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

لغة معالجة البيانات DML الخاصة بلغة SQL


Ola Abbas

تُستخدَم لغة معالجة البيانات Data Manipulation Language -أو DML اختصارًا- الخاصة بلغة SQL للاستعلام عن البيانات في قاعدة البيانات وتعديلها، وسنشرح في هذا المقال كيفية استخدام تعليمات أوامر لغة SQL DML والتي هي SELECT وINSERT وUPDATE، وDELETE المُعرَّفة كما يلي:

في تعليمة SQL DML:

  • يجب بدأ كل شرط في عبارة بسطر جديد.
  • يجب انتظام بداية كل شرط مع بداية الشروط الأخرى.
  • إذا تألّف شرط من عدة أجزاء، فيجب توضُّع هذه الأجزاء على سطور منفصلة، كما يجب إضافة مسافة بادئة لها تحت بداية الشرط لإظهار العلاقة.
  • تُستخدَم الأحرف الكبيرة لتمثيل الكلمات المحجوزة.
  • تُستخدَم الحروف الصغيرة لتمثيل الكلمات التي يُعرِّفها المستخدِم.

تعليمة SELECT

تسمح التعليمة أو الأمر SELECT للمستخدِم باستخراج البيانات من الجداول، بناءً على معايير محدَّدة، حيث تُعالَج وفقًا للتسلسل التالي:

  • SELECT DISTINCT اختيار عنصر أو مجموعة عناصر.
  • FROM من جدول أو مجموعة جداول.
  • WHERE يليها تعبير شرطي.
  • GROUP BY يليها حقل أو مجموعة حقول.
  • ORDER BY يليها مجموعة حقول.

يمكننا استخدام تعليمة SELECT لإنشاء قائمة بهواتف الموظفين من جدول الموظفين Employees كما يلي:

SELECT  FirstName, LastName, phone
FROM Employees
ORDER BY LastName

سيعرض هذا الإجراء اسم عائلة last name الموظف، واسمه الأول first name، ورقم هاتفه phone number من جدول الموظفين Employees كما في الجدول التالي:

Last Name First Name Phone Number
Hagans Jim 604-232-3232
Wong Bruce 604-244-2322

سنستخدم في المثال التالي جدول الناشرين Publishers table الذي يمثِّله الجدول الآتي، حيث ستلاحظ أنّ كندا Canada مكتوبة بطريقة خاطئة في حقل بلد الناشر Publisher Country المقابل لحقل اسم الناشر Example Publishing، ومدينة الناشر ABC Publishing.

استخدم تعليمة UPDATE لتصحيح الأخطاء وتوحيد حقل البلد ليصبح Canada، -كما سنتكلم لاحقًا عن تعليمة UPDATE في هذا المقال.

Publisher Name Publisher City Publisher Province Publisher Country
Acme Publishing Vancouver BC Canada
Example Publishing Edmonton AB Cnada
ABC Publishing Toronto ON Canda

إذا أضفتَ اسم الناشر Publisher Name، ومدينة الناشر Publisher City، فستستخدِم تعليمة SELECT، ويتبعها اسم الحقول التي يُفصَل بينها بفاصلة أجنبية comma، أي كما يلي:

SELECT PubName, city
FROM Publishers

سيؤدي هذا الإجراء إلى عرض اسم الناشر ومدينته من جدول الناشرين.

إذا أردت عرض حقل اسم الناشر باسم حقل المدينة -أي تبديل اسم الحقل PubName ليصبح city-، فاستخدِم تعليمة SELECT مع عدم وضع فاصلة أجنبية بين Pub_Name وcity، أي كما يلي:

SELECT PubName city
FROM Publishers

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

يفترض SQL Server أنك تريد وضع اسم عمود جديد للحقل PUB_NAME إذا لم تضمّن الفاصلة الأجنبية.

تعليمة SELECT مع معيار WHERE

قد ترغب أحيانًا في التركيز على جزء من جدول الناشرين، مثل الناشرين الموجودين في مدينة فانكوفر Vancouver فقط، إذ ستستخدم في هذه الحالة عبارة SELECT مع معيار WHERE، أي كما يلي: 'WHERE city = 'Vancouver.

