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);