SQL Serverを使用していると、「ある条件に合致するデータのみを更新したい」「他のテーブルのデータを基に特定のカラムの値を変更したい」といったケースに遭遇することがよくあります。こうした場合、単純な UPDATE
文だけでは対応できず、SELECT
した結果を利用して UPDATE
を実行する方法が必要になります。
こうした操作を実現するには、SQL ServerのUPDATE
文に SELECT
を組み込む方法を理解する必要があります。本記事では、次の3つの主要な方法を詳しく解説します。
- サブクエリを使って
SELECT
の結果をUPDATE
する方法 JOIN
を活用してUPDATE
する方法- 具体的なユースケースとパフォーマンス最適化のポイント
それぞれの方法のメリット・デメリットを比較しながら、実際に使えるSQLのサンプルコードとともに説明していきます。
サブクエリを使ってSELECT結果をUPDATEする
SQL Serverでは、UPDATE
文の SET
句にサブクエリを指定することで、SELECT
の結果を利用して値を更新できます。特に、以下のようなケースで有効です。
- 他のテーブルのデータを参照して値を更新したい
- 同じテーブル内の別の列の値を元に更新したい
- 特定の条件に合致するデータのみを更新したい
サブクエリを使用したUPDATEの基本構文
サブクエリを活用した UPDATE
の基本構文は以下のようになります。
UPDATE テーブル名
SET 更新対象の列 = (SELECT 値 FROM 参照テーブル WHERE 条件)
WHERE 更新対象の列がある条件;
サブクエリを SET
句に埋め込むことで、SELECT
した結果を UPDATE
できます。ただし、SELECT
の結果が1行のみになるようにすることが重要です。もし複数行が返ってしまうと、エラーになります。
他のテーブルのデータを利用して更新する
たとえば、employees
テーブルの salary
を、 salaries
テーブルの new_salary
を基に更新する場合を考えます。
UPDATE employees
SET salary = (SELECT new_salary FROM salaries WHERE salaries.emp_id = employees.emp_id)
WHERE EXISTS (SELECT 1 FROM salaries WHERE salaries.emp_id = employees.emp_id);
ポイント
SELECT new_salary FROM salaries WHERE salaries.emp_id = employees.emp_id
の部分で、employees
の各emp_id
に対するnew_salary
を取得WHERE EXISTS
を使って、更新対象のemployees.emp_id
がsalaries
に存在する場合のみ更新
このように、他のテーブルのデータを参照しながらUPDATE
することができます。
同じテーブル内の別の列の値を使って更新する
同じテーブルの別のカラムを基にデータを更新するケースもあります。
例: products
テーブルの discount_price
を price
の90%に更新
UPDATE products
SET discount_price = (SELECT price * 0.9 FROM products AS p WHERE p.product_id = products.product_id);
この方法を使えば、特定の計算を加えた値を既存の列に反映できます。
条件を指定して部分的に更新する
特定の条件を満たすレコードのみを更新する場合、WHERE
句を適切に指定することが重要です。
例: users
テーブルで、購入金額が一定額を超えたユーザーにボーナスポイントを付与
UPDATE users
SET points = points + 100
WHERE user_id IN (SELECT user_id FROM orders WHERE total_amount > 50000);
ポイント
IN
を使用して、orders
テーブルでtotal_amount
が 50,000 を超えるuser_id
のみ更新points
に100ポイントを加算
このように、特定の条件を満たすレコードのみを SELECT
の結果を基に更新できます。
サブクエリを使う際の注意点
サブクエリを使って UPDATE
する際には、以下のポイントに注意してください。
- サブクエリが複数の値を返さないようにする
SET
句に入るサブクエリは、1つの値(スカラー値)を返す必要があるWHERE
句の条件を適切に指定し、複数行が返らないようにする
- パフォーマンスに注意
- サブクエリは、更新対象の行ごとに実行される ため、データ量が多いと処理が遅くなる
- インデックスを適切に設定し、パフォーマンスを向上させる
- 複雑なロジックの場合は
JOIN
を検討- サブクエリを使うと、クエリが分かりやすくなるが、JOIN を使った方が高速に処理できることがある
- 特に、大量のデータを更新する場合は、次に紹介する JOIN を活用した
UPDATE
も検討すべき
JOINを使ってUPDATEする
サブクエリを使用する方法はシンプルですが、データ量が増えるとパフォーマンスが低下することがあります。そのような場合、JOIN
を活用した UPDATE
を行うことで、より効率的にデータを更新できます。
JOINを使用したUPDATEの基本構文
SQL Serverでは、UPDATE
文に FROM
句を追加し、JOIN
を使って他のテーブルのデータを参照しながら更新できます。
UPDATE 更新対象のエイリアス
SET 更新対象のカラム = 参照テーブルのカラム
FROM 更新対象のテーブル AS 更新対象のエイリアス
JOIN 参照テーブル AS 参照エイリアス ON 結合条件
WHERE 更新条件;
この方法を使うと、サブクエリを使う場合と比べて、クエリの可読性と実行速度が向上することが多いです。
JOINを使ったUPDATEの実例
たとえば、employees
テーブルの salary
を、salaries
テーブルの new_salary
を基に更新する場合を考えます。
UPDATE e
SET e.salary = s.new_salary
FROM employees e
JOIN salaries s ON e.emp_id = s.emp_id
WHERE s.new_salary IS NOT NULL;
ポイント
employees
テーブル(e
)とsalaries
テーブル(s
)をemp_id
で結合salaries
テーブルのnew_salary
をemployees
テーブルのsalary
に更新WHERE s.new_salary IS NOT NULL
を指定して、NULLの値を更新しないように制御
まとめ
SQL ServerでのUPDATE
文を活用する方法には、主に2つのアプローチ—サブクエリとJOIN—があります。それぞれの方法には、用途に応じたメリットとデメリットがありますが、どちらも効果的に使用することで、柔軟かつ効率的にデータの更新を行うことができます。
本記事で紹介した方法を理解し、ケースバイケースで適切なアプローチを選択することが、SQL Serverにおけるデータ更新作業を効果的に行う鍵となります。
コメント