SQL キーワード

キーワード 説明
ADD 既存のテーブルに列を追加します。
ADD CONSTRAINT テーブルが既に作成された後に制約を追加します。
ALL サブクエリの全ての値が条件を満たす場合に TRUE を返します。
ALTER テーブル内の列を追加、削除、または変更し、列のデータ型を変更します。
ALTER COLUMN テーブル内の列のデータ型を変更します。
ALTER TABLE テーブル内の列を追加、削除、または変更します。
AND 両方の条件が TRUE の行のみを含みます。
ANY サブクエリのいずれかの値が条件を満たす場合に TRUE を返します。
AS 列またはテーブルに別名を付けます。
ASC 昇順で結果セットをソートします。
BACKUP DATABASE 既存のデータベースのバックアップを作成します。
BETWEEN 指定された範囲内の値を選択します。
CASE 条件に基づいて異なる出力を作成します。
CHECK 列に配置できる値を制限する制約です。
COLUMN テーブル内の列のデータ型を変更または列を削除します。
CONSTRAINT 制約を追加または削除します。
CREATE データベース、インデックス、ビュー、テーブル、またはプロシージャを作成します。
CREATE DATABASE 新しいSQLデータベースを作成します。
CREATE INDEX テーブルにインデックスを作成します(重複する値を許可します)。
CREATE OR REPLACE VIEW ビューを更新します。
CREATE TABLE データベースに新しいテーブルを作成します。
CREATE PROCEDURE ストアドプロシージャを作成します。
CREATE UNIQUE INDEX テーブルにユニークインデックスを作成します(重複する値は許可しません)。
CREATE VIEW SELECT文の結果セットに基づいてビューを作成します。
DATABASE SQLデータベースを作成または削除します。
DEFAULT 列のデフォルト値を提供する制約です。
DELETE テーブルから行を削除します。
DESC 降順で結果セットをソートします。
DISTINCT 異なる値のみを選択します。
DROP 列、制約、データベース、インデックス、テーブル、またはビューを削除します。
DROP COLUMN テーブルから列を削除します。
DROP CONSTRAINT UNIQUE、PRIMARY KEY、FOREIGN KEY、またはCHECK制約を削除します。
DROP DATABASE 既存のSQLデータベースを削除します。
DROP DEFAULT DEFAULT制約を削除します。
DROP INDEX テーブルのインデックスを削除します。
DROP TABLE データベース内の既存のテーブルを削除します。
DROP VIEW ビューを削除します。
EXEC ストアドプロシージャを実行します。
EXISTS サブクエリが 1 つ以上のレコードを返す場合に TRUE を返します。
FOREIGN KEY 2つのテーブルをリンクするキーとして使用される制約です。
FROM どのテーブルからデータを選択または削除するかを指定します。
FULL OUTER JOIN 左のテーブルまたは右のテーブルのいずれかに一致する行を返します。
GROUP BY 集計関数(COUNT、MAX、MIN、SUM、AVG)とともに使用され、結果セットをグループ化します。
HAVING 集計関数と一緒に使用され、WHEREの代わりに使います。
IN WHERE句で複数の値を指定するために使用します。
INDEX テーブルにインデックスを作成または削除します。
INNER JOIN 両方のテーブルで一致する値を持つ行を返します。
INSERT INTO テーブルに新しい行を挿入します。
INSERT INTO SELECT 1つのテーブルから別のテーブルにデータをコピーします。
IS NULL 空の値をテストします。
IS NOT NULL 空でない値をテストします。
JOIN 複数のテーブルを結合します。
LEFT JOIN 左側のテーブルのすべての行と、右側のテーブルと一致する行を返します。
LIKE 列内の指定されたパターンを検索します。
LIMIT 結果セットで返すレコードの数を指定します。
NOT 条件が FALSE の場合にのみ行を含みます。
NOT NULL 列に NULL 値を受け入れないように制約します。
OR いずれかの条件が TRUE の行を含みます。
ORDER BY 結果セットを昇順または降順でソートします。
OUTER JOIN 左側のテーブルまたは右側のテーブルのいずれかに一致する行を返します。
PRIMARY KEY データベーステーブル内の各レコードを一意に識別する制約です。
PROCEDURE ストアドプロシージャです。
RIGHT JOIN 右側のテーブルのすべての行と、左側のテーブルと一致する行を返します。
ROWNUM 結果セットで返すレコードの数を指定します。
SELECT データベースからデータを選択します。
SELECT DISTINCT 異なる値のみを選択します。
SELECT INTO データを別のテーブルにコピーします。
SELECT TOP 結果セットで返すレコードの数を指定します。
SET テーブル内で更新する列と値を指定します。
TABLE テーブルを作成し、列を追加、削除、または変更します。
TOP 結果セットで返すレコードの数を指定します。
TRUNCATE TABLE テーブル内のデータを削除しますが、テーブル自体は削除しません。
UNION 2つ以上のSELECT文の結果セットを結合します(重複した値は1度のみ表示されます)。
UNION ALL 2つ以上のSELECT文の結果セットを結合します(重複した値も表示されます)。
UNIQUE 列内のすべての値が一意であることを保証する制約です。
UPDATE テーブル内の既存の行を更新します。
VALUES INSERT INTO文で挿入する値を指定します。
VIEW ビューを作成、更新、または削除します。
WHERE 特定の条件を満たすレコードのみを結果セットにフィルタリングします。

