1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【SQL】「サブクエリ」と「相関サブクエリ」について

Posted at

サブクエリとは

  • 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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?