この記事では、弊社の新人エンジニア研修の参考にMySQLを解説します。
前回は、複数テーブルに対する検索を解説しました。
今回は、副問合せについて解説します。
1. 副問合せとは
あるSELECT文の結果を別のSQL文で利用することができます。
SQL文の中にSQL文を記述することになるため副問合せといいます。
1.1. 単一行副問合せ
入れ子にして埋め込んだSELECT文の結果が1行を返す場合の副問合せを単一行副問合せといいます。
例えば、以下の8_1.sqlはcarsテーブルから価格がもっとも高い商品のレコードを表示します。
SELECT
*
FROM
cars
WHERE
price = (SELECT
MAX(price)
FROM
cars);
<結果の例>

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


例えば、carsテーブルから価格が平均以上の商品のレコードを表示するには以下8_2.sqlのようにします。
SELECT
*
FROM
cars
WHERE
price >= (SELECT
AVG(price)
FROM
cars);
<結果の例>

1.2. 複数行副問合せ
複数テーブルを使った副問合せの例を紹介します。
入れ子にして埋め込んだSELECT文の結果が複数行を返す場合の副問合せを複数行副問合せといいます。
salesテーブルから一番最近購入したcustomer_idを抽出し、customersテーブルからその顧客のレコードを抽出してみます。
以下の8_3.sqlは、salesテーブルからクーペ(car_idは2)を購入したことのある顧客のcustomer_idとcustomer_nameを抽出します。
SELECT
customer_id, customers.name
FROM
customers
WHERE
customer_id IN (SELECT
customer_id
FROM
sales
WHERE
car_id = 2);
<結果の例>

上記の例では、クーペのcar_idが2であることをMySQLの操作者が知っていることが前提でした。
では、クーペのcar_idを知らず、ただ、クーペという名前のみを使って検索するにはどうしたら良いでしょうか?
もちろん、クーペのcar_idが2であることも副問合せを使って求めることもできます。
SELECT文を3つ重ねることになり複雑ですが、ゆっくり後ろの丸カッコ内のSQL文から順に解析すれば理解できるでしょう。
以下8_4.sqlは上記と同じ結果を得ます。
SELECT
customer_id, customers.name
FROM
customers
WHERE
customer_id IN (SELECT
customer_id
FROM
sales
WHERE
car_id = (SELECT
car_id
FROM
cars
WHERE
name = 'クーペ'));
以上、副問合せについて見てきました。
以上で、MySQLを使った新人エンジニアのためのデータベース講座は終了です。
最後までお読みいただきありがとうございます。
IT企業向け新人研修おすすめ資料 無料公開中 (saycon.co.jp)