この記事では、弊社の新人エンジニア研修の参考にMySQLを解説します。

前回は、複数テーブルに対する検索を解説しました。

今回は、副問合せについて解説します。

1. 副問合せとは

あるSELECT文の結果を別のSQL文で利用することができます。

SQLの中にSQLを記述することになるため副問合せといいます。

1.1. 単一行副問合せ

入れ子にして埋め込んだSELECT文の結果が1行を返す場合の副問合せを単一行副問合せといいます

単一行副問合せの構文

SELECT 列名1,列名2, ... FROM 表名1

WHERE 列名 = (SELECT 列名 FROM 表名2 WHERE 抽出条件);

※このとき表名1,2は同じでも可

※ 列名 の後ろには=以外にも単一行比較演算子(<, <=, >, >=, !=)が使用可

例えば、以下の8_1.sqlはcarsテーブルから価格がもっとも高い商品のレコードを表示します。

結果は下図8.1の通りです。

新人エンジニア研修
図8.1

このときコツはまず、()の中の副問い合わせ部分を先に実行して結果を確認することです。

MySQL Workbenchを使っていると下図8.2のように、()の中のSQL文をドラッグして選択状態にした上で稲妻アイコンをクリックすることで副問い合わせ部分だけを実行することができますので試してみてください。

8_2
図8.2 副問合せのカッコだけを実行する

例えば、carsテーブルから価格が平均以上の商品のレコードを表示するには以下8_2.sqlのようにします。

結果は下図8.3の通りです。

新人エンジニア研修
図8.3

1.2. 複数行副問合せ

複数テーブルを使った副問合せの例を紹介します。

入れ子にして埋め込んだSELECT文の結果が複数行を返す場合の副問合せを複数行副問合せといいます。

salesテーブルから一番最近購入したcustomer_idを抽出し、customersテーブルからその顧客のレコードを抽出してみます。

複数行副問合せの構文

SELECT 列名1,列名2, ... FROM 表名1

WHERE 列名 IN (SELECT 列名 FROM 表名2 WHERE 抽出条件);

※このとき表名1,2は同じでも可

※ 列名 の後ろにはIN以外にもNOT INが使用可

以下の8_3.sqlは、salesテーブルからクーペ(car_idは2)を購入したことのある顧客のcustomer_idとcustomer_nameを抽出してみます。

結果は下図8.4の通りです。

8_4sql
図8.4

さらには、クーペのcar_idが2であることも副問合せを使って求めることもできます。

SELECT文を3つ重ねることになり複雑ですが、ゆっくり後ろのSQLから順に解析すれば理解できるでしょう。

以下8_4.sqlは上記と同じ結果を得ます。

<まとめ:隣の人に正しく説明できたらチェックを付けましょう>

□ あるSELECT文の結果を別のSQL文で利用することを副問合せという

□入れ子にして埋め込んだSELECT文の結果が1行を返す場合の副問合せを単一行副問合せという

□入れ子にして埋め込んだSELECT文の結果が複数行を返す場合の副問合せを複数行副問合せという

以上、副問合せについて見てきました。

以上で、MySQLを使った新人エンジニアのためのデータベース講座は終了です。

最後までお読みいただきありがとうございます。

データベース(MySQL)へ戻る