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 を使用します:
SELECT * FROM Products
WHERE Price NOT BETWEEN 10 AND 20;
以下の SQL 文は、価格が 10 から 20 の間であり、CategoryID が 1、2、または 3 のいずれかであるすべての製品を選択します:
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20
AND CategoryID IN (1,2,3);
以下の 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;
以下の SQL 文は、ProductName が ‘Carnarvon Tigers’ と ‘Mozzarella di Giovanni’ の間にない製品をすべて選択します:
SELECT * FROM Products
WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;
以下の 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 |
IN 演算子の前に NOT キーワードを使用することで、リスト内のどれにも該当しないすべてのレコードを返します。
‘Germany’、’France’、または ‘UK’ 以外のすべての顧客を返します:
SELECT * FROM Customers
WHERE Country NOT IN ('Germany', 'France', 'UK');
IN をサブクエリと組み合わせて WHERE 句で使用することもできます。
サブクエリを使用すると、主クエリの結果に含まれるサブクエリの結果がすべて返されます。
Orders テーブルに注文があるすべての顧客を返します:
SELECT * FROM Customers
WHERE CustomerID IN (SELECT CustomerID FROM Orders);
前述の例での結果は 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 データベースには他のワイルドカードもあります:
シンボル | 説明 | 例 |
---|---|---|
* | ゼロ個以上の文字を表します。 | 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 句を追加することができます:
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);
ここでは、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 句を追加することができます:
SELECT SUM(Quantity)
FROM OrderDetails
WHERE ProductId = 11;
AS キーワードを使用して合計された列に名前を付けます。
SELECT SUM(Quantity) AS total
FROM OrderDetails;
ここでは、SUM() 関数と GROUP BY 句を使用して、OrderDetails テーブル内の各 OrderID の Quantity を返します:
SELECT OrderID, SUM(Quantity) AS [Total Quantity]
FROM OrderDetails
GROUP BY OrderID;
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 句を追加することができます:
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;
ここでは、COUNT() 関数と GROUP BY 句を使用して、Products テーブル内の各カテゴリのレコード数を返します:
SELECT COUNT(*) AS [Number of records], CategoryID
FROM Products
GROUP BY CategoryID;
SQL MIN() と MAX() 関数
MIN() 関数は選択した列の最小値を返します。
MAX() 関数は選択した列の最大値を返します。
Price 列で最も低い価格を見つける:
SELECT MIN(Price)
FROM Products;
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;
ここでは、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が使用されます。
SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
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 |
以下のSQL文は、MySQLでの例を示しています:
Customersテーブルの最初の3件を選択します:
SELECT * FROM Customers
LIMIT 3;
以下のSQL文は、Oracleでの例を示しています:
Customersテーブルの最初の3件を選択します:
SELECT * FROM Customers
FETCH FIRST 3 ROWS ONLY;
以下のSQL文は、”Customers”テーブルから最初の50%のレコードを選択します(SQL Server/MS Access用):
SELECT TOP 50 PERCENT * FROM Customers;
以下のSQL文は、Oracleでの等価例を示しています:
SELECT * FROM Customers
FETCH FIRST 50 PERCENT ROWS ONLY;
以下の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;
結果をソートして最初の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;