こんにちはiwanagaです。
11月も近いのに今日も電車で汗だくでした💦極端に暑いのも寒いのも嫌ですが流石にこうも気温がガチャガチャだと体調も崩れちゃいますね。自分は先週扁桃炎で39度以上熱が出てなかなか大変な事になっていましたので皆様もお気をつけください。
さて、今回も全く脈絡のない事を話しましたが今回も前回に引き続きSQLの学習をしていきたいと思います。今回はサブクエリについて学んでいきたいと思います。
サブクエリ
そもそもサブクエリとは何かという話になりますが、簡単にいうとサブのクエリです笑
ふざけている訳ではありませんがメインのクエリで該当箇所を探すための条件として使用される事が多いです。
例を幾つか説明させていただくにあたって必要なテーブルを下記に記載します。
テーブル名:group
ID | first_name | last_name | team | salary| |
---|---|---|---|---|
1 | taro | yamada | IT | 200000 |
2 | jiro | suzuki | food | 220000 |
3 | sabro | kitano | book | 320000 |
4 | hanako | iwai | IT | 110000 |
5 | matuko | dx | food | 250000 |
6 | yuta | abe | IT | 540 |
上記のテーブルから給料が200000より多い人を抽出する際にサブクエリを使用した文にすると下記のようになります。
SELECT ID, first_name, last_name, salary
FROM group
WHERE ID IN (SELECT ID FROM group WHERE salary >= 200000);
上記の文でどの様なIDを抽出するかの条件に対して、カッコ内で(給料が200000以上)と条件を絞っています。このカッコ内で実行しいているクエリがサブクエリとなります。
この文を抽出される内容は下記の様になります。
ID | first_name | last_name | team | salary| |
---|---|---|---|---|
1 | taro | yamada | IT | 200000 |
2 | jiro | suzuki | food | 220000 |
3 | sabro | kitano | book | 320000 |
5 | matuko | dx | food | 250000 |
ただここで一つ疑問が出ると思います...
『これ、普通のSELECTで良くないか...?』
正直この基本的な文だけだとその通りです。なんせ普通に下記の文で同じ結果が出ます。
SELECT order_id, customer_id, order_date, total_amount
FROM orders
WHERE salary >= 200000;
では違いは何か?カラムの枠を超えて抽出ができます。普通のSELECT文ですと給料を知らないと抽出できませんがサブクエリがあればIDや名前など多角的に情報を抽出できるのでおすすめです。逆に様々な情報を元により正確なデータを抽出する事ができます。
JOIN
やってて思ったのですがサブクエリが個人的にかなり難しいのでまたの機会にやります。なので気分転換にJOINをやります。
JOINがあるとテーブルとテーブルを結合して抽出ができるので便利です。例として下記に二つのテーブルを記載します。
a_table
ID | first_name | last_name | salary| |
---|---|---|---|
1 | taro | yamada | 200000 |
2 | jiro | suzuki | 220000 |
3 | sabro | kitano | 320000 |
4 | hanako | iwai | 110000 |
5 | matuko | dx | 250000 |
6 | yuta | abe | 540 |
b_table
ID | first_name | last_name | team |
---|---|---|---|
1 | taro | yamada | IT |
2 | jiro | suzuki | food |
3 | sabro | kitano | book |
4 | hanako | iwai | IT |
5 | matuko | dx | food |
6 | yuta | abe | IT |
これらを結合して必要な情報だけ抽出する場合下記の様な文になります。
SELECT a_table.first_name, b_table.team,
a_table.salary AS price
FROM a_table
JOIN b_table ON a_table.ID = b_table.ID;
すると下記の様な結果が抽出されます。
ID | first_name | price |
---|---|---|
1 | taro | 200000 |
2 | jiro | 220000 |
3 | sabro | 320000 |
4 | hanako | 110000 |
5 | matuko | 250000 |
6 | yuta | 540 |
内容が結合した上で必要なデータだけ抽出できるので便利ですね。
最後に
いやぁ...今回のところは割と難しかったですね。
今までの4大命令文は単文でしたがここからは複数の文が折り重なった長文になっていくのでレベル高いです。
ただまぁめげずに頑張ります。
今回もご覧いただきありがとうございました!
参照
https://products.sint.co.jp/siob/blog/what-is-sql-subquery#toc-1
エンジニアファーストの会社 株式会社CRE-CO iwanaga