0
0

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 1 year has passed since last update.

SQLを学びます。⑧

Posted at

こんにちは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

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?