Developer

【SQL基礎】ANY/ALL演算子による条件指定
2020.12.28
Lv1

【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

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

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

答え
[sql] SELECT *
FROM players
WHERE weight > ALL (SELECT weight
FROM players
WHERE country_id = 12);
[/sql]


※画像はSELECT結果の一部物を表示しています。

ALL演算子は、比較対象と副問い合わせの結果に対して指定した比較演算子で比較して、結果が全てTRUEならTRUEとなるので、結果的に日本選手の体重の最大値と比較した結果と同じになります。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