SQL BETWEEN 演算子

BETWEEN 演算子は指定された範囲内の値を選択します。値は数字、テキスト、または日付などがあります。

BETWEEN 演算子は両端を含みます:開始値と終了値が含まれます。

価格が 10 から 20 の間のすべての製品を選択します:

SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20;

構文

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

デモデータベース

以下は、例に使用される 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

NOT BETWEEN

前の例の範囲外の製品を表示するには、NOT BETWEEN を使用します:

SELECT * FROM Products
WHERE Price NOT BETWEEN 10 AND 20;

BETWEEN と IN

以下の SQL 文は、価格が 10 から 20 の間であり、CategoryID が 1、2、または 3 のいずれかであるすべての製品を選択します:

SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20
AND CategoryID IN (1,2,3);

BETWEEN テキスト値

以下の SQL 文は、ProductName が ‘Carnarvon Tigers’ と ‘Mozzarella di Giovanni’ の間の製品をすべて選択します(アルファベット順):

SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;

以下の SQL 文は、ProductName が ‘Carnarvon Tigers’ と “Chef Anton’s Cajun Seasoning” の間の製品をすべて選択します:

SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND "Chef Anton's Cajun Seasoning"
ORDER BY ProductName;

NOT BETWEEN テキスト値

以下の SQL 文は、ProductName が ‘Carnarvon Tigers’ と ‘Mozzarella di Giovanni’ の間にない製品をすべて選択します:

SELECT * FROM Products
WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;

BETWEEN 日付

以下の SQL 文は、OrderDate が ‘1996-07-01’ から ‘1996-07-31’ の間のすべての注文を選択します:

SELECT * FROM Orders
WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-31';

または:

SELECT * FROM Orders
WHERE OrderDate BETWEEN #07/01/1996# AND #07/31/1996#;

サンプルテーブル

以下は、例に使用される Orders テーブルからの選択です:

OrderID CustomerID EmployeeID OrderDate ShipperID
10248 90 5 7/4/1996 3
10249 81 6 7/5/1996 1
10250 34 4 7/8/1996 2
10251 84 3 7/9/1996 1
10252 76 4 7/10/1996 2

SQL IN 演算子

IN 演算子を使用すると、WHERE 句で複数の値を指定できます。

IN 演算子は、複数の OR 条件の短縮形です。

‘Germany’、’France’、または ‘UK’ のすべての顧客を返します:

SELECT * FROM Customers
WHERE Country IN ('Germany', 'France', 'UK');

構文

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);

デモデータベース

以下は、例に使用される Customers テーブルからの選択です:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

NOT IN

IN 演算子の前に NOT キーワードを使用することで、リスト内のどれにも該当しないすべてのレコードを返します。

‘Germany’、’France’、または ‘UK’ 以外のすべての顧客を返します:

SELECT * FROM Customers
WHERE Country NOT IN ('Germany', 'France', 'UK');

IN (SELECT)

IN をサブクエリと組み合わせて WHERE 句で使用することもできます。

サブクエリを使用すると、主クエリの結果に含まれるサブクエリの結果がすべて返されます。

Orders テーブルに注文があるすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerID IN (SELECT CustomerID FROM Orders);

NOT IN (SELECT)

前述の例での結果は 74 レコードを返しました。これは、注文をしていない顧客が 17 人いることを意味します。

それが正しいかどうかを確認するために、NOT IN 演算子を使用してみましょう。

Orders テーブルに注文をしていないすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerID NOT IN (SELECT CustomerID FROM Orders);

SQL ワイルドカード文字

ワイルドカード文字は文字列内の一つ以上の文字を置き換えるために使用されます。

ワイルドカード文字は LIKE 演算子と一緒に使用されます。LIKE 演算子は、列内の指定されたパターンを検索するために WHERE 句で使用されます。

「a」で始まるすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';

ワイルドカード文字

シンボル 説明
% ゼロ個以上の任意の文字を表します。
_ 一つの任意の文字を表します。
[] 角かっこ内の任意の一文字と一致します。
^ 角かっこ内にない任意の文字に一致します。
指定された範囲内の任意の一文字に一致します。
{} エスケープされた任意の文字に一致します。

* PostgreSQL および MySQL データベースではサポートされていません。

** Oracle データベースのみでサポートされています。

デモデータベース

以下は、例に使用される Customers テーブルからの選択です:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

% ワイルドカードの使用

