【SQL基礎】複数行副問い合わせ
複数行副問い合わせ
本項では、「副問い合わせとは」の記事でご紹介した複数行副問い合わせについてご説明します。
複数行副問い合わせとは複数のレコードを主問い合わせに返す副問い合わせのことです。
単一行副問い合わせは結果として1行を戻すものでしたが、複数行を戻したい時に利用します。
基本的な複数行副問い合わせの書き方は以下の通りです。※WHERE句だけでなくFROM句でも記述できます。
SELECT 列名1, 列名2, …
FROM テーブル名
WHERE 列名 演算子 ( SELECT 列名 FROM テーブル名 [WHERE 条件式])
演算子には以下が使用できます。
IN | 副問い合わせが返した値のいずれかと等しいかを評価する |
EXISTS | 副問い合わせが返した値が存在するかを評価する |
ANY | 副問い合わせが返した値のいずれかの値を評価する |
ALL | 副問い合わせが返した値の全てを評価する |
では実際に複数行副問い合わせをやってみましょう。
今回は以下テーブル(テーブル名:teachersとclass)を使用します。
IN演算子
副問い合わせによって複数の値が返される場合はIN句を用いることで、副問い合わせによって返される値のうち、いずれかと一致するレコードを抽出することができます。
SELECT subject FROM class WHERE name IN (SELECT name FROM teachers WHERE address = '埼玉県');
EXISTS演算子
EXISTS句は副問い合わせによって返されたレコードが1つでもあれば真、1つもなければ偽を返します。
SELECT id,name FROM teachers WHERE EXISTS(SELECT code FROM class WHERE id = 1);
EXISTS句内のSELECT文でidを1に指定したことによって、タロウのデータだけが抽出されました。
ANY演算子
ANY句とSOME句は指定した値と副問い合わせの結果を比較する時に使用します。
比較演算子の条件が1つでも真になる場合は真、条件が全て偽になるとき偽になります。
SELECT id,name,students FROM teachers WHERE students > ANY (SELECT students FROM teachers WHERE id = 3) ;
まず副問い合わせによってid 3のstudents(12)データが返されます。次にANY句によって学生の数が12より多いレコードを抽出します。その結果id 2、5、6のデータが表示されました。
ALL演算子
ALL句は指定した値と副問い合わせの結果を比較する時に使用します。
比較演算子の条件が全て真になるとき真、条件が1つでも偽になるとき偽になります。
SELECT id,name,students FROM teachers WHERE students > ALL (SELECT students FROM teachers WHERE id = 2);
まず副問い合わせによってid 2の生徒数が返されます。次にALL句によって生徒数が14よりも多いレコードを抽出します。
この場合、生徒数が14よりも多いのはid 5と6なので、そのデータが表示されました。
今回の学習ポイント
・複数のレコードを主問い合わせに返す場合は複数行副問い合わせを使用する。
・副問い合わせが返す結果をどのように評価したいかで演算子を使い分ける。
練習問題
問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。
[sql]CREATE DATABASE worldcup2014;
USE worldcup2014;
Source C</span>/worldcup2014.sql
[/sql]
- ANYを使った複数行副問い合わせで日本よりランキングが上の国を表示する。(使用するテーブル:countries)
以上、複数行副問い合わせについてでした。