بهروزرسانی دادهها در SQL Server: راهنمای جامع دستور UPDATE با مثالهای کاربردی
دستور `UPDATE` در SQL یک دستور DML (زبان دستکاری دادهها) است که برای تغییر رکوردهای موجود در یک جدول به کار میرود. ما از عبارت `WHERE` همراه با دستور `UPDATE` برای انتخاب رکوردهای خاص جهت بهروزرسانی استفاده میکنیم. اگر عبارت `WHERE` را حذف کنید، تمام رکوردهای جدول بهروزرسانی خواهند شد. این دستور برای مدیریت و ویرایش دقیق دادهها در پایگاه داده SQL Server حیاتی است.
مثال پایه دستور UPDATE در SQL
بیایید با یک مثال ساده از دستور `UPDATE` در SQL شروع کنیم. ما یک جدول `Employees` داریم که شامل جزئیات کارمندان مانند `EmployeeID`، `EmployeeName` و `Position` است. اکنون میخواهیم `Position` کارمند با `EmployeeID = 1` را به ‘Software Architect’ بهروزرسانی کنیم.
ساختار کلی دستور `UPDATE` به صورت زیر است:
UPDATE table_name SET column_name = value WHERE condition;
میتوانیم از کوئری زیر برای بهروزرسانی سمت شغلی استفاده کنیم:
UPDATE Employees
SET Position = 'Software Architect'
WHERE EmployeeID = 1;
مثال دستور UPDATE در SQL همراه با JOIN
میخواهیم رکوردها را در یک جدول بر اساس رکوردهای یک جدول دیگر بهروزرسانی کنیم. این کار با استفاده از `JOIN` در دستور `UPDATE` به راحتی قابل انجام است. فرض کنید دو جدول `Employees` و `EmployeeDetails` داریم و میخواهیم `Salary` کارمندان را بر اساس `BonusPercentage` موجود در `EmployeeDetails` بهروزرسانی کنیم.
ساختار کلی دستور `UPDATE` با `JOIN` به صورت زیر است:
UPDATE T1 SET T1.column_name = T2.column_name FROM table1 AS T1 JOIN table2 AS T2 ON T1.key = T2.key WHERE condition;
کوئری زیر را میتوان برای بهروزرسانی ستون `Salary` در جدول `Employees` با استفاده از `BonusPercentage` از جدول `EmployeeDetails` به کار برد:
UPDATE E
SET E.Salary = E.Salary * (1 + ED.BonusPercentage)
FROM Employees AS E
JOIN EmployeeDetails AS ED ON E.EmployeeID = ED.EmployeeID
WHERE ED.BonusPercentage > 0;
مثال دستور UPDATE در SQL همراه با Subquery
گاهی اوقات نیاز داریم ستونی را در یک جدول بر اساس نتایج یک `Subquery` (کوئری فرعی) که دادهها را از یک جدول دیگر برمیگرداند، بهروزرسانی کنیم. در این مثال، میخواهیم `Position` کارمندان را در جدول `Employees` بر اساس بالاترین `Rating` از جدول `EmployeeRatings` بهروزرسانی کنیم، فقط برای کارمندانی که امتیاز بالایی دارند.
ساختار کلی دستور `UPDATE` با `Subquery` به صورت زیر است:
UPDATE table_name SET column_name = (SELECT column_name FROM other_table WHERE condition) WHERE condition;
این کوئری `Position` را برای کارمندانی که `Rating` آنها بالاتر از میانگین است، بهروزرسانی میکند:
UPDATE E
SET E.Position = 'Senior Developer'
WHERE E.EmployeeID IN (
SELECT ER.EmployeeID
FROM EmployeeRatings AS ER
WHERE ER.Rating > (SELECT AVG(Rating) FROM EmployeeRatings)
);
مثال دستور UPDATE در SQL همراه با CTE
استفاده از CTE (عبارت جدول مشترک) میتواند کوئریهای `UPDATE` پیچیده را خواناتر و قابل مدیریتتر کند. فرض کنید میخواهیم `DepartmentName` را در جدول `Employees` برای کارمندانی که در بخش ‘IT’ هستند و درآمد آنها کمتر از میانگین بخش است، به ‘IT Support’ تغییر دهیم.
ساختار کلی دستور `UPDATE` با `CTE` به صورت زیر است:
WITH CTE_Name AS (SELECT * FROM table_name WHERE condition) UPDATE CTE_Name SET column_name = value;
این کوئری `DepartmentName` را برای کارمندان خاص با استفاده از `CTE` بهروزرسانی میکند:
WITH LowPerformingIT AS (
SELECT E.EmployeeID, E.DepartmentName
FROM Employees AS E
WHERE E.DepartmentName = 'IT' AND E.Salary < (SELECT AVG(Salary) FROM Employees WHERE DepartmentName = 'IT')
)
UPDATE LowPerformingIT
SET DepartmentName = 'IT Support';
مثال دستور UPDATE در SQL از یک جدول دیگر بدون JOIN
در برخی موارد، ممکن است بخواهیم یک ستون را در یک جدول بر اساس ستونی در یک جدول دیگر بهروزرسانی کنیم، بدون استفاده صریح از `JOIN`، بلکه با استفاده از یک `FROM` دیگر در دستور `UPDATE`. این روش به خصوص در SQL Server رایج است. میخواهیم `Email` کارمندان را در جدول `Employees` بر اساس `ContactEmail` از جدول `EmployeeContact` بهروزرسانی کنیم.
ساختار کلی این نوع `UPDATE` به صورت زیر است:
UPDATE T1 SET T1.column_name = T2.column_name FROM table1 AS T1, table2 AS T2 WHERE T1.key = T2.key AND condition;
این کوئری `Email` را با ارجاع به جدول `EmployeeContact` بهروزرسانی میکند:
UPDATE E
SET E.Email = EC.ContactEmail
FROM Employees AS E, EmployeeContact AS EC
WHERE E.EmployeeID = EC.EmployeeID;
مثال دستور UPDATE در SQL همراه با TOP
دستور `TOP` در `UPDATE` برای محدود کردن تعداد رکوردهایی که قرار است بهروزرسانی شوند، به کار میرود. این برای سناریوهایی مفید است که فقط میخواهید تعداد مشخصی از ردیفها را بر اساس یک شرط خاص بهروزرسانی کنید. فرض کنید میخواهیم `Status` را برای 5 کارمند با کمترین `Salary` به ‘On Probation’ تغییر دهیم.
ساختار کلی دستور `UPDATE` با `TOP` به صورت زیر است:
UPDATE TOP (N) table_name SET column_name = value WHERE condition ORDER BY column_name;
این کوئری وضعیت 5 کارمند با کمترین حقوق را بهروزرسانی میکند:
UPDATE TOP (5) Employees
SET Status = 'On Probation'
WHERE Status IS NULL
ORDER BY Salary ASC;
مثال دستور UPDATE در SQL همراه با عبارت OUTPUT
عبارت `OUTPUT` در دستور `UPDATE` به شما امکان میدهد اطلاعاتی درباره ردیفهای تغییر یافته (قبل یا بعد از تغییر) را بازیابی کنید. این ویژگی برای لاگبرداری یا فرآیندهای پیچیدهتر که نیاز به دیدن نتایج فوری `UPDATE` دارند، بسیار مفید است. میخواهیم `Position` کارمند با `EmployeeID = 2` را بهروزرسانی کنیم و در عین حال `OldPosition` و `NewPosition` را دریافت کنیم.
ساختار کلی دستور `UPDATE` با `OUTPUT` به صورت زیر است:
UPDATE table_name SET column_name = value OUTPUT DELETED.column_name, INSERTED.column_name WHERE condition;
این کوئری `Position` را بهروزرسانی کرده و مقادیر قدیمی و جدید را بازمیگرداند:
UPDATE Employees
SET Position = 'Team Lead'
OUTPUT DELETED.Position AS OldPosition, INSERTED.Position AS NewPosition
WHERE EmployeeID = 2;
مثال دستور UPDATE در SQL همراه با عبارت CASE
عبارت `CASE` در دستور `UPDATE` برای اعمال بهروزرسانیهای شرطی بر اساس چندین سناریو مفید است. این امکان را میدهد که مقادیر مختلفی را به یک ستون اختصاص دهید بسته به اینکه ردیفها با کدام یک از شرایط `CASE` مطابقت دارند. فرض کنید میخواهیم `Salary` کارمندان را بر اساس `ExperienceLevel` آنها بهروزرسانی کنیم.
ساختار کلی دستور `UPDATE` با `CASE` به صورت زیر است:
UPDATE table_name SET column_name = CASE WHEN condition1 THEN value1 WHEN condition2 THEN value2 ELSE default_value END WHERE condition;
این کوئری `Salary` را بر اساس سطح تجربه کارمندان بهروزرسانی میکند:
UPDATE Employees
SET Salary =
CASE
WHEN ExperienceLevel = 'Junior' THEN Salary * 1.10
WHEN ExperienceLevel = 'Mid' THEN Salary * 1.15
WHEN ExperienceLevel = 'Senior' THEN Salary * 1.20
ELSE Salary
END
WHERE DepartmentName = 'Engineering';
مثال دستور UPDATE در SQL همراه با تابع جمعی (Aggregate Function)
گاهی اوقات نیاز داریم یک ستون را با استفاده از نتایج یک تابع جمعی (مانند `AVG`, `SUM`, `COUNT`) بهروزرسانی کنیم. این کار معمولاً از طریق یک `Subquery` یا `CTE` انجام میشود که تابع جمعی را محاسبه میکند. میخواهیم `AverageSalary` را در جدول `Departments` با استفاده از میانگین حقوق از جدول `Employees` بهروزرسانی کنیم.
ساختار کلی دستور `UPDATE` با تابع جمعی (معمولاً در Subquery) به صورت زیر است:
UPDATE T1 SET T1.column_name = (SELECT AggregateFunction(T2.column_name) FROM table2 AS T2 WHERE T1.key = T2.key) WHERE condition;
این کوئری میانگین حقوق هر دپارتمان را در جدول `Departments` بهروزرسانی میکند:
UPDATE D
SET D.AverageSalary = (
SELECT AVG(E.Salary)
FROM Employees AS E
WHERE E.DepartmentID = D.DepartmentID
)
FROM Departments AS D;
مثال دستور UPDATE در SQL با چندین ستون
در بسیاری از موارد، شما نیاز دارید که چندین ستون را در یک ردیف به صورت همزمان بهروزرسانی کنید. دستور `UPDATE` به شما اجازه میدهد تا با یک دستور، چندین ستون را تغییر دهید و کارایی و وضوح کوئری را افزایش دهید. میخواهیم `Position` و `Salary` کارمند با `EmployeeID = 3` را بهروزرسانی کنیم.
ساختار کلی دستور `UPDATE` برای چندین ستون به صورت زیر است:
UPDATE table_name SET column1 = value1, column2 = value2, … WHERE condition;
این کوئری چندین ستون را در یک عملیات بهروزرسانی میکند:
UPDATE Employees
SET Position = 'Project Manager', Salary = 95000
WHERE EmployeeID = 3;