اذهب إلى المحتوى

تحديث الجداول في SQL


محمد بغات

تستعرض هذه المقالة كيفية تحديث قواعد البيانات، وكيفية إنشاء قواعد بيانات وجداول ودوال جديدة.

التحديث عبر UPDATE

تُستخدم الكلمة المفتاحية UPDATE لتحديث بيانات الجداول.

تحديث جدول من بيانات جدول آخر

تملأ الأمثلة الموضحة أدناه الحقل ‎PhoneNumber‎ لأي موظف يكون أيضًا عميلًا ‎Customer‎، وليس له حاليًا رقم هاتف في جدول الموظفين ‎Employees‎.

(تستخدم الأمثلة التالية جدولي الموظفين Employees والعملاء Customers)

  • SQL القياسية

يحدّث المثال التالي قاعدة البيانات باستخدام استعلام فرعي مربوط (correlated subquery):

UPDATE
    Employees
SET PhoneNumber =
   (SELECT
         c.PhoneNumber
   FROM
         Customers c
   WHERE
         c.FName = Employees.FName
         AND c.LName = Employees.LName)
WHERE Employees.PhoneNumber IS NULL
  • SQL:2003

تحديث باستخدام ‎MERGE‎:

MERGE INTO
    Employees e
USING
    Customers c
ON
    e.FName = c.Fname
   AND e.LName = c.LName
   AND e.PhoneNumber IS NULL
WHEN MATCHED THEN
  UPDATE
       SET PhoneNumber = c.PhoneNumber
  • SQL Server

تحديث باستخدام ‎INNER JOIN‎:

UPDATE
    Employees
SET
    PhoneNumber = c.PhoneNumber
FROM
    Employees e
INNER JOIN Customers c
 ON e.FName = c.FName
 AND e.LName = c.LName
WHERE
    PhoneNumber IS NULL

تعديل القيم الحالية

يستخدم هذا المثال "الجدول Car" من الفصل 1.

تتيح لك SQL إمكانية استخدام القيم القديمة في عمليات التحديث. في المثال التالي، تُزاد قيمة ‎TotalCost‎ بمقدار 100 في الصفين ذوي المعرّفين 3 و4:

UPDATE Cars
SET TotalCost = TotalCost + 100
WHERE Id = 3 or Id = 4
  • زِيدَت قيمة TotalCost الخاصّة بالسيارة 3 من 100 إلى 200.
  • زيدت قيمة TotalCost الخاصّة بالسيارة 4 من 1254 إلى 1354.

يمكن اشتقاق القيمة الجديدة للعمود من قيمته السابقة، أو من قيمة أيّ عمود آخر في الجدول أو من الجدول المضموم (joined table) نفسه.

تحديث صفوف معيّنة

تعيّن الشيفرة أدناه قيمة حالة الصف ذي المُعرٍّف 4 إلى READY.

UPDATE
    Cars
SET
    Status = 'READY'
WHERE
    Id = 4

تقيّم عبارة ‎WHERE‎ شرطًا منطقيًا في كل صفّ. إذا استوفى الصف ذلك الشرط، فستُحدّث قيمته. خلاف ذلك، يظل الصف دون تغيير.

تحديث جميع الصفوف

يعيّن المثال التالي العمود "status" الخاص بجميع صفوف الجدول "Cars" إلى القيمة "READY"، التحديث يشمل جميع الصفوف بسبب غياب العبارة ‎WHERE‎ (التي تصفّي الصفوف).

UPDATE Cars
SET Status = 'READY'

التقاط السجلات المُحدّثة

قد ترغب في بعض الأحيان في التقاط السجلات التي حُدِّثت للتو. يمكنك ذلك عبر الصياغة التالية:

CREATE TABLE #TempUpdated(ID INT)
Update TableName SET Col1 = 42
    OUTPUT inserted.ID INTO #TempUpdated
    WHERE Id > 50

إنشاء قاعدة بيانات عبر CREATE

يمكن إنشاء قاعدة بيانات باستخدام أمر SQL التالي:

CREATE DATABASE myDatabase;

سينتج عن الشيفرة أعلاه قاعدة بيانات فارغة باسم myDatabase، والتي يمكن أن تضيف جداول إليها باستخدام العبارة CREATE TABLE.

إنشاء جدول عبر CREATE TABLE

تُستخدم العبارة CREATE TABLE لإنشاء جدول جديد في قاعدة البيانات. يتألّف تعريف الجدول من قائمة من الأعمدة وأنواعها، إضافة إلى أيّ قيود تكاملية (integrity constraints).

المعامل الشرح
tableName اسم الجدول
columns تحتوي راقمة (enumeration) لجميع الأعمدة الموجودة في الجدول

إنشاء جدول عبر Select

يمكنك إنشاء نسخة مكرّرة من جدول معيّن على النحو التالي:

CREATE TABLE ClonedEmployees AS SELECT * FROM Employees;

يمكنك استخدام أيّ من الميزات الأخرى لعبارة SELECT لتعديل البيانات قبل نقلها إلى الجدول الجديد.

تُنشأ أعمدة الجدول الجديد تلقائيًا انطلاقًا من الصفوف المُختارة.

