MySQLの相関サブクエリとは?SQL初心者でも理解できる使い方と仕組みをやさしく解説【データベース入門】
生徒
「SQLを勉強していたら『相関サブクエリ』という言葉が出てきました。普通のサブクエリと何が違うんですか?」
先生
「相関サブクエリは、外側のSQLのデータを見ながら実行されるサブクエリのことです。つまり、外の情報に『関係(相関)』しながら動くSQLですね。」
生徒
「外側の情報を見る…というのが少しイメージできません。」
先生
「例えば、クラスの生徒名簿を1人ずつ見ながら、その人のテスト結果を調べるようなイメージです。1人確認するごとに別の表を調べる仕組みが、相関サブクエリです。」
生徒
「なるほど。1行ずつチェックして調べるSQLなんですね。」
1. MySQLの相関サブクエリとは何か?
MySQLの相関サブクエリとは、外側のSQLの値を利用して実行されるサブクエリのことです。まずサブクエリとは、SQLの中に書く「小さなSQL」のことを意味します。SQLの中にもう一つSQLを書くことで、より複雑な検索ができるようになります。
しかし通常のサブクエリは、先に一度だけ実行されて結果が決まり、その結果を外側のSQLが利用します。それに対して相関サブクエリは、外側のSQLのレコードを1行ずつ見ながらサブクエリが実行されるという特徴があります。
つまり、外側のテーブルの行ごとにサブクエリが動く仕組みです。これが「相関」という言葉の意味です。外側のSQLと内側のSQLが関係しながら処理されるため、相関サブクエリと呼ばれています。
データベース初心者は少し難しく感じるかもしれませんが、「1行ずつ確認して、別の表で条件を調べるSQL」と考えると理解しやすくなります。
2. 相関サブクエリをイメージで理解する
相関サブクエリを理解するために、日常生活の例で考えてみましょう。例えば会社の社員一覧があり、その社員が注文した商品があるかどうかを調べるとします。
まず社員名簿を1人ずつ見ます。そしてその社員が注文した履歴があるかどうかを注文表で確認します。このように、社員1人を見るたびに注文表をチェックする仕組みが相関サブクエリです。
SQLの世界では、次のような流れになります。
- ① 外側のテーブルを1行読む
- ② その行の情報を使ってサブクエリを実行
- ③ 条件に合うか確認
- ④ 次の行で同じ処理を繰り返す
この仕組みによって、データベースの中で「関連する情報」を見つけることができます。JOINと似た使い方をすることも多いですが、SQLの書き方が異なる点が特徴です。
3. 相関サブクエリの基本的なSQL例
まずは簡単なテーブルを用意します。ここでは社員テーブルと注文テーブルを使います。
employeesテーブル
id | name | age
---+------------+----
1 | 山田太郎 | 25
2 | 佐藤花子 | 19
3 | 鈴木一郎 | 30
4 | 高橋美咲 | 28
ordersテーブル
id | employee_id | product
---+-------------+---------
1 | 1 | ノートPC
2 | 1 | マウス
3 | 3 | モニター
次のSQLは、注文をしたことがある社員を取得する相関サブクエリです。
SELECT *
FROM employees e
WHERE EXISTS (
SELECT *
FROM orders o
WHERE o.employee_id = e.id
);
このSQLでは、employeesテーブルの1行ごとにordersテーブルを検索しています。ここが相関サブクエリのポイントです。
実行結果
id | name | age
---+------------+----
1 | 山田太郎 | 25
3 | 鈴木一郎 | 30
4. 相関サブクエリで平均値と比較する
相関サブクエリは、同じテーブルの中で条件を比較するときにもよく使われます。例えば、同じ部署の平均年齢より年齢が高い社員を調べることができます。
employeesテーブル
id | name | age | department
---+------------+-----+-----------
1 | 山田太郎 | 25 | 営業
2 | 佐藤花子 | 19 | 営業
3 | 鈴木一郎 | 30 | 開発
4 | 高橋美咲 | 28 | 開発
5 | 伊藤健太 | 40 | 開発
SELECT *
FROM employees e1
WHERE age > (
SELECT AVG(age)
FROM employees e2
WHERE e1.department = e2.department
);
このSQLでは、同じ部署の平均年齢をサブクエリで求めています。そして、その平均より年齢が高い社員だけを表示しています。
実行結果
id | name | age | department
---+------------+-----+-----------
3 | 鈴木一郎 | 30 | 開発
5 | 伊藤健太 | 40 | 開発
5. 相関サブクエリとEXISTSの組み合わせ
相関サブクエリでは、EXISTSというSQLがよく使われます。EXISTSは「データが存在するかどうか」を確認するSQLです。
注文がある商品だけを表示するSQLを書いてみます。
productsテーブル
id | name
---+---------
1 | ノートPC
2 | マウス
3 | モニター
4 | キーボード
ordersテーブル
id | product_id
---+------------
1 | 1
2 | 1
3 | 3
SELECT *
FROM products p
WHERE EXISTS (
SELECT *
FROM orders o
WHERE o.product_id = p.id
);
実行結果
id | name
---+---------
1 | ノートPC
3 | モニター
このように、外側のproductsテーブルのIDを使って、ordersテーブルを調べているのが相関サブクエリです。
6. 相関サブクエリと普通のサブクエリの違い
SQL初心者が混乱しやすいポイントが、普通のサブクエリとの違いです。違いを簡単に整理すると次のようになります。
| 種類 | 特徴 |
|---|---|
| 通常のサブクエリ | サブクエリが先に一度実行される |
| 相関サブクエリ | 外側の行ごとにサブクエリが実行される |
つまり通常のサブクエリは「一度計算して終わり」ですが、相関サブクエリは「行ごとに繰り返し計算する」という違いがあります。
まとめ
相関サブクエリとは何かを振り返る
ここまで、MySQLにおける相関サブクエリの仕組みや使い方について詳しく解説してきました。相関サブクエリは、SQLの中に書かれたサブクエリが外側のSQLの行の値を利用して実行される仕組みを持つSQL構文です。データベースを扱う際に、テーブル同士の関係を調べたり、条件に合うレコードを細かく絞り込んだりする場面でよく利用されます。
一般的なサブクエリは一度だけ実行され、その結果を外側のSQLが利用します。しかし相関サブクエリは違います。外側のテーブルのレコードを一行ずつ確認しながら、その都度サブクエリが実行されます。つまり外側のSQLと内側のSQLが密接に関係しながら処理が進むSQL文になっています。この仕組みこそが相関サブクエリの最大の特徴です。
データベース初心者の方にとっては少し難しく感じるかもしれませんが、考え方はとてもシンプルです。「外側のテーブルを一行ずつ読み、その行の情報を使って別のテーブルを検索する」という流れをイメージすると理解しやすくなります。SQLの処理の流れを理解することで、データベースの検索や分析がより柔軟にできるようになります。
相関サブクエリの基本的な動作
相関サブクエリは次のような流れで処理されます。まず外側のSQLがテーブルの一行目を読み込みます。その次に、その行の値を利用してサブクエリが実行されます。条件に一致すればその行は結果に含まれ、一致しなければ除外されます。そして次の行でも同じ処理が繰り返されます。
- 外側のテーブルの一行を読み込む
- その行の値を使ってサブクエリを実行する
- 条件に一致するかどうかを確認する
- 次の行でも同じ処理を繰り返す
この仕組みによって、SQLは「関連するデータ」を細かく検索することができるようになります。たとえば社員テーブルと注文テーブルを使い、注文履歴がある社員だけを取得するような処理を実現できます。こうした処理はデータベース開発や業務システム開発で頻繁に登場します。
相関サブクエリのサンプルSQL
employeesテーブル
id | name | age
---+------------+----
1 | 山田太郎 | 25
2 | 佐藤花子 | 19
3 | 鈴木一郎 | 30
4 | 高橋美咲 | 28
5 | 伊藤健太 | 40
ordersテーブル
id | employee_id | product
---+-------------+---------
1 | 1 | ノートPC
2 | 1 | マウス
3 | 3 | モニター
4 | 5 | キーボード
SELECT *
FROM employees e
WHERE EXISTS (
SELECT *
FROM orders o
WHERE o.employee_id = e.id
);
このSQLはemployeesテーブルのレコードを一行ずつ読みながら、ordersテーブルに対応する注文履歴が存在するかどうかを調べています。EXISTSを利用することで、関連するレコードが存在するかどうかを効率的に確認できます。
実行結果
id | name | age
---+------------+----
1 | 山田太郎 | 25
3 | 鈴木一郎 | 30
5 | 伊藤健太 | 40
この結果から、注文履歴を持っている社員だけが抽出されていることがわかります。つまり相関サブクエリは「関連データが存在するレコード」を見つけるときに非常に便利なSQL構文です。
相関サブクエリとJOINの違い
SQL初心者がよく疑問に思うのが「JOINと何が違うのか」という点です。JOINも複数のテーブルを結び付けてデータを取得するため、相関サブクエリと似た役割を持っています。
しかし相関サブクエリは、外側のSQLの行ごとにサブクエリを実行するという特徴があります。一方JOINは、テーブル同士を結合して一度に結果を取得する仕組みです。処理の仕組みが異なるため、状況に応じて使い分けることが重要です。
実務のデータベース開発では、次のような場面で相関サブクエリがよく利用されます。
- 関連データが存在するレコードを取得したい場合
- 同じテーブル内で平均値や最大値と比較したい場合
- 複雑な条件を細かく判定したい場合
- EXISTSやNOT EXISTSを利用した条件検索
これらの処理を理解しておくことで、SQLの検索能力は大きく広がります。MySQLだけでなく、多くのデータベースシステムでも同じ考え方が使われているため、データベース学習の基礎としてとても重要な知識になります。
生徒
今日の学習で、相関サブクエリの仕組みが少し理解できました。普通のサブクエリは一度だけ実行されるけれど、相関サブクエリは外側のテーブルの行ごとにサブクエリが実行されるという違いがあるんですね。
先生
その通りです。相関サブクエリは外側のSQLと内側のSQLが連動して動くのが特徴です。特にEXISTSやNOT EXISTSと組み合わせることで、関連データの有無を調べるSQLを書くことができます。
生徒
つまり、社員を一人ずつ確認しながら、その社員の注文履歴があるかどうかをチェックするようなイメージですね。データベースの中で一行ずつ調べていく処理なんだと理解できました。
先生
とても良い理解です。SQLを学ぶ上では、処理の流れをイメージできることが大切です。相関サブクエリは一見難しく見えますが、外側の行を見ながら条件を確認するSQLだと覚えておけば問題ありません。
生徒
JOINと似ている部分もありますが、処理の仕組みが違うということも分かりました。これからSQLを書くときは、JOINだけでなく相関サブクエリも使えるように練習してみます。
先生
ぜひ実際にSQLを書きながら練習してみてください。MySQLの相関サブクエリを理解すると、データベースの検索や分析の幅が広がります。SQL初心者の方でも、基本を押さえておけば必ず使いこなせるようになりますよ。