【SQL基礎】ANY/ALL演算子による条件指定
本項では、ANY演算子、ALL演算子について説明していきます。
ANY/ALL演算子の基本構文
前回やったIN演算子は、値のリストもしくは副問い合わせの結果のいずれかと「等しい(=)」ものが判定できました。
副問い合わせとの比較だけですが、ANY演算子を使用すると、「等しい(=)」だけでなく、引数で渡された値といずれかが「対象 < 引数の値」であるなど、「=」以外の比較述語(=、!=、<>、<、<=、>、>=)を使用した比較を一度にすることができます。
副問い合わせについて詳しくは後述しますが、SQLでは、SQL文中にSELECT文を記述してその結果を元のSQL文で利用することができ機能があり、そのSQL文中に記述するSELECT文のことを副問い合わせといいます。
構文は下記になります。
対象 比較述語 ANY (副問い合わせ)
また、ALL演算子を使用すると、「いずれか」ではなく「すべて」の値が「対象 < 引数の値」であるなどの比較ができます。
構文は下記になります。
対象 比較述語 ALL (副問い合わせ)
注意点として、ANYやALLでの副問い合わせでは、複数のカラムを返すようなSELECT文を使用することはできません。
例えば下記のようなSELECT文です。
SELECT * FROM テーブル名; -- または SELECT カラム名1, カラム名2 FROM テーブル名;
使用できるのは下記のように一つのカラムを返すSELECT文のみになります。
SELECT カラム1 FROM テーブル名;
では、実際にやってみましょう。
使用するテーブルは引き続き下記になります。
まずは、ANY演算子で住所が東京都の人の誰かより年齢が上の人のデータを抽出していましょう
SELECT * FROM teachers WHERE age > ANY (SELECT age FROM teachers WHERE address = "東京都");
東京都の人の年齢は、25、26、29歳なので、このいずれかより上の26、27、28、29、30歳の人のデータが抽出されています。
では、今度は、上記SQLをALL演算子にしてやってみましょう。
SELECT * FROM teachers WHERE age > ALL (SELECT age FROM teachers WHERE address = "東京都");
今度は、25、26、29歳と比べて全てで年齢が上にならないといけないので30歳の人のデータのみが抽出されています。
今回の学習ポイント
・ANY/ALL演算子は。副問い合わせに対して比較述語(=、!=、<>、<、<=、>、>=)を使用した比較を一度にすることができる。
・ANY/ALL演算子で比較できる副問い合わせは、1つのカラムを返すだけの副問い合わせだけである。
練習問題
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。 [sql] CREATE DATABASE worldcup2014;
use worldcup2014
source C:\worldcup2014.sql
[/sql]