% ワイルドカードは、ゼロ個以上の文字、すなわち任意の数の文字を表します。

「es」で終わるすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE '%es';

「mer」を含むすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE '%mer%';

_ ワイルドカードの使用

_ ワイルドカードは、一つの任意の文字を表します。

それはどんな文字や数字でも構いませんが、各 _ は一つの文字だけを表します。

どんな文字で始まる「ondon」を含む都市のすべての顧客を返します:

SELECT * FROM Customers
WHERE City LIKE '_ondon';

「L」で始まり、どんな3文字でもいい、「on」で終わる都市のすべての顧客を返します:

SELECT * FROM Customers
WHERE City LIKE 'L___on';

[] ワイルドカードの使用

[] ワイルドカードは、角かっこ内のどれかの文字に一致する場合に結果を返します。

「b」、「s」、または「p」で始まるすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE '[bsp]%';

– ワイルドカードの使用

– ワイルドカードは、角かっこ内の指定された範囲の文字に一致します。

「a」、「b」、「c」、「d」、「e」、「f」で始まるすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE '[a-f]%';

ワイルドカードの組み合わせ

任意のワイルドカード(例:% および _)は、他のワイルドカードと組み合わせて使用できます。

「a」で始まり、少なくとも3文字の長さの顧客をすべて返します:

SELECT * FROM Customers
WHERE CustomerName LIKE 'a__%';

2番目の位置に「r」を含むすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE '_r%';

ワイルドカードなし

ワイルドカードが指定されていない場合、フレーズは完全一致する必要があります。

スペインからのすべての顧客を返します:

SELECT * FROM Customers
WHERE Country LIKE 'Spain';

Microsoft Access ワイルドカード

Microsoft Access データベースには他のワイルドカードもあります:

シンボル 説明
* ゼロ個以上の文字を表します。 bl* は bl、black、blue、および blob を見つけます。
? 一つの文字を表します。 h?t は hot、hat、および hit を見つけます。
[] 角かっこ内の任意の一文字と一致します。 h[oa]t は hot および hat を見つけますが、hit は見つけません。
! 角かっこ内にない任意の一文字に一致します。 h[!oa]t は hit を見つけますが、hot および hat は見つけません。
指定された範囲内の任意の一文字に一致します。 c[a-b]t は cat および cbt を見つけます。
# 一つの数値文字に一致します。 2#5 は 205、215、225、235、245、255、265、275、285、および 295 を見つけます。

SQL LIKE 演算子

LIKE 演算子は、指定されたパターンを列で検索するための WHERE 句で使用されます。

LIKE 演算子と一緒によく使用されるワイルドカードには、次の2つがあります:

ワイルドカードについての詳細は、次の章で学びます。

「a」で始まるすべての顧客を選択します:

SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';

構文

SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;

デモデータベース

以下は、例に使用される Customers テーブルからの選択です:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

_ ワイルドカード

_ ワイルドカードは、一つの任意の文字を表します。

それはどんな文字や数字でも構いませんが、各 _ は一つの文字だけを表します。

‘L’ で始まり、1つのワイルドカード文字が続き、’nd’ が後に続き、さらに2つのワイルドカード文字が続く都市からのすべての顧客を返します:

SELECT * FROM Customers
WHERE city LIKE 'L_nd__';

% ワイルドカード

% ワイルドカードは、ゼロ個以上の文字、すなわち任意の数の文字を表します。

‘L’ を含む都市からのすべての顧客を返します:

SELECT * FROM Customers
WHERE city LIKE '%L%';

指定文字で始まるもの

特定の文字またはフレーズで始まるレコードを返すには、文字またはフレーズの末尾に % を追加します。

‘La’ で始まるすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE 'La%';

ヒント:AND または OR 演算子を使用して任意の数の条件を組み合わせることができます。

‘a’ で始まる顧客または ‘b’ で始まる顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE 'a%' OR CustomerName LIKE 'b%';

指定文字で終わるもの

特定の文字またはフレーズで終わるレコードを返すには、文字またはフレーズの先頭に % を追加します。

‘a’ で終わるすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE '%a';

ヒント:「始まりが」や「終わりが」を組み合わせることもできます。

‘b’ で始まり、’s’ で終わるすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE 'b%s';

含むもの

特定の文字またはフレーズを含むレコードを返すには、文字またはフレーズの両端に % を追加します。

‘or’ を含むすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE '%or%';

ワイルドカードの組み合わせ