SQL 算術演算子

演算子 説明
+ 加算
減算
* 乗算
/ 除算
% 剰余

SQL ビット演算子

演算子 説明
& ビット単位 AND
| ビット単位 OR
^ ビット単位排他的 OR

SQL 比較演算子

演算子 説明
= 等しい
> より大きい
< より小さい
>= 以上
<= 以下
<> 等しくない

SQL 複合演算子

演算子 説明
+= 加算と代入
-= 減算と代入
*= 乗算と代入
/= 除算と代入
%= 剰余と代入
&= ビット単位 AND と代入
^-= ビット単位排他的 OR と代入
|*= ビット単位 OR と代入

SQL 論理演算子

演算子 説明
ALL サブクエリの全ての値が条件を満たす場合に TRUE
AND AND で区切られた全ての条件が TRUE の場合に TRUE
ANY サブクエリのいずれかの値が条件を満たす場合に TRUE
BETWEEN オペランドが比較範囲内にある場合に TRUE
EXISTS サブクエリが 1 つ以上のレコードを返す場合に TRUE
IN オペランドが式のリストのいずれかに等しい場合に TRUE
LIKE オペランドがパターンに一致する場合に TRUE
NOT 条件が TRUE でない場合にレコードを表示
OR OR で区切られたいずれかの条件が TRUE の場合に TRUE
SOME サブクエリのいずれかの値が条件を満たす場合に TRUE

SQL コメント

コメントは、SQL文のセクションを説明するためや、SQL文の実行を防止するために使用されます。

注意: Microsoft Access データベースではコメントがサポートされていません!

単一行コメント

単一行コメントは — で始まります。

— から行末までの任意のテキストは無視されます(実行されません)。

以下の例は、単一行コメントを使用して説明します:

-- 全て選択:
SELECT * FROM Customers;

以下の例は、単一行コメントを使用して行末を無視します:

SELECT * FROM Customers -- WHERE City='Berlin';

以下の例は、単一行コメントを使用してステートメントを無視します:

-- SELECT * FROM Customers;
SELECT * FROM Products;

複数行コメント

複数行コメントは /* で始まり */ で終わります。

/* と */ の間の任意のテキストは無視されます。

以下の例は、複数行コメントを使用して説明します:

/* Customers テーブルの全てのレコードの全ての列を選択する */
SELECT * FROM Customers;

以下の例は、複数行コメントを使用して複数のステートメントを無視します:

/*SELECT * FROM Customers;
SELECT * FROM Products;
SELECT * FROM Orders;
SELECT * FROM Categories;*/
SELECT * FROM Suppliers;

ステートメントの一部を無視するには、 /* */ コメントも使用します。

以下の例は、コメントを使用して行の一部を無視します:

SELECT CustomerName, /*City,*/ Country FROM Customers;

以下の例は、コメントを使用してステートメントの一部を無視します:

SELECT * FROM Customers WHERE (CustomerName LIKE 'L%'
OR CustomerName LIKE 'R%' /*OR CustomerName LIKE 'S%'
OR CustomerName LIKE 'T%'*/ OR CustomerName LIKE 'W%')
AND Country='USA'
ORDER BY CustomerName;

ストアドプロシージャとは?

ストアドプロシージャは事前に準備されたSQLコードであり、保存して再利用することができます。

