MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

単一行サブクエリと複数行サブクエリとは?違いと使い方をわかりやすく解説

単一行サブクエリ(Single Row Subquery)とは

単一行サブクエリは、外側のクエリ(親クエリ)の結果がある1つの未知の値に基づいて決まる場合に使用します。「単一行」という名前から複数の列を返す印象を持たれがちですが、実際に外側のクエリへ返せるのは1列・1行のみという点に注意が必要です。

次のSELECT文では、内側のサブクエリが会社全体の最低給与という「1行」だけを返します。外側のクエリはその値を受け取り、全社員の給与と照らし合わせることで、最低給与と一致する社員だけを表示しています。

SELECT first_name, salary, department_id
FROM employees
WHERE salary = (SELECT MIN(salary)
FROM employees);

HAVING句と組み合わせた単一行サブクエリ

HAVING句は、GROUP BYによってグループ化された結果に対して条件を加えたい場合に使用します。サブクエリの結果をMINやAVGなどの集計関数(グループ関数)と比較したいときは、内側のクエリを外側のクエリのHAVING句の中に記述する必要があります。

下の例では、部署ごとの最低給与が「会社全体の平均給与」より低い部署だけを抽出しています。

SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) < (SELECT AVG(salary)
FROM employees)

複数行サブクエリ(Multiple Row Subquery)とは

複数行サブクエリとは、親クエリに対して2行以上の結果を返すことができる入れ子のクエリです。主にWHERE句やHAVING句で使用され、複数の行を返すため、集合比較演算子(IN / ANY / ALL)で結果を受け取る必要があります。

  • IN:指定した値が、サブクエリが返す値のいずれかと一致すれば真を返す
  • ANY:指定した値を、サブクエリが返す各行の値と順に比較し、どれか1つでも条件を満たせば真
  • ALL:指定した値を、サブクエリが返すすべての値と比較し、全件が条件を満たした場合にのみ真

複数行を返すサブクエリに「=」を使うとエラーになる

次のクエリは、location_id = 100 の拠点に所属するdepartment_idが複数存在するため、サブクエリが複数行を返します。ところが外側のクエリでは単一の値を前提とした「=」で比較しているため、エラーが発生します(Oracle環境では「ORA-01427: 単一行副問合せにより複数の行が戻されます」といったメッセージが表示されます)。

-- エラーになる例:「=」で複数行の結果を比較している
SELECT first_name, department_id FROM employees WHERE department_id = (SELECT department_id FROM employees WHERE location_id = 100);

このようなケースでは、比較演算子を IN に変更することで正しく動作します。

-- 正しく動作する例:IN を使って複数行の結果と比較する
SELECT first_name, department_id FROM employees WHERE department_id IN (SELECT department_id FROM employees WHERE location_id = 100);

まとめ:単一行と複数行サブクエリの違い

種類返せる結果組み合わせられる演算子
単一行サブクエリ1行・1列のみ=、>、<、>=、<=、<> など
複数行サブクエリ複数行IN、ANY、ALL

サブクエリを書く際は、まず内側のクエリが何行の結果を返すのかを見極め、それに応じて適切な比較方法を選ぶことが重要です。

  1. MySQLのUPDATE文で1つのクエリを使って複数のレコードを更新する方法

    MySQLでは、UPDATEステートメントを使うことで、1つのクエリで複数のカラムや複数のレコードの値をまとめて更新できます。この記事では、実際にサンプルテーブルを作成し、UPDATE文でデータを更新する具体的な手順を解説します。サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable     -> (     -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,    &

  2. C#の多重継承とは?インターフェースを使った実装方法をわかりやすく解説

    C#の多重継承とは? C#では、クラスに対する多重継承(複数のクラスから同時に継承すること)はサポートされていません。これは、複数の親クラスが同名のメンバーを持つ場合に発生する「ダイヤモンド継承問題」など、コードの曖昧さや競合を避けるための言語設計上の判断です。 しかし、インターフェースを利用すれば、多重継承と同等の機能を実現できます。C#では1つのクラスが複数のインターフェースを実装できるため、これが事実上の多重継承の代替手段として広く使われています。 ステップ1:複数のインターフェースを定義する まず、基底クラスの代わりとなる2つのインターフェースを作成します。 public inter