SQL DELETE文とは?
DELETE文はテーブル内の既存のレコードを削除するために使用されます。
DELETE FROM table_name WHERE condition;
注意:テーブル内のレコードを削除する際は注意が必要です! DELETE文のWHERE句に注意してください。WHERE句を省略すると、テーブル内のすべてのレコードが削除されます。
以下は、例で使用される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”テーブルから顧客”Alfreds Futterkiste”を削除します:
DELETE FROM Customers WHERE CustomerName='Alfreds Futterkiste';
“Customers”テーブルの選択結果は以下のようになります:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
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 |
テーブル内のすべての行を削除することができます。これにより、テーブルの構造、属性、およびインデックスは維持されます:
DELETE FROM table_name;
以下のSQL文は、”Customers”テーブル内のすべての行を削除します:
DELETE FROM Customers;
テーブルを完全に削除するには、DROP TABLE文を使用します:
Customersテーブルを削除します:
DROP TABLE Customers;
SQL UPDATE文とは?
UPDATE文はテーブル内の既存のレコードを変更するために使用されます。
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
注意:テーブル内のレコードを更新する際は注意が必要です! UPDATE文のWHERE句に注意してください。WHERE句を省略すると、テーブル内のすべてのレコードが更新されます。
以下は、例で使用される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文は、最初の顧客(CustomerID = 1)の連絡先担当者と都市を更新します。
UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1;
“Customers”テーブルの選択結果は以下のようになります:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Frankfurt | 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 |
更新するレコード数はWHERE句で決まります。
UPDATE Customers
SET ContactName='Juan'
WHERE Country='Mexico';
“Customers”テーブルの選択結果は以下のようになります:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Frankfurt | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Juan | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Juan | 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 |
注意:レコードを更新する際は慎重に行ってください。WHERE句を省略すると、すべてのレコードが更新されます!
NULL値とは?
NULL値を持つフィールドは値がありません。
テーブルのフィールドがオプションの場合、このフィールドに値を追加せずに新しいレコードを挿入したり、レコードを更新したりすることが可能です。その場合、フィールドはNULL値で保存されます。
ヒント:NULL値はゼロ値や空白を含むフィールドとは異なります。NULL値を持つフィールドは、レコード作成時に空白にされたフィールドです。
比較演算子(=、<、<>など)を使用してNULL値をテストすることはできません。
代わりにIS NULLとIS NOT NULL演算子を使用する必要があります。
SELECT column_names
FROM table_name
WHERE column_name IS NULL;
SELECT column_names
FROM table_name
WHERE column_name IS NOT NULL;
以下は、例で使用される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 |
IS NULL演算子は空の値(NULL値)をテストするために使用されます。
SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NULL;
すべてのNULL値を持つ顧客をリストアップするSQLは次のとおりです。
IS NOT NULL演算子は空でない値(NOT NULL値)をテストするために使用されます。
SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NOT NULL;
SQL INSERT INTOステートメント
INSERT INTOステートメントは、テーブルに新しいレコードを挿入するために使用されます。
INSERT INTOステートメントを書く方法は2つあります:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
以下は、例で使用されるCustomersテーブルの一部です:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
89 | White Clover Markets | Karl Jablonski | 305 – 14th Ave. S. Suite 3B | Seattle | 98128 | USA |
90 | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
91 | Wolski | Zbyszek | ul. Filtrowa 68 | Walla | 01-012 | Poland |
以下のSQLステートメントは、”Customers”テーブルに新しいレコードを挿入します:
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway');
“Customers”テーブルの選択は次のようになります:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
89 | White Clover Markets | Karl Jablonski | 305 – 14th Ave. S. Suite 3B | Seattle | 98128 | USA |
90 | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
91 | Wolski | Zbyszek | ul. Filtrowa 68 | Walla | 01-012 | Poland |
92 | Cardinal | Tom B. Erichsen | Skagen 21 | Stavanger | 4006 | Norway |
注:CustomerIDフィールドに番号を挿入していないことに気づきましたか?
CustomerID列は自動インクリメントフィールドであり、新しいレコードがテーブルに挿入されると自動的に生成されます。
特定の列にのみデータを挿入することも可能です。
以下のSQLステートメントは、新しいレコードを挿入しますが、「CustomerName」、「City」、「Country」列にのみデータを挿入します(CustomerIDは自動的に更新されます):
INSERT INTO Customers (CustomerName, City, Country)
VALUES ('Cardinal', 'Stavanger', 'Norway');
“Customers”テーブルの選択は次のようになります:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
89 | White Clover Markets | Karl Jablonski | 305 – 14th Ave. S. Suite 3B | Seattle | 98128 | USA |
90 | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
91 | Wolski | Zbyszek | ul. Filtrowa 68 | Walla | 01-012 | Poland |
92 | Cardinal | null | null | Stavanger | null | Norway |
1つのステートメントで複数の行を挿入することも可能です。
複数のデータ行を挿入するには、同じINSERT INTOステートメントを使用しますが、複数の値を指定します:
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES
('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway'),
('Greasy Burger', 'Per Olsen', 'Gateveien 15', 'Sandnes', '4306', 'Norway'),
('Tasty Tee', 'Finn Egan', 'Streetroad 19B', 'Liverpool', 'L1 0AA', 'UK');
各セットの値をカンマで区切ることを確認してください。
“Customers”テーブルの選択は次のようになります:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
89 | White Clover Markets | Karl Jablonski | 305 – 14th Ave. S. Suite 3B | Seattle | 98128 | USA |
90 | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
91 | Wolski | Zbyszek | ul. Filtrowa 68 | Walla | 01-012 | Poland |
92 | Cardinal | Tom B. Erichsen | Skagen 21 | Stavanger | 4006 | Norway |
93 | Greasy Burger | Per Olsen | Gateveien 15 | Sandnes | 4306 | Norway |
94 | Tasty Tee | Finn Egan | Streetroad 19B | Liverpool | L1 0AA | UK |
NOT演算子
NOT演算子は他の演算子と組み合わせて使用され、反対の結果、つまり否定の結果を返します。
以下のSELECT文では、スペイン出身ではないすべての顧客を返したいとします。
スペイン出身ではない顧客のみを選択します:
SELECT * FROM Customers
WHERE NOT Country = 'Spain';
上記の例では、NOT演算子が=演算子と組み合わせて使用されていますが、他の比較演算子や論理演算子とも組み合わせて使用できます。以下の例を参照してください。
SELECT column1, column2, ...
FROM table_name
WHERE NOT condition;
以下は例で使用される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 |
「A」で始まらない顧客を選択します:
SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'A%';
CustomerIDが10から60の間にない顧客を選択します:
SELECT * FROM Customers
WHERE CustomerID NOT BETWEEN 10 AND 60;
パリまたはロンドン出身ではない顧客を選択します:
SELECT * FROM Customers
WHERE City NOT IN ('Paris', 'London');
CustomerIDが50より大きくない顧客を選択します:
SELECT * FROM Customers
WHERE NOT CustomerID > 50;
注:同じ結果を得るには、not-greater-than演算子:>!
を使用することもできます。
CustomerIDが50より小さくない顧客を選択します:
SELECT * FROM Customers
WHERE NOT CustomerID < 50;
注:同じ結果を得るには、not-less-than演算子:<!
を使用することもできます。
WHERE句には1つ以上のOR演算子を含めることができます。
OR演算子は、複数の条件に基づいてレコードをフィルタリングするために使用されます。例えば、ドイツ出身のすべての顧客とスペイン出身のすべての顧客を返したい場合です。
ドイツまたはスペイン出身のすべての顧客を選択します:
SELECT *
FROM Customers
WHERE Country = 'Germany' OR Country = 'Spain';
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
OR演算子は、いずれかの条件がTRUEである場合にレコードを表示します。
AND演算子は、すべての条件がTRUEである場合にレコードを表示します。
以下は例で使用される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文は、Cityが「Berlin」、CustomerNameが「G」で始まる、またはCountryが「Norway」であるCustomersのすべてのフィールドを選択します:
SELECT * FROM Customers
WHERE City = 'Berlin' OR CustomerName LIKE 'G%' OR Country = 'Norway';
AND演算子とOR演算子を組み合わせることができます。
次のSQL文は、スペイン出身で名前が「G」または「R」で始まるすべての顧客を選択します。正しい結果を得るためには、括弧を使用してください。
スペイン出身で名前が「G」または「R」で始まるすべての顧客を選択します:
SELECT * FROM Customers
WHERE Country = 'Spain' AND (CustomerName LIKE 'G%' OR CustomerName LIKE 'R%');
括弧を使用しない場合、次のようになります:
次のいずれかに該当するすべての顧客を選択します:
SELECT * FROM Customers
WHERE Country = 'Spain' AND CustomerName LIKE 'G%' OR CustomerName LIKE 'R%';
WHERE句には1つ以上のAND演算子を含めることができます。
AND演算子は、複数の条件に基づいてレコードをフィルタリングするために使用されます。例えば、スペイン出身で名前が ‘G’ で始まるすべての顧客を返したい場合です。
スペイン出身で名前が ‘G’ で始まるすべての顧客を選択します:
SELECT *
FROM Customers
WHERE Country = 'Spain' AND CustomerName LIKE 'G%';
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
AND演算子は、すべての条件がTRUEである場合にレコードを表示します。
OR演算子は、いずれかの条件がTRUEである場合にレコードを表示します。
以下は例で使用される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文は、Countryが「Germany」であり、Cityが「Berlin」であり、PostalCodeが12000より大きいCustomersのすべてのフィールドを選択します:
SELECT * FROM Customers
WHERE Country = 'Germany'
AND City = 'Berlin'
AND PostalCode > 12000;
AND演算子とOR演算子を組み合わせることができます。
次のSQL文は、スペイン出身で名前が「G」または「R」で始まるすべての顧客を選択します。正しい結果を得るためには、括弧を使用してください。
スペイン出身で名前が「G」または「R」で始まるすべての顧客を選択します:
SELECT * FROM Customers
WHERE Country = 'Spain' AND (CustomerName LIKE 'G%' OR CustomerName LIKE 'R%');
括弧を使用しない場合、次のようになります:
次のいずれかに該当するすべての顧客を選択します:
SELECT * FROM Customers
WHERE Country = 'Spain' AND CustomerName LIKE 'G%' OR CustomerName LIKE 'R%';
ORDER BYキーワードは、結果セットを昇順または降順に並べ替えるために使用されます。
価格で商品を並べ替えます:
SELECT * FROM Products
ORDER BY Price;
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
以下は例で使用される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 |
ORDER BYキーワードはデフォルトでレコードを昇順に並べ替えます。レコードを降順に並べ替えるには、DESCキーワードを使用します。
商品を価格の高い順に並べ替えます:
SELECT * FROM Products
ORDER BY Price DESC;
文字列値の場合、ORDER BYキーワードはアルファベット順に並べ替えます:
商品をProductNameでアルファベット順に並べ替えます:
SELECT * FROM Products
ORDER BY ProductName;
テーブルを逆アルファベット順に並べ替えるには、DESCキーワードを使用します:
商品をProductNameで逆順に並べ替えます:
SELECT * FROM Products
ORDER BY ProductName DESC;
次のSQL文は、”Customers”テーブルのすべての顧客を、”Country”および”CustomerName”列で並べ替えて選択します。これは、Countryで並べ替え、同じCountryを持つ行がある場合はCustomerNameで並べ替えます:
SELECT * FROM Customers
ORDER BY Country, CustomerName;
次のSQL文は、”Customers”テーブルのすべての顧客を、”Country”で昇順に、”CustomerName”で降順に並べ替えて選択します:
SELECT * FROM Customers
ORDER BY Country ASC, CustomerName DESC;
WHERE句はレコードをフィルタリングするために使用されます。
指定された条件を満たすレコードのみを抽出するために使用されます。
メキシコのすべての顧客を選択します:
SELECT * FROM Customers
WHERE Country='Mexico';
SELECT column1, column2, ...
FROM table_name
WHERE condition;
注:WHERE句はSELECT文だけでなく、UPDATEやDELETEなどでも使用されます!
以下は例で使用される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ではテキスト値をシングルクォートで囲む必要があります(ほとんどのデータベースシステムではダブルクォートも許可されます)。
ただし、数値フィールドはクォートで囲むべきではありません:
SELECT * FROM Customers
WHERE CustomerID=1;
検索をフィルタリングするために=演算子以外の演算子を使用することができます。
CustomerIDが80より大きいすべての顧客を選択します:
SELECT * FROM Customers
WHERE CustomerID > 80;
WHERE句で使用できる演算子は次の通りです:
演算子 | 説明 |
---|---|
= | 等しい |
> | より大きい |
< | より小さい |
>= | 以上 |
<= | 以下 |
<> | 等しくない。注:SQLのいくつかのバージョンではこの演算子は!=として記述される場合があります |
BETWEEN | 特定の範囲内 |
LIKE | パターン検索 |
IN | 列に対して複数の可能な値を指定する |
SQL SELECT DISTINCT文は、重複しない異なる値のみを返すために使用されます。
Customersテーブルから異なるすべての国を選択します:
SELECT DISTINCT Country FROM Customers;
テーブル内の列はしばしば多くの重複する値を含むことがありますが、異なる(重複しない)値のみをリストしたい場合があります。
SELECT DISTINCT column1, column2, ...
FROM table_name;
以下は例で使用される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 |
DISTINCTキーワードを省略すると、SQL文はCustomersテーブルのすべてのレコードから「Country」値を返します:
SELECT Country FROM Customers;
DISTINCTキーワードをCOUNT関数で使用することで、異なる国の数を返すことができます。
SELECT COUNT(DISTINCT Country) FROM Customers;
注:COUNT(DISTINCT column_name)はMicrosoft Accessデータベースではサポートされていません。
MS Access用の回避策はこちらです:
SELECT Count(*) AS DistinctCountries
FROM (SELECT DISTINCT Country FROM Customers);