يوضِّح المثالان الأوليّان التاليان كيفية تحديد اختيار سجل مع المعيار WHERE باستخدام BETWEEN، إذ يعطي كل من هذين المثالَين نتائج تخزين العناصر نفسها التي عددها بين 20 و50 عنصر في المخزن.

يستخدم المثال رقم 1 الكمية التي قيمتها بين 20 و50 عنصر مع تضمين العنصرين 20 و50 بالصورة التالية: qty BETWEEN 20 and 50.

SELECT StorID, qty, TitleID
FROM Sales
WHERE qty BETWEEN 20 and 50

يستخدِم المثال رقم 2 الشرط qty >=20 and qty <=50.

SELECT StorID, qty, TitleID
FROM Sales
WHERE qty >= 20 and qty  <= 50

يوضِّح المثال رقم 3 كيفية تحديد اختيار سجل مع المعيار WHERE باستخدام NOT BETWEEN.

SELECT StorID, qty, TitleID
FROM Sales
WHERE qty NOT BETWEEN 20 and 50

يظهر المثالان التاليان طريقتَين مختلفتَين لتحديد اختيار سجل مع المعيار WHERE باستخدام IN مع النتائج نفسها.

يوضح المثال رقم 4 كيفية اختيار السجلات باستخدام حقل المقاطعة province من جدول Publishers -أي =province- على أساس جزء من تعليمة WHERE.

SELECT *
FROM Publishers
WHERE province = 'BC' OR province = 'AB' OR province = 'ON'

يوضِّح المثال رقم 5 كيفية اختيار السجلات باستخدام المقاطعة province مع IN على أساس جزء من تعليمة WHERE:

SELECT *
FROM Publishers
WHERE province IN (‘BC’, AB’, ON’)

يوضِّح المثالان الأخيران كيف يمكن استخدام NULL وNOT NULL لتحديد السجلات، ولكن سنستخدم في هذين المثالين جدول الكتب Books table الغير موضَّح هنا، والذي يحتوي على حقول، وهي: العنوان Title، والكمية Quantity، وسعر الكتاب Price، وكل ناشر لديه جدول كتب يعطي قائمةً بجميع كتب الناشر.

يستخدِم المثال رقم 6 القيمة NULL:

SELECT price, title
FROM Books
WHERE price IS NULL

يستخدِم المثال رقم 7 القيمة NOT NULL:

SELECT price, title
FROM Books
WHERE price IS NOT NULL

استخدام محارف البدل wildcards في شرط LIKE

يحدِّد الشرط LIKE الصفوف التي تحتوي على الحقول التي تطابق أجزاءً محددة من سلاسل محرفية، كما يُستخدَم LIKE مع البيانات التي من النوع char وvarchar وtext وdatetime وsmalldatetime.

يسمح محرف البدل wildcard للمستخدِم بمطابقة الحقول التي تحتوي على محارف معينة، حيث سيعطي محرف البدل '%province = 'N جميع المقاطعات التي تبدأ بالمحرف N.

يوضِّح الجدول التالي أربعة طرق لتحديد محارف البدل في تعليمة SELECT في صيغة التعبير المنتظم:

محرف البدل wildcard نتيجة استخدامه
% يمثل أيّ سلسلة تتألف من صفر أو أكثر من المحارف
_ يمثل أيّ محرف واحد
[ ] يمثل أيّ محرف واحد ضمن مجال محدد مثل المجال [a-f]، أو مجموعة محدَّدة مثل المجموعة [abcdef]
[^] يمثل أي محرف واحد ليس ضمن مجال محدد مثل المجال [a - f^]، أو مجموعة محدَّدة مثل المجموعة [abcdef^]

تبحث التعليمة '%LIKE 'Mc في المثال رقم 1 عن جميع أسماء العائلة last names التي تبدأ بالمحرفين Mc مثل McBadden:

SELECT LastName
FROM Employees
WHERE LastName LIKE 'Mc%'

