SQL DELETE文とは?

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 DELETEの例

以下の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構文

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値のテスト方法

比較演算子(=、<、<>など)を使用してNULL値をテストすることはできません。

代わりにIS NULLとIS NOT NULL演算子を使用する必要があります。

IS NULL構文

SELECT column_names
FROM table_name
WHERE column_name IS NULL;

IS NOT 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演算子

IS NULL演算子は空の値(NULL値)をテストするために使用されます。

SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NULL;

すべてのNULL値を持つ顧客をリストアップするSQLは次のとおりです。

IS NOT NULL演算子

IS NOT NULL演算子は空でない値(NOT NULL値)をテストするために使用されます。

SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NOT NULL;

SQL INSERT INTOステートメント

INSERT INTOステートメントは、テーブルに新しいレコードを挿入するために使用されます。

INSERT INTO構文

INSERT INTOステートメントを書く方法は2つあります:

  1. 列名と挿入する値を指定する方法:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  1. テーブルのすべての列に値を追加する場合は、SQLクエリで列名を指定する必要はありません。ただし、値の順序がテーブル内の列の順序と同じであることを確認してください。この場合、INSERT INTO構文は次のようになります:
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

INSERT INTO例

以下の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

NOT LIKE

「A」で始まらない顧客を選択します:

SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'A%';

NOT BETWEEN

CustomerIDが10から60の間にない顧客を選択します:

SELECT * FROM Customers
WHERE CustomerID NOT BETWEEN 10 AND 60;

NOT IN

パリまたはロンドン出身ではない顧客を選択します:

SELECT * FROM Customers
WHERE City NOT IN ('Paris', 'London');

NOT Greater Than

CustomerIDが50より大きくない顧客を選択します:

SELECT * FROM Customers
WHERE NOT CustomerID > 50;

注:同じ結果を得るには、not-greater-than演算子:>!を使用することもできます。

NOT Less 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とAND

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

少なくとも1つの条件がTRUEである必要がある場合

次のSQL文は、Cityが「Berlin」、CustomerNameが「G」で始まる、またはCountryが「Norway」であるCustomersのすべてのフィールドを選択します:

SELECT * FROM Customers
WHERE City = 'Berlin' OR CustomerName LIKE 'G%' OR Country = 'Norway';

ANDとORの組み合わせ

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とOR

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

すべての条件がTRUEである必要がある場合

次のSQL文は、Countryが「Germany」であり、Cityが「Berlin」であり、PostalCodeが12000より大きいCustomersのすべてのフィールドを選択します:

SELECT * FROM Customers
WHERE Country = 'Germany'
AND City = 'Berlin'
AND PostalCode > 12000;

ANDとORの組み合わせ

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

DESC

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;

複数列でのORDER BY

次のSQL文は、”Customers”テーブルのすべての顧客を、”Country”および”CustomerName”列で並べ替えて選択します。これは、Countryで並べ替え、同じCountryを持つ行がある場合はCustomerNameで並べ替えます:

SELECT * FROM Customers
ORDER BY Country, CustomerName;

ASCとDESCの両方を使用

次の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;

WHERE句の演算子

検索をフィルタリングするために=演算子以外の演算子を使用することができます。

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なしのSELECT例

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