サブクエリとは
- SQL文の中に入れ子になって書かれているSQL文のこと
- SQLの副問合せとも呼ばれる
- ちなみにクエリとはSQL文のこと
サブクエリの例
Players テーブル Competitions テーブル
+------+---------+ +------+-------------+
| id | name | | id | competition |
+------+---------+ +------+-------------+
| 1 | メッシ | | 1 | サッカー |
| 2 | 松井 | | 2 | 野球 |
| 3 | 大谷 | | 3 | 野球 |
| 4 | ネイマール | | 4 | サッカー |
| 5 | 錦織 | | 5 | テニス |
+------+---------+ +------+------------+
とうテーブルがあるとして
サッカーをやっているプレイヤーのidと名前を取得したい時にサブクエリを使用すると簡単にかけます
SELECT * FROM players
WHERE EXISTS (SELECT * FROM competitions
WHERE players.id = competitions.id
AND competitions.competition = "サッカー");
これは二つのテーブルからidが同じ、かつcompetition(競技)がサッカーの人を取得するSQL文です
結果
Players テーブル
+------+----------+
| id | name |
+------+----------+
| 1 | メッシ |
| 4 | ネイマール |
+------+----------+
このように"SQL文の中に書くSQL文"がサブクエリです
(今回はWHERE句のなかで使いましたがFROM句やSELECT文でも使えます)
相関サブクエリ とは
- 相関サブクエリはサブクエリの一種
- 外側のSQL文の値をサブクエリ内で使うことを言う
相関サブクエリの例
Playersテーブル
+------+--------+------+-------------+
| id | name | age | competition |
+------+--------+------+-------------+
| 1 | 佐藤 | 23 | サッカー |
| 2 | 田中 | 35 | サッカー |
| 3 | 桐谷 | 38 | サッカー |
| 4 | 大島 | 42 | 野球 |
| 5 | 松井 | 41 | 野球 |
| 6 | 後藤 | 35 | 野球 |
+------+---------+------+------------+
このような様々なスポーツ選手が登録されているテーブルがあるとして
スポーツの種目ごとに平均年齢より年齢が若い選手を取得したい時、
相関サブクエリを使って取得することができる
SELECT name, age, competition
FROM players as p1
WHERE p1.age < (SELECT AVG(age) as avg_age
FROM players as p2
WHERE p1.competition = p2.competition);
結果
+--------+------+-------------+
| name | age | competition |
+--------+------+-------------+
| 佐藤 | 23 | サッカー |
| 後藤 | 35 | 野球 |
+---------+------+------------+
上記のSQL文は、playersテーブル(p1)の年齢と、competition(競技)が同じ選手の年齢の平均年齢を比べて
平均年齢よりも年齢が低い人を取得しています。
この時に、サブクエリの中で外側のクエリの値を使っているので(WHERE p1.competition = p2.competition)
これが相関サブクエリとなる。
まとめ
- サブクエリ
- SQL文の中に入れ子になって書かれているSQL文のこと
- 相関サブクエリ
- 相関サブクエリはサブクエリの一種
- 外側のSQL文の値をサブクエリ内で使うことを言う
以上
参考記事
https://style.potepan.com/articles/17593.html
https://qiita.com/aki-takano/items/6df0513ccc5aa40a075a