【SQLite3】サブクエリ(副問合せ)を、順番に理解しながら動作確認する。

PCで仕事をしている人

結合に加えて、私が理解しにくかったのが、サブクエリ(副問合せ)です。

SQLをネストすることで、様々なデータを呼び出し結果を得ることができますが、考え方に慣れるまで、(私は)苦労しました、、

Pythonの時も、ネストで苦労したので、たぶんこういった考え方が苦手なんだろうなと思います、、、

本日は、副問合せについて、まとめていきたいと思います。

記事要約
  1. サブクエリ(副問合せ)とはなにか?について解説します。
  2. サブクエリ(副問合せ)の使い道について、解説しています。
  3. サンプルコードと動作確認を行います。

ネストについての解説は、以下の記事をご参照ください!!

【Python】タプルの補足(編集可否)と、コレクションの応用(ネスト)

2022年10月24日

目次

サブクエリ(副問合せ)とはなにか?を解説

サブクエリ(副問合せ)の定義

サブクエリ(副問合せ)とは、SQLをネストすることを指します。

SELECT 文で取得した検索結果に基づいて、他のSELECT文・UPDATE文を実行することで新たな表を作成する。操作のやり方です。

サブクエリを利用することで、複数のSQLを、1つにまとめることができ、可読性が上がります。

サブクエリ(副問合せ)のイメージ

サブクエリを使わない場合、どうなるか?

以下の図のように、フルーツや花に対して、金額を表す列を追加しました。

この表の中で、一番金額が高いフルーツはどれか?を調べるとしたら、どうしましょう。

一つずつ、SQLを実行するのもありです。

  1. price列から、一番値の大きいものを検索する。
  2. 検索した値で、別のSQLを実行する。

サブクエリを使う場合!

動作イメージ
  1. 図中の緑枠SQLがサブクエリ部分です。まずここが実行されます。
  2. そうすると、price列の中で一番金額が大きいものは【500】です。
    検索結果として、【500】と言う値を得ることができました。

  3. では、【500】という値を保持している行は、どこでしょうか?
  4. それをSELECT文・Where句で検索しています。

禄太
今回の作図は、いまいちかな、、と言うのは重々承知しています。

①一番高い金額のフルーツを検索する。
②金額に紐づいている、フルーツの名前を検索する。

と、2つSQLを個別に実行しなくても、1つのSQLでどちらも実行できる。と言うことをイメージしていただけたら幸いです。

ここまでの要約・補足!(どう言うときに使えて、メリットがあるか?)

動作イメージ
  1. 複数のSQLを一つにまとめることができる!
  2. 結合や、集合関数・分析関数を利用しなくても、表操作ができる!
  3. 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

本日も、一緒に学習してくださって、ありがとうございました!

では、また!