任意のワイルドカード(例:% および _)は、他のワイルドカードと組み合わせて使用できます。

‘a’ で始まり、少なくとも3文字の長さの顧客をすべて返します:

SELECT * FROM Customers
WHERE CustomerName LIKE 'a__%';

2番目の位置に「r」を含むすべての顧客を返します:

SELECT * FROM Customers
WHERE CustomerName LIKE '_r%';

ワイルドカードなし

ワイルドカードが指定されていない場合、フレーズは完全一致する必要があります。

スペインからのすべての顧客を返します:

SELECT * FROM Customers
WHERE Country LIKE 'Spain';

SQL AVG() 関数

AVG() 関数は数値列の平均値を返します。

すべての製品の平均価格を見つけます:

SELECT AVG(Price)
FROM Products;

注意:NULL 値は無視されます。

構文

SELECT AVG(column_name)
FROM table_name
WHERE condition;

デモデータベース

以下は、例に使用される 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

WHERE 句の追加

条件を指定するために WHERE 句を追加することができます:

SELECT AVG(Price)
FROM Products
WHERE CategoryID = 1;

エイリアスの使用

AVG 列に名前を付けるために AS キーワードを使用します。

SELECT AVG(Price) AS [average price]
FROM Products;

平均価格を超えるものを選択

平均価格より高い価格のすべてのレコードをリストアップするには、サブクエリ内で AVG() 関数を使用します:

SELECT * FROM Products
WHERE price > (SELECT AVG(price) FROM Products);

GROUP BY と AVG() の使用

ここでは、AVG() 関数と GROUP BY 句を使用して、Products テーブル内の各カテゴリの平均価格を返します:

SELECT AVG(Price) AS AveragePrice, CategoryID
FROM Products
GROUP BY CategoryID;

SQL SUM() 関数

SUM() 関数は数値列の合計を返します。

OrderDetails テーブルのすべての Quantity フィールドの合計を返します:

SELECT SUM(Quantity)
FROM OrderDetails;

構文

SELECT SUM(column_name)
FROM table_name
WHERE condition;

デモデータベース

以下は、例に使用される 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

WHERE 句の追加

条件を指定するために WHERE 句を追加することができます:

SELECT SUM(Quantity)
FROM OrderDetails
WHERE ProductId = 11;

エイリアスの使用

AS キーワードを使用して合計された列に名前を付けます。

SELECT SUM(Quantity) AS total
FROM OrderDetails;

GROUP BY と SUM() の使用

ここでは、SUM() 関数と GROUP BY 句を使用して、OrderDetails テーブル内の各 OrderID の Quantity を返します:

SELECT OrderID, SUM(Quantity) AS [Total Quantity]
FROM OrderDetails
GROUP BY OrderID;

SUM() に式を使用する

SUM() 関数内のパラメータは式にすることもできます。

例えば、OrderDetails 列の各製品が10ドルであると仮定した場合、数量を10倍してドルでの合計収入を見つけることができます:

SELECT SUM(Quantity * 10)
FROM OrderDetails;

また、OrderDetails テーブルを Products テーブルと結合して実際の金額を見つけることもできます:

SELECT SUM(Price * Quantity)
FROM OrderDetails
LEFT JOIN Products ON OrderDetails.ProductID = Products.ProductID;

SQL COUNT() 関数

COUNT() 関数は指定された条件に一致する行の数を返します。

Products テーブル内の合計行数を見つける:

SELECT COUNT(*)
FROM Products;

構文

SELECT COUNT(column_name)
FROM table_name
WHERE condition;

デモデータベース

以下は、例に使用される 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

列の指定

*

WHERE 句の追加

条件を指定するために WHERE 句を追加することができます:

SELECT COUNT(ProductID)
FROM Products
WHERE Price > 20;

重複の無視

COUNT() 関数で DISTINCT キーワードを使用して重複を無視することができます。

SELECT COUNT(DISTINCT Price)
FROM Products;

エイリアスの使用

AS キーワードを使用してカウントされた列に名前を付けます。

SELECT COUNT(*) AS [Number of records]
FROM Products;

GROUP BY と COUNT() の使用

ここでは、COUNT() 関数と GROUP BY 句を使用して、Products テーブル内の各カテゴリのレコード数を返します:

SELECT COUNT(*) AS [Number of records], CategoryID
FROM Products
GROUP BY CategoryID;

SQL MIN() と MAX() 関数

