SQL ANY, ALL 演算子

SQL ANY および ALL 演算子

ANY および ALL 演算子は、単一の列の値と他の値の範囲との間で比較を行うことを可能にします。

SQL ANY 演算子

ANY 演算子:

  • 結果としてブール値を返します
  • サブクエリの値のうち、条件を満たすものがある場合は TRUE を返します
  • ANY は、範囲内の値のいずれかに対して操作が真である場合に条件が真になります

ANY 構文

SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
  (SELECT column_name
  FROM table_name
  WHERE condition);

SQL ALL 演算子

ALL 演算子:

  • 結果としてブール値を返します
  • サブクエリの値のすべてが条件を満たす場合は TRUE を返します
  • SELECT、WHERE、HAVING 文と共に使用されます
  • ALL は、範囲内のすべての値に対して操作が真である場合に条件が真になります

SELECT での ALL 構文

SELECT ALL column_name(s)
FROM table_name
WHERE condition;

WHERE もしくは HAVING での ALL 構文

SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
  (SELECT column_name
  FROM table_name
  WHERE condition);

デモデータベース

以下は、Northwind サンプルデータベースの “Products” テーブルからの選択です:

ProductID ProductName SupplierID CategoryID Unit Price
1 Chais 1 1 10 boxes x 20 bags 18
2 Chang 1 1 24 – 12 oz bottles 19
3 Aniseed Syrup 1 2 12 – 550 ml bottles 10
4 Chef Anton’s Cajun Seasoning 2 2 48 – 6 oz jars 22
5 Chef Anton’s Gumbo Mix 2 2 36 boxes 21.35
6 Grandma’s Boysenberry Spread 3 2 12 – 8 oz jars 25
7 Uncle Bob’s Organic Dried Pears 3 7 12 – 1 lb pkgs. 30
8 Northwoods Cranberry Sauce 3 2 12 – 12 oz jars 40
9 Mishi Kobe Niku 4 6 18 – 500 g pkgs. 97

そして “OrderDetails” テーブルからの選択です:

OrderDetailID OrderID ProductID Quantity
1 10248 11 12
2 10248 42 10
3 10248 72 5
4 10249 14 9
5 10249 51 40
6 10250 41 10
7 10250 51 35
8 10250 65 15
9 10251 22 6
10 10251 57 15

SQL ANY の例

以下の SQL 文は、OrderDetails テーブル内のいずれかのレコードの Quantity が 10 と等しい場合、ProductName をリストアップします(これは Quantity 列に値が 10 のレコードがいくつかあるため、TRUE を返します):

SELECT ProductName
FROM Products
WHERE ProductID = ANY
  (SELECT ProductID
  FROM OrderDetails
  WHERE Quantity = 10);

以下の SQL 文は、OrderDetails テーブル内のいずれかのレコードの Quantity が 99 より大きい場合、ProductName をリストアップします(これは Quantity 列に値が 99 より大きいレコードがいくつかあるため、TRUE を返します):

SELECT ProductName
FROM Products
WHERE ProductID = ANY
  (SELECT ProductID
  FROM OrderDetails
  WHERE Quantity > 99);

以下の SQL 文は、OrderDetails テーブル内のいずれかのレコードの Quantity が 1000 より大きい場合、ProductName をリストアップします(これは Quantity 列に値が 1000 より大きいレコードが存在しないため、FALSE を返します):

SELECT ProductName
FROM Products
WHERE ProductID = ANY
  (SELECT ProductID
  FROM OrderDetails
  WHERE Quantity > 1000);

SQL ALL の例

以下の SQL 文は、すべての製品名をリストアップします:

SELECT ALL ProductName
FROM Products
WHERE TRUE;

以下の SQL 文は、OrderDetails テーブル内のすべてのレコードの Quantity が 10 と等しい場合、ProductName をリストアップします。当然ですが、Quantity 列にはさまざまな値があります(10 の値だけではないため、FALSE を返します):

SELECT ProductName
FROM Products
WHERE ProductID = ALL
  (SELECT ProductID
  FROM OrderDetails
  WHERE Quantity = 10);