【楽しく学ぶSQL入門】第7章:副問い合わせ

公開日:
更新日:

システム開発の現場では、複雑な条件を満たすデータを抽出するために、複数のクエリを組み合わせたい場面によく遭遇します。SQL文の中にSELECT文をネストする、このようなSQL文のことを副問い合わせ副照会サブクエリなどと呼びます。非常に便利な構文ですが、少しややこしくなるのできちんと理解しておきましょう。

参考サイト:MySQL 公式サイト(サブクエリ)

副問い合わせは検索結果の種類によって主に3パターンに分類されます。それぞれの特徴と具体的な記述スタイルを以下のようにまとめました。

単一行副問い合わせ

検索結果が、「1行1列の値」となる副問い合わせ。単一の値を記述するような場所であれば、基本的にどこでも記述することが可能。

特定の数値を直接書き込む代わりに、別のクエリの計算結果をそのまま代入するイメージです。実際の記述例を確認してみましょう。

① 例)収支テーブルからID = 1と同じ費目の出費を取得する。

SELECT expense, expenditure
FROM income_and_expenditure
WHERE expense = (SELECT expense
FROM income_and_expenditure
WHERE id = 1);

expense expenditure
飲食費 1000
飲食費 500

② 例)収支テーブルから費目が飲食費の日付と出費額と飲食費合計を取得する。

SELECT income_and_expenditure_date, expenditure, 
(SELECT SUM(expenditure)     
 FROM income_and_expenditure
 WHERE expense = '飲食費') AS '飲食費合計'
FROM income_and_expenditure
WHERE expense = '飲食費';

date expenditure 飲食費合計
2026/05/11 1000 1500
2026/05/12 500 1500

複数列副問い合わせ

検索結果が、「複数の行から成る単一列の値」となる副問い合わせ。SQL文中で複数の値を列挙するような場所に、その代わりとして記述することが可能で、IN演算子を用いた条件式が代表的な事例です。

条件に合致する複数の候補リストを、内側のクエリが自動的に作成してくれます。

③ 例)収支テーブルから5000円以上の出費があった費目の全ての収支情報を取得する。

SELECT *
FROM income_and_expenditure
WHERE expense IN (SELECT DISTINCT expense
FROM income_and_expenditure
WHERE expenditure >= 5000);

id expense expenditure remarks
1 交通費 5400 大阪出張移動費
2 交通費 800 近隣交通費
3 宿泊費 8500 ホテル宿泊代

表形式の副問い合わせ

検索結果が、「複数行と複数の列から成る表形式」となる副問い合わせ。通常のSQL文において表を記述することのできる場所、例えばSELECT文のFROM句などに記述します。

クエリによって一時的に作られた仮想のテーブルを、外側のSELECT文でさらに加工するような柔軟なデータ操作を実現できます。

④ 例)費目が交通費と定期代の出費額の合計を取得する。

SELECT SUM(SUB.expenditure)
FROM (SELECT *
FROM income_and_expenditure
WHERE expense IN('交通費', '定期代')) AS SUB;

SUM(SUB.expenditure)
15400

お問い合わせ

CONTACT

業務システムに関するお困りごと、WEBサイトの制作など、
まずはお気軽にお問い合わせください。

会員サイト
CONTACT
06-6305-2278
採用サイトはこちらRECRUIT