同じSQLクエリを繰り返し書く場合は、ストアドプロシージャとして保存して、必要なときに呼び出すだけで実行できます。

また、ストアドプロシージャにパラメータを渡すこともでき、そのパラメータの値に基づいてストアドプロシージャが動作します。

ストアドプロシージャの構文

CREATE PROCEDURE procedure_name
AS
sql_statement
GO;

ストアドプロシージャの実行

EXEC procedure_name;

デモデータベース

以下は Northwind サンプルデータベースの “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文は、”Customers” テーブルからすべてのレコードを選択する “SelectAllCustomers” という名前のストアドプロシージャを作成します:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

上記のストアドプロシージャは以下のように実行します:

EXEC SelectAllCustomers;

1つのパラメータを持つストアドプロシージャ

以下のSQL文は、特定の都市の顧客を “Customers” テーブルから選択するストアドプロシージャを作成します:

CREATE PROCEDURE SelectAllCustomers @City nvarchar(30)
AS
SELECT * FROM Customers WHERE City = @City
GO;

上記のストアドプロシージャは以下のように実行します:

EXEC SelectAllCustomers @City = 'London';

複数のパラメータを持つストアドプロシージャ

複数のパラメータを設定することは非常に簡単です。以下のように各パラメータとデータ型をカンマで区切ってリストアップします。

以下のSQL文は、特定の都市と特定の郵便番号の顧客を “Customers” テーブルから選択するストアドプロシージャを作成します:

CREATE PROCEDURE SelectAllCustomers @City nvarchar(30), @PostalCode nvarchar(10)
AS
SELECT * FROM Customers WHERE City = @City AND PostalCode = @PostalCode
GO;

上記のストアドプロシージャは以下のように実行します:

EXEC SelectAllCustomers @City = 'London', @PostalCode = 'WA1 1DP';

SQL NULL 関数

SQL IFNULL(), ISNULL(), COALESCE(), および NVL() 関数を見ていきます。

“Products” テーブルを見てみましょう:

P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder
1 Jarlsberg 10.45 16 15
2 Mascarpone 32.56 23
3 Gorgonzola 15.67 9 20

“UnitsOnOrder” 列はオプショナルで、NULL 値を含むことがあります。

以下の SELECT 文を見てみましょう:

SELECT ProductName, UnitPrice * (UnitsInStock + UnitsOnOrder)
FROM Products;

上記の例では、”UnitsOnOrder” の値が NULL の場合、結果も NULL になります。

解決策

MySQL

MySQL の IFNULL() 関数を使用して、式が NULL の場合に代替値を返します:

SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0))
FROM Products;

または COALESCE() 関数を使用することもできます:

SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))
FROM Products;

SQL Server

SQL Server の ISNULL() 関数を使用して、式が NULL の場合に代替値を返します:

SELECT ProductName, UnitPrice * (UnitsInStock + ISNULL(UnitsOnOrder, 0))
FROM Products;

または COALESCE() 関数を使用することもできます:

SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))
FROM Products;

MS Access

MS Access の IsNull() 関数は、式が NULL の場合に TRUE (-1) を返し、それ以外の場合は FALSE (0) を返します:

SELECT ProductName, UnitPrice * (UnitsInStock + IIF(IsNull(UnitsOnOrder), 0, UnitsOnOrder))
FROM Products;

Oracle

Oracle の NVL() 関数は同じ結果を得るために使用されます:

SELECT ProductName, UnitPrice * (UnitsInStock + NVL(UnitsOnOrder, 0))
FROM Products;

または COALESCE() 関数を使用することもできます:

SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))
FROM Products;

SQL CASE 式

CASE 式は条件を逐次評価し、最初に条件が満たされた時点で値を返します(if-then-else 文のようなものです)。したがって、条件が true の場合はその結果を返し、以降の条件は評価されません。すべての条件が false の場合、ELSE 句の値が返されます。

もしELSE 部分がなく、どの条件も満たされない場合はNULLが返されます。

CASE 構文

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;

デモ データベース

以下はNorthwind サンプルデータベースの”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

SQL CASE の例

以下のSQLは条件を逐次評価し、最初に条件が満たされた場合に値を返します:

SELECT OrderID, Quantity,
CASE
    WHEN Quantity > 30 THEN '数量は30より大きいです'
    WHEN Quantity = 30 THEN '数量は30です'
    ELSE '数量は30未満です'
