SELECTの結果を条件式の条件値にしたり、SELECTの結果に対して、さらにSELECTしたい場合があります。
SQLサブクエリ(副問い合わせ)を利用すると上記を実現できます。
WHERE句で判定する条件をレコードの問い合わせ結果を使う場合に利用します。
SELECT (列名) FROM (テーブル名) WHERE (条件式列名) > (SELECT (関数等) FROM (テーブル名))
SELECT (列名) FROM (テーブル名) WHERE (条件式列名) > (SELECT (列名) FROM (テーブル名))
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products)
SELECT文で抽出した結果に対し、さらにソートやJOIN、結果の編集などをする場合に利用します。
主問い合わせの列名でサブクエリの列名を正しく参照するために、サブクエリの後には as エイリアス名
を記述する必要があります。
SELECT (列名) FROM (SELECT (列名) FROM (テーブル名) WHERE (条件式) ) AS (エイリアス名)
SELECT (列名) FROM (SELECT (列名) FROM (テーブル名) WHERE (条件式) ) AS (エイリアス名) WHERE (条件式)
列にレコードの値をもとにした演算結果を表示する場合などに利用します。
SELECT (列名... (SELECT (関数) FROM (テーブル名) ) FROM (テーブル名)
SELECT (列名... (SELECT (関数) FROM (テーブル名) WHERE (条件式)) FROM (テーブル名)
HAVING句の詳細はこちらの記事を参照して下さい。
id | model | name | category | price |
---|---|---|---|---|
1 | C-XM01 | モーダンチェア | チェア | 56000 |
2 | X-XD05 | ラージデスク | テーブル | 87000 |
3 | A-DA40 | ラウンドダイニングチェア | チェア | 28000 |
4 | O-XX100 | ナチュラルオフィス | チェア | 13800 |
5 | R-D400 | ラウンドダイニングテーブル | テーブル | 128000 |
6 | R7000 | ウッドキャビネット | その他 | 32000 |
上記のテーブルでpriceの平均値より高いpriceの値を持つレコードを列挙する場合は以下のSQLを実行します。(下記のうちどちらでも可)
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products)
SELECT * FROM products WHERE price > (SELECT AVG(price) AS average FROM products)
結果は以下になります。
id | model | name | category | price |
---|---|---|---|---|
2 | X-XD05 | ラージデスク | テーブル | 87000 |
5 | R-D400 | ラウンドダイニングテーブル | テーブル | 128000 |