MIN() 関数は選択した列の最小値を返します。

MAX() 関数は選択した列の最大値を返します。

MIN 関数の例

Price 列で最も低い価格を見つける:

SELECT MIN(Price)
FROM Products;

MAX 関数の例

Price 列で最も高い価格を見つける:

SELECT MAX(Price)
FROM Products;

構文

SELECT MIN(column_name)
FROM table_name
WHERE condition;

SELECT MAX(column_name)
FROM table_name
WHERE condition;

デモデータベース

以下は、例に使用される 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

列名の設定(別名)

MIN() や MAX() を使用すると、返される列には説明的な名前が付きません。列に説明的な名前を付けるには、AS キーワードを使用します:

SELECT MIN(Price) AS SmallestPrice
FROM Products;

GROUP BY と MIN() の使用

ここでは、MIN() 関数と GROUP BY 句を使用して、Products テーブル内の各カテゴリの最小価格を返します:

SELECT MIN(Price) AS SmallestPrice, CategoryID
FROM Products
GROUP BY CategoryID;

SQL集約関数

集約関数は、値のセットに対して計算を行い、単一の値を返す関数です。

集約関数はしばしばSELECT文のGROUP BY句と共に使用されます。GROUP BY句は結果セットを値のグループに分割し、集約関数は各グループに対して単一の値を返すために使用されます。

最も一般的に使用されるSQL集約関数は以下の通りです:

集約関数はnull値を無視します(COUNT()を除く)。

SQL SELECT TOP句

SELECT TOP句は、返されるレコードの数を指定するために使用されます。

大規模なテーブルに対しては特に有用であり、パフォーマンスに影響を与えることがあります。

Customersテーブルの最初の3件のみを選択します:

SELECT TOP 3 * FROM Customers;

ヒント: SELECT TOP句はすべてのデータベースシステムでサポートされているわけではありません。MySQLではLIMIT句、OracleではFETCH FIRST n ROWS ONLYやROWNUMが使用されます。

SQL Server / MS Accessの構文:

SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;

MySQLの構文:

SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;

Oracle 12の構文:

SELECT column_name(s)
FROM table_name
ORDER BY column_name(s)
FETCH FIRST number ROWS ONLY;

古いバージョンのOracleでは以下のように記述します:

SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;

ORDER BYを使用する古いOracleの構文:

SELECT *
FROM (SELECT column_name(s) FROM table_name ORDER BY column_name(s))
WHERE ROWNUM <= number;

デモデータベース

以下は、例で使用されるCustomersテーブルの一部です:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

LIMIT

以下のSQL文は、MySQLでの例を示しています:

Customersテーブルの最初の3件を選択します:

SELECT * FROM Customers
LIMIT 3;

FETCH FIRST

以下のSQL文は、Oracleでの例を示しています:

Customersテーブルの最初の3件を選択します:

SELECT * FROM Customers
FETCH FIRST 3 ROWS ONLY;

SQL TOP PERCENTの例

以下のSQL文は、”Customers”テーブルから最初の50%のレコードを選択します(SQL Server/MS Access用):

SELECT TOP 50 PERCENT * FROM Customers;

以下のSQL文は、Oracleでの等価例を示しています:

SELECT * FROM Customers
FETCH FIRST 50 PERCENT ROWS ONLY;

WHERE句の追加

以下のSQL文は、SQL Server/MS Accessで”Country”が”Germany”である最初の3件のレコードを選択します:

SELECT TOP 3 * FROM Customers
WHERE Country='Germany';

以下のSQL文は、MySQLでの等価例を示しています:

SELECT * FROM Customers
WHERE Country='Germany'
LIMIT 3;

以下のSQL文は、Oracleでの等価例を示しています:

SELECT * FROM Customers
WHERE Country='Germany'
FETCH FIRST 3 ROWS ONLY;

ORDER BYキーワードの追加

結果をソートして最初の3件を返す場合は、ORDER BYキーワードを追加します。

SQL ServerとMS Access用:

顧客名(CustomerName)を逆アルファベット順にソートし、最初の3件を返します:

SELECT TOP 3 * FROM Customers
ORDER BY CustomerName DESC;

MySQLでの等価例を示しています:

SELECT * FROM Customers
ORDER BY CustomerName DESC
LIMIT 3;

Oracleでの等価例を示しています:

SELECT * FROM Customers
ORDER BY CustomerName DESC
FETCH FIRST 3 ROWS ONLY;