END AS QuantityText
FROM OrderDetails;

以下のSQLは顧客をCityで並べ替えます。ただし、CityがNULLの場合はCountryで並べ替えます:

SELECT CustomerName, City, Country
FROM Customers
ORDER BY
(CASE
    WHEN City IS NULL THEN Country
    ELSE City
END);

SQL INSERT INTO SELECT 文

INSERT INTO SELECT 文は、1つのテーブルからデータを取得して別のテーブルに挿入します。

INSERT INTO SELECT 文では、ソースとターゲットのテーブルのデータ型が一致している必要があります。

INSERT INTO SELECT 構文

すべての列を別のテーブルにコピーします:

INSERT INTO table2
SELECT * FROM table1
WHERE condition;

一部の列のみを別のテーブルにコピーします:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;

デモ データベース

このチュートリアルでは、よく知られたNorthwind サンプルデータベースを使用します。

“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

“Suppliers” テーブルからの選択:

SupplierID SupplierName ContactName Address City Postal Code Country
1 Exotic Liquid Charlotte Cooper 49 Gilbert St. Londona EC1 4SD UK
2 New Orleans Cajun Delights Shelley Burke P.O. Box 78934 New Orleans 70117 USA
3 Grandma Kelly’s Homestead Regina Murphy 707 Oxford Rd. Ann Arbor 48104 USA

SQL INSERT INTO SELECT の例

例:

INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;

例:

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
SELECT SupplierName, ContactName, Address, City, PostalCode, Country FROM Suppliers;

例:

INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers
WHERE Country='Germany';

SQL SELECT INTO 文

SELECT INTO 文は、1つのテーブルからデータをコピーして新しいテーブルに挿入します。

SELECT INTO 構文

すべての列を新しいテーブルにコピーします:

SELECT *
INTO newtable [IN externaldb]
FROM oldtable
WHERE condition;

一部の列のみを新しいテーブルにコピーします:

SELECT column1, column2, column3, ...
INTO newtable [IN externaldb]
FROM oldtable
WHERE condition;

新しいテーブルは、既存のテーブルで定義されている列名と型で作成されます。AS 句を使用して新しい列名を作成することができます。

SQL SELECT INTO の例

次の SQL 文は、Customers のバックアップコピーを作成します:

SELECT * INTO CustomersBackup2017
FROM Customers;

次の SQL 文は、IN 句を使用して別のデータベースの新しいテーブルにテーブルをコピーします:

SELECT * INTO CustomersBackup2017 IN 'Backup.mdb'
FROM Customers;

次の SQL 文は、一部の列のみを新しいテーブルにコピーします:

SELECT CustomerName, ContactName INTO CustomersBackup2017
FROM Customers;

次の SQL 文は、ドイツの顧客のみを新しいテーブルにコピーします:

SELECT * INTO CustomersGermany
FROM Customers
WHERE Country = 'Germany';

次の SQL 文は、複数のテーブルからデータを新しいテーブルにコピーします:

SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2017
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

Tip: SELECT INTO は、別のテーブルのスキーマを使用して新しい空のテーブルを作成するためにも使用できます。クエリがデータを返さないようにする WHERE 句を追加してください:

SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

SQL ANY および ALL 演算子

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

SQL ANY 演算子

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 演算子:

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

SQL EXISTS 演算子

EXISTS 演算子はサブクエリでレコードの存在をテストするために使用されます。

サブクエリが1つ以上のレコードを返す場合、EXISTS 演算子は TRUE を返します。

EXISTS 構文

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(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

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

SupplierID SupplierName ContactName Address City PostalCode Country
1 Exotic Liquid Charlotte Cooper 49 Gilbert St. London EC1 4SD UK
2 New Orleans Cajun Delights Shelley Burke P.O. Box 78934 New Orleans 70117 USA
3 Grandma Kelly’s Homestead Regina Murphy 707 Oxford Rd. Ann Arbor 48104 USA
4 Tokyo Traders Yoshi Nagase 9-8 Sekimai Musashino-shi Tokyo 100 Japan

SQL EXISTS の例

以下の SQL 文は、商品の価格が20未満のサプライヤーをリストアップし、TRUE を返します:

SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.SupplierID AND Price < 20);

以下の SQL 文は、商品の価格が22と等しいサプライヤーをリストアップし、TRUE を返します:

SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.SupplierID AND Price = 22);