今回はSQL文の内部に別のSELECT文を記述する副問い合わせ
について説明していきたいと思います!!副問合わせの機能を用いることで、1つのSQL文で2つ以上の処理
を行うことができます。
過去の関連投稿
「SQLの基礎について学ぶ#01」
「SQLの基礎について学ぶ#02」
「SQLの基礎について学ぶ#03」
「SQLの基礎について学ぶ#04」
「SQLの基礎について学ぶ#05」
「SQLの基礎について学ぶ#06」
「SQLの基礎について学ぶ#07」
1. 検索結果に対して結果表を操作する
accountテーブル
date(日付) | name(項目名) | price(金額) |
---|---|---|
2020-12-03 | 食費 | 800 |
2021-01-03 | 交通費 | 600 |
2021-05-22 | 食費 | 1000 |
2021-03-14 | 日用品 | 1400 |
① 2つのSELECT文が必要な例
例:最も大きい金額とその項目名を取得する
SELECT MAX(price) FROM account /* 1行目のSELECT文の結果 => 1400 */
SELECT name, price FROM account
WHERE price = 1400 /* 1行目のSELECT文の結果(1400)を記述 */
結果
name | price |
---|---|
日用品 | 1400 |
▶ 1つめのSELECT文で最も大きい金額1400円を取得 | |
▶ 2つめのSELECT文で金額1400円に対応する項目名を取得 |
② SELECTのネスト
①では2つのSQL文を用いましたが、1つのSQL文で①を記述する
ことができます。
SELECT name, price FROM account
WHERE price = ( SELECT MAX(price) FROM account ) /* SELECT文をネスト */
結果
①の結果と同じ
▶ このように、ある構造に対して別の構造が含まれていることをネスト構造
や入れ子構造
と呼びます。
▶ SQL文の一部として含まれているSELECT文のことを副問合わせ
、副照会
、サブスクエリ
と呼びます。
▶ ほかのSQL文の一部として登場する副問い合わせ
は、丸括弧()
で閉じます。
③ 副問合わせの処理
SELECT name, price FROM account
WHERE price = ( SELECT MAX(price) FROM account ) /* SELECT文をネスト */
副問合せの動作は、丸括弧()で囲まれているSELECT文
が先に実行されて結果に化けた後に外側のSQL文
が実行されます。
2. 副問い合わせの3パターン
① 単一の値の代わりとして、服問い合わせの検索結果を用いるパターン
price(金額) |
---|
1000 |
▶ 検索結果が1行1列の値 となる副問合わせ |
▶ SELECT文の選択列リスト やFROM句 、UPDATEのSET句 に使用できる。また、1つの値の判定を行うWHERE句の条件式 としても使用 |
② 複数の値の代わりとして、服問い合わせの検索結果を用いるパターン
price(金額) |
---|
800 |
600 |
1000 |
1400 |
▶ 検索結果がn行1列の値 となる副問合わせ(n>1) |
▶ SELECT文の選択列リスト やFROM句 に使用できる。また、複数の値の判定を行うWHERE句の条件式 としても使用 |
③ 表の値の代わりとして、服問い合わせの検索結果を用いるパターン
name(項目名) | price(金額) |
---|---|
食費 | 800 |
交通費 | 600 |
食費 | 1000 |
日用品 | 1400 |
▶ 検索結果がn行m列の値 となる副問合わせ(n>1, m>1) |
|
▶ SELECT文 、FROM句 、INSERT文 に使用 |
3. まとめ
今回は以上になります。副問合せの3パターン
については、次回の投稿以降に例文(SQL文)を示して説明していきたいと思います。
何か間違い等ありましたら、コメントお願いします。引き続きSQLについて学んでいきたいと思います。