CREATE TABLE ModifiedEmployees AS
SELECT Id, CONCAT(FName," ",LName) AS FullName FROM Employees
WHERE Id > 10;

إنشاء جدول جديد

تنشئ الشيفرة التالية جدولًا بسيطًا باسم (‎Employees‎)، يتألّف من معرّف، واسم الموظف الأول، واسم العائلة، إضافة إلى رقم الهاتف:

CREATE TABLE Employees(
    Id int identity(1,1) primary key not null,
    FName varchar(20) not null,
    LName varchar(20) not null,
    PhoneNumber varchar(10) not null
);

هذا المثال خاص بالإصدار Transact-SQL،

تنشئ العبارة CREATE TABLE جدولًا جديدًا وتضيفه إلى قاعدة البيانات، تُتبع هذه العبارة باسم الجدول (Employees). ثم تعقبه قائمة بأسماء الأعمدة وخصائصها، مثل المعرّف ID.

Id int identity(1,1) not null

شرح الشيفرة

القيمة شرح
Id اسم العمود
int نوع البيانات
identity(1,1) ينصّ على أنّ قيم العمود ستُنشأ تلقائيًا، بداية من 1، ثم تزداد بمقدار 1 في كل صف جديد
primary key تنص على أنّ قيم هذا العمود فريدة وغير مكرّرة
not null تنص على أنّ قيم العمود لا يمكن أن تكون معدومة

إنشاء جدول باستخدام مفتاح خارجي FOREIGN KEY

ينشئ المثال أدناه جدولًا للموظفين ‎Employees‎ يحتوي مرجعًا إلى جدول آخر، وهو جدول المدن ‎Cities‎.

CREATE TABLE Cities(
    CityID INT IDENTITY(1,1) NOT NULL,
    Name VARCHAR(20) NOT NULL,
    Zip VARCHAR(10) NOT NULL
);
CREATE TABLE Employees(
    EmployeeID INT IDENTITY (1,1) NOT NULL,
    FirstName VARCHAR(20) NOT NULL,
    LastName VARCHAR(20) NOT NULL,
    PhoneNumber VARCHAR(10) NOT NULL,
    CityID INT FOREIGN KEY REFERENCES Cities(CityID)
);

يستعرض الرسم التالي مخططًا توضيحيًا للعلاقة بين قاعدتي البيانات.

ch7t3.png

لاحظ أنّه في السطر الأخير من الشيفرة، يشير العمود ‎CityID‎ من الجدول ‎Employees‎ إلى العمود ‎CityID‎ في الجدول ‎Cities‎:

CityID INT FOREIGN KEY REFERENCES Cities(CityID)

شرح الشيفرة

القمة شرح
CityID اسم العمود
int نوع العمود
FOREIGN KEY إنشاء المفتاح الخارجي (اختياري)
REFERENCES Cities(CityID) إنشاء مرجع إلى العمود CityID من جدول المدن

تنبيه: لا يجوز إنشاء مرجع إلى جدول غير موجود في قاعدة البيانات. عليك أن تنشئ الجدول ‎Cities‎ أولا، ثم تنشئ الجدول ‎Employees‎ عقب ذلك. إذا فعلت ذلك بترتيب معكوس، فسيُطرَح خطأ.

تكرار جدول Duplicate a table

يمكنك تكرار جدول معيّن عبر الصياغة التالية:

CREATE TABLE newtable LIKE oldtable;
INSERT newtable SELECT * FROM oldtable;

إنشاء جدول مؤقت

يمكن إنشاء جدول مؤقت خاص بالجلسة (session) الحالية. لكنّ الصياغة تختلف بحسب إصدار SQL:

  • PostgreSQL و SQLite
CREATE TEMP TABLE MyTable(...);
  • SQL Server
CREATE TABLE #TempPhysical(...);

يمكن كذلك إنشاء جدول مؤقت مرئي للجميع، وليس حصرًا على الجلسة الحالية على النحو التالي:

CREATE TABLE ##TempPhysicalVisibleToEveryone(...);

ويمكن أيضًا إنشاء جدول في الذاكرة:

DECLARE @TempMemory TABLE(...);

إنشاء دالة عبر CREATE FUNCTION

تتيح SQL إنشاء دالة جديدة.

ينشئ المثال التالي دالة باسم FirstWord، والتي تقبل معاملًا من النوع varchar، وتُعيد قيمة من النوع نفسه.

CREATE FUNCTION FirstWord (@input varchar(1000))
RETURNS varchar(1000)
AS
BEGIN
     DECLARE @output varchar(1000)
     SET @output = SUBSTRING(@input, 0, CASE CHARINDEX(' ', @input)
         WHEN 0 THEN LEN(@input) + 1
         ELSE CHARINDEX(' ', @input)
     END)
     RETURN @output
END

شرح الشيفرة

الوسيط شرح
function_name اسم الدالة
list_of_paramenters معاملات الدالة
return_data_type نوع القيمة المُعادة
function_body متن الدالة
scalar_expression القيمة العددية المُعادة من الدالة

ترجمة -وبتصرّف- للفصول من 19 إلى 22 من الكتاب SQL Notes for Professionals

اقرأ أيضًا:


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...