تُستخدَم لغة معالجة البيانات Data Manipulation Language -أو DML اختصارًا- الخاصة بلغة SQL للاستعلام عن البيانات في قاعدة البيانات وتعديلها، وسنشرح في هذا المقال كيفية استخدام تعليمات أوامر لغة SQL DML والتي هي SELECT
وINSERT
وUPDATE
، وDELETE
المُعرَّفة كما يلي:
-
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 فقط:
-
تُدخَل قيمة افتراضية إذا كان للعمود قيد
DEFAULT
، أو إذا كان الافتراض مرتبط بالعمود، أو إذا كان الافتراض مرتبط بنوع البيانات التي يعرِّفها المستخدم. -
تُدخَل القيمة الفارغة
NULL
إذا سمح العمود بالقيم الفارغة، ولا توجد قيمة افتراضية موجودة للعمود. -
تُعرَض رسالة خطأ ويُرفَض الصف إذا عُرَِف العمود بأنه غير فارغ
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
هي:
-
إذا حُذِف شرط
WHERE
فستُزال جميع الصفوف الموجودة في الجدول باستثناء الفهارس indexes، والجدول، والقيود. -
لا يمكن استخدام عبارة
DELETE
بعرض view يحتوي على شرطFROM
يسمّي أكثر من جدول واحد، فتعليمةDELETE
يمكن أن تؤثر على جدول أساسي فقط في الوقت نفسه.
فيما يلي ثلاث تعليمات DELETE
مختلفة يمكن استخدامها:
- حذف جميع الصفوف من جدول:
DELETE FROM Discounts
- حذف صفوف محدَّدة:
DELETE FROM Sales WHERE stor_id = '6380'
- حذف صفوف بناءً على قيمة ضمن استعلام فرعي:
DELETE FROM Sales WHERE title_id IN (SELECT title_id FROM Books WHERE type = 'mod_cook')
الدوال المبنية مسبقا Built-in Functions
يوجد العديد من الدوال المبنية مسبقًا في SQL Server، مثل:
- دوال التجميع Aggregate: ترجع قيمًا موجِزة summary values.
- دوال التحويل Conversion: تحوِّل نوع بيانات معين إلى نوع آخر.
- دوال التاريخ Date: تعرض معلومات عن التواريخ والأوقات.
- الدوال الرياضية Mathematical: تجري عمليات على البيانات العددية.
- الدوال المتعلِّقة بالسلاسل String: تجري عمليات على سلاسل المحارف، أو البيانات الثنائية، أو التعابير.
- الدوال المتعلِّقة بالنظام System: ترجع معلومات من قاعدة البيانات.
- الدوال المتعلِّقة بالنصوص 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 | 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.
اقرأ أيضًا
- المقال التالي: أمثلة عملية عن كيفية تصميم قواعد البيانات
- المقال السابق: نظرة سريعة على لغة الاستعلامات الهيكلية SQL
- الاعتماديات الوظيفية المستخدمة في تصميم قواعد البيانات
- قواعد السلامة وقيودها لضمان سلامة البيانات في قواعد البيانات
- الاستعلامات الفرعية والإجراءات في SQL
- البحث والتنقيب والترشيح في SQL
- معالجة الأخطاء والتعديل على قواعد البيانات في SQL
- النسخة العربية الكاملة لكتاب تصميم قواعد البيانات
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.