結合に加えて、私が理解しにくかったのが、サブクエリ(副問合せ)です。
SQLをネストすることで、様々なデータを呼び出し結果を得ることができますが、考え方に慣れるまで、(私は)苦労しました、、
Pythonの時も、ネストで苦労したので、たぶんこういった考え方が苦手なんだろうなと思います、、、
本日は、副問合せについて、まとめていきたいと思います。
記事要約
- サブクエリ(副問合せ)とはなにか?について解説します。
- サブクエリ(副問合せ)の使い道について、解説しています。
- サンプルコードと動作確認を行います。
ネストについての解説は、以下の記事をご参照ください!!
目次
サブクエリ(副問合せ)とはなにか?を解説
サブクエリ(副問合せ)の定義
サブクエリ(副問合せ)とは、SQLをネストすることを指します。
SELECT 文で取得した検索結果に基づいて、他のSELECT文・UPDATE文を実行することで新たな表を作成する。操作のやり方です。
サブクエリを利用することで、複数のSQLを、1つにまとめることができ、可読性が上がります。
サブクエリ(副問合せ)のイメージ
サブクエリを使わない場合、どうなるか?
以下の図のように、フルーツや花に対して、金額を表す列を追加しました。
この表の中で、一番金額が高いフルーツはどれか?を調べるとしたら、どうしましょう。
一つずつ、SQLを実行するのもありです。
- price列から、一番値の大きいものを検索する。
- 検索した値で、別のSQLを実行する。
サブクエリを使う場合!
動作イメージ
- 図中の緑枠SQLがサブクエリ部分です。まずここが実行されます。
- では、【500】という値を保持している行は、どこでしょうか?
そうすると、price列の中で一番金額が大きいものは【500】です。
検索結果として、【500】と言う値を得ることができました。
それをSELECT文・Where句で検索しています。
ここまでの要約・補足!(どう言うときに使えて、メリットがあるか?)
動作イメージ
- 複数のSQLを一つにまとめることができる!
- 結合や、集合関数・分析関数を利用しなくても、表操作ができる!
- Where句だけではなく、Having句などと組み合わせることもできる!
基本構文とサンプル
基本的な書き方
SELECT 列① FROM テーブル名称①
WHERE 列① = ( 検索条件 )
事前準備(Priceテーブル)
create table Price(flower_ID integer primary key, flower_fruit text,family_ID integer, price integer);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(10,'バラ',10,150);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(20,'つつじ',20,200);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(30,'みかん',30,500);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(1,'りんご',10,120);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(2,'グレープフルーツ',30,150);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(3,'シャクナゲ',20,250);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(4,'ブルーベリー',20,370);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(5,'ソメイヨシノ',10,400);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(6,'桃',10,390);
insert into Price(flower_ID, flower_fruit,family_ID,price) values(7,'サザンクロス',30,450);
サンプルコード
select flower_fruit, price from price where price = (select max(price) from price);
動作確認
EOF
本日も、一緒に学習してくださって、ありがとうございました!
では、また!
①一番高い金額のフルーツを検索する。
②金額に紐づいている、フルーツの名前を検索する。
と、2つSQLを個別に実行しなくても、1つのSQLでどちらも実行できる。と言うことをイメージしていただけたら幸いです。