SQL UPDATE コマンドを使用してデータベース テーブル内のレコードを更新する方法を学習します。
開発者は、リレーショナル データベースの操作に慣れている必要があります。 SQL (構造化照会言語) は、直感的に学習でき、構文が単純な初心者に優しい言語です。 SQL を使用すると、データベース オブジェクトを作成し、リレーショナル データベース テーブルにクエリを実行できます。
SQL クエリを実行して、データベース テーブル内のレコードを作成、読み取り、更新、削除できます。これらの操作を総称して CRUD 操作と呼ぶことはご存知かもしれません。
データベース テーブルに格納されているレコードを更新するには、SQL で
UPDATE
コマンドを実行します。
このチュートリアルでは、次のことを学習します。
-
UPDATE
コマンドの構文 - 論理演算子を使用して特定の条件または連鎖した複数の条件に基づいてレコードを更新する方法
-
SQL
UPDATE
コマンドを実行するときに注意すべき一般的な注意事項
SQL UPDATEコマンドの構文
SQL UPDATE コマンドの構文は次のとおりです。
UPDATE table_name
SET column = new_value
WHERE condition;
上記のクエリは、
condition
が true であるすべてのレコードの
column
を更新します。
複数の列 (またはフィールド) を更新するには、次のように SQL UPDATE コマンドを使用します。
UPDATE table_name
SET column_1 = new_value_1, column_2 = new_value_2, ..., column_k = new_value_k
WHERE condition;
リレーショナル データベースの場合を思い出してください。
- テーブルは エンティティ を表します。
- テーブルの 行は レコード であり、エンティティのインスタンスを表します。
- 列は フィールド または属性とも呼ばれます。このチュートリアルでは、 列 とフィールドを同じ意味で使用します。
SQL UPDATEコマンドの使用例
では、いくつかの例を見てみましょう。
前提条件
コーディングを始める前に:
- このチュートリアルでは SQLite を使用します。したがって、コーディングするには SQLite と SQLite データベース ブラウザー (推奨) が必要です。 MySQL または PostgreSQL も使用できることに注意してください。
- この例を複製する場合は、Python と Faker Python パッケージ も必要です。
レコードを含むデータベーステーブルの作成
このチュートリアルに沿ってコードを記述したい場合は、次のコード スニペットを実行して顧客データベース
customer_db.db
を作成し、接続できます。 Faker Python ライブラリを使用して、
customers
テーブルに挿入する合成データを生成していることに注意してください。
# main.py
import sqlite3
from faker import Faker
import random
# connect to the db
conn = sqlite3.connect('customer_db.db')
cur = conn.cur()
# create a database table
cur.execute('''CREATE TABLE customers (
customerID INTEGER PRIMARY KEY,
name TEXT,
city TEXT,
email TEXT,
num_orders INTEGER,
discount INTEGER DEFAULT 2)''')
# create a Faker object
fake = Faker()
Faker.seed(42)
for _ in range(15):
name = fake.name()
city = fake.city()
d = fake.domain_name()
email = f"{name[:2]}.{city[:2]}@{d}"
num_orders = random.choice(range(200))
db_cursor.execute('INSERT INTO customers (name, city, email, num_orders) \
VALUES (?,?,?,?)', (name,city,email,num_orders))
# commit the transaction
conn.commit()
cur.close()
conn.close()
📑 このコードがエラーなしで動作するには、開発環境に Python 3.7 (またはそれ以降のバージョン) と Faker がインストールされていることを確認してください。 pip を使用して Faker Python パッケージをインストールできます。
pip install faker
接続できるデータベースとクエリできるデータベース テーブルがすでにある場合は、それを優先的に使用することもできます。
最初の SQL クエリの実行
customers
テーブルには次のフィールドがあります。
-
customerID
:customerID
、データベース テーブル内のレコードを一意に識別するのに役立つ主キーです。 -
name
: 顧客の名前 -
city
: 所属する都市。 -
email
: メールアドレス。 -
num_orders
: 発注した注文の数。 -
discount
: 割引率。デフォルト値 2 の整数。discount
フィールドにはデフォルト値があるため、データベース テーブルにデータを入力するときにその値を挿入する必要はありません。
📝 SQLite コマンドライン クライアントを使用してクエリを実行し、結果を表示できます。または、SQLite データベース ブラウザを使用することもできます。
解釈しやすいため、SQLite DB ブラウザーからの出力を示します。
次のクエリを実行して、
customers
テーブル内のすべてのレコードを取得します。
SELECT * FROM customers;
実際には、必要な場合を除き、
SELECT *
の使用を避ける必要があります。ただし、この例では、レコードが 15 個しかなく、フィールドも多くないため、これを使用します。
単一の条件に基づいてレコードを更新する
テーブルがどのようなものであるかがわかったので、いくつかの
UPDATE
クエリを実行して、必要な条件に基づいてレコードを更新しましょう。
📋 注 : UPDATE ステートメントを実行した後、
SELECT * FROM customers
を実行して、更新されたレコードを確認します。
単一フィールドの更新
まず、レコードの
city
フィールドを
customerID=7
で更新しましょう。
UPDATE customers
SET city='Codeshire'
WHERE customerID=7;
Customers テーブルからすべての列とレコードを選択してみましょう。
SELECT * FROM customers;
Danielle Ford (
customerID=7
) の
city
フィールドが更新されたことがわかります。
複数のフィールドの更新
前の例では、
customerID
7 に対応するレコードの
city
という 1 つのフィールドのみを更新しました。しかし、学習した構文を使用して複数のフィールドを更新することもできます。
ここでは、
customerID
1 に対応する
city
と
email
フィールドの両方を更新します。
UPDATE customers
SET city='East Carlisle',email='Al.Ea@isle.com'
WHERE customerID=1;
次に、以下を実行します。
SELECT * FROM customers;
そして出力は次のとおりです。
複数のレコードの更新
顧客レコードを一意に識別する主キーである
customerID
使用したため、これまでに実行したクエリでは 1 つのレコードのみが更新されました。
ただし、テーブル内の複数のレコードで条件が true の場合、SQL update コマンドを実行すると、対応するすべてのレコードが更新されます。
たとえば、次のクエリを考えてみましょう。
UPDATE customers
SET discount=10
WHERE num_orders > 170;
次に、次のクエリを実行します。
SELECT * FROM customers;
出力は次のとおりです。
上記の SQL 更新コマンドを実行すると、3 つのレコードが変更されます。これらはすべて
num_orders
170 を超えており、
discount
値は 10 になります。
複数の条件に基づいてレコードを更新する
これまで、
WHERE
句には単純な条件がありましたが、フィルタリング基準には論理演算子によって複数の条件が連結されるのが一般的です。
これを理解するために、2 つの条件に基づいて割引を 5 に設定してみましょう。
-
city LIKE 'New%
‘: この条件は、city フィールドが New で始まるレコードをチェックして含めます。 -
num_orders > 100
注文数に基づいてフィルターを適用し、注文数が 100 を超えるレコードのみを含めます。
UPDATE ステートメントは次のようになります。
UPDATE customers
SET DISCOUNT=5
WHERE city LIKE 'New%' AND num_orders>100;
WHERE
句に 2 つの条件があり、論理 AND 演算子で連結されていることに注目してください。そして、両方の条件が当てはまるレコードのみが更新されます。
次に、このクエリを実行して出力を観察します。
SELECT * FROM customers;
出力に見られるように、上記の両方の条件が当てはまるレコードの
discount
フィールドが更新されます。
SQL UPDATEコマンドを使用する場合の一般的な注意事項
これまでに実行されたすべての UPDATE ステートメントには、WHERE 句が含まれています。
たとえば、特定の顧客の割引を 25 に更新するとします。そして、更新クエリに、フィルタリングする
customerID
を含む
WHERE
句を含めるのを忘れています。
UPDATE customers
SET DISCOUNT=25;
今すぐ実行してください:
SELECT * FROM customers;
テーブル内のすべてのレコードが更新されたことがわかります。これはあなたが望む動作ではないかもしれません。
⚠ したがって、条件に基づいてレコードのサブセットを更新する場合は、必ず
WHERE
句を含めてください。すべてのレコードの特定のフィールドを更新する場合は、WHERE 句を省略できます。
この例では、ブラック フライデー セールが近づいており、すべての顧客に 25% の割引を提供したいとします。その後、上記のクエリを実行するのが理にかなっています。
結論
学んだことの要約は次のとおりです。
- データベース テーブル内のレコードを更新する場合は、SQL UPDATE コマンドを使用できます。
-
通常、SQL
UPDATE
ステートメントには、更新するレコード (テーブルの行) のサブセットを決定する条件を含むWHERE
句が含まれます。 -
UPDATE
ステートメントでWHERE
句を省略すると、すべてのレコードが更新されます。したがって、テーブルのすべての行を更新することが望ましい動作ではない場合は、WHERE
句を省略しないように注意する必要があります。
次に、クイック リファレンスとして、この SQL チート シートを確認してください。