تبحث التعليمة 'LIKE '%inger في المثال رقم 2 عن جميع أسماء العائلة التي تنتهي بالمحارف inger، مثل Ringer وStringer:

SELECT LastName
FROM Employees
WHERE LastName LIKE '%inger'

تبحث التعليمة '%LIKE '%en عن جميع أسماء العائلة التي تحتوي على المحرفين en، مثل Bennett وGreen وMcBadden:

SELECT LastName
FROM Employees
WHERE LastName LIKE '%en%'

تعليمة SELECT مع الشرط ORDER BY

يُستخدَم الشرط ORDER BY لترتيب السجلات في القائمة الناتجة، ويمكنك استخدام ASC لترتيب النتائج تصاعديًا، وDESC لترتيب النتائج تنازليًا.

يستخدِم المثال التالي ASC:

SELECT *
FROM Employees
ORDER BY HireDate ASC

يستخدم المثال التالي DESC:

SELECT *
FROM Books
ORDER BY type, price DESC

تعليمة SELECT مع الشرط GROUP BY

يُستخدَم الشرط GROUP BY لإنشاء خرج هو عبارة عن صف واحد لكل مجموعة، وينتج قيمًا موجِزةً للأعمدة المحدَّدة، كما هو موضَّح أدناه:

SELECT type
FROM Books
GROUP BY type

يستخدم المثال التالي التعليمة السابقة:

SELECT type AS 'Type', MIN(price) AS 'Minimum Price'
FROM Books
WHERE royalty > 10
GROUP BY type

إذا تضمنت تعليمة SELECT معيار WHERE ليكون السعر price قيمةً غير فارغة not null كما يلي:

SELECT type, price
FROM Books
WHERE price is not null

فستكون التعليمة التي تحتوي على شرط GROUP BY كما يلي:

SELECT type AS 'Type', MIN(price) AS 'Minimum Price'
FROM Books
WHERE price is not null
GROUP BY type

استخدام COUNT مع GROUP BY

يمكننا استخدام COUNT لإحصاء عدد العناصر الموجودة في حاوية container، ولكن إذا أردت حساب عدد عناصر مختلفة في مجموعات منفصلة مثل رخام ذي ألوان مختلفة، فسنستخدِم دالة COUNT مع الأمر GROUP BY.

توضح تعليمة SELECT أدناه كيفية حساب عدد مجموعات من البيانات باستخدام دالة COUNT مع الشرط أو الأمر GROUP BY:

SELECT COUNT(*)
FROM Books
GROUP BY type

استخدام AVG وSUM مع GROUP BY

يمكننا استخدام دالة AVG لتعطينا متوسط أي مجموعة، وتُستخدَم الدالة SUM لإعطاء المجموع.

يستخدِم المثال رقم 1 التالي دالة AVG مع الشرط GROUP BY type:

SELECT AVG(qty)
FROM Books
GROUP BY type

يستخدِم المثال رقم 2 التالي دالة SUM مع الشرط GROUP BY type:

SELECT SUM(qty)
FROM Books
GROUP BY type

يستخدِم المثال رقم 3 كلًا من الدالتين AVG، وSUM مع الشرط GROUP BY type في تعليمة SELECT:

SELECT 'Total Sales' = SUM(qty), 'Average Sales' = AVG(qty), stor_id
FROM Sales
GROUP BY StorID ORDER BY  'Total Sales'

تقييد الصفوف مع HAVING

يمكن استخدام الشرط HAVING لتقييد الصفوف، فهو يشبه شرط WHERE باستثناء أنه يتضمّن دالة تجميع aggregate function؛ إذ لا يستطيع الشرط WHERE فعل ذلك، أي يتصرّف الشرط HAVING مثل الشرط WHERE، ولكنه قابل للتطبيق على المجموعات.

نستخدم في هذا المثال الشرط HAVING لاستبعاد المجموعات التي مقاطعتها 'BC'.

SELECT au_fname AS 'Author"s First Name', province as 'Province'
FROM Authors
GROUP BY au_fname, province
HAVING province <> 'BC'

تعليمة INSERT

تضيف تعليمة INSERT صفوفًا إلى جدول، وأيضًا ما يلي:

  • تحدِّد تعليمة INSERT الجدول أو العرض view التي ستُدخَل البيانات فيه.
  • تعرض Column List قائمةً بالأعمدة التي ستتأثر بتعليمة INSERT.
  • يجب توفير كل قيمة إذا حُذِف عمود.
  • يمكن وضع الأعمدة في قائمة ضمن أي ترتيب إذا ضمّنتها.
  • تحدِّد الكلمة VALUES البيانات التي تريد إدخالها في الجدول، وتكون VALUES إلزامية).

يجب عدم إدراج الأعمدة ذات الخاصية IDENTITY بصورة صريحة في column_list أو value_sclause.

صيغة تعليمة INSERT هي:

INSERT [INTO] Table_name | view name [column_list]
DEFAULT VALUES | values_list | select statement

تُطبَّق القواعد التالية عند إدخال صفوف باستخدام تعليمة INSERT:

  • يؤدي إدخال سلسلة فارغة (' ') في عمود من النوع varchar، أو text إلى إدخال مسافة واحدة.
  • تُحشَى جميع الأعمدة ذات النوع char على اليمين right-padded حتى تصل إلى الطول المحدد.
  • تُزال جميع المسافات الزائدة من البيانات المدرجة في أعمدة من النوع varchar، باستثناء السلاسل التي تحتوي على مسافات فقط، إذ تُختصَر هذه السلاسل إلى مسافة واحدة فقط.
  • إذا أخلَّت تعليمة INSERT بالقيد، أو الافتراض، أو القاعدة، أو إذا كان نوع البيانات خاطئًا، فستفشل هذه التعليمة، وسيعرض خادم SQL Server رسالة خطأ.

يمكن حدوث أحد الأشياء الثلاثة التالية للأعمدة التي لا تحتوي على قيم عند تحديد قيم بعض الأعمدة في column_list فقط:

  1. تُدخَل قيمة افتراضية إذا كان للعمود قيد DEFAULT، أو إذا كان الافتراض مرتبط بالعمود، أو إذا كان الافتراض مرتبط بنوع البيانات التي يعرِّفها المستخدم.
  2. تُدخَل القيمة الفارغة NULL إذا سمح العمود بالقيم الفارغة، ولا توجد قيمة افتراضية موجودة للعمود.
  3. تُعرَض رسالة خطأ ويُرفَض الصف إذا عُرَِف العمود بأنه غير فارغ NOT NULL، ولا توجد قيمة افتراضية.

يستخدِم المثال التالي تعليمة INSERT لإضافة سجل إلى جدول الكتّاب Authors:

INSERT INTO Authors
VALUES('555-093-467', 'Martin', 'April', '281 555-5673', '816 Market St.,' , 'Vancouver', 'BC', 'V7G3P4', 0)

يوضِّح المثال التالي كيفية إدخال صف جزئي partial row في جدول الناشرِين Publishers مع قائمة أعمدة.

يملك عمود الدولة country قيمة افتراضية هي Canada، لذلك لا يلزمك تضمينه في قيمك.

INSERT INTO Publishers (PubID, PubName, city, province)
VALUES ('9900', 'Acme Publishing', 'Vancouver', 'BC')

اتبع المثال التالي لإدخال صفوف في جدول مع عمود IDENTITY، ولا تعطي قيمةً للعمود IDENTITY، ولا قيمةً لاسم العمود ضمن قائمة الأعمدة.

INSERT INTO jobs
VALUES ('DBA', 100, 175)

إدخال قيم محددة ضمن عمود IDENTITY

لا يمكن إدخال البيانات مباشرة في عمود IDENTITY افتراضيًا، ولكن إذا حُذِف صف خطأً، أو إذا كانت هناك ثغرات في قيم عمود IDENTITY، فيمكنك إدخال صف وتحديد قيمة العمود IDENTITY.

IDENTITY_INSERT option

يمكن استخدام خيار IDENTITY_INSERT على النحو التالي للسماح بإدخال قيمة هوية identity محدَّدة:

SET IDENTITY_INSERT jobs ON
INSERT INTO jobs  (job_id, job_desc, min_lvl, max_lvl)
VALUES (19, 'DBA2', 100, 175)
SET IDENTITY_INSERT jobs OFF

إدخال صفوف باستخدام عبارة SELECT

يمكننا أحيانًا إنشاء جدول مؤقت صغير من جدول كبير، لذلك يمكننا إدخال صفوف مع تعليمة SELECT.

لا يوجد تحقق لصحة التفرد uniqueness عند استخدام هذا الأمر، وبالتالي، قد يكون هناك العديد من الصفوف بالمعرّف pub_id نفسه في المثال التالي.

ينشِئ هذا المثال جدول ناشرِين Publishers مؤقت هو tmpPublishers أصغر باستخدام تعليمة إنشاء جدول CREATE TABLE، ثم تُستخدَم تعليمة INSERT مع تعليمة SELECT لإضافة سجلات إلى جدول الناشرِين المؤقت من جدول الناشرين Publishers.

CREATE TABLE dbo.tmpPublishers (
PubID char (4) NOT NULL ,
PubName varchar (40) NULL ,
city varchar (20) NULL ,
province char (2) NULL ,
country varchar (30) NULL  DEFAULT ('Canada')
)
INSERT  tmpPublishers
SELECT * FROM Publishers

ننسخ في هذا المثال مجموعةً فرعيةً من البيانات:

INSERT tmpPublishers (pub_id, pub_name)
SELECT PubID, PubName
FROM Publishers

تُنسَخ بيانات الناشرين في هذا المثال إلى جدول tmpPublishers ويُضبَط عمود الدولة country إلى القيمة Canada:

INSERT tmpPublishers (PubID, PubName, city, province, country)
SELECT PubID, PubName, city, province, Canada
FROM Publishers

تعليمة UPDATE

تغيّر تعليمة UPDATE البيانات في الصفوف الموجودة إما بإضافة بيانات جديدة أو بتعديل البيانات الموجودة.

يستخدِم المثال التالي تعليمة UPDATE لتوحيد حقل الدولة country ليكون Canada لجميع السجلات في جدول Publishers:

UPDATE Publishers
SET country = 'Canada'

يزيد المثال التالي مبالغ حقوق المؤلف royalty التي قيمتها بين 10 و20 بنسبة 10%:

UPDATE roysched
SET royalty = royalty + (royalty * .10)
WHERE royalty BETWEEN 10 and 20

تضمين استعلامات فرعية subqueries ضمن عبارة UPDATE

يُمنَح الموظفون في جدول الموظفين Employees الذين وظّفهم الناشر في عام 2010 ترقيةً إلى أعلى مستوى وظيفي حسب نوع عملهم كما يلي:

UPDATE Employees
SET job_lvl =
(SELECT max_lvl FROM jobs
WHERE employee.job_id = jobs.job_id)
WHERE DATEPART(year, employee.hire_date) = 2010

تعليمة DELETE

تزيل تعليمة DELETE صفوفًا من مجموعة سجلات، كما تحدِّد عبارة DELETE الجدول أو العرض view الذي يحوي الصفوف التي ستُحذَف، ويمكن إدراج جدول أو صف واحد فقط في الوقت نفسه.

يُعَدّ الشرط WHERE المعيار الذي يحدِّد السجلات المراد حذفها، وتكون صيغة تعليمة DELETE كما يلي:

DELETE [FROM] {table_name | view_name }
[WHERE clause]

قواعد تعليمة DELETE هي:

  1. إذا حُذِف شرط WHERE فستُزال جميع الصفوف الموجودة في الجدول باستثناء الفهارس indexes، والجدول، والقيود.
  2. لا يمكن استخدام عبارة DELETE بعرض view يحتوي على شرط FROM يسمّي أكثر من جدول واحد، فتعليمة DELETE يمكن أن تؤثر على جدول أساسي فقط في الوقت نفسه.

فيما يلي ثلاث تعليمات DELETE مختلفة يمكن استخدامها:

  1. حذف جميع الصفوف من جدول:
DELETE
FROM Discounts
  1. حذف صفوف محدَّدة:
DELETE
FROM Sales
WHERE stor_id = '6380'
  1. حذف صفوف بناءً على قيمة ضمن استعلام فرعي:
DELETE FROM Sales
WHERE title_id IN
(SELECT title_id FROM Books WHERE type = 'mod_cook')

الدوال المبنية مسبقا Built-in Functions

يوجد العديد من الدوال المبنية مسبقًا في SQL Server، مثل:

  1. دوال التجميع Aggregate: ترجع قيمًا موجِزة summary values.
  2. دوال التحويل Conversion: تحوِّل نوع بيانات معين إلى نوع آخر.
  3. دوال التاريخ Date: تعرض معلومات عن التواريخ والأوقات.
  4. الدوال الرياضية Mathematical: تجري عمليات على البيانات العددية.
  5. الدوال المتعلِّقة بالسلاسل String: تجري عمليات على سلاسل المحارف، أو البيانات الثنائية، أو التعابير.
  6. الدوال المتعلِّقة بالنظام System: ترجع معلومات من قاعدة البيانات.
  7. الدوال المتعلِّقة بالنصوص Text، والصور image: تجري عمليات على بيانات نصية، أو على بيانات الصور.

سنشرح أدناه الدوال الأربع الأولى شرحًا مفصَّلًا مع أمثلة عنها.

دوال التجميع Aggregate functions

تجري دوال التجميع حسابات على مجموعة من القيم، وترجع قيمةً واحدةً أو قيمةً موجِزةً.

يعرض الجدول التالي هذه الدوال:

الدالة FUNCTION وصفها
AVG ترجع متوسط average جميع القيم، أو القيم المميزة DISTINCT فقط، ضمن التعبير
COUNT ترجع عدد القيم غير الفارغة في التعبير، وإذا استخدِم التمايز DISTINCT فستجد الدالة COUNT عدد القيم غير الفارغة الفريدة
(*)COUNT ترجع عدد الصفوف، ولا تأخذ الدالة (*)COUNT معاملات، كما لا يمكن استخدام التمايز DISTINCT معها
MAX ترجع القيمة العليا في التعبير، ويمكن استخدام الدالة Max مع الأعمدة ذات النوع العددي، والمحرفي، والأعمدة ذات النوع datetime، ولكنها لا تُستخدَم مع الأعمدة ذات النوع bit، كما تعطي الدالة MAX مع الأعمدة المحرفية أعلى قيمة في تسلسل مرتَّب، وتتجاهل هذه الدالة القيم الفارغة
MIN ترجع القيمة الدنيا في التعبير. يمكن استخدام الدالة MIN مع أعمدة عددية، ومحرفية، وذات النوع datetime، ولكنها لا تُستخدَم مع أعمدة لها النوع bit، كما تعطي الدالة MIN مع الأعمدة المحرفية أعلى قيمة في تسلسل مرتَّب، وتتجاهل هذه الدالة القيم الفارغة
SUM ترجع مجموع كل القيم، أو فقط القيم المميزة DISTINCT في التعبير، ويمكن استخدام الدالة SUM مع الأعمدة العددية فقط

سنعرض فيما يلي أمثلةً عن كل من دوال التجميع الموجودة في الجدول السابق.

  • المثال الأول: الدالة AVG
SELECT AVG (price) AS 'Average Title Price'
FROM Books
  • المثال الثاني: الدالة COUNT
SELECT COUNT(PubID) AS 'Number of Publishers'
FROM Publishers
  • المثال الثالث: الدالة COUNT
SELECT COUNT(province) AS 'Number of Publishers'
FROM Publishers
  • المثال الرابع: الدالة (*) COUNT
SELECT COUNT(*)
FROM Employees
WHERE job_lvl = 35
  • المثال الخامس: الدالة MAX
SELECT MAX (HireDate)
FROM Employees
  • المثال السادس: الدالة MIN
SELECT MIN (price)
FROM Books
  • المثال السابع: الدالة SUM
SELECT SUM(discount) AS 'Total Discounts'
FROM Discounts

دالة التحويل Conversion function

تحوّل دالة التحويل نوع بيانات معين إلى نوع بيانات آخر.

يُحوَّل السعر price الذي يحتوي ضمنه على تسعتين 99 إلى خمسة محارف في المثال الآتي، حيث تكون صيغة التعليمة بالصورة التالية:

SELECT 'The date is ' + CONVERT(varchar(12), getdate())

إليك مثال:

SELECT CONVERT(int, 10.6496)
SELECT title_id, price
FROM Books
WHERE CONVERT(char(5), price) LIKE '%99%'

مثال آخر عن تغيِّر دالة التحويل في المثال التالي البيانات إلى نوع بيانات بحجم مختلف:

SELECT title_id, CONVERT(char(4), ytd_sales) as 'Sales'
FROM Books
WHERE type LIKE '%cook'

دالة التاريخ Date function

تُنتج دالة التاريخ تاريخًا عن طريق إضافة فاصل زمني إلى تاريخ محدَّد، والنتيجة هي قيمة لها نوع datetime، وتساوي التاريخ مضافًا إليه عدد أجزاء التاريخ date parts.

إذا كان معامل دالة التاريخ قيمةً من النوع smalldatetime، فستكون النتيجة قيمةً من النوع smalldatetime أيضًا.

تُستخدَم الدالة DATEADD لإضافة وزيادة قيم التاريخ، وصيغة هذه الدالة هي: (DATEADD(datepart, number, date.

SELECT DATEADD(day, 3, hire_date)
FROM Employees

يستخدِم المثال الآتي الدالة (DATEDIFF(datepart, date1, date2، ويعيد هذا الأمر عدد أجزاء التاريخ أو الحدود boundaries المتقاطعة بين تاريخَين محددين.

تجعل طريقة حساب الحدود المتقاطعة النتيجة التي أعطتها الدالة DATEDIFF متوافقة مع جميع أنواع البيانات، مثل الدقائق، والثواني، والميلي ثانية.

SELECT DATEDIFF(day, HireDate, 'Nov 30 1995')
FROM Employees

يمكننا فحص أي جزء من تاريخ معيَّن من السنة إلى الميلي ثانية.

يعرض الجدول التالي أجزاء التاريخ DATEPART، واختصاراتها، وقيمها المقبولة التي يعترف بها خادم SQL Server.

جزء التاريخ DATE PART اختصاره ABBREVIATION قيمه VALUES
Year yy 1753-9999
Quarter qq 1-4
Month mm 1-12
Day of year dy 1-366
Day dd 1-31
Week wk 1-53
Weekday dw 1-7‎ (Sun.-Sat.)
Hour hh 0-23
Minute mi 0-59
Second ss 0-59
Millisecond ms 0-999

الدوال الرياضية Mathematical functions

تجري الدوال الرياضية عمليات على البيانات العددية، ويعرض المثال التالي السعر الحالي لكل كتاب يبيعه الناشر، كما يعرض ما سيكون عليه الأمر إذا ارتفعت جميع الأسعار بنسبة 10%:

SELECT Price, (price * 1.1) AS 'New Price', title
FROM Books
SELECT 'Square Root' = SQRT(81)
SELECT 'Rounded' = ROUND(4567.9876,2)
SELECT FLOOR (123.45)

ربط الجداول Joining Tables

يُعَدّ ربط جدولين أو أكثر مثل عملية موازنة بيانات ضمن أعمدة محدَّدة، واستخدام نتائج الموازنة لتشكيل جدول جديد من الصفوف المؤهلة لذلك.

تقوم عبارة الربط join بما يلي:

  • تحدِّد عمودًا من كل جدول.
  • توازن القيم الموجودة في تلك الأعمدة صفًا صفًا.
  • تدمج الصفوف ذات القيم المؤهلة ضمن صف جديد.

تكون الموازنة عادةً مساواةً -أي القيم التي تتطابق مع بعضها البعض تمامًا-، ولكن يمكن تحديد أنواع ربط أخرى أيضًا.

سنشرح جميع أنواع الربط المختلفة أدناه، مثل: الربط الداخلي inner، واليساري (الخارجي)، واليميني (الخارجي)، والربط المتقاطع cross join (التام).

الربط الداخلي Inner join

يربط جدولين في عمود له نفس نوع البيانات، وينتج الصفوف التي تتطابق فيها قيم العمود فقط، حيث يجري تجاهل الصفوف التي لا مثيل لها.

  • المثال الأول:
SELECT jobs.job_id, job_desc
FROM jobs
INNER JOIN Employees ON emp
loyee.job_id = jobs.job_id
WHERE jobs.job_id < 7
  • المثال الثاني:
SELECT authors.au_fname, authors.au_lname, books.royalty, title
FROM authorsINNER JOIN titleauthor ON authors.au_id=titleauthor.au_id
INNER JOIN books ON titleauthor.title_id=books.title_id
GROUP BY authors.au_lname, authors.au_fname, title, title.royalty
ORDER BY authors.au_lname

الربط اليساري الخارجي Left outer join

ينتج عن الربط الخارجي اليساري كل الصفوف الخارجية اليسرى، إذ تُضمَّن جميع الصفوف من الجدول الأيسر التي لا تحقّق الشرط المحدّد في مجموعة النتائج، وتُضبَط أعمدة الخرج من الجدول الآخر على القيمة الفارغة NULL.

يستخدِم المثال التالي الصيغة الجديدة للربط اليساري الخارجي:

SELECT publishers.pub_name, books.title
FROM Publishers
LEFT OUTER JOIN Books On publishers.pub_id = books.pub_id

بينما يستخدِم المثال التالي الصيغة القديمة للربط الخارجي اليساري:

SELECT publishers.pub_name, books.title
FROM Publishers, Books
WHERE publishers.pub_id *= books.pub_id

الربط الخارجي الأيمن Right outer join

يتضّمن الربط الخارجي الأيمن في مجموعة النتائج الخاصة به كافة الصفوف من الجدول الأيمن التي لا تحقّق الشرط المحدّد، وتُضبَط أعمدة الخرج المقابلة من الجدول الآخر على القيمة الفارغة NULL.

يستخدِم المثال التالي الصيغة الجديدة للربط الخارجي الأيمن:

SELECT titleauthor.title_id, authors.au_lname, authors.au_fname
FROM titleauthor
RIGHT OUTER JOIN authors ON titleauthor.au_id = authors.au_id
ORDERY BY au_lname

بينما يوضِّح المثال التالي الصيغة القديمة المستخدَمة للربط الخارجي الأيمن:

SELECT titleauthor.title_id, authors.au_lname, authors.au_fname
FROM titleauthor, authors
WHERE titleauthor.au_id =* authors.au_id
ORDERY BY au_lname

الربط الخارجي الكامل Full outer join

يحدِّد الربط الخارجي الكامل أنه في حالة عدم تطابق صف من أي من الجدولين مع معايير التحديد، فسيُضمَّن الصف في مجموعة النتائج، وتُضبَط أعمدة الخرج الخاصة به التي تتوافق مع الجدول الآخر إلى القيمة الفارغة NULL.

فيما يلي مثال عن ربط خارجي كامل:

SELECT books.title, publishers.pub_name, publishers.province
FROM Publishers
FULL OUTER JOIN Books ON books.pub_id = publishers.pub_id
WHERE (publishers.province <> "BC" and publishers.province <> "ON")
ORDER BY books.title_id

الربط المتقاطع Cross join

الربط المتقاطع هو ناتج دمج جدولين، وينتج عن هذا الربط صفوف حالة عدم استخدام الشرط WHERE نفسها، أي كما يلي:

SELECT au_lname, pub_name,
FROM Authors CROSS JOIN Publishers

للمزيد من المعلومات، انظر توثيق SQL في موسوعة حسوب.

ترجمة -وبتصرّف- للمقال SQL Data Manipulation Language لصاحبَيه Adrienne Watt و Nelson Eng.

اقرأ أيضًا


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

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

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



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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...