SQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い
CASE WHEN は、SQL で if-then ロジックを記述する方法です。両方の形式を学習し、NULL や順序付けのトラップを回避しながら、ラベル、ピボット スタイルのレポート、カスタム並べ替え、安全な更新に使用します。
CASEは、true である first 条件に基づいて値を返します。- 最も具体的な条件を最初に置くと、後の条件に到達できない可能性があります。
ELSEがない場合、一致しない行はNULLを返します。SUMまたはCOUNTでは、CASE は 1 つのクエリをコンパクトなピボット スタイルのレポートに変換します。
ほとんどのレポートには、注文に大小のラベルを付ける、支払い済みの注文と保留中の注文を並べて数える、緊急品目を最初に表示するなど、何らかのロジックが必要です。 SQL CASE WHEN はこれらすべてをクエリ内で直接処理し、すべての主要なデータベースで機能します。
ここではすべてのクエリを SQLite 3.50 で実行し、表示された結果はその実行から得られたものです。 CASE は標準 SQL の一部であるため、これらの例では PostgreSQL、MySQL、SQL Server、Oracle で同じように動作します。
ケース・いつとは何ですか?
CASE は式であり、別個のコマンドではありません。条件を順番に評価して値を返すため、SELECT、WHERE、GROUP BY、ORDER BY、または関数内など、値が許可されている場所であればどこにでも使用できます。必ずENDで終わります。
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE fallback
END
サンプルテーブル
CREATE TABLE orders (id INT, customer TEXT, total INT, status TEXT);
INSERT INTO orders VALUES
(1,'Asha',1200,'paid'), (2,'Ben',300,'pending'),
(3,'Asha',800,'paid'), (4,'Chitra',2500,'shipped'),
(5,'Dev',150,'cancelled'), (6,'Ben',NULL,'pending');
次数 6 には合計がないことに注意してください。その行は後で重要になります。
検索されたケース
各 WHEN には独自の完全な条件があるため、これはより柔軟な形式です。
SELECT id, total,
CASE
WHEN total >= 1000 THEN 'large'
WHEN total >= 500 THEN 'medium'
ELSE 'small'
END AS size
FROM orders;
-- 1 | 1200 | large
-- 2 | 300 | small
-- 3 | 800 | medium
-- 4 | 2500 | large
-- 5 | 150 | small
-- 6 | NULL | small
最後の行を見てください。オーダー 6 には合計がありませんが、「小さい」というラベルが付けられています。 NULL との比較はどちらも true ではなかったので、ELSE に落ちました。これを修正する方法を NULL セクションで示します。常に AS を使用して結果に名前を付けてください。そうしないと、扱いにくい列名が付けられる可能性があります。
シンプルなケース
1 つの列を固定値と比較する場合は、短い形式の方が読みやすくなります。
SELECT id,
CASE status
WHEN 'paid' THEN 'Complete'
WHEN 'shipped' THEN 'Complete'
WHEN 'pending' THEN 'Waiting'
END AS label
FROM orders;
-- 1 | Complete
-- 2 | Waiting
-- 3 | Complete
-- 4 | Complete
-- 5 | NULL
-- 6 | Waiting
| フォーム | 比較する | 範囲は使用できますか? | こんな方に最適 |
|---|---|---|---|
| シンプル | 平等を表す 1 つの式 | いいえ | コードをラベルにマッピングする |
| 検索されました | ブランチごとに任意の条件 | はい | 範囲、複数の列、NULL チェック |
注文事項
CASE は最初の true 条件で停止します。これは最も一般的なロジック バグです。前のクエリの 2 つの条件を交換します。
SELECT id, total,
CASE
WHEN total >= 500 THEN 'medium'
WHEN total >= 1000 THEN 'large'
ELSE 'small'
END AS size
FROM orders WHERE id IN (1, 4);
-- 1 | 1200 | medium
-- 4 | 2500 | medium
今では何も「大きく」なることはありません。合計 2500 は少なくとも 500 なので、最初のブランチが勝ち、2 番目のブランチには到達しません。エラーは表示されず、ラベルが間違っているだけです。範囲の場合は、最も制限的な条件を最初に指定するか、total >= 500 AND total < 1000 のように完全な範囲を記述します。
ELSE がない場合はどうなりますか?
上記の単純な CASE の例では、注文 5 がキャンセルされ、どの支店もそれを処理しなかったため、結果は NULL になりました。次のセクションで示すように、それがまさにあなたが望むことである場合もあります。ただし、ラベルを作成する場合は、レポートに空白を残すよりも、予期しない値が表示されるため、通常は明確な ELSE 'other' の方が適しています。
ヒント: すべてのブランチは同じ型を返す必要があります。 SQLite ではテキストと数値の混合は大まかに機能しますが、PostgreSQL などの厳密なデータベースではエラーが発生したり、意図しない方法で値を変換しようとしたりします。
SUM を使用したピボット スタイルのレポート
これは、日常の SQL で最も役立つパターンの 1 つです。 CASE を集計でラップすると、行が列に変わり、顧客ごとに 1 行になります。
SELECT customer,
SUM(CASE WHEN status = 'paid' THEN total ELSE 0 END) AS paid,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending_orders
FROM orders
GROUP BY customer
ORDER BY customer;
-- Asha | 2000 | 0
-- Ben | 0 | 2
-- Chitra | 0 | 0
-- Dev | 0 | 0
1 つのクエリで、別のクエリや結合を必要とせずに、支払われた収益と保留中の注文数の両方が得られるようになりました。このパターンは、一部のデータベースのみが提供する専用の PIVOT 構文とは異なり、ほぼすべてのデータベースで機能します。 GROUP BY が初めての場合は、SQL GROUP BY と HAVING をお読みください。
条件付きカウント
COUNT は NULL をスキップするため、ELSE のない CASE は一致する行のみをカウントします。
SELECT COUNT(*) AS all_orders,
COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid_orders,
COUNT(CASE WHEN total >= 1000 THEN 1 END) AS large_orders
FROM orders;
-- 6 | 2 | 2
注意: COUNT の中に ELSE 0 を追加すると、0 は NULL ではないため、すべての行がカウントされます。 ELSE 0はSUMで使用し、COUNTは省略します。 PostgreSQL と SQLite も COUNT(*) FILTER (WHERE ...) をサポートしており、これは読みやすいですが、どこでも利用できるわけではありません。
CASEごとにグループ化する
独自のバケットを作成して、それらを要約することができます。
SELECT CASE WHEN total >= 1000 THEN 'large' ELSE 'other' END AS bucket,
COUNT(*)
FROM orders
GROUP BY bucket
ORDER BY bucket;
-- large | 2
-- other | 4
エイリアスによるグループ化は、SQLite、PostgreSQL、MySQL で機能します。 SQL Server ではこれが許可されていないため、式全体を繰り返すか、最初にクエリを CTE またはサブクエリに入れる必要があります。
ORDER BYによるカスタムソート
アルファベット順が企業にとって望まれることはほとんどありません。 CASE を使用すると、独自の順序を定義できます。
SELECT id, status FROM orders
ORDER BY CASE status
WHEN 'pending' THEN 1
WHEN 'paid' THEN 2
ELSE 3
END, id;
-- 2 | pending
-- 6 | pending
-- 1 | paid
-- 3 | paid
-- 4 | shipped
-- 5 | cancelled
保留中の注文が最初に来るため、作業キューに便利です。 2 番目の並べ替え列 id は、各グループ内で行を予測可能な順序に保ちます。
更新中のケース
CASE を使用すると、1 つのステートメントで異なる行に異なる変更を適用できます。ここでは、少額の未決注文にレビュー用のフラグが付けられています。
UPDATE orders
SET status = CASE
WHEN status = 'pending' AND total < 500 THEN 'review'
ELSE status
END;
SELECT id, status FROM orders WHERE customer = 'Ben';
-- 2 | review
-- 6 | pending
ELSE status は他の行を変更しないままにします。 これを省略すると危険です。一致しない行は NULL に設定されるためです。 WHERE 句がない場合、このステートメントはすべての行にも影響するため、大規模なテーブルではフィルターを追加し、コミットする前に結果を確認できるように変更を トランザクション でラップすることを検討してください。次数 6 は、その NULL 合計が total < 500 を満たしていないため、変更されていないことにも注目してください。
NULLトラップ
NULL は CASE に関して 2 つの別々の問題を引き起こします。まず、単純な形式では等価性を使用して比較しますが、NULL と等しいものはなく、NULL 自体も同様です。
SELECT CASE NULL WHEN NULL THEN 'matched' ELSE 'not matched' END;
-- not matched
したがって、CASE col WHEN NULL は決して一致しません。代わりに IS NULL の検索フォームを使用してください。次に、順序 6 で見たように、NULL 値は比較をすり抜けて ELSE に到達します。修正するには、まずそれを確認します。
SELECT id,
CASE
WHEN total IS NULL THEN 'unknown'
WHEN total >= 1000 THEN 'large'
ELSE 'other'
END AS size
FROM orders WHERE id IN (1, 2, 6);
-- 1 | large
-- 2 | other
-- 6 | unknown
オーダー 6 には正直なラベルが付けられます。 SQL NULL 値 に関するガイドでは、この動作について完全に説明しています。
CASE と他のオプションの比較
| オプション | で働く | こんなときに使います |
|---|---|---|
ケース |
すべての主要なデータベース | 移植可能なロジックが必要な場合 |
合体 |
すべての主要なデータベース | NULL のフォールバックのみが必要です |
IF() |
MySQL | シンプルな二者択一の選択 |
IIF() |
SQLサーバー、SQLite | シンプルな二者択一の選択 |
DECODE() |
オラクル | 古い Oracle コード |
| ルックアップテーブル | すべて | マッピングが長い、または頻繁に変更される |
最後の選択肢については一考の価値があります。 CASE が 30 個のブランチに成長し、5 つのクエリに出現する場合は、マッピングをテーブルに移動し、それに結合します。この場合、変更は 5 か所のコード変更ではなく、1 行の更新になります。
よくある間違い
- 条件の順序が間違っています。 広い条件が最初に狭い条件を隠します。
- 忘れています
END. これは最も頻繁に起こる構文エラーです。 WHEN NULLを使用します。 一致しないため、WHEN col IS NULLを使用します。COUNTの中にELSE 0を足します。 すべての行をカウントします。- UPDATE の
ELSEを省略します。 NULL で値を消去できます。 WHEREのCASEによるフィルタリング。 インデックスの使用を停止できます。 SQL クエリの最適化 に関するガイドをご覧ください。
まとめ
CASE WHEN は、非常に多くの機能を実行する小さな機能です。 3 つのルールを覚えておいてください。最初の真の分岐が勝ち、一致しない行は ELSE なしで NULL になり、NULL には独自のチェックが必要です。練習するには、現在複数のクエリを使用して作成しているレポートを使用し、SUM(CASE ...) を使用してそれを 1 つのクエリとして作成してみます。
よくある質問
SQL で CASE WHEN は何をするのでしょうか?
if-then ロジックをクエリに追加します。 SQL は各条件を順番にチェックし、最初に真となった条件の値を返すか、真でない場合は ELSE 値を返します。
CASE ステートメントに ELSE がない場合はどうなりますか?
どの条件にも一致しない行は NULL を返します。これは COUNT 内では便利ですが、ラベルや更新ではデータが空白になったり失われたりする可能性があります。
WHERE 句で CASE を使用できますか?
そう、表現だから。ただし、通常は単純な AND 条件と OR 条件の方が明確であり、インデックスを使用する可能性が高くなります。
単純な CASE と検索された CASE の違いは何ですか?
Simple CASE は、1 つの式を固定値と比較して等しいかどうかを確認します。検索された CASE は各 WHEN に完全な条件があるため、範囲と NULL チェックを処理できます。
CASE ステートメントはネストできますか?
はい、CASE は別の CASE の中に現れることができます。ただし、ネストが深くなると読みにくくなるため、条件を AND で組み合わせるか、ルックアップ テーブルを使用することを検討してください。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェアテストユーザー受け入れテスト (UAT): プロセス、チェックリスト、および実際の例
ユーザー受け入れテストの説明: 誰が実行するか、QA との違い、7 段階のプロセス、UAT テスト ケース テンプレート、チェックリスト、サインオフ基準、およびよくある間違い。
記事を読む →データベースとSQLSQL NULL 値の説明: IS NULL、COALESCE、NULLIF、および回避すべきトラップ
SQL の NULL 値について、実行したクエリで説明しました。3 つの値のロジック、IS NULL、COALESCE、NULLIF、集計、結合、並べ替えでの NULL の扱い方、およびそれが密かに引き起こすバグです。
記事を読む →データベースとSQLSQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い
SQL CASE WHEN では、単純な検索フォーム、条件順序、SUM を使用したピボット、COUNT トリック、カスタム並べ替え、更新、回避すべき NULL トラップなど、実行したクエリを使用して説明しました。
記事を読む →ソフトウェア開発JWTとは何ですか? JSON Web トークンを実際の例で説明する
JWTとは何ですか? JSON Web トークンについて説明しました。3 つの部分、実行したコード内で構築および改ざんされたトークン、JWT とセッション、ストレージ、リフレッシュ トークン、およびセキュリティ上の間違いです。
記事を読む →ソフトウェア開発JavaScript イベントループの説明: コールスタック、マイクロタスク、タイマーと例
JavaScript イベント ループについて、実行したコードで説明しました。コール スタック、タスク キュー、マイクロタスク キュー、setTimeout 0 が即時ではない理由、ブロッキング、スターベーション、およびインタビュー クイズです。
記事を読む →ソフトウェア開発Python ジェネレーターと収量の説明: 実際の例でメモリを節約する
Python ジェネレーターと Yield について、実行したコードを使用して説明します。一時停止と再開の方法、メモリ節約の測定、パイプライン、無限シーケンス、Yield from、send、および一般的なトラップについて説明します。
記事を読む →人工知能埋め込みとは何ですか?ベクトルとコサインの類似度を簡単に説明
埋め込みとは何ですか?ベクトル、コサイン類似度、セマンティック検索に関する平易なガイド。私たちが実行した小さな例、一般的な使用法、モデルの選択、既知の制限が含まれています。
記事を読む →DevOpsBlue-Green デプロイメントと Canary デプロイメント: 違い、トレードオフ、および選択方法
ブルー グリーン デプロイメントとカナリア デプロイメントについて説明: それぞれの仕組み、コスト、リスクとロールバック、テストした安定したユーザー バケット化、データベース移行、ローリング アップデート、および選択方法。
記事を読む →テスト自動化不安定なテスト: 問題の原因とそれを永久に修正する方法
不安定なテストについては、私たちが実行したデモを使用して説明しました。主な原因、確認および診断する方法、タイミングの適切な修正、共有された状態と日付、隔離プロセスなどです。
記事を読む →ソフトウェアテスト負荷テストとストレス テスト: 違い、メトリクス、および k6 の例
ロード テストとストレス テストについて説明します。それぞれが何を証明するか、スパイク テストとソーク テスト、重要な指標、平均値が誤解を招く理由、K6 の例、テストの計画方法について説明します。
記事を読む →ソフトウェアテストテスト ケースとテスト シナリオ: 主な違い、例、およびそれぞれをいつ使用するか
テスト ケースとテスト シナリオの説明: 明確な定義、並べて表、シナリオからケースへの 1 つのパスワード リセット機能、テンプレート、およびそれぞれをいつ使用するか。
記事を読む →データベースとSQLSQL クエリの最適化: 実行プランを読み取り、タイミングを考慮して遅いクエリを修正
SQL クエリの最適化は 100 万行でテストされています。実行プランの読み取り、適切なインデックスの追加、検索対象外のフィルターの修正、複合インデックスとキーセットのページネーションの使用。
記事を読む →データベースとSQLSQL UNION と UNION ALL: 違い、例、テストされたパフォーマンス
SQL UNION と UNION ALL について、実行したクエリで説明しました。重複、両方に従うルール、実際のデータのバグ、測定されたパフォーマンス、INTERSECT と EXCEPT、およびそれぞれをいつ使用するかについて説明します。
記事を読む →ソフトウェア開発JavaScript Fetch API チュートリアル: GET、POST、エラー処理、タイムアウト
ローカル サーバーに対してテストされた JavaScript Fetch API チュートリアル: GET と POST、404 がスローされない理由、再利用可能なヘルパー、クエリ文字列、タイムアウト、CORS、およびよくある間違い。
記事を読む →ソフトウェア開発Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例
Python のファイル処理について、実行したコードで説明します。オープン モード、大きいファイルの読み取り、CSV、JSON、パスライブラリ、バイナリ ファイル、安全な書き込み、エラー処理、およびよくある間違いについて説明します。
記事を読む →ソフトウェア開発Python のクラスとオブジェクト: 実際の例を含む OOP チュートリアル
Python のクラスとオブジェクトについて、実行したコードとともに説明します: __init__、メソッド、クラスとインスタンスの属性、継承、プロパティ、ダンダー メソッド、データクラス、およびよくある間違い。
記事を読む →人工知能大規模言語モデルとは何ですか? LLM の仕組みを誇大広告なしで説明
大規模言語モデルとは何ですか? LLM は、トークン、エンベディング、アテンション、トレーニング、温度およびコンテキスト ウィンドウ、小さな次の単語のデモ、実際の制限など、平易な言葉で説明されています。
記事を読む →DevOps初心者のための Linux コマンド: 例を含む基本ターミナル ガイド
初心者向けの Linux コマンド。ナビゲーション、ファイル、ログの表示、grep、パイプ、権限、プロセス、アーカイブなどのタスク別にグループ化されており、実用的なログ分析の例も含まれています。
記事を読む →テスト自動化Selenium と Playwright: 主な違い、コードの比較、どちらを選択するか
Selenium と Playwright の比較: アーキテクチャ、待機、ブラウザと言語のサポート、デバッグ、両方のツールでの同じテスト、移行のアドバイスと選択方法。
記事を読む →ソフトウェアテスト等価性分割: テスト設計手法を実際の例で説明
等価性パーティション化について説明しました。有効なパーティションと無効なパーティションを見つける方法、年齢、パスワード、クーポンに関する実際の例、実行したテスト、境界と組み合わせる理由。
記事を読む →ソフトウェアテストソフトウェアテストにおける重大度と優先度: 相違点、マトリックス、および実際の例
ソフトウェア テストにおける重大度と優先度について説明します。明確な定義、例を含む 4 方向のマトリックス、レベル スケール、それぞれの設定者、バグ トリアージの実行方法。
記事を読む →データベースとSQLSQL サブクエリのチュートリアル: 型、相関サブクエリ、および EXISTS と例
実行したクエリを含む SQL サブクエリのチュートリアル: スカラー、IN、FROM、SELECT サブクエリ、相関サブクエリ、EXISTS、NOT IN NULL トラップ、サブクエリ対 JOIN 対 CTE。
記事を読む →データベースとSQLSQL トランザクションと ACID の説明: COMMIT、ROLLBACK、分離レベル
SQL トランザクションと ACID について、実行した銀行振込で説明しました。COMMIT、ROLLBACK、セーブポイント、ロック、分離レベル、ダーティ リード、デッドロック、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →