【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つのカラムを返すだけの副問い合わせだけである。


練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.zip

CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
1.ALL演算子と>演算子のみを使用して、日本(players.country = 12)の選手で体重(players.weight)が最も重い人よりも重い選手のデータを抽出してください。

答え
  • このエントリーをはてなブックマークに追加

PAGE TOP