اذهب الي المحتوي
أوفيسنا

كتاب ثمين و هام في SQL ( منقول ) لعيون الاساتذة الافاضل


الردود الموصى بها

 Structured Query Language

 لغة الاستعلام البنوية

 SQL

الكتاب منقول للامانة : عمار دربالي

 

 

SQL

SQL هي اختصارٌ للعبارة Structured Query Language (أي لغة الاستعلام البنوية)، وهي اللغة المستخدمة لإجراء عمليات على قواعد البيانات، بما في ذلك إضافة أو تحديث أو حذف البيانات من قاعدة البيانات، أو لتعديل بينة قاعدة البيانات نفسها.

محتويات

·         1بنية تعليمات SQL

·         2أنواع البيانات

·         3أساسيات لغة SQL

o        3.1القيمة NULL

o        3.2التعليقات Comments

o        3.3التسمية Alias

o        3.4الاستعلامات الفرعية Subqueries

·         4التعامل مع السجلات

o        4.1عرض السجلات SELECT

o        4.2الشرط WHERE

o        4.3التجميع GROUP BY

o        4.4الشرط HAVING

o        4.5ترتيب النتائج ORDER BY

o        4.6الحصول على عدد محدد من النتائج

o        4.7إدخال السجلات للجدول INSERT

o        4.8حذف السجلات من الجدول DELETE

o        4.9الاستبدال REPLACE

o        4.10التعديل UPDATE

·         5ربط الجداول

o        5.1الربط الداخلي INNER JOIN

o        5.2الربط اليساري LEFT JOIN

o        5.3الربط اليميني RIGHT JOIN

o        5.4الربط التامّ FULL JOIN

·         6المعاملات

o        6.1المعاملات الأساسية

o        6.2النتائج المتمايزة DISTINCT

o        6.3التأكد من وجود سجل EXISTS

o        6.4المعامل LIKE

o        6.5المعاملات المنطقية AND, OR, NOT

o        6.6معاملات المجال IN, BETWEEN

o        6.7معاملات الضم UNION, INTERSECT, EXCEPT

o        6.8معاملات المقارنة ALL, SOME, ANY

·         7بنى التحكم

o        7.1شرط IF

o        7.2شرط CASE

o        7.3حلقة WHILE

·         8العمليات

o        8.1لمحة عن العمليات

o        8.2أمر بدأ العمليات START TRANSACTION

o        8.3الأمر COMMIT

o        8.4الأمر ROLLBACK

·         9التعامل مع المستخدمين

o        9.1إنشاء المستخدم CREATE USER

o        9.2تعديل المستخدم ALTER USER

o        9.3حذف المستخدم DROP USER

o        9.4منح الصلاحيات GRANT

o        9.5إلغاء الصلاحيات REVOKE

·         10التعامل مع الفهارس

o        10.1إنشاء الفهرس CREATE INDEX

o        10.2تعديل الفهرس ALTER INDEX

o        10.3حذف الفهرس DROP INDEX

·         11التعامل مع قواعد البيانات

o        11.1إنشاء قاعدة البيانات CREATE DATABASE

o        11.2حذف قاعدة البيانات DROP DATABASE

o        11.3الاستخدام USE

·         12التعامل مع الجداول

o        12.1مفاتيح الجداول Table Keys

o        12.2إنشاء الجدول CREATE TABLE

o        12.3تعديل جدول ALTER TABLE

o        12.4حذف الجدول DROP TABLE

·         13التعامل مع الدوال

o        13.1بعض الدوال المساعدة في SQL

o        13.2إنشاء الدالة CREATE FUNCTION

o        13.3تعديل الدالة ALTER FUNCTION

o        13.4حذف الدالة DROP FUNCTION

o        13.5العودة من الدالة RETURN

·         14التعامل مع العرض

o        14.1إنشاء العرض CREATE VIEW

o        14.2تعديل العرض ALTER VIEW

o        14.3حذف العرض DROP VIEW

·         15مصادر

 

 

 

 

 

 

بنية تعليمات SQL

تُنفَّذ تعليمات SQL على الجداول الموجودة في قواعد البيانات، وتلك الجداول تتألف من أعمدة وسجلات؛ أما التعليمات فهي تتألف من كلمات محجوزة ومتغيرات ومعاملات (وغير ذلك) التي تُحدِّد ما هي العملية التي نريد تنفيذها.

لغة SQL تُصرِّح عن النتيجة النهائية للعملية التي نريد إجراءها، وليس عن التفاصيل اللازمة لطريقة إجراء تلك العملية، إذ إنَّ محركات قواعد البيانات هي المسؤولة عن تلك التفاصيل.

المثال الآتي يُبيّن استخدام الاستعلام SELECT لتحديد عمودين من أحد الجداول، مع توفير اسم بديل (AS) لأحد الأعمدة، لتحديد السجلات التي ينطبق عليها شرطٌ معيّن (WHERE)، وترتيبها وفق أحد الأعمدة (ORDER BY):

SELECT name, age*365 AS AgeDays

FROM students

WHERE age > 10

ORDER BY name;

نُظِّم هذا الدليل بتخصيص صفحة لكل عبارة أو كلمة محجوزة أو معامل في SQL، ويكون اسم تلك الصفحة بأحرفٍ صغيرة، وإذا تألفت العبارة من أكثر من كلمة فيُفصَل بينها بشرطة سفلية؛ فمثلًا صفحة الاستعلام SELECT ستكون موجودةً على الرابط SQL/select، أما صفحة ORDER BY فهي موجودة في SQL/order_by وهكذا...

أنواع البيانات التي يمكن استخدامها مع محركات قواعد البيانات المختلفة (البيانات العددية، والبيانات النصية، والوقت والتاريخ، والبيانات الثنائية ...إلخ.).

أساسيات لغة SQL

القيمة NULL

يستخدم التعبير IS NULL للتأكد من خلو القيمة (أي لا توجد قيمة في الحقل المحدد).

التعليقات Comments

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

SELECT count(*);     -- This comment continues to the end of line

SELECT count(*);     /* This is an inline comment */;

التسمية Alias

يمكن إطلاق تسمية على الجداول أو الحقول تسهيلًا للتعامل معها بالاسم البديل المؤقت، وذلك عند الحاجة إلى الوصول إلى نفس الجدول أو الحقل عدة مرات، وعندما يكون اسم الجدول أو الحقل طويلًا وصعب الكتابة.

الاستعلامات الفرعية Subqueries

هي استعلام واقعٌ ضمن استعلام آخر بهدف استخدام البيانات الناتجة عنه في الاستعلام الرئيسي الذي يحتويه.

التعامل مع السجلات

عرض السجلات SELECT

يُستخدَم للحصول على سجلات البيانات من الجداول المخزنة في قاعدة البيانات، قد تكون نتيجة الاستعلام سجلًا أو أكثر، وعمودًا أو أكثر.

الشرط WHERE

يُستخدم ضمن استعلام SELECT لتحديد الشروط التي تُعرض أو تحذف السجلات أو تُعدل قيم حقولها وفقًا لها، إذ يُمكن أن تستخدم أيضًا مع استعلامَي DELETE و UPDATE.

التجميع GROUP BY

تُستخدم في استعلام SELECT بهدف تجميع النتائج ضمن مجموعات بحسب عمود أو أكثر من الجدول.

الشرط HAVING

يُستخدم ضمن استعلام SELECT لتحديد شرطٍ معينٍ عند تجميع السجلات مع بعضها GROUP BY.

ترتيب النتائج ORDER BY

تتلخص مهمة عبارة ORDER BY بترتيب النتائج (تصاعديًا أو تنازليًا) ضمن استعلام SELECT وفق عمودٍ (أو أكثر) من الجدول.

الحصول على عدد محدد من النتائج

يمكن تحديد عدد السجلات التي ستُجلب من الجدول ضمن استعلام SELECT أو التي ستُحذف من الجدول ضمن استعلام DELETE أو ستُحدَّث قيمها ضمن استعلام UPDATE، هنالك اختلافات بين محركات قواعد البيانات، ويُفضَّل العودة إلى هذه الصفحة للتفاصيل.

إدخال السجلات للجدول INSERT

مهمة هذا الاستعلام هي إنشاء سجل جديد في الجدول.

حذف السجلات من الجدول DELETE

يُستخدم لحذف سجل أو أكثر.

الاستبدال REPLACE

هو استعلام يستخدم للقيام بنفس مهمة الاستعلام INSERT (إضافة سجل جديد للجدول) ولكن لإدخال سجلٍ بنفس القيمة الموجودة مسبقًا في عمود المفتاح الأوليّ وذلك منعًا لحدوث التكرار.

التعديل UPDATE

يُستخدم هذا الاستعلام من أجل تحديث قيم البيانات المخزنة في سجلات الجداول.

الربط الداخلي INNER JOIN

يُستخدم لتحديد بعض السجلات من الجدول اليساري والجدول اليميني بحيث تحقق شرط الربط.

الربط اليساري LEFT JOIN

يُستخدم لتحديد كافة السجلات من الجدول اليساري وبعض السجلات من الجدول اليميني التي تحقق شرط الربط.

الربط اليميني RIGHT JOIN

يُستخدم لتحديد بعض السجلات التي تحقق شرط الربط من الجدول اليساري وكافة السجلات من الجدول اليميني.

الربط التامّ FULL JOIN

يُستخدم لتحديد كافة السجلات من الجدولين اليساري واليميني بغض النظر عن تحقيقها للشرط.

المعاملات

المعاملات الأساسية

تتضمن المعاملات الأساسية المعاملات الرياضية، والمعاملات الثنائية، ومعاملات المقارنة، والمعاملات المنطقية، وتحتوي الصفحة أيضًا على جداول تبيّن أولوية المعاملات.

النتائج المتمايزة DISTINCT

تستخدم للحصول على قيمٍ فريدةٍ غير مكررة، وغالبًا ما تستخدم في استعلام SELECT للحصول على سجلات لا تتكرر القيم فيما بينها.

التأكد من وجود سجل EXISTS

يستخدم للتأكد من وجود سجلات ناتجة عن الاستعلام الفرعي المستخدم في الاستعلام الرئيسي.

المعامل LIKE

يستخدم لتحديد نمط معين للسلسلة النصية يُحدد الشرط وفقًا له.

المعاملات المنطقية AND, OR, NOT

غالبًا ما تستخدم المعاملات المنطقية (AND و OR و NOT) في عبارة WHERE للربط ما بين الشروط أو نفيها.

معاملات المجال IN, BETWEEN

تُستخدَم هذه المعاملات لتحديد مجال أو عدد محدّد من القيم في SQL.

معاملات الضم UNION, INTERSECT, EXCEPT

تُستخدَم هذه المعاملات للربط بين نتائج الاستعلامات في SQL.

معاملات المقارنة ALL, SOME, ANY

تستخدم بهدف المقارنة مع القيم الناتجة (لعمودٍ واحدٍ) عن أحد الاستعلامات الفرعية.

بنى التحكم

شرط IF

تستخدم صيغة IF لاختبار شرط معين للتأكّد من تحقّقه أو عدم تحقّقه وإجراء ما يتناسب مع ذلك.

شرط CASE

تستخدم لاختبار شرط معين بشكل مشابه لتعليمات if/else في لغات البرمجة الأخرى لتعيد أحد التعابير الممكنة.

حلقة WHILE

تهدف حلقة WHILE إلى تكرار عددٍ من التعليمات باستمرار تحقق الشرط ضمنها، إذ يُتأكَّد من تحقّق الشرط قبل البدء بتنفيذ التعليمات التي تحتويه.

العمليات

لمحة عن العمليات

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

أمر بدأ العمليات START TRANSACTION

يُستخدم هذا الأمر للإعلام بالبدء بإجراء مجموعة من العمليات التي قد تنتهي بأمر COMMIT أو ROLLBACK.

الأمر COMMIT

يستخدم بهدف حفظ التغييرات المُجراة على قاعدة البيانات نتيجة لتنفيذ العمليات، إذ تحفظ كافة التغييرات منذ آخر أمر COMMIT أو ROLLBACK.

الأمر ROLLBACK

يستخدم لإلغاء العمليات المُجراة على قاعدة البيانات مما يعني تجاهل التغييرات التي طرأت عليها.

التعامل مع المستخدمين

إنشاء المستخدم CREATE USER

يُستخدم لإنشاء مستخدم جديد، وتختلف صيغته بحسب محركات قواعد البيانات المختلفة.

تعديل المستخدم ALTER USER

يُستخدم للتعديل من خصائص وسماحيات المستخدم، وتختلف صيغته بحسب محركات قواعد البيانات المختلفة.

حذف المستخدم DROP USER

يُستخدَم لحذف مستخدم.

منح الصلاحيات GRANT

يستخدم لمنح صلاحيات الوصول access privileges لمستخدمٍ أو مجموعة مستخدمين أو أكثر، وتختلف صيغته بحسب محركات قواعد البيانات المختلفة.

إلغاء الصلاحيات REVOKE

يستخدم لإلغاء صلاحيات الوصول access privileges لمستخدمٍ أو مجموعة مستخدمين أو أكثر، وتختلف صيغته بحسب محركات قواعد البيانات المختلفة.

التعامل مع الفهارس

إنشاء الفهرس CREATE INDEX

يستخدم لإنشاء فهرس للجدول.

تعديل الفهرس ALTER INDEX

يستخدم لتعديل الفهرس المُنشأ عبر الأمر CREATE INDEX.

حذف الفهرس DROP INDEX

يستخدم لحذف فهرس أو أكثر.

التعامل مع قواعد البيانات

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

يستخدم لإنشاء قاعدة بيانات جديدة.

حذف قاعدة البيانات DROP DATABASE

يستخدم لحذف قاعدة البيانات.

الاستخدام USE

يستخدم لتحديد قاعدة البيانات التي يتَعامَل معها لنقل السياق context لها.

التعامل مع الجداول

مفاتيح الجداول Table Keys

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

إنشاء الجدول CREATE TABLE

يستخدم لإنشاء جدولٍ جديدٍ في قاعدة البيانات.

تعديل جدول ALTER TABLE

يستخدم لتعديل تعريف الجدول المُنشأ مسبقًا عبر الأمر CREATE TABLE.

حذف الجدول DROP TABLE

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

التعامل مع الدوال

بعض الدوال المساعدة في SQL

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

إنشاء الدالة CREATE FUNCTION

يستخدم لتعريف دالة جديدة.

تعديل الدالة ALTER FUNCTION

يستخدم لتعديل تعريف دالة مُعرَّفة مسبقًا عبر الأمر CREATE FUNCTION.

حذف الدالة DROP FUNCTION

يستخدم لحذف دالة (أو إجراء) أو أكثر مُعرَّفة مسبقًا عبر الأمر CREATE FUNCTION.

العودة من الدالة RETURN

تستخدم لإنهاء الدالة وإعادة قيمة ما للموقع الذي استُدعيت فيه الدالة.

التعامل مع العرض

إنشاء العرض CREATE VIEW

يستخدم لإنشاء عرضٍ والذي هو عبارة عن جدول افتراضي يُبنى بالاعتماد على نتائج استعلامٍ ما.

تعديل العرض ALTER VIEW

يستخدم لتعديل عرضٍ مُنشَأ مسبقًا عبر الأمر CREATE VIEW.

حذف العرض DROP VIEW

يستخدم لحذف view أو أكثر مُنشئ مسبقًا عبر الأمر CREATE VIEW.

 

 

 

 

 

 

 

التأكد من خُلوّ القيمة IS NULL في SQL

يستخدم التعبير IS NULL للتأكد من خلو القيمة (أي لا توجد قيمة في الحقل المحدد)، ويكون سياق التعبير بالشكل الآتي:

column IS [NOT] NULL

وغالبًا ما تستخدم في العبارة WHERE للتحقق من وجود القيمة في إحدى حقول السجلات.

مثال

إن كانت قاعدة البيانات تحتوي الجدول customers الآتي:

Bill

OrderID

Phone

FullName

CustomerID

160

0291

NULL

Abd al-Salam Hadi

1156

170

0302

(171) 555-2222

Ahmad Mostafa

1157

210

0203

(100) 555-4822

Reem Hammad

1158

350

0294

NULL

Abd Allah Sadiq

1159

185

0255

(03) 3555-5011

Raghad al-Hamdan

1160

165

0276

(98) 598 76 54

Abd al-Razzaq Salloum

1161

175

0247

NULL

Hussam Siraj

1162

180

0208

NULL

Hiba Maktabi

1163

170

0219

(06) 431-7877

Abd al-Rahman Rida

1164

220

0210

NULL

Abd al-Qader Khalil

1165

إن الاستعلام الآتي:                                

SELECT *
FROM customers
WHERE Phone IS NULL;

سيُظهر السجلات التي لا تحتوي على أي قيمة في حقل Phone على النحو الآتي:

Bill

OrderID

Phone

FullName

CustomerID

160

0291

NULL

Abd al-Salam Hadi

1156

350

0294

NULL

Abd Allah Sadiq

1159

175

0247

NULL

Hussam Siraj

1162

180

0208

NULL

Hiba Maktabi

1163

220

0210

NULL

Abd al-Qader Khalil

1165

أما لعرض الزبائن الذي زوّدوا قاعدة البيانات برقم الهاتف، يستخدم الاستعلام الآتي:

SELECT * 
FROM customers
WHERE Phone IS NOT NULL;

 

 

 

 

 

 

 

 

 

 

لتظهر النتائج:

Bill

OrderID

Phone

FullName

CustomerID

170

0302

(171) 555-2222

Ahmad Mostafa

1157

210

0203

(100) 555-4822

Reem Hammad

1158

185

0255

(03) 3555-5011

Raghad al-Hamdan

1160

165

0276

(98) 598 76 54

Abd al-Razzaq Salloum

1161

170

0219

(06) 431-7877

Abd al-Rahman Rida

1164

 

التسمية البديلة Alias في SQL

يمكن إطلاق تسمية على الجداول أو الحقول تسهيلًا للتعامل معها بالاسم البديل المؤقت (وقد يكون أكثر اختصارًا)، وذلك عند الحاجة إلى الوصول إلى نفس الجدول أو الحقل عدة مرات، ويعبًّر عن ذلك بالكلمة المفتاحية AS، ويمكن الاستغناء عنها عند تسمية الجدول.

أمثلة

في الاستعلام الآتي:

SELECT Name AS Top Students, Age, GPA
FROM students

سيظهر العمود Name باسم Top Students في النتائج. وفي الاستعلام:

SELECT StudentID, FirstName, Course, Lecturer
FROM students st
LEFT JOIN courses co
ON st.CourseID = co.CourseID;

سُمي الجدول students باسم st والجدول courses باسم co وذلك تسهيلًا لعملية الربط بين الجدولين.

 

الاستعلامات الفرعية Subqueries في SQL

SQL

اذهب إلى التنقلاذهب إلى البحث

الاستعلام الفرعي هو استعلام واقعٌ ضمن استعلام آخر بهدف استخدام البيانات الناتجة عنه في الاستعلام الرئيسي الذي يحتويه، وغالبًا ما يكون الاستعلام الفرعي عبارة عن استعلام SELECT، ويمكن استخدامه مع أي من استعلامات SELECT أو INSERT أو UPDATE أو DELETE.

محتويات

·         1استخدام الاستعلام الفرعي في استعلام SELECT

o        1.1تحديد الاستعلام الفرعي كأحد الأعمدة

§         1.1.1مثال

o        1.2تحديد الاستعلام الفرعي كجدول جزئي من جدول أساسي

o        1.3استخدام الاستعلام الفرعي لتحديد قيم ضمن الشرط WHERE

·         2حذف السجلات التي تحقق شرط محدد باستعلام فرعي

·         3تحديث قيم السجلات اعتمادًا على الاستعلام الفرعي

·         4إضافة سجلات في جدول من جدول آخر باستخدام الاستعلام الفرعي

·         5التوافقية

·         6مصادر

استخدام الاستعلام الفرعي في استعلام SELECT

تحديد الاستعلام الفرعي كأحد الأعمدة

يُمكن تحديد أحد الأعمدة التي ستظهر بتنفيذ استعلام SELECT من خلال الاستعلام الفرعي الذي يعيد قيمة وحيدة لكل سجل.

مثال

إن كانت الجداول الآتية موجودة في قاعدة البيانات:

 

 

 

الجدول الأول: السيارات cars

Colour

Price

Year

Company

Model

CarID

White

22,500

2018

KIA

Optima

05081

Red

25,995

2017

KIA

Optima Hybrid

05082

Red

31,900

2018

KIA

Stinger

05083

Black

31,990

2017

KIA

Cadenza

05084

Blue

23,240

2018

KIA

Niro

05085

Grey

14,200

2018

KIA

Rio 5-Door

05086

Blue

18,200

2018

KIA

Forte5

05087

Blue

32,250

2017

KIA

Soul EV

05088

Red

23,385

2017

Nissan

Altima

05089

White

46,195

2017

Nissan

Armada

05090

Black

33,495

2017

Nissan

Maxima

05091

Black

30,715

2017

Nissan

Murano

05092

Grey

31,265

2017

Nissan

Pathfinder

05093

White

17,875

2017

Nissan

Sentra

05094

Red

12,875

2017

Nissan

Versa

05095

 

 

الجدول الثاني: الزبائن customers

Remaining

CarID

Name

CustomerID

15,495

05091

Mona Sinno

0156

8,875

05095

Ahmad Najjar

0157

19,500

05081

Kareem al-Hamdan

0158

11,875

05094

Mohammad Qadi

0159

17,500

05081

Rasha Mostafa

0160

10,200

05087

Jaber Hammad

0161

19,990

05084

Wessam Fattah

0162

8,875

05094

Shadi Sharif

0163

12,500

05081

Iman Mansour

0164

6,875

05095

Monther Zein

0165

9,200

05087

Rami Fares

0166

18,240

05085

Ammar Arab

0167

إن تنفيذ الاستعلام الآتي:

SELECT CarID, Model, Company, 
  ( SELECT count(*) 
    FROM customers
    WHERE customers.CarID = cars.CarID
  ) AS NumberOrders
FROM cars;

سيعرض عدد المشترين لكل سيارة من السيارات بعمودٍ منفصلٍ (NumberOrders) اعتمادًا على الاستعلام الفرعي المُنفَّذ في الجدول customers بحيث يكون الرقم التسلسلي لطلب السيارة في جدول الزبائن مساويًا للرقم التسلسلي للسيارة في جدول السيارات، وستظهر النتائج:

NumberOrders

Company

Model

CarID

3

KIA

Optima

05081

0

KIA

Optima Hybrid

05082

0

KIA

Stinger

05083

1

KIA

Cadenza

05084

1

KIA

Niro

05085

0

KIA

Rio 5-Door

05086

2

KIA

Forte5

05087

0

KIA

Soul EV

05088

0

Nissan

Altima

05089

0

Nissan

Armada

05090

1

Nissan

Maxima

05091

0

Nissan

Murano

05092

0

Nissan

Pathfinder

05093

2

Nissan

Sentra

05094

2

Nissan

Versa

05095

تحديد الاستعلام الفرعي كجدول جزئي من جدول أساسي

يمكن استخدام الاستعلام الفرعي للحصول على جدول جزئي مقتبس من جدول أساسي لاستخدامه في عبارة FROM، كما في الاستعلام الآتي:

SELECT cars.CarID, cars.Model, result.CustomerID
FROM  cars JOIN 
  (SELECT * FROM customers 
   WHERE CustomerID BETWEEN 0160 AND 0165
  ) AS result
ON cars.CarID = result.CarID;

إن تنفيذ هذا الاستعلام على الجدولين cars و customers في قاعدة البيانات سيؤدي إلى عرض الرقم التسلسلي ونوع السيارة من الجدول الناتج عن الربط ما بين جدول cars وجدول فرعي يُؤخذ من جدول customers بحيث يكون الرقم التسلسلي للزبون واقعًا ما بين الرقمين 0160 و 0165 وتسميته باسم result إذ يتم الربط عندما يكون الرقم التسلسلي في الجدولين متساويًا، وتكون نتيجة تنفيذه:

CustomerID

Model

CarID

0160

Optima

05081

0164

Optima

05081

0162

Cadenza

05084

0161

Forte5

05087

0163

Sentra

05094

0165

Versa

05095

استخدام الاستعلام الفرعي لتحديد قيم ضمن الشرط WHERE

تمكن الاستفادة من الاستعلام الفرعي لتحديد عدد من القيم لتوضع ضمن الشرط في عبارة WHERE.

لمعرفة السيارات التي لم تُشترَ من قبل أيّ من الزبائن يمكن استخدام الاستعلام الآتي:

SELECT * 
FROM cars
WHERE CarID NOT IN(
  SELECT CarID
  FROM customers
   );

لتظهر النتائج:

Colour

Price

Year

Company

Model

CarID

Red

25,995

2017

KIA

Optima Hybrid

05082

Red

31,900

2018

KIA

Stinger

05083

Grey

14,200

2018

KIA

Rio 5-Door

05086

Blue

32,250

2017

KIA

Soul EV

05088

Red

23,385

2017

Nissan

Altima

05089

White

46,195

2017

Nissan

Armada

05090

Black

30,715

2017

Nissan

Murano

05092

Grey

31,265

2017

Nissan

Pathfinder

05093

ولمعرفة مجموع أسعار السيارات التي لم تُشترى يمكن إضافة الدالة التجميعيّة sum للاستعلام السابق ليصبح:

SELECT SUM(Price) AS Total 
FROM cars
WHERE CarID NOT IN(
  SELECT CarID
  FROM customers
  );

 

 

 

وتظهر النتيجة:

Total

235,905

حذف السجلات التي تحقق شرط محدد باستعلام فرعي

يمكن تحديد الشرط الذي ستحذف وفقًا له البيانات ضمن الاستعلام الفرعي في عبارة WHERE.

فلحذف السيارات التي اشتراها أيّ من الزبائن في جدول customers من الجدول cars، يصبح الاستعلام بالشكل الآتي:

DELETE FROM cars
WHERE CarID IN(
  SELECT CarID
  FROM customers
  );

ليصبح الجدول cars في قاعدة البيانات على النحو الآتي:

Colour

Price

Year

Company

Model

CarID

Red

25,995

2017

KIA

Optima Hybrid

05082

Red

31,900

2018

KIA

Stinger

05083

Grey

14,200

2018

KIA

Rio 5-Door

05086

Blue

32,250

2017

KIA

Soul EV

05088

Red

23,385

2017

Nissan

Altima

05089

White

46,195

2017

Nissan

Armada

05090

Black

30,715

2017

Nissan

Murano

05092

Grey

31,265

2017

Nissan

Pathfinder

05093

تحديث قيم السجلات اعتمادًا على الاستعلام الفرعي

يمكن الاعتماد على الاستعلام الفرعي لتحديد القيم الجديدة التي ستوضع في الحقل المطلوب في استعلام UPDATE، إن كان جدول الأقساط installments الآتي موجودًا في قاعدة البيانات:

Date

CustomerID

Amount

TransactionID

04/11/2017

0156

7,000

0206

11/11/2017

0157

5,000

0207

01/11/2017

0158

9,000

0208

09/11/2017

0159

6,000

0209

24/11/2017

0160

8,000

0210

11/11/2017

0161

7,000

0211

04/11/2017

0162

9,000

0212

09/11/2017

0163

5,000

0213

01/11/2017

0164

8,000

0214

09/11/2017

0165

4,000

0215

04/11/2017

0166

5,000

0216

01/11/2017

0167

10,000

0217

فلتحديث قيمة المبلغ المتبقي في جدول الزبائن customers بحسب القيمة المدفوعة في الجدول السابق يُنفذ الاستعلام الآتي:

UPDATE customers 
SET remaining = remaining - 
  (SELECT Amount
   FROM installments
   WHERE customers.CustomerID = installments.CustomerID);

ليصبح الجدول كما يلي:

Remaining

CarID

Name

CustomerID

8,495

05091

Mona Sinno

0156

3,875

05095

Ahmad Najjar

0157

10,500

05081

Kareem al-Hamdan

0158

5,875

05094

Mohammad Qadi

0159

9,500

05081

Rasha Mostafa

0160

3,200

05087

Jaber Hammad

0161

10,990

05084

Wessam Fattah

0162

3,875

05094

Shadi Sharif

0163

4,500

05081

Iman Mansour

0164

2,875

05095

Monther Zein

0165

4,200

05087

Rami Fares

0166

8,240

05085

Ammar Arab

0167

إضافة سجلات في جدول من جدول آخر باستخدام الاستعلام الفرعي

تمكن إضافة بعض السجلات إلى الجدول من جدول آخر اعتمادًا على استعلام فرعي بحيث تتوافق أسماء الأعمدة المختارة ما بين الجدولين.

ليكن الجدول الآتي cheapCars موجودًا في قاعدة البيانات:

Colour

Price

Year

Company

Model

CarID

Grey

12,800

2014

Nissan

Versa 1.6 S

06002

WHITE

14,700

2014

KIA

Rio LX

06003

Blue

13,790

2014

Mitsubishi

Mirage DE

06004

لإضافة سيارات أخرى لهذا الجدول من الجدول الأساسي cars يُمكن الاعتماد على الاستعلام الفرعي بالشكل الآتي:

INSERT INTO cheapCars 
SELECT * FROM cars WHERE Price < 20000;

لاحظ : في استعلام INSERT INTO لم نضع أقواس حول الإستعلام الفرعي.

ليصبح الجدول:

Colour

Price

Year

Company

Model

CarID

Grey

12,800

2014

Nissan

Versa 1.6 S

06002

WHITE

14,700

2014

KIA

Rio LX

06003

Blue

13,790

2014

Mitsubishi

Mirage DE

06004

Grey

14,200

2018

KIA

Rio 5-Door

05086

Blue

18,200

2018

KIA

Forte5

05087

White

17,875

2017

Nissan

Sentra

05094

Red

12,875

2017

Nissan

Versa

05095

 

 

 

 

التعامل مع السجلات

 

الاستعلام SELECT

يُستخدَم استعلام SELECT للحصول على سجلات البيانات من الجداول المخزنة في قاعدة البيانات، قد تكون نتيجة الاستعلام سجلًا أو أكثر، وعمودًا أو أكثر.

محتويات

·         1البنية العامة

·         2أمثلة

o        2.1تحديد كافة أعمدة أحد الجداول

·         3تحديد ظهور بعض الأعمدة

o        3.1تحديد السجلات وفق ترتيبٍ معيّن

o        3.2تحديد السجلات التي ينطبق عليها شرطٌ معيّن

o        3.3تحديد السجلات التي قيمة أحد حقولها فريدة

o        3.4استخدام الدوال مع بيانات الجدول

o        3.5جلب البيانات من أكثر من جدول

o        3.6التوافقية

·         4مصادر

البنية العامة

SELECT [DISTINCT | TOP] select_list

[FROM table_source]

[WHERE search_condition]

[GROUP BY group_by_expression]

[HAVING search_condition]

[ORDER BY order_expression [ ASC | DESC]];

ويمكن أن تُستخدَم بعض المعاملات مثل UNION و EXCEPT و INTERSECT لدمج نتائج الاستعلامات أو مقارنتها مع بعضها، وتجب مراعاة ترتيب الكلمات المفتاحية المستخدمة في الصياغة السابقة لدى وجود العديد منها ضمن استعلامٍ واحد.

أمثلة

فيما يلي أمثلةٌ مختلفةٌ عن استخدام الاستعلام SELECT مع مختلف المعاملات، يُمكن الاطلاع على صفحات تلك المعاملات لمزيدٍ من المعلومات والأمثلة عنها.

تحديد كافة أعمدة أحد الجداول

يُستخدَم الرمز * للحصول على كافة الأعمدة من الجدول (وهو أحد رموز المحارف البديلة Wildcards):

SELECT *

FROM table_source;

إذا نُفِذ الاستعلام السابق على جدولٍ باسم riverTable (الذي يضم أسماء بعض الأنهار وأطوالها ومصبها والقارة التي يوجد فيها) فسيظهر لدينا الجدول الآتي:

Continent

Outflow

LengthMiles

LengthKm

River

Serial

South America

Atlantic Ocean

4345

6992

Amazon

1

Africa

Mediterranean

4258

6853

Nile

2

North America

Gulf of Mexico

3902

6275

Mississippi

3

Asia

Bohai Sea

3395

5464

Yellow River

4

Africa

Atlantic Ocean

2922

4700

Congo

5

Asia

Laptev Sea

2736

4400

Lena

6

Africa

Gulf of Guinea

2611

4200

Niger

7

Europe

Caspian Sea

2266

3645

Volga

8

Asia

Andaman Sea

1901

3060

Salween

9

تحديد ظهور بعض الأعمدة

يمكن تحديد مجموعة الأعمدة التي ستظهر في الناتج عبر فصل أسماء تلك الأعمدة بفاصلة ,، وذلك مبيّن في الاستعلام الآتي الذي يُظهِر أسماء الأنهار ومصبّاتها وطولها بالكيلومتر:

SELECT River, Outflow, LengthKm

FROM riverTable;

الاستعلام السابق سيُظِهر الناتج الآتي حيث يُلاحظ اختلاف ترتيب الأعمدة عن الترتيب في الجدول الأصلي:

LengthKm

Outflow

River

6992

Atlantic Ocean

Amazon

6853

Mediterranean

Nile

6275

Gulf of Mexico

Mississippi

5464

Bohai Sea

Yellow River

4700

Atlantic Ocean

Congo

4400

Laptev Sea

Lena

4200

Gulf of Guinea

Niger

3645

Caspian Sea

Volga

3060

Andaman Sea

Salween

تحديد السجلات وفق ترتيبٍ معيّن

الاستعلام الآتي يُحدِّد الأعمدة River و LengthKm و Continent من الجدول riverTable الظاهر في القسم السابق، ويضيف اسمًا بديلًا (التسمية alias عبر المعامل AS) للعمود Continent لجعله يظهر باسم Place، ثم يرتِّب النتائج ترتيبًا هجائيًا تصاعديًا عبر التعبير ORDER BY:

SELECT River, LengthKm, Continent AS Place

FROM riverTable

ORDER BY Continent;

تظهر النتيجة المبيّنة في الجدول الآتي، ويُلاحظ كيف ظهر عمود القارة باسم Place:

Place

LengthKm

River

Africa

6853

Nile

Africa

4700

Congo

Africa

4200

Niger

Asia

5464

Yellow River

Asia

4400

Lena

Asia

3060

Salween

Europe

3645

Volga

North America

6275

Mississippi

South America

6992

Amazon

تحديد السجلات التي ينطبق عليها شرطٌ معيّن

سيُنفَّذ الاستعلام الآتي على الجدول riverTable وهو يُحدِّد اسم النهر River ويُظهِر طوله بالمتر (بتحديد العمود LengthKm ثم ضربه بالعدد 1000 لتحويله إلى المتر، وذلك باستخدام المعاملات الرياضية ويبيّن مكان وجوده Continent، وذلك من الجدول riverTable، على أن يكون طوله أكبر من 4000 كيلومتر (المعامل WHERE)، ثم يُرتِّب الناتج كله ترتيبًا هجائيًا تصاعديًا عبر اسم القارة:

SELECT River, LengthKm*1000 AS LengthM, Continent

FROM riverTable

WHERE LengthKm > 4000

ORDER BY Continent;

ستظهر النتيجة المبيّنة في الجدول الآتي:

Continent

LengthM

River

Africa

6853000

Nile

Africa

4700000

Congo

Africa

4200000

Niger

Asia

5464000

Yellow River

Asia

4400000

Lena

North America

6275000

Mississippi

South America

6992000

Amazon

تحديد السجلات التي قيمة أحد حقولها فريدة

تضاف الكلمة المفتاحية DISTINCT في استعلام SELECT للحصول على قيم مختلفة وغير مكررة (أي فريدة)، إذ إن الاستعلام الآتي الذي يُحدِّد أسماء القارات الفريدة من الجدول riverTable:

SELECT DISTINCT Continent

FROM riverTable

 

 

 

 

 

 

 

 

 

 

 

 

سيُظهِر النتيجة:

Continent

South America

Africa

North America

Asia

Europe

استخدام الدوال مع بيانات الجدول

الاستعلام الآتي سيُنفَّذ على جدول riverTable وسيؤدي إلى إظهار طول النهر الأقصر ما بين الأنهار، وطول النهر الأطول، والمتوسط الحسابي للأطوال جميعها، وذلك عبر استخدام الدوال min() و max() و avg() في SQL:

SELECT MIN(LengthKm) AS Minimum Length, MAX(LengthKm) AS Maximum Length, AVG(LengthKm) AS Average Length

FROM riverTable;

وتظهر النتائج الآتية:

Average Length

Maximum Length

Minimum Length

5065.444

3060

6992

جلب البيانات من أكثر من جدول

يمكن أن تجلب البيانات من أكثر من جدول ضمن قاعدة البيانات وذلك بتحديد أسماء الجداول المطلوب إظهار بياناتها عند الكلمة المفتاحية FROM، إن تنفيذ الاستعلام الآتي سيجلب الأعمدة المطلوبة بحسب وجودها في الجدول المناسب لها:

SELECT River, LengthKm, Mountain, HeightKm

FROM riverTable, mountainTable;

ولدى التعامل مع أكثر من جدول تُربط الجداول فيما بينها بإحدى معاملات الربط.

عبارة WHERE

تُستخدم عبارة WHERE ضمن استعلام SELECT لتحديد الشروط التي تُعرض أو تحذف السجلات أو تُعدل قيم حقولها وفقًا لها، إذ يُمكن أن تستخدم أيضًا مع استعلامَي DELETE و UPDATE، وتعتمد اعتمادًا أساسيًا على المُعاملات المنطقية والحسابية وبعض المعاملات الأخرى في صياغة تلك الشروط.

محتويات

·         1الحصول على البيانات وفق شرطٍ بسيط

·         2حذف السجل المُحقِّق لشرط معين

·         3تعديل القيم في السجلات وفق شرطٍ مُحدَّد

·         4ربط الشروط باستخدام المعاملات المنطقية

o        4.1عرض عدد السجلات المُحقِّقَة لشرط معيّن

·         5المعاملات المساعدة في عبارة WHERE

·         6التوافقية

·         7مصادر

الحصول على البيانات وفق شرطٍ بسيط

إن كان الجدول الآتي موجودًا في قاعدة البيانات:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

1.96

22

Amin

1066

2.87

23

Yusuf

1056

الاستعلام الآتي يُحدد شرط وجود قيمة السلسلة النصية 'Amin' في الحقل Name:

SELECT *

FROM students

WHERE Name=Amin;

وتكون نتيجة تنفيذه:

GPA

Age

Name

StudentID

1.96

22

Amin

1066

حذف السجل المُحقِّق لشرط معين

يمكن حذف سجل أو أكثر إن كان مُحقِّقًا لشرط يُحدد من خلال عبارة WHERE.

إن تنفيذ الاستعلام الآتي يؤدي لحذف جميع سجلات الطلاب بمعدل أقل من 2.5 وذلك بالاعتماد على استعلام DELETE:

DELETE FROM students

WHERE GPA<2.5;

تعديل القيم في السجلات وفق شرطٍ مُحدَّد

تحدد عبارة WHERE الشرط الذي من خلاله ستُحدد السجلات التي ستُعدَّل قيمها بالاستفادة من الاستعلام UPDATE، إذ يمكن تعديل قيمة أو أكثر.

الاستعلام الآتي سيُعدِّل قيمتي العمر والمعدل للسجل الذي يكون فيه الاسم بقيمة Yusuf:

UPDATE students

SET Age = 24, GPA= 3.4

WHERE Name = 'Yusuf';

ويُلاحظ هنا أنه إن لم تُذكر عبارة WHERE في هذا الاستعلام فسيشمل التعديل كافة السجلات الموجودة في الجدول.

ربط الشروط باستخدام المعاملات المنطقية

يُستفاد من المُعاملات المنطقية (AND, OR, NOT) بربط أكثر من شرط أو نفيها ضمن عبارة WHERE.

إن تنفيذ الاستعلام الآتي يُحدد شرط وجود قيمة أكبر من 3.00 في حقل المعدل الوسطيّ وقيمة أكبر من 24 سنة في حقل العمر، ويُرتِّب النتائج بحسب المعدل الوسطيّ ترتيبًا تنازليًا وتصبح تسمية Top Students بدلًا من Name في الجدول بالاستفادة من التسمية عبر الكلمة المفتاحية AS:

SELECT Name AS Top Students, Age, GPA

FROM students

WHERE GPA>3.00 AND age>24

ORDER BY GPA DESC;

وستظهر النتائج الآتية:

GPA

Age

Top Students

4.00

26

Sarah

3.68

25

Mona

عرض عدد السجلات المُحقِّقَة لشرط معيّن

تمكن معرفة عدد السجلات التي تُحقِّق شرطًا معينًا بالاعتماد على الدالة count، مع تحديد الشرط المطلوب في عبارة WHERE، فلدى تنفيذ الاستعلام الآتي على الجدول السابق (باستخدام المعامل BETWEEN الذي يقوم بتحديد مجال للقيم المحتملة في الحقل Age):

SELECT count(*) AS Count

FROM students

WHERE age BETWEEN 23 AND 25;

ستظهر النتيجة:

Count

4

 

 

المعاملات المساعدة في عبارة WHERE

يُوضح الجدول الآتي بعض المعاملات المُستخدمة لدى صياغة الشرط الذي تحدده الكلمة المفتاحية WHERE:

المعامل

الوصف

=

حالة التساوي

<> 

حالة عدم التساوي

أكبر من

أصغر من

=<

أكبر من أو يساوي

=>

أصغر من أو يساوي

BETWEEN

واقعٌ ضمن مجال محدَّد

LIKE

مماثل لنمط محدد يلي الكلمة المفتاحية

IN

لتحديد عدة قيم ممكنة للقيمة المأخوذة من العمود

ويُمكن كذلك استخدام المعاملات المنطقية الآتية للربط ما بين عدة شروط أو نفيها:

المعامل

الوصف

AND

لعرض السجل إذا تحققت كافة الشروط

OR

لعرض السجل إذا تحقق واحدٌ من الشروط أو أكثر

NOT

إذا تحقق نفي الشرط

عبارة GROUP BY

تُستخدم عبارة GROUP BY في استعلام SELECT بهدف تجميع النتائج ضمن مجموعات بحسب عمود أو أكثر من الجدول.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

محتويات

·         1استخدام GROUP BY لمعرفة عدد السجلات الممكن تجميعها سويةً

·         2تجميع النتائج المحققة لشرط محدد

·         3تجميع النتائج من عدة جداول

·         4التوافقية

·         5مصادر

استخدام GROUP BY لمعرفة عدد السجلات الممكن تجميعها سويةً

ليكن الجدول الآتي (patients) موجودًا في قاعدة البيانات:

Doctor

Section

Age

Patient

PatientID

Nasser

Cardiology

76

Salem

1029

Abd Allah

Neurology

17

Hasan

896

Reem

Maternity

23

Nadine

964

Fateh

Cardiology

65

Rami

1070

Kareem

Neurology

19

Abd al-Rahim

1150

Hadi

Critical Care

65

Roushd

1097

Reem

Maternity

27

Sana

1034

Abd Allah

Neurology

49

Helen

963

Hadi

Critical Care

58

Ahmad

1154

Kareem

Neurology

40

Maher

1069

Amnah

Maternity

30

Zeina

1028

Fateh

Cardiology

55

Sarah

1180

Hadi

Critical Care

23

Fadi

1076

Abd Allah

Neurology

36

Naim

987

Fateh

Cardiology

70

Batoul

1156

Amnah

Maternity

24

Rahaf

1181

Nasser

Cardiology

66

Aya

808

الاستعلام الآتي يحدد عدد المرضى في كل قسم اعتمادًا على الدالة التجميعيّة count():

SELECT Section, count(*) AS Number of patients

FROM patients

GROUP BY Section;

وتظهر النتائج كما الآتي:

Number of patients

Section

5

Cardiology

5

Neurology

4

Maternity

3

Critical Care

ولدى استخدام حقلين ضمن عبارة GROUP BY كما في الاستعلام الآتي:

SELECT Section, Doctor, count(Patient) AS Number of patients

FROM patients

GROUP BY Section, Doctor

تُجمَّع النتائج بحسب العمود المُحدد أولًا ثم العمود الثاني وهكذا، وستظهر النتائج الآتية:

Number of patients

Doctor

Section

2

Nasser

Cardiology

3

Fateh

Cardiology

3

Abd Allah

Neurology

2

Kareem

Neurology

2

Reem

Maternity

2

Amnah

Maternity

3

Hadi

Critical Care

تجميع النتائج المحققة لشرط محدد

الاستعلام الآتي يحدد عدد المرضى لدى كل طبيب ويستثني الأطباء المعالجِين لأقل من 3 مرضى اعتمادًا على العبارة HAVING التي تقوم بتحديد الشرط المطلوب عند استخدام التجميع:

SELECT Doctor, count(Patient) AS Number of patients

FROM patients

GROUP BY Doctor

HAVING count(Patient)>2 ;

وتظهر النتائج كما يلي:

Number of patients

Doctor

3

Fateh

3

Abd Allah

3

Hadi

تجميع النتائج من عدة جداول

ليكن الجدول الآتي (doctors) في قاعدة البيانات (إضافة للجدول السابق بأسماء المرضى):

City

DoctorName

Damascus

Nasser

Aleppo

Fateh

Aleppo

Abd Allah

Hama

Kareem

Damascus

Reem

Aleppo

Amnah

Damascus

Hadi

إن تنفيذ الاستعلام الآتي:

SELECT doctors.City, count(patients.Patient) AS Number of patients in city

FROM patients

LEFT JOIN doctors ON patients.Doctor = doctors.DoctorName

GROUP BY City;

يربط ما بين الجدولين ربطًا يساريًا ويرتب النتائج بمجموعات حسب عمود المدينة الموجود في جدول الأطباء، وهذا يؤدي لظهور عدد المرضى في كل مدينة على النحو الآتي:

City

Number of patients in city

Damascus

7

Aleppo

8

Hama

2

ملاحظة: لا يمكن استخدام الأعمدة التي نوعها text أو ntext أو image ضمن عبارة GROUP BY.

عبارة HAVING

SQL

اذهب إلى التنقلاذهب إلى البحث

تستخدم عبارة  HAVING ضمن استعلام SELECT لتحديد شرطٍ معينٍ عند تجميع السجلات مع بعضها GROUP BY، وقد أُضيف إلى لغة SQL لأنه لا يمكن استخدام عبارة WHERE مع الدوال التجميعيّة مثل SUM و MIN  و MAX ...إلخ.

محتويات

·         1تجميع السجلات وفق شرط مُحدّد

·         2الفرق ما بين WHERE و HAVING

·         3التوافقية

·         4مصادر

 

 

 

 

 

 

 

 

 

 

تجميع السجلات وفق شرط مُحدّد

ليكن الجدول الآتي (patients) موجودًا في قاعدة البيانات:

Doctor

Section

Age

Patient

PatientID

Nasser

Cardiology

76

Salem

1029

Abd Allah

Neurology

17

Hasan

896

Reem

Maternity

23

Nadine

964

Fateh

Cardiology

65

Rami

1070

Kareem

Neurology

19

Abd al-Rahim

1150

Hadi

Critical Care

65

Roushd

1097

Reem

Maternity

27

Sana

1034

Abd Allah

Neurology

49

Helen

963

Hadi

Critical Care

58

Ahmad

1154

Kareem

Neurology

40

Maher

1069

Amnah

Maternity

30

Zeina

1028

Fateh

Cardiology

55

Sarah

1180

Hadi

Critical Care

23

Fadi

1076

Abd Allah

Neurology

36

Naim

987

Fateh

Cardiology

70

Batoul

1156

Amnah

Maternity

24

Rahaf

1181

Nasser

Cardiology

66

Aya

808

الاستعلام الآتي يحدد عدد المرضى المعالجِين لدى كل طبيب اعتمادًا على الدالة count() بشرط ألا يقلَّ هذا العدد عن ثلاثة مرضى:

SELECT Doctor, count(Patient) AS Number of patients

FROM patients

GROUP BY Doctor

HAVING count(Patient)>2 ;

وتظهر النتائج كما الآتي:

Number of patients

Doctor

3

Fateh

3

Abd Allah

3

Hadi

الفرق ما بين WHERE و HAVING

يكمُن الفرق الرئيسي بين العبارتين بأن عبارة HAVING متناسبة مع الدوال التجميعية أما عبارة WHERE فتُستخدم للتحقق من الشرط دون وجود أي دالة تجميعية، وبالتالي فإن الاستعلامَين الآتيَين متكافئان تمامًا:

SELECT Section, count(Patient) AS Number

FROM patients

GROUP BY Section

HAVING Age>25 ;

SELECT Section, count(Patient) AS Number

FROM patients

WHERE Age>25

GROUP BY Section;

وتكون نتيجتهما:

Number

Section

5

Cardiology

3

Neurology

2

Maternity

2

Critical Care

أما في حال استخدام إحدى الدوال التجميعيّة مثل معرفة عدد المرضى في كل قسم واستبعاد الأقسام بعددٍ من المرضى أقل من ثلاثة، فإن الاستعلامَين الآتييَن ليسا متكافئين:

SELECT Section, count(Patient) AS Number

FROM patients

GROUP BY Section

HAVING count(Patient)>2 ;

SELECT Section, count(Patient) AS Number

FROM patients

WHERE count(Patient)>2      -- استخدم GROUP BY;

ذلك لأنه لا يمكن استخدام العبارة WHERE مع الدوال التجميعية، ويجب بهذه الحالة استخدام العبارة HAVING للحصول على النتيجة الآتية:

Number

Section

5

Cardiology

3

Neurology

العبارة ORDER BY

تتلخص مهمة عبارة ORDER BY بترتيب النتائج (تصاعديًا أو تنازليًا) ضمن استعلام SELECT وفق عمودٍ (أو أكثر) من الجدول.

محتويات

·         1تحديد نمط الترتيب التصاعدي أو التنازلي

·         2الترتيب وفق أكثر من عمود

·         3الترتيب الشرطي

o        3.1مثال ثانٍ

·         4ترتيب نتائج الربط

·         5التوافقية

·         6مصادر

تحديد نمط الترتيب التصاعدي أو التنازلي

تُستخدم الكلمتان المفتاحيتان ASC و DESC لتحديد نمط الترتيب التصاعدي ASC والتنازلي DESC بعدّ الترتيب التصاعدي الحالة الافتراضية للعبارة.

ليكن الجدول rivers الآتي موجودًا في قاعدة البيانات:

Continent

Outflow

LengthMiles

LengthKm

River

Serial

South America

Atlantic Ocean

4345

6992

Amazon

1

Africa

Mediterranean

4258

6853

Nile

2

North America

Gulf of Mexico

3902

6275

Mississippi

3

Asia

Bohai Sea

3395

5464

Yellow River

4

Africa

Atlantic Ocean

2922

4700

Congo

5

Asia

Laptev Sea

2736

4400

Lena

6

Africa

Gulf of Guinea

2611

4200

Niger

7

Europe

Caspian Sea

2266

3645

Volga

8

Asia

Andaman Sea

1901

3060

Salween

9

لدى تنفيذ الاستعلام الآتي:

SELECT *

FROM rivers

ORDER BY Serial DESC;

ستظهر السجلات مرتبة ترتيبًا تنازليًا وفق العمود Serial، أي سيظهر الجدول بترتيب عكسي:

Continent

Outflow

LengthMiles

LengthKm

River

Serial

Asia

Andaman Sea

1901

3060

Salween

9

Europe

Caspian Sea

2266

3645

Volga

8

Africa

Gulf of Guinea

2611

4200

Niger

7

Asia

Laptev Sea

2736

4400

Lena

6

Africa

Atlantic Ocean

2922

4700

Congo

5

Asia

Bohai Sea

3395

5464

Yellow River

4

North America

Gulf of Mexico

3902

6275

Mississippi

3

Africa

Mediterranean

4258

6853

Nile

2

South America

Atlantic Ocean

4345

6992

Amazon

1

ولا يشترط وجود العمود المذكور في عبارة ORDER BY ضمن قائمة الأعمدة المذكورة في SELECT، أي أن الاستعلام الآتي صحيح أيضًا (لا يُعرض عمود Serial في النتائج):

SELECT River, LengthKm, LengthMiles, Outflow, Continent

FROM rivers

ORDER BY Serial DESC;

ويُمكن استخدام التسمية البديلة (alias) في عبارة ORDER BY كما في الاستعلام الآتي (الذي نتيجته تماثل نتيجة الاستعلام الأول):

SELECT Serial AS sortingCol, River, LengthKm, LengthMiles, Outflow, Continent

FROM rivers

ORDER BY sortingCol DESC;

الترتيب وفق أكثر من عمود

عند وجود أكثر من عمود في عبارة ORDER BY تُرتَّب النتائج وفقًا للعمود المذكور أولًأ ثم تُرتب السجلات الناتجة عن الترتيب السابق وفقًا للعمود الثاني وهكذا.

الاستعلام الآتي يُرتب الجدول وفقًا لعمود القارة ترتيبًا هجائيًا تصاعديًا (لا يُشترَط ذكر الكلمة المفتاحية ASC) ومن ثم ترتيبًا تنازليًا وفقًا لعمود الطول المقدر بالكيلومتر:

SELECT River, LengthKm, Continent

FROM rivers

ORDER BY Continent ASC, LengthKm DESC;

 

 

 

وتظهر النتائج الآتية:

Continent

LengthKm

River

Africa

6853

Nile

Africa

4700

Congo

Africa

4200

Niger

Asia

5464

Yellow River

Asia

4400

Lena

Asia

3060

Salween

Europe

3645

Volga

North America

6275

Mississippi

South America

6992

Amazon

الترتيب الشرطي

يمكن تحديد الترتيب ضمن عبارة ORDER BY وفقًا لشرط محدد وذلك باستخدام الكلمات المفتاحية CASE و WHEN و THEN و END والتي تعبر عن الشرط CASE المعروف في لغات البرمجة.

لترتيب السجلات وفقًا لأطوالها في قارة Africa ووفقًا لأسمائها في القارات البقية، يُنفذ الاستعلام الآتي:

SELECT *

FROM rivers

ORDER BY

  CASE Country

  WHEN 'Africa' THEN length

  ELSE Name

  END;

والذي يفحص القيمة الموجودة في حقل Country للسجل، فإن كانت Africa فترتب بحسب الترتيب التصاعدي للطول أما في الحالات الأخرى فستُرتب ترتيبًا هجائيًا تصاعديًا حسب اسم القارة، إذ إن الكلمات المفتاحية السابقة لها الصيغة التالية:

CASE field_name

WHEN value THEN expression

ELSE expression

END

وستظهر النتائج الآتية:

Continent

LengthKm

River

Africa

4200

Niger

Africa

4700

Congo

Africa

6853

Nile

Asia

4400

Lena

Asia

3060

Salween

Asia

5464

Yellow River

Europe

3645

Volga

North America

6275

Mississippi

South America

6992

Amazon

مثال ثانٍ

إن كان الجدول الآتي (patients) موجودًا في قاعدة البيانات:

Doctor

Section

Age

Patient

PatientID

Nasser

Cardiology

76

Salem

1029

Abd Allah

Neurology

17

Hasan

896

Reem

Maternity

23

Nadine

964

Fateh

Cardiology

65

Rami

1070

Kareem

Neurology

19

Abd al-Rahim

1150

Hadi

Critical Care

65

Roushd

1097

Reem

Maternity

27

Sana

1034

Abd Allah

Neurology

49

Helen

963

Hadi

Critical Care

58

Ahmad

1154

Kareem

Neurology

40

Maher

1069

Amnah

Maternity

30

Zeina

1028

الاستعلام الآتي يرتب السجلات ترتيبًا تصاعديًا بحسب العمر إن كان القسم Cardiology وبحسب الاسم إن كان القسم Neurology وبحسب الرقم التسلسلي فيما تبقى من حالات:  

SELECT *

FROM patients

ORDER BY

  CASE Section

  WHEN 'Cardiology' THEN Age

  WHEN 'Neurology' THEN Name

  ELSE PatientID

  END;

وتظهر النتائج الآتية:

Doctor

Section

Age

Patient

PatientID

Fateh

Cardiology

65

Rami

1070

Nasser

Cardiology

76

Salem

1029

Kareem

Neurology

19

Abd al-Rahim

1150

Abd Allah

Neurology

17

Hasan

896

Abd Allah

Neurology

49

Helen

963

Kareem

Neurology

40

Maher

1069

Reem

Maternity

23

Nadine

964

Amnah

Maternity

30

Zeina

1028

Reem

Maternity

27

Sana

1034

Hadi

Critical Care

65

Roushd

1097

Hadi

Critical Care

58

Ahmad

1154

 

ترتيب نتائج الربط

يمكن ترتيب نتائج الربط ما بين جدولين أو جزئين من جدول عبر معاملات الربط UNION أو EXCEPT أو INTERSECT وذلك بذكر العمود الذي سترتب النتائج وفقًا له عند عبارة ORDER BY.

لترتيب الأنهار الواقعة في قارتي آسيا وإفريقيا فقط بحسب أطوالها ترتيبًا تنازليًا، يُنفذ الاستعلام الآتي:

SELECT River, LengthKm, Continent

FROM rivers

WHERE Continent = Asia

UNION ALL

SELECT River, LengthKm, Continent

FROM rivers

WHERE Continent = Africa

ORDER BY LengthKm;

وتكون النتيجة:

Continent

LengthKm

River

Africa

6853

Nile

Asia

5464

Yellow River

Africa

4700

Congo

Asia

4400

Lena

Africa

4200

Niger

Asia

3060

Salween

 

 

تحديد عدد السجلات في استعلامات SQL

يمكن تحديد عدد السجلات التي ستُجلب من الجدول ضمن استعلام SELECT أو التي ستُحذف من الجدول ضمن استعلام DELETE أو ستُحدَّث قيمها ضمن استعلام UPDATE، ولكن تختلف محركات قواعد البيانات فيما بينها بالصياغة العامة للاستعلام، وسيُذكر ذلك تباعًا.

محتويات

·         1تحديد عدد سجلات النتائج

·         2أمثلة

·         3حذف عدد محدد من السجلات

o        3.1مثال

·         4الحصول على عدد نتائج محدد مع الإزاحة

o        4.1مثال

·         5مصادر

تحديد عدد سجلات النتائج

يكون للاستعلام البنية العامة الآتية في محرك SQL Server، والتي تعتمد على الكلمة المفتاحية TOP:

SELECT TOP number | percent col_name(s)

FROM tbl_name

WHERE condition;

إذ يُعبّر المتحول number عن عدد السجلات المطلوبة، وتُعبّر الكلمة المفتاحية percent عن نسبة السجلات المئوية التي نريد عرضها (أي يُمكن جلب نسبة محددة من عدد السجلات الإجمالي). ويكون للاستعلام البنية العامة الآتية في محركات PostgreSQL و SQLite و MySQL، والتي تعتمد على الكلمة المفتاحية LIMIT:

SELECT col_name(s)

FROM tbl_name

WHERE condition

LIMIT number;

ويمكن استخدام العبارة المفتاحية  FETCH FIRST number ROWS ONLY في محرك PostgreSQL بدلًا من LIMIT، إذ يُعبِّر المتحول number عن عدد السجلات المطلوبة، أما في محرك Oracle، فيكون للاستعلام البنية العامة الآتية، والتي تعتمد على الكلمة المفتاحية ROWNUM:

SELECT col_name(s)

FROM tbl_name

WHERE ROWNUM <= number;

إذ يُعبّر المتحول number عن عدد السجلات المطلوبة.

أمثلة

يُراد الحصول على السجلات الخمس الأولى المحققة لشرط العمر أكبر من 25 سنة من الجدول الآتي (باسم patients):

Doctor

Section

Age

Patient

PatientID

Nasser

Cardiology

76

Salem

1029

Abd Allah

Neurology

17

Hasan

896

Reem

Maternity

23

Nadine

964

Fateh

Cardiology

65

Rami

1070

Kareem

Neurology

19

Abd al-Rahim

1150

Hadi

Critical Care

65

Roushd

1097

Reem

Maternity

27

Sana

1034

Abd Allah

Neurology

49

Helen

963

Hadi

Critical Care

58

Ahmad

1154

Kareem

Neurology

40

Maher

1069

Amnah

Maternity

30

Zeina

1028

Fateh

Cardiology

55

Sarah

1180

Hadi

Critical Care

23

Fadi

1076

Abd Allah

Neurology

36

Naim

987

Fateh

Cardiology

70

Batoul

1156

Amnah

Maternity

24

Rahaf

1181

Nasser

Cardiology

66

Aya

808

Fateh

Cardiology

30

Raghad

1256

Amnah

Maternity

17

Mona

1161

Nasser

Cardiology

50

Sami

809

فيكون الاستعلام المطلوب تنفيذه هو (بحسب المحركات المختلفة):

في محرك SQL Server:

SELECT TOP 3 *

FROM patients

WHERE Age>25;

أو بالاستفادة من النسبة المئوية (5 مرضى من أصل 20 مريضًا تعادل نسبة 25%):

SELECT TOP 25 PERCENT *

FROM patients

WHERE Age>25;

في محركات PostgreSQL و SQLite و MySQL:

SELECT *

FROM patients

WHERE Age>25

LIMIT 5;

في محرك Oracle:

SELECT *

FROM patients

WHERE Age>25 AND ROWNUM <= 5;

وستظهر النتائج الآتية:

Doctor

Section

Age

Patient

PatientID

Nasser

Cardiology

76

Salem

1029

Fateh

Cardiology

65

Rami

1070

Hadi

Critical Care

65

Roushd

1097

Reem

Maternity

27

Sana

1034

Abd Allah

Neurology

49

Helen

963

حذف عدد محدد من السجلات

تكون للاستعلام البنية العامة الآتية في محرك SQL Server:

DELETE TOP number FROM tbl_name;

أما في محركات PostgreSQL و SQLite و MySQL، فتكون البنية العامة له كما يلي:

DELETE FROM tbl_name

LIMIT number;

مثال

لحذف المرضى الخمسة الأكبر سنًا من جدول المرضى patients السابق، يُستخدَم الاستعلام الآتي في محرك SQL Server:

DELETE TOP 5 FROM patients

ORDER BY age DESC;

في محركات PostgreSQL و SQLite و MySQL:

DELETE FROM patients

ORDER BY age DESC

LIMIT 5;

الحصول على عدد نتائج محدد مع الإزاحة

تستخدم الإزاحة مع العبارة ORDER BY وذلك لاستبعاد عددٍ مُحدّدٍ من النتائج الأولى في الجدول.

مثال

إن كان الجدول cars الآتي موجودًا في قاعدة البيانات:

Colour

Price

Year

Company

Model

CarID

White

22,500

2018

KIA

Optima

05081

Red

25,995

2017

KIA

Optima Hybrid

05082

Red

31,900

2018

KIA

Stinger

05083

Black

31,990

2017

KIA

Cadenza

05084

Blue

23,240

2018

KIA

Niro

05085

Grey

14,200

2018

KIA

Rio 5-Door

05086

Blue

18,200

2018

KIA

Forte5

05087

Blue

32,250

2017

KIA

Soul EV

05088

للحصول على السيارات ذات الثمن الأعلى بدءًا من الرابعة حتى الأقل ثمنًا، يصبح الاستعلام بالشكل الآتي:

SELECT *

FROM cars

ORDER BY Price DESC

OFFSET 3 ROWS;

لتظهر النتائج بالشكل:

Colour

Price

Year

Company

Model

CarID

Red

25,995

2017

KIA

Optima Hybrid

05082

Blue

23,240

2018

KIA

Niro

05085

White

22,500

2018

KIA

Optima

05081

Blue

18,200

2018

KIA

Forte5

05087

Grey

14,200

2018

KIA

Rio 5-Door

05086

استعلام INSERT

مهمة هذا الاستعلام هي إنشاء سجل جديد في الجدول، وله البنية العامة:

INSERT INTO tbl_name (column1, column2, column3, ...)

VALUES (value1, value2, value3, ...);

إذ تجب مراعاة التوافقية ما بين اسم العمود والقيمة التي ستوضع فيه على التوالي وبالترتيب، وأن تكون متوافقةً مع نوع بيانات الحقل، أي أن التوافق يجب أن يكون بالترتيب والعدد والنوع. ولإسناد قيم إلى كافة الحقول في السجل يُمكن الاستغناء عن أسماء الأعمدة ليصبح الاستعلام بالشكل:

INSERT INTO tbl_name VALUES (value1, value2, value3, ...);

إذ تجب مراعاة ترتيب القيم وعددها ونوعها ليتوافق مع الأعمدة في الجدول. أما إن كان الاستعلام بالشكل:

INSERT INTO tbl DEFAULT VALUES;

فتنفيذه يؤدي إلى إنشاء سجل جديدٍ في الجدول يحتوي على القيم الافتراضية بحسب نوع البيانات المحدد لكل عمود على حدة. وكما أن محرك MySQL يدعم الصيغة الآتية لاستعلام INSERT:

INSERT INTO tbl_name

  SET assignment_list

إذ إن assignment_list هي عدد من عمليات إسناد القيم للحقول المناسبة لها.

محتويات

·         1مثال

·         2إضافة سجل لا يحتوي على كافة بيانات الأعمدة

·         3إضافة عدد من السجلات باستعلام واحد

·         4إضافة سجلات إلى الجدول من جدول آخر

·         5التوافقية

·         6مصادر

مثال

إن كان الجدول students التالي موجودًا في قاعدة البيانات:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

1.96

22

Amin

1066

2.87

23

Yusuf

1056

لإضافة سجل طالب جديد رقمه التسلسلي 1075 واسمه Abed وعمره 21 سنة ومعدله 1.90 في هذا الجدول، يصبح الاستعلام بالشكل الآتي:

INSERT INTO students (StudentID, Name, Age, GPA)

VALUES (1075, Abed, 21, 1.90);

ويصبح الجدول بعد تنفيذ هذا الاستعلام:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

1.96

22

Amin

1066

2.87

23

Yusuf

1056

1.90

21

Abed

1075

 

إضافة سجل لا يحتوي على كافة بيانات الأعمدة

تمكن إضافة سجل لا يحتوي على كافة بيانات الأعمدة وحينئذٍ ستُملأ الأعمدة المتبقية بالقيم الافتراضية لنوع البيانات المحددة في هذه الأعمدة.

إن تنفيذ الاستعلام الآتي على الجدول الأساسي students:

INSERT INTO students (StudentID, Name, Age)

VALUES (NEWID(), Abed, 21);

سيؤدي لإضافة طالب اسمه Abed وعمره 21 وبمعدل 0.0 لأنها القيمة الافتراضية لعمود GPA أما رقمه التسلسلي فسيصبح 1086 لأن الدالة NEWID() مسؤولة عن إعطاء الرقم التسلسلي التالي لآخر رقم تسلسلي مستخدم في الجدول، ويصبح الجدول كما يلي:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

1.96

22

Amin

1066

2.87

23

Yusuf

1056

0.0

21

Abed

1086

إضافة عدد من السجلات باستعلام واحد

من الممكن أن تُضاف عدة سجلات بآن واحد ضمن نفس الاستعلام INSERT وذلك بفصل السجلات عن بعضها بفاصلة كما في الاستعلام الآتي:

INSERT INTO students (StudentID, Name, Age, GPA)

VALUES (1075, Abed, 21, 1.90), (1076, Taimaa, 23, 2.75), (1077, Mohammad, 22, 1.85);

إذ تُضاف ثلاثة سجلات للجدول ليصبح كالآتي:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

1.96

22

Amin

1066

2.87

23

Yusuf

1056

1.90

21

Abed

1075

2.75

23

Taimaa

1076

1.85

22

Mohammad

1077

إضافة سجلات إلى الجدول من جدول آخر

تمكن إضافة سجلات للجدول من جدول آخر بالاعتماد على استعلام SELECT.

ليكن الجدول الآتي newStudents موجودًا في قاعدة البيانات التي تحوي الجدول students:

GPA

Age

Name

StudentID

1.86

21

Maher

2027

3.57

23

Joud

2051

2.40

22

Kawthar

2082

3.68

25

Asmaa

2075

لدى تنفيذ الاستعلام الآتي:

INSERT INTO students (StudentID, Name, Age, GPA)

SELECT StudentID, Name, Age, GPA

FROM newStudents

WHERE GPA > 2.50;

ستضاف السجلات من الجدول newStudents والتي معدل الطالب فيها أكبر من 2.50 إلى الجدول students، ليصبح الجدول students بالشكل الآتي:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

1.96

22

Amin

1066

2.87

23

Yusuf

1056

3.57

23

Joud

2051

3.68

25

Asmaa

2075

 

 

 

استعلام DELETE

يُستخدم استعلام DELETE لحذف سجل أو أكثر، وله البنية العامة:

DELETE FROM tbl_name

WHERE condition;

إذ يُحدد الشرط الذي ستُحذف السجلات وفقًا له في عبارة WHERE. أما تنفيذ الاستعلامَيْن الآتيين:

DELETE * FROM tbl_name;

DELETE FROM tbl_name;

فيؤدي لحذف كافة السجلات الموجودة في الجدول.

محتويات

·         1مثال

·         2حذف عدد محدد من السجلات

·         3حذف البيانات من الجدول اعتمادًا على قيم البيانات في جدول آخر

·         4التوافقية

·         5مصادر

مثال

إن كان جدول الزبائن customers موجودًا في قاعدة البيانات على النحو الآتي:

Bill

OrderID

FullName

CustomerID

160

0291

Abd al-Salam Hadi

1156

170

0302

Ahmad Mostafa

1157

210

0203

Reem Hammad

1158

350

0294

Abd Allah Sadiq

1159

185

0255

Raghad al-Hamdan

1160

165

0276

Abd al-Razzaq Salloum

1161

175

0247

Hussam Siraj

1162

180

0208

Hiba Maktabi

1163

170

0219

Abd al-Rahman Rida

1164

220

0210

Abd al-Qader Khalil

1165

350

0211

Fateh Hammad

1166

185

0202

Abd al-Azziz Othman

1167

400

0213

Zahraa Qasem

1168

350

0314

Abd al-Wahhab Masri

1169

185

0215

Mona Saber

1170

لحذف السجلات التي يبدأ فيها اسم الزبون بكلمة Abd أو تتراوح فاتورته ما بين 150 - 200 $ يصبح الاستعلام بالشكل الآتي:

DELETE FROM customers

WHERE FullName LIKE Abd% OR Bill BETWEEN 150 AND 200;

إذ إنَّ المعامل LIKE يحدد نمطًا للسلسلة النصية الموجودة في حقل FullName وهو تتابع أي تسلسل للمحارف من بعد البدء بكلمة Abd، والمعامل BETWEEN يحدد المجال الواقع بين القيمتَيْن المحدّدتين.

 

 

 

 

بعد تنفيذ الاستعلام سيصبح الجدول بالشكل:

Bill

OrderID

FullName

CustomerID

210

0203

Reem Hammad

1158

350

0211

Fateh Hammad

1166

400

0213

Zahraa Qasem

1168

حذف عدد محدد من السجلات

يمكن تعيين عدد محدد من السجلات التي ستُحذف وذلك بالاعتماد على الكلمة المفتاحية TOP في محرك SQL Server والكلمة المفتاحية LIMIT في محركات PostgreSQL و SQLite و MySQL والكلمة المفتاحية ROWNUM في محرك Oracle وذلك بنفس الطريقة المستخدمة لتحديد عدد السجلات في استعلام SELECT، واستعلام UPDATE.

لدى تنفيذ الاستعلام السابق بإضافة TOP بمحرك SQL Server يصبح بالشكل الآتي:

DELETE TOP (5) FROM customers

WHERE FullName LIKE Abd% OR Bill BETWEEN 150 AND 200;

وفي محركات PostgreSQL و SQLite و MySQL بالشكل:

DELETE FROM customers

WHERE FullName LIKE Abd% OR Bill BETWEEN 150 AND 200;

LIMIT 5;

وعند تنفيذ الاستعلامات الثلاثة السابقة ستُحذَف 5 سجلات فقط ، أي ستصبح القيم بالجدول على النحو الآتي:

Bill

OrderID

FullName

CustomerID

210

0203

Reem Hammad

1158

175

0247

Hussam Siraj

1162

180

0208

Hiba Maktabi

1163

170

0219

Abd al-Rahman Rida

1164

220

0210

Abd al-Qader Khalil

1165

350

0211

Fateh Hammad

1166

185

0202

Abd al-Azziz Othman

1167

400

0213

Zahraa Qasem

1168

350

0314

Abd al-Wahhab Masri

1169

185

0215

Mona Saber

1170

وفي حال استخدام عبارة الترتيب ORDER BY في الاستعلام فسيُحذَف العدد المطلوب من السجلات بعد ترتيبها بحسب العمود المُحدَّد، إن تنفيذ الاستعلام الآتي في محرك SQL Server بالشكل:

DELETE TOP (5) FROM customers

ORDER BY Bill;

أو في محركات PostgreSQL و SQLite و MySQL بالشكل:

DELETE FROM customers

ORDER BY Bill

LIMIT 5;

سيؤدي إلى حذف السجلات الخمس الأولى من بعد ترتيبها بحسب عمود Bill ترتيبًا تصاعديًا، وسيصبح الجدول:

Bill

OrderID

FullName

CustomerID

160

0291

Abd al-Salam Hadi

1156

170

0302

Ahmad Mostafa

1157

210

0203

Reem Hammad

1158

185

0255

Raghad al-Hamdan

1160

165

0276

Abd al-Razzaq Salloum

1161

175

0247

Hussam Siraj

1162

180

0208

Hiba Maktabi

1163

170

0219

Abd al-Rahman Rida

1164

185

0202

Abd al-Azziz Othman

1167

185

0215

Mona Saber

1170

يُلاحظ هنا أن الترتيب مستخدَم مع استعلام DELETE ولذلك فإن سجلات الجدول السابق غير مرتبة لأنها ليست ناتجة عن استعلام الحصول على السجلات SELECT وبقيت بترتيبها الأصلي في الجدول.

حذف البيانات من الجدول اعتمادًا على قيم البيانات في جدول آخر

إن كان الجدول الآتي orders موجودًا في قاعدة البيانات السابقة التي تحوي جدول الزبائن customers السابق:

Item

EmployeeID

OrderID

ZenFone 4 Max

096

0302

ZenFone 3 Max

054

0291

ZenFone 4 4G LTE

096

0213

VivoBook Max

054

0210

ZenFone 3 Deluxe 5.7”

054

0314

ZenFone 3 Laser (ZC551KL)

054

0276

ولحذف السجلات من جدول customers التي طلبها موظف محدد في الجدول orders، سيصبح الاستعلام بالشكل الآتي:

DELETE FROM customers

WHERE OrderID IN

  (SELECT OrderID

  FROM orders

  WHERE EmployeeID = 054);

وهذا بالاعتماد على مفهوم الاستعلام الفرعي Subquery الموجود في قائمة المعامل IN الذي يحدد عددًا من القيم المحتملة لقيمة الحقل OrderID، وبعد تنفيذ الاستعلام السابق سيصبح جدول الزبائن customers على النحو الآتي:

Bill

OrderID

FullName

CustomerID

170

0302

Ahmad Mostafa

1157

210

0203

Reem Hammad

1158

350

0294

Abd Allah Sadiq

1159

185

0255

Raghad al-Hamdan

1160

175

0247

Hussam Siraj

1162

180

0208

Hiba Maktabi

1163

170

0219

Abd al-Rahman Rida

1164

350

0211

Fateh Hammad

1166

185

0202

Abd al-Azziz Othman

1167

400

0213

Zahraa Qasem

1168

185

0215

Mona Saber

1170

 

استعلام الاستبدال REPLACE

هو استعلام يستخدم للقيام بنفس مهمة الاستعلام INSERT (إضافة سجل جديد للجدول) ولكن لإدخال سجلٍ بنفس القيمة الموجودة مسبقًا في عمود المفتاح الأوليّ وذلك منعًا لحدوث التكرار، إذ يُحذف السجل المحتوي لهذه القيمة ليُضاف سجلٌ جديدٌ بدلًا منه، وتكون الصيغة العامة للاستعلام على النحو الآتي:

REPLACE INTO tbl VALUES (col_name [, col_name] ...);

إذ إن table هو اسم الجدول الذي سيُعدَّل فيه السجل، وتوضع القيم الجديدة ضمن القوسين.

مثال

 

 

 

 

إن كان الجدول الآتي students موجودًا في قاعدة البيانات:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

1.96

22

Amin

1066

2.87

23

Yusuf

1056

فلاستبدال السجل ذو الرقم الفريد 1066 (وهو رقم لا يمكن تكراره لأن هذا الحقل يعدّ مفتاحًا أوليًا للجدول) ببياناتٍ متعلقة بطالب آخر يُنفذ الاستعلام الآتي:

REPLACE INTO students VALUES (1066, 'Ahmad', 21, 3.15);

ليصبح الجدول بعد الاستبدال بالشكل الآتي:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

3.15

21

Ahmad

1066

2.87

23

Yusuf

1056

الاستعلام UPDATE

يُستخدم هذا الاستعلام من أجل تحديث قيم البيانات المخزنة في سجلات الجداول.

البنية العامة للاستعلام:

UPDATE tbl_name

SET col_name = [|DEFAULT], col_name = value [|DEFAULT],

WHERE condition

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

UPDATE tbl_name

SET col_name = value [|DEFAULT], col_name = value [|DEFAULT],

فتنفيذه يؤدي لتعديل قيمة الحقل المحدد بكافة السجلات الموجودة في الجدول بسبب عدم وجود الشرط الذي يحدد السجلات التي ستُعدل.

 

 

 

محتويات

·         1مثال

·         2تحديث قيمة عدد محدد من السجلات

·         3تحديث القيم في السجلات اعتمادًا على قيم مخزنة في جدول آخر

·         4التوافقية

·         5مصادر

مثال

إن كان الجدول التالي (employees) موجودًا في قاعدة البيانات:

WeeklyHours

Work

City

Salary

Name

EmployeeID

25

In centre

Beruit

200

Natalie Sinno

0156

30

In centre

Alexandria

275

Ahmad Rida

0157

25

In centre

Aleppo

210

Kareem al-Hamdan

0158

28

In centre

Rabat

190

Mahdi Thabit

0159

36

In centre

Jedda

300

Rabie al-Sadi

0160

36

In centre

Amman

290

Jaber Hammad

0161

30

In centre

Cairo

210

Rawda Hussien

0162

ويُراد زيادة 10% لقيمة الراتب وتعديل طبيعة العمل لتصبح عبر شبكة الإنترنت بدلًا من المركز، وذلك لكل موظف يسكن في أيّ من المدن (Aleppo, Cairo, Rabat) بالاستفادة من المعامل IN، فسيكون الاستعلام المطلوب:

UPDATE employees

SET Salary = Salary * 1.1 , Work =online

WHERE City IN (Aleppo, Cairo, Rabat);

وسيصبح الجدول بالقيم الجديدة كالآتي:

WeeklyHours

Work

City

Salary

Name

EmployeeID

25

In centre

Beruit

200

Natalie Sinno

0156

30

In centre

Alexandria

275

Ahmad Rida

0157

25

online

Aleppo

231

Kareem al-Hamdan

0158

28

online

Rabat

209

Mahdi Thabit

0159

36

In centre

Jedda

300

Rabie al-Sadi

0160

36

In centre

Amman

290

Jaber Hammad

0161

30

online

Cairo

231

Rawda Hussien

0162

تحديث قيمة عدد محدد من السجلات

يمكن تعيين عدد محدد من السجلات التي ستُحدّث قيمتها وذلك بالاعتماد على الكلمة المفتاحية TOP في محرك SQL Server والكلمة المفتاحية LIMIT في محركات PostgreSQL و SQLite و MySQL والكلمة المفتاحية ROWNUM في محرك Oracle وذلك بنفس الطريقة المستخدمة لتحديد عدد السجلات في استعلام SELECT، واستعلام DELETE.

لدى تنفيذ نفس الاستعلام السابق بإضافة TOP بمحرك SQL Server يصبح بالشكل الآتي:

UPDATE TOP (2) employees

SET Salary = Salary * 1.1, Work =online

WHERE City IN (Aleppo, Cairo, Rabat);

وفي محركات PostgreSQL و SQLite و MySQL بالشكل:

UPDATE employees

SET Salary = Salary * 1.1, Work =online

WHERE City IN (Aleppo, Cairo, Rabat)

LIMIT 2;

وفي محرك Oracle بالشكل:

UPDATE employees

SET Salary = Salary * 1.1, Work =online

WHERE City IN (Aleppo, Cairo, Rabat) AND ROWNUM <= 2;

وعند تنفيذ الاستعلامات الثلاثة السابقة ستُحدَّث قيمة الراتب ومكان العمل في سجلين فقط دون تعديل الثالث، أي تصبح القيم بالجدول على النحو الآتي:

WeeklyHours

Work

City

Salary

Name

EmployeeID

25

In centre

Beruit

200

Natalie Sinno

0156

30

In centre

Alexandria

275

Ahmad Rida

0157

25

online

Aleppo

231

Kareem al-Hamdan

0158

28

online

Rabat

209

Mahdi Thabit

0159

36

In centre

Jedda

300

Rabie al-Sadi

0160

36

In centre

Amman

290

Jaber Hammad

0161

30

In centre

Cairo

210

Rawda Hussien

0162

تحديث القيم في السجلات اعتمادًا على قيم مخزنة في جدول آخر

ليكن الجدول الآتي باسم leaves موجودًا في قاعدة البيانات السابقة التي تحوي جدول الموظفين (employees):

AnnualLeave

EmployeeID

10

0156

12

0157

10

0158

11

0159

15

0160

15

0161

12

0162

لإضافة يوميّ إجازة إضافيَّين للجدول leaves اعتمادًا على عدد ساعات العمل المحددة في جدول employees بحيث تكون ساعات عمل الموظف أكثر من 25 ساعة، سيُستخدم الاستعلام الآتي:

UPDATE leaves 

SET AnnualLeave = AnnualLeave + 2 

FROM (SELECT EmployeeID FROM employees  WHERE WeeklyHours > 25 ) AS tempTable

WHERE leaves.EmployeeID = tempTable.EmployeeID;

إذ إنَّ هذا الاستعلام يعتمد على مفهوم الاستعلام الفرعي في عبارة FROM والذي حَدَّد السجلات من الجدول employees التي ساعات العمل فيها أكثر من 25، وسُمّي الجدول الناتج باسم tempTable بالاستفادة من المعامل AS، وتحقق التقابل ما بين الجدولين ضمن عبارة WHERE.

الربط بين الجداول

تخزن البيانات عادةً في قواعد البيانات بأكثر من جدول لتسهيل تنظيمها وإدارتها، وتُربط هذه الجداول فيما بينها من خلال الأعمدة المترابطة فيما بينها، وذلك بالاعتماد على مفهومي المفتاح الأولي Primary Key والمفتاح الثانوي Foreign Key، وله عدة أنواع ستُذكر تباعًا.

 

 

 

 

 

 

 

 

 

 

 

 

 

محتويات

·         1أنواع ربط الجداول

·         2ربط أكثر من جدولين

o        2.1مثال

·         3دمج النتائج من استعلامي SELECT في جدول واحد

o        3.1مثال

·         4التوافقية

·         5مصادر

أنواع ربط الجداول

توجد عدة أنواع للربط بين جدولين (أو أكثر)، إذ يسمى الجدول الأول يساريًا والجدول الثاني يمينًا:

1.    الربط الداخلي INNER JOIN: تحديد بعض السجلات من الجدول اليساري والجدول اليميني بحيث تحقق شرط الربط.

2.    الربط اليساري LEFT JOIN: تحديد كافة السجلات من الجدول اليساري وبعض السجلات من الجدول اليميني التي تحقق شرط الربط.

3.    الربط اليميني RIGHT JOIN: تحديد بعض السجلات التي تحقق شرط الربط من الجدول اليساري وكافة السجلات من الجدول اليميني.

4.    الربط التام FULL JOIN: تحديد كافة السجلات من الجدولين اليساري واليميني بغض النظر عن تحقيقها للشرط.

وهذه الأنواع موضحة باستخدام مخططات Venn.

ربط أكثر من جدولين

عند ربط أكثر من جدول يكون الربط باستخدام JOIN (بأحد الأنواع الأربع) عدة مرات لتشكيل جداول مرحلية يُربط فيما بينها للحصول على جدول الربط النهائي.

مثال

تحتوي قاعدة بيانات أحد المراكز التعليمية الجداول الآتية:

الجدول الأول: جدول الطلاب students

(المفتاح الأولي فيه هو عمود StudentID والمفتاح الثانوي هو عمود CourseID للربط مع جدول الدورات التدريبية)

RegDate

CourseID

LastName

FirstName

StudentID

07-JUL-2017

0206

Najjar

Rama

1147

08-NOV-2017

0604

Kordi

Jenan

1148

07-JUL-2017

0206

Bitar

Rahaf

1149

20-AUG-2017

0607

Taweel

Farah

1150

08-NOV-2017

0610

Arab

Rami

1151

24-OCT-2017

0803

Akkad

Aya

1152

08-NOV-2017

0504

Haddad

Abed

1153

20-AUG-2017

0801

Fares

Tasneem

1154

24-OCT-2017

0607

Hamsho

Monther

1155

30-SEP-2017

0607

Abd Allah

Hiba

1156

07-JUL-2017

0509

Khatib

Mohammad

1157

20-AUG-2017

0801

Sharif

Ibrahim

1158

24-OCT-2017

0802

Fehmi

Hanin

1159

20-AUG-2017

0204

Zein

Loujain

1160

08-NOV-2017

0503

Helali

Ammar

1161

الجدول الثاني: جدول الدورات التدريبية courses

(المفتاح الأولي فيه هو عمود CourseID والمفتاح الثانوي هو عمود DepartmentID للربط مع جدول الأقسام)

DepartmentID

Lecturer

Course

CourseID

EN01

Dr. Reem Hadi

English (Adv)

0204

EN01

Dr. Shadi Balid

English (Int)

0206

EN02

Dr. Firas Abd

English (TOEFL)

0211

IT01

Eng. Nasser Sharif

Artificial Intelligence

0604

IT01

Eng. Amal Safi

Networks

0607

IT01

Eng. Salem Najm

ICDL

0610

IT02

Eng. Nasser Sharif

SQL Programming

0703

IT02

Eng. Amal Safi

FrontEnd Programming

0704

IT03

Mr. Maher Siraj

Photoshop Design

0801

IT03

Ms. Nadia Taleb

Illustrator Design

0802

IT03

Mr. Maher Siraj

UI Design

0803

الجدول الثالث: جدول الأقسام departments

(المفتاح الأولي فيه هو DepartmentID)

Head

DepatementName

DepartmentID

Dr. Firas Abd

General English

EN01

Dr. Saer Raslan

Advanced English

EN02

Dr. Osama Najjar

Information Technology

IT01

Eng. Amal Safi

Programming

IT02

Eng. Fares Ahmad

Graphic Design

IT03

لربط الجداول الثلاث السابقة يُربط الجدول الأول students مع الجدول الثاني courses عبر العمود CourseID بالعبارة:

students INNER JOIN courses ON students.CourseID = courses.CourseID

ومن ثم يربط الجدول الناتج مع الجدول الثالث عبر العمود DepartmentID بالعبارة:

INNER JOIN departments ON courses.DepartmentID = departments.DepartmentID

ليصبح الاستعلام بشكله الكامل:

SELECT StudentID, FirstName, Course, Lecturer, DepartmentName

FROM (

  (students INNER JOIN courses ON students.CourseID = courses.CourseID)

  INNER JOIN departments ON courses.DepartmentID = departments.DepartmentID);

وتظهر النتائج بالشكل الآتي:

DepartmentName

Lecturer

Course

FirstName

StudentID

General English

Dr. Shadi Balid

English (Int)

Rama

1147

Information Technology

Eng. Nasser Sharif

Artificial Intelligence

Jenan

1148

General English

Dr. Shadi Balid

English (Int)

Rahaf

1149

Information Technology

Eng. Amal Safi

Networks

Farah

1150

Information Technology

Eng. Salem Najm

ICDL

Rami

1151

Graphic Design

Mr. Maher Siraj

UI Design

Aya

1152

Graphic Design

Mr. Maher Siraj

Photoshop Design

Tasneem

1154

Information Technology

Eng. Amal Safi

Networks

Monther

1155

Information Technology

Eng. Amal Safi

Networks

Hiba

1156

Graphic Design

Mr. Maher Siraj

Photoshop Design

Ibrahim

1158

Graphic Design

Ms. Nadia Taleb

Illustrator Design

Hanin

1159

General English

Dr. Reem Hadi

English (Adv)

Loujain

1160

دمج النتائج من استعلامي SELECT في جدول واحد

يمكن دمج السجلات الناتجة عن استعلامي SELECT في جدول واحد من خلال الكلمة المفتاحية UNION التي توضع بين الاستعلامين.

مثال

 

 

 

 

 

 

 

إذا كان الجدولان الآتيان موجودَين في قاعدة البيانات بالشكل الآتي:

الجدول الأول: مجموعة الدورات التدريبية في المركز الأول

Lecturer

Course

CourseID

Dr. Reem Hadi

English (Adv)

0204

Dr. Shadi Balid

English (Int)

0206

Dr. Firas Abd

English (TOEFL)

0211

Eng. Nasser Sharif

Artificial Intelligence

0604

Eng. Amal Safi

Networks

0607

Eng. Salem Najm

ICDL

0610

Eng. Nasser Sharif

SQL Programming

0703

Eng. Amal Safi

FrontEnd Programming

0704

Mr. Maher Siraj

Photoshop Design

0801

Ms. Nadia Taleb

Illustrator Design

0802

Mr. Maher Siraj

UI Design

0803

الجدول الثاني: مجموعة الدورات التدريبية في المركز الثاني

Lecturer

Course

CourseID

Dr. Reem Hadi

English (Bas)

0205

Dr. Shadi Balid

English (Int)

0206

Dr. Firas Abd

English (IELTS)

0208

Eng. Nasser Sharif

C# Programming

0705

Eng. Amal Safi

PHP Programming

0706

Mr. Maher Siraj

AfterEffects Design

0804

Ms. Nadia Taleb

3D MAX Design

0805

فيمكن عرض سجلات الجدولين ضمن جدول واحد عبر الاستعلام الآتي:

SELECT CourseID, Course

FROM firstCentre

UNION

SELECT CourseID, Course

FROM secondCentre

ORDER BY Course DESC;

 

 

 

 

 

إذ دُمجت سجلات الجدولين عبر الكلمة المفتاحية UNION ورُتبت النتائج بشكل تنازليّ بحسب اسم الدورة التدريبية لتظهر النتائج الآتية:

Course

CourseID

UI Design

0803

SQL Programming

0703

PHP Programming

0706

Photoshop Design

0801

Networks

0607

Illustrator Design

0802

ICDL

0610

FrontEnd Programming

0704

English (TOEFL)

0211

English (Int)

0206

English (IELTS)

0208

English (Bas)

0205

English (Adv)

0204

C# Programming

0705

Artificial Intelligence

0604

AfterEffects Design

0804

3D MAX Design

0805

ويُلاحظ أن السجل المكرر في الجدولين لم يظهر سوى كسجل وحيد في النتائج لأن الكلمة المفتاحية UNION لا تعرض السجلات المكررة إلا بوجود الكلمة المفتاحية ALL والتي ستحدد عرض كافة السجلات متضمنةً التكرار إن وُجد، أي يصبح الاستعلام بالشكل الآتي:

SELECT CourseID, Course

FROM firstCentre

UNION ALL

SELECT CourseID, Course

FROM secondCentre

ORDER BY Course DESC;

وستظهر نفس النتائج السابقة مع تكرار سجل الدورة التدريبية English (Int).

 

 

 

 

 

 

الربط الداخلي INNER JOIN

يُستخدم هذا النوع من الربط ما بين جدولين (أو أكثر) وذلك لتحديد بعض السجلات من الجدول اليساري والجدول اليميني بحيث تحقق شرط الربط، وتكون له البنية العامّة الآتية:

SELECT col_names
FROM tbl_name1 
[INNER] JOIN tbl_name2 
ON col_name1 = col_name2

وكما يُلاحظ أن وجود كلمة INNER اختياريّ لأن الربط الداخلي هو الحالة الافتراضية في الربط.

مثال

إن كانت قاعدة بيانات أحد المراكز التعليمية تحتوي على الجداول الآتية:

الجدول الأول: جدول الطلاب students

(المفتاح الأولي فيه هو عمود StudentID والمفتاح الثانوي هو عمود CourseID للربط مع جدول الدورات التدريبية)

RegDate

CourseID

LastName

FirstName

StudentID

07-JUL-2017

0206

Najjar

Rama

1147

08-NOV-2017

0604

Kordi

Jenan

1148

07-JUL-2017

0206

Bitar

Rahaf

1149

20-AUG-2017

0607

Taweel

Farah

1150

08-NOV-2017

0610

Arab

Rami

1151

24-OCT-2017

0803

Akkad

Aya

1152

08-NOV-2017

0504

Haddad

Abed

1153

20-AUG-2017

0801

Fares

Tasneem

1154

24-OCT-2017

0607

Hamsho

Monther

1155

30-SEP-2017

0607

Abd Allah

Hiba

1156

07-JUL-2017

0509

Khatib

Mohammad

1157

20-AUG-2017

0801

Sharif

Ibrahim

1158

24-OCT-2017

0802

Fehmi

Hanin

1159

20-AUG-2017

0204

Zein

Loujain

1160

08-NOV-2017

0503

Helali

Ammar

1161

 

 

 

 

 

 

 

الجدول الثاني: جدول الدورات التدريبية courses

(المفتاح الأولي فيه هو عمود CourseID والمفتاح الثانوي هو عمود DepartmentID للربط مع جدول الأقسام)

CourseID

Course

Lecturer

DepartmentID

0204

English (Adv)

Dr. Reem Hadi

EN01

0206

English (Int)

Dr. Shadi Balid

EN01

0211

English (TOEFL)

Dr. Firas Abd

EN02

0604

Artificial Intelligence

Eng. Nasser Sharif

IT01

0607

Networks

Eng. Amal Safi

IT01

0610

ICDL

Eng. Salem Najm

IT01

0703

SQL Programming

Eng. Nasser Sharif

IT02

0704

FrontEnd Programming

Eng. Amal Safi

IT02

0801

Photoshop Design

Mr. Maher Siraj

IT03

0802

Illustrator Design

Ms. Nadia Taleb

IT03

0803

UI Design

Mr. Maher Siraj

IT03

 

الجدول الثالث: جدول الأقسام departments

(المفتاح الأولي فيه هو DepartmentID)

Head

DepatementName

DepartmentID

Dr. Firas Abd

General English

EN01

Dr. Saer Raslan

Advanced English

EN02

Dr. Osama Najjar

Information Technology

IT01

Eng. Amal Safi

Programming

IT02

Eng. Fares Ahmad

Graphic Design

IT03

فإن تنفيذ الاستعلام الآتي:

SELECT StudentID, FirstName, Course, Lecturer
FROM students st
INNER JOIN courses co
ON st.CourseID = co.CourseID;

سيُظهر السجلات من الجدول students (والذي سُمي باسم st ضمن الشيفرة) والجدول courses (والذي سُمي باسم co ضمن الشيفرة) بالربط بينهما داخليًا عبر العمود CourseID لتظهر النتائج الآتية:

Lecturer

Course

FirstName

StudentID

Dr. Shadi Balid

English (Int)

Rama

1147

Eng. Nasser Sharif

Artificial Intelligence

Jenan

1148

Dr. Shadi Balid

English (Int)

Rahaf

1149

Eng. Amal Safi

Networks

Farah

1150

Eng. Salem Najm

ICDL

Rami

1151

Mr. Maher Siraj

UI Design

Aya

1152

Mr. Maher Siraj

Photoshop Design

Tasneem

1154

Eng. Amal Safi

Networks

Monther

1155

Eng. Amal Safi

Networks

Hiba

1156

Mr. Maher Siraj

Photoshop Design

Ibrahim

1158

Ms. Nadia Taleb

Illustrator Design

Hanin

1159

Dr. Reem Hadi

English (Adv)

Loujain

1160

ويُلاحظ أنه لم تظهر كافة سجلات الطلاب إذ استُثني الطلاب الذين لديهم دورات تدريبية غير موجودة في جدول الدورات التدريبية (مثل الطالب Abed Haddad)، وكذلك لم تظهر الدورات التدريبية التي لا يوجد فيها أي طلاب مسجلين (مثل دورة SQL Programming).

 

 

 

 

الربط اليساري LEFT JOIN

يُستخدم هذا النوع من الربط ما بين جدولين (أو أكثر) وذلك لتحديد كافة السجلات من الجدول اليساري وبعض السجلات من الجدول اليميني التي تحقق شرط الربط، وتكون له البنية العامّة الآتية:

SELECT col_names
FROM tbl_name1 
LEFT [OUTER] JOIN tbl_name2 
ON col_name1 = col_name2

مثال

إن كانت قاعدة بيانات أحد المراكز التعليمية تحتوي على الجداول الآتية:

الجدول الأول: جدول الطلاب students

(المفتاح الأولي فيه هو عمود StudentID والمفتاح الثانوي هو عمود CourseID للربط مع جدول الدورات التدريبية)

RegDate

CourseID

LastName

FirstName

StudentID

07-JUL-2017

0206

Najjar

Rama

1147

08-NOV-2017

0604

Kordi

Jenan

1148

07-JUL-2017

0206

Bitar

Rahaf

1149

20-AUG-2017

0607

Taweel

Farah

1150

08-NOV-2017

0610

Arab

Rami

1151

24-OCT-2017

0803

Akkad

Aya

1152

08-NOV-2017

0504

Haddad

Abed

1153

20-AUG-2017

0801

Fares

Tasneem

1154

24-OCT-2017

0607

Hamsho

Monther

1155

30-SEP-2017

0607

Abd Allah

Hiba

1156

07-JUL-2017

0509

Khatib

Mohammad

1157

20-AUG-2017

0801

Sharif

Ibrahim

1158

24-OCT-2017

0802

Fehmi

Hanin

1159

20-AUG-2017

0204

Zein

Loujain

1160

08-NOV-2017

0503

Helali

Ammar

1161

 

 

 

 

 

 

 

 

 

الجدول الثاني: جدول الدورات التدريبية courses

(المفتاح الأولي فيه هو عمود CourseID والمفتاح الثانوي هو عمود DepartmentID للربط مع جدول الأقسام)

DepartmentID

Lecturer

Course

CourseID

EN01

Dr. Reem Hadi

English (Adv)

0204

EN01

Dr. Shadi Balid

English (Int)

0206

EN02

Dr. Firas Abd

English (TOEFL)

0211

IT01

Eng. Nasser Sharif

Artificial Intelligence

0604

IT01

Eng. Amal Safi

Networks

0607

IT01

Eng. Salem Najm

ICDL

0610

IT02

Eng. Nasser Sharif

SQL Programming

0703

IT02

Eng. Amal Safi

FrontEnd Programming

0704

IT03

Mr. Maher Siraj

Photoshop Design

0801

IT03

Ms. Nadia Taleb

Illustrator Design

0802

IT03

Mr. Maher Siraj

UI Design

0803

 

الجدول الثالث: جدول الأقسام departments

(المفتاح الأولي فيه هو DepartmentID)

Head

DepatementName

DepartmentID

Dr. Firas Abd

General English

EN01

Dr. Saer Raslan

Advanced English

EN02

Dr. Osama Najjar

Information Technology

IT01

Eng. Amal Safi

Programming

IT02

Eng. Fares Ahmad

Graphic Design

IT03

فإن تنفيذ الاستعلام الآتي:

SELECT StudentID, FirstName, Course, Lecturer
FROM students st
LEFT JOIN courses co
ON st.CourseID = co.CourseID;

 

 

 

 

 

 

 

سيُظهر كافة السجلات من الجدول students (والذي سُمي باسم st ضمن الشيفرة) وسجلات الجدول courses (والذي سُمي باسم co ضمن الشيفرة) المرتبطة فقط بالجدول students عبر العمود CourseID لتظهر النتائج الآتية:

Lecturer

Course

FirstName

StudentID

Dr. Shadi Balid

English (Int)

Rama

1147

Eng. Nasser Sharif

Artificial Intelligence

Jenan

1148

Dr. Shadi Balid

English (Int)

Rahaf

1149

Eng. Amal Safi

Networks

Farah

1150

Eng. Salem Najm

ICDL

Rami

1151

Mr. Maher Siraj

UI Design

Aya

1152

NULL

NULL

Abed

1153

Mr. Maher Siraj

Photoshop Design

Tasneem

1154

Eng. Amal Safi

Networks

Monther

1155

Eng. Amal Safi

Networks

Hiba

1156

NULL

NULL

Mohammad

1157

Mr. Maher Siraj

Photoshop Design

Ibrahim

1158

Ms. Nadia Taleb

Illustrator Design

Hanin

1159

Dr. Reem Hadi

English (Adv)

Loujain

1160

NULL

NULL

Ammar

1161

 

الربط اليميني RIGHT JOIN

يُستخدم هذا النوع من الربط ما بين جدولين (أو أكثر) وذلك لتحديد بعض السجلات التي تحقق شرط الربط من الجدول اليساري وكافة السجلات من الجدول اليميني، وتكون له البنية العامّة الآتية:

SELECT col_names
FROM tbl_name1 
RIGHT [OUTER] JOIN tbl_name2 
ON col_name1 = col_name2

مثال

إن كانت قاعدة بيانات أحد المراكز التعليمية تحتوي على الجداول الآتية:

الجدول الأول: جدول الطلاب students

(المفتاح الأولي فيه هو عمود StudentID والمفتاح الثانوي هو عمود CourseID للربط مع جدول الدورات التدريبية)

RegDate

CourseID

LastName

FirstName

StudentID

07-JUL-2017

0206

Najjar

Rama

1147

08-NOV-2017

0604

Kordi

Jenan

1148

07-JUL-2017

0206

Bitar

Rahaf

1149

20-AUG-2017

0607

Taweel

Farah

1150

08-NOV-2017

0610

Arab

Rami

1151

24-OCT-2017

0803

Akkad

Aya

1152

08-NOV-2017

0504

Haddad

Abed

1153

20-AUG-2017

0801

Fares

Tasneem

1154

24-OCT-2017

0607

Hamsho

Monther

1155

30-SEP-2017

0607

Abd Allah

Hiba

1156

07-JUL-2017

0509

Khatib

Mohammad

1157

20-AUG-2017

0801

Sharif

Ibrahim

1158

24-OCT-2017

0802

Fehmi

Hanin

1159

20-AUG-2017

0204

Zein

Loujain

1160

08-NOV-2017

0503

Helali

Ammar

1161

 

 

الجدول الثاني: جدول الدورات التدريبية courses

(المفتاح الأولي فيه هو عمود CourseID والمفتاح الثانوي هو عمود DepartmentID للربط مع جدول الأقسام)

DepartmentID

Lecturer

Course

CourseID

EN01

Dr. Reem Hadi

English (Adv)

0204

EN01

Dr. Shadi Balid

English (Int)

0206

EN02

Dr. Firas Abd

English (TOEFL)

0211

IT01

Eng. Nasser Sharif

Artificial Intelligence

0604

IT01

Eng. Amal Safi

Networks

0607

IT01

Eng. Salem Najm

ICDL

0610

IT02

Eng. Nasser Sharif

SQL Programming

0703

IT02

Eng. Amal Safi

FrontEnd Programming

0704

IT03

Mr. Maher Siraj

Photoshop Design

0801

IT03

Ms. Nadia Taleb

Illustrator Design

0802

IT03

Mr. Maher Siraj

UI Design

0803

الجدول الثالث: جدول الأقسام departments

(المفتاح الأولي فيه هو DepartmentID)

Head

DepatementName

DepartmentID

Dr. Firas Abd

General English

EN01

Dr. Saer Raslan

Advanced English

EN02

Dr. Osama Najjar

Information Technology

IT01

Eng. Amal Safi

Programming

IT02

Eng. Fares Ahmad

Graphic Design

IT03

فإن تنفيذ الاستعلام الآتي:

SELECT StudentID, FirstName, Course, Lecturer
FROM students st
RIGHT JOIN courses co
ON st.CourseID = co.CourseID;

سيُظهر سجلات الجدول students (والذي سُمي باسم st ضمن الشيفرة) المرتبطة فقط بالجدول courses (والذي سُمي باسم co ضمن الشيفرة) عبر العمود CourseID، إضافةً إلى كافة السجلات الموجودة في جدول courses سواء أكان لها ارتباط بجدول students أو لم يكن، لتظهر النتائج الآتية:

Lecturer

Course

FirstName

StudentID

Dr. Shadi Balid

English (Int)

Rama

1147

Eng. Nasser Sharif

Artificial Intelligence

Jenan

1148

Dr. Shadi Balid

English (Int)

Rahaf

1149

Eng. Amal Safi

Networks

Farah

1150

Eng. Salem Najm

ICDL

Rami

1151

Mr. Maher Siraj

UI Design

Aya

1152

Mr. Maher Siraj

Photoshop Design

Tasneem

1154

Eng. Amal Safi

Networks

Monther

1155

Eng. Amal Safi

Networks

Hiba

1156

Mr. Maher Siraj

Photoshop Design

Ibrahim

1158

Ms. Nadia Taleb

Illustrator Design

Hanin

1159

Dr. Reem Hadi

English (Adv)

Loujain

1160

Dr. Firas Abd

English (TOEFL)

NULL

NULL

Eng. Nasser Sharif

SQL Programming

NULL

NULL

Eng. Amal Safi

FrontEnd Programming

NULL

NULL

الربط التام FULL JOIN

يُستخدم هذا النوع من الربط ما بين جدولين (أو أكثر) وذلك لتحديد كافة السجلات من الجدولين اليساري واليميني بغض النظر عن تحقيقها للشرط، وتكون له البنية العامّة الآتية:

SELECT col_names
FROM tbl_name1 
FULL JOIN tbl_name2 
ON col_name1 = col_name2

مثال

إن كانت قاعدة بيانات أحد المراكز التعليمية تحتوي على الجداول الآتية:

الجدول الأول: جدول الطلاب students

(المفتاح الأولي فيه هو عمود StudentID والمفتاح الثانوي هو عمود CourseID للربط مع جدول الدورات التدريبية)

RegDate

CourseID

LastName

FirstName

StudentID

07-JUL-2017

0206

Najjar

Rama

1147

08-NOV-2017

0604

Kordi

Jenan

1148

07-JUL-2017

0206

Bitar

Rahaf

1149

20-AUG-2017

0607

Taweel

Farah

1150

08-NOV-2017

0610

Arab

Rami

1151

24-OCT-2017

0803

Akkad

Aya

1152

08-NOV-2017

0504

Haddad

Abed

1153

20-AUG-2017

0801

Fares

Tasneem

1154

24-OCT-2017

0607

Hamsho

Monther

1155

30-SEP-2017

0607

Abd Allah

Hiba

1156

07-JUL-2017

0509

Khatib

Mohammad

1157

20-AUG-2017

0801

Sharif

Ibrahim

1158

24-OCT-2017

0802

Fehmi

Hanin

1159

20-AUG-2017

0204

Zein

Loujain

1160

08-NOV-2017

0503

Helali

Ammar

1161

الجدول الثاني: جدول الدورات التدريبية courses

(المفتاح الأولي فيه هو عمود CourseID والمفتاح الثانوي هو عمود DepartmentID للربط مع جدول الأقسام)

DepartmentID

Lecturer

Course

CourseID

EN01

Dr. Reem Hadi

English (Adv)

0204

EN01

Dr. Shadi Balid

English (Int)

0206

EN02

Dr. Firas Abd

English (TOEFL)

0211

IT01

Eng. Nasser Sharif

Artificial Intelligence

0604

IT01

Eng. Amal Safi

Networks

0607

IT01

Eng. Salem Najm

ICDL

0610

IT02

Eng. Nasser Sharif

SQL Programming

0703

IT02

Eng. Amal Safi

FrontEnd Programming

0704

IT03

Mr. Maher Siraj

Photoshop Design

0801

IT03

Ms. Nadia Taleb

Illustrator Design

0802

IT03

Mr. Maher Siraj

UI Design

0803

الجدول الثالث: جدول الأقسام departments

(المفتاح الأولي فيه هو DepartmentID)

Head

DepatementName

DepartmentID

Dr. Firas Abd

General English

EN01

Dr. Saer Raslan

Advanced English

EN02

Dr. Osama Najjar

Information Technology

IT01

Eng. Amal Safi

Programming

IT02

Eng. Fares Ahmad

Graphic Design

IT03

فإن تنفيذ الاستعلام الآتي:

SELECT StudentID, FirstName, Course, Lecturer
FROM students st
FULL JOIN courses co
ON st.CourseID = co.CourseID;

سيُظهر كافة السجلات من الجدول students (والذي سُمي باسم st ضمن الشيفرة) وكافة سجلات الجدول courses (والذي سُمي باسم co ضمن الشيفرة) سواءً كانت مرتبطة عبر العمود CourseID أو لم تكن، لتظهر النتائج الآتية:

Lecturer

Course

FirstName

StudentID

Dr. Shadi Balid

English (Int)

Rama

1147

Eng. Nasser Sharif

Artificial Intelligence

Jenan

1148

Dr. Shadi Balid

English (Int)

Rahaf

1149

Eng. Amal Safi

Networks

Farah

1150

Eng. Salem Najm

ICDL

Rami

1151

Mr. Maher Siraj

UI Design

Aya

1152

NULL

NULL

Abed

1153

Mr. Maher Siraj

Photoshop Design

Tasneem

1154

Eng. Amal Safi

Networks

Monther

1155

Eng. Amal Safi

Networks

Hiba

1156

NULL

NULL

Mohammad

1157

Mr. Maher Siraj

Photoshop Design

Ibrahim

1158

Ms. Nadia Taleb

Illustrator Design

Hanin

1159

Dr. Reem Hadi

English (Adv)

Loujain

1160

NULL

NULL

Ammar

1161

Dr. Firas Abd

English (TOEFL)

NULL

NULL

Eng. Nasser Sharif

SQL Programming

NULL

NULL

Eng. Amal Safi

FrontEnd Programming

NULL

NULL

 

المعاملات

المعاملات Operators في SQL

محتويات

·         1المعاملات الرياضية Arithmetic Operators

o        1.1مثال

o        1.2ملاحظة

·         2المعاملات الثنائية Bitwise Operators

o        2.1أمثلة

·         3معاملات المقارنة Comparison Operators

o        3.1مثال

·         4المعاملات المركبة مع الإسناد Compound Operators

·         5المعاملات المنطقية Logical Operators

·         6أولوية المعاملات

o        6.1أولوية المعاملات في محرك SQL Server

o        6.2أولوية المعاملات في محرك SQLite

o        6.3أولوية المعاملات في محرك Oracle

o        6.4أولوية المعاملات في محرك MySQL

o        6.5أولوية المعاملات في محرك Postgresql

o        6.6مثال

·         7التوافقية

·         8مصادر

 

 

 

المعاملات الرياضية Arithmetic Operators

تستخدم لإجراء العمليات الحسابية على البيانات العددية في الجداول، وهي:

المعامل

المهمة

+

الجمع

-

الطرح

*

الضرب

/

القسمة

%

باقي القسمة

ويضاف إليها المعامل ^ في محرك PostgreSQL للقيام بعملية الرفع إلى قوة.

مثال

إن كان الجدول الآتي items موجودًا في قاعدة البيانات:

DiscountPercent

No

Price

ItemID

20

2

25

157

10

2

5

203

30

3

10

109

فيمكن حساب قيمة الشراء النهائية من خلال إجراء العملية الحسابية وجمع النتائج باستخدام الدالة التجميعية SUM() كما في الاستعلام الآتي:

SELECT SUM((Price * No) - (Price * No * DiscountPercent * 0.01)) AS FinalBill

From items;

 

 

 

لتظهر النتيجة الآتية:

FinalBill

70

ملاحظة

يمكن استخدام المعامل + للربط ما بين السلاسل النصية فمثلًا في الاستعلام الآتي:

SELECT (FirstName + LastName) AS FullName 

FROM students;

يقوم معامل + بالربط ما بين العمودين FirstName و LastName وعرضهما في عمود واحد باسم FullName.

وهذا مختلف في محركات Oracle و SQLite و PostgreSQL إذ يستخدم المعامل || للربط ما بين السلاسل النصية بدلًا من +، أما في محرك MySQL فإن المعامل || يستخدم للعملية المنطقية OR.

 

 

 

 

المعاملات الثنائية Bitwise Operators

تستخدم للقيام بالعمليات الثنائية على البيانات العددية الصحيحة، إذ تُحوّل القيم الصحيحة إلى خانات ثنائية bits توافق القيم لتُجرى عليها العمليات ثم تُحول النتيجة إلى قيمة صحيحة من جديد، وهي:

المعامل

المهمة

&

AND (تصبح الخانة بقيمة 1 إن كانت الخانتان المتقابلتان بقيمة 1)

|

OR (تصبح الخانة بقيمة 1 إن كانت الخانتان المتقابلتان أو إحداهما بقيمة 1)

^

XOR (تصبح الخانة بقيمة 1 إن كانت خانة واحدة فقط من الخانتين المتقابلتين بقيمة 1)

~

NOT (تعكس حالة الخانة من 0 إلى 1 أو بالعكس)

ويضاف لها في محركات MySQL و SQLite و Postgresql المعاملَين:

·         المعامل << للإزاحة نحو اليسار بعدد الخانات المحدد بالعدد بعد المعامل.

·         المعامل >> للإزاحة نحو اليمين بعدد الخانات المحدد بالعدد بعد المعامل.

أما في محرك PostgreSQL فإن المعامل # يقوم بالعملية الثنائية XOR للخانات.

أمثلة

لدى تنفيذ العمليات السابقة على العددين 110 (بالتمثيل الثنائي 01101110) و 96 (بالتمثيل الثنائي 01100000) يعطي النتائج الآتية:

AND

01101110

01100000

-------------

01100000

OR

01101110

01100000

-------------

01101110

XOR

01101110

01100000

-------------

00001110

NOT

01101110

-------------

10010001

معاملات المقارنة Comparison Operators

تستخدم للمقارنة ما بين قيمتين من أي نوع من أنواع البيانات باستثناء السلاسل النصية، وتكون قيمة النتيجة قيمة بوليانية إما TRUE أو FALSE، وهي:

المعامل

المهمة

=

يساوي

< 

أصغر من

> 

أكبر من

<=

أصغر من أو يساوي

>=

أكبر من أو يساوي

<> 

لا يساوي

مثال

ليكن الجدول الآتي students موجودًا في قاعدة البيانات:

RegDate

CourseID

LastName

FirstName

StudentID

07-JUL-2017

0206

Najjar

Rama

1147

08-NOV-2017

0604

Kordi

Jenan

1148

07-JUL-2017

0206

Bitar

Rahaf

1149

20-AUG-2017

0607

Taweel

Farah

1150

08-NOV-2017

0610

Arab

Rami

1151

24-OCT-2017

0803

Akkad

Aya

1152

إن تنفيذ الاستعلام الآتي:

SELECT *

FROM students

WHERE StudentID >= 1150 AND FirstName <> Rami;

سيجلب السجلات التي يكون الرقم التسلسلي فيها أكبر من أو يساوي القيمة 1150 باستثناء السجلات التي يكون فيها الاسم الأول للطالب Rami، لتظهر النتائج الآتية:

RegDate

CourseID

LastName

FirstName

StudentID

20-AUG-2017

0607

Taweel

Farah

1150

24-OCT-2017

0803

Akkad

Aya

1152

المعاملات المركبة مع الإسناد Compound Operators

تستخدم لإجراء العمليات على القيمة المخزنة بالمتحول وإعادة تخزين القيمة الجديدة بالمتحول نفسه، وهي:

المعامل

المهمة

+=

الجمع والإسناد

-=

الطرح والإسناد

*=

الضرب والإسناد

/=

القسمة والإسناد

%=

باقي القسمة والإسناد

&=

العملية الثنائية AND والإسناد

|=

العملية الثنائية OR والإسناد

^=

العملية الثنائية XOR والإسناد

 

 

 

المعاملات المنطقية Logical Operators

وتشمل:

·         AND و OR و NOT

·         BETWEEN و IN

·         ALL و ANY و SOME

·         UNION و INTERSECT و EXCEPT

·         LIKE

·         EXISTS

·         IS NULL

·         ON

·         UNIQUE

أولوية المعاملات

عند وجود أكثر من معامل معًا في نفس العبارة تُحدِّد أولويةُ المعاملات الترتيبَ الذي تتم العمليات وفقًا له، وعند وجود أكثر من معامل ضمن نفس مستوى الأولوية تنفذ العمليات بحسب ورودها بدءًا من اليسار إلى اليمين.

أولوية المعاملات في محرك SQL Server

مستوى الأولوية

المعاملات

1

المعامل الثنائي للنفي ~

2

الضرب * والقسمة / وباقي القسمة %

3

+ (لتحديد قيمة موجبة أو الجمع أو ربط السلاسل النصية)

- (لتحديد قيمة سالبة أو الطرح)

المعاملات الثنائية & و | و ^

4

معاملات المقارنة = و > و < و>=و<=و <>

5

NOT

6

AND

7

ALL, ANY, BETWEEN, IN, LIKE, OR, SOME

8

معامل الإسناد =

أولوية المعاملات في محرك SQLite

مستوى الأولوية

المعاملات

1

معامل الربط ||

2

الضرب * والقسمة / وباقي القسمة %

3

+ (الجمع)

- (الطرح)

4

المعاملات الثنائية & و |

معاملات الإزاحة << و >>

5

معاملات المقارنة = و > و < و>=و<=

6

معاملات المقارنة = و <>

IN, LIKE

7

AND

8

OR

أولوية المعاملات في محرك Oracle

مستوى الأولوية

المعاملات

 

1

المعاملات الأحادية + و - (لتحديد إشارة العدد الموجب أو السالب)

 

2

الضرب * والقسمة /

 

3

+ (الجمع)

- (الطرح)

معامل ربط السلاسل النصية

 

4

كافة معاملات المقارنة

 

 

5

NOT

 

 

6

AND

 

 

7

OR

 

 

أولوية المعاملات في محرك MySQL

مستوى الأولوية

المعاملات

1

المعاملات الأحادية + و - (لتحديد إشارة العدد الموجب أو السالب)

2

المعامل الثنائي ^

3

الضرب * والقسمة / وباقي القسمة %

4

+ (الجمع)  و - (الطرح)

5

معاملات الإزاحة << و >>

6

المعامل الثنائي &

7

المعامل الثنائي |

8

معاملات المقارنة = و > و < و>=و<=و <>

المعاملات IS, LIKE, IN

9

BETWEEN, CASE, WHEN, THEN, ELSE

10

NOT

11

AND

12

XOR

13

OR

14

معامل الإسناد =

أولوية المعاملات في محرك Postgresql

مستوى الأولوية

المعاملات

1

المعامل الأحادي - (لتحديد إشارة العدد السالب)

2

المعامل ^ للرفع إلى قوة

3

الضرب * والقسمة / وباقي القسمة %

4

+ (الجمع)  و - (الطرح)

5

IS

6

IN

7

BETWEEN

8

LIKE

9

معاملات المقارنة

10

= معامل الإسناد والتساوي

11

NOT

12

AND

13

OR

مثال

في عبارة WHERE الآتية:

WHERE salary-tax*0.5 BETWEEN 500 AND 550

ستُنفذ عملية الضرب * ثم الطرح - ثم تحديد المجال للقيمة الناتجة عبر المعامل BETWEEN.

 

 

 

 

 

 

 

 

 

 

DISTINCT

 

تستخدم العبارة DISTINCT للحصول على قيمٍ فريدةٍ غير مكررة، وغالبًا ما تستخدم في استعلام SELECT للحصول على سجلات لا تتكرر القيم فيما بينها، إذ يصبح الاستعلام بالشكل الآتي:

SELECT DISTINCT columns

FROM tbl;

 

محتويات

·         1مثال

·         2الحصول على سجل واحد فقط

o        2.1مثال

·         3التوافقية

·         4مصادر

مثال

إن كان الجدول الآتي patients موجودًا في قاعدة البيانات:

Doctor

Section

Age

Patient

PatientID

Nasser

Cardiology

76

Salem

1029

Abd Allah

Neurology

17

Hasan

896

Reem

Maternity

23

Nadine

964

Fateh

Cardiology

65

Rami

1070

Kareem

Neurology

19

Abd al-Rahim

1150

Hadi

Critical Care

65

Roushd

1097

Reem

Maternity

27

Sana

1034

Abd Allah

Neurology

49

Helen

963

Hadi

Critical Care

58

Ahmad

1154

Kareem

Neurology

40

Maher

1069

Amnah

Maternity

30

Zeina

1028

Fateh

Cardiology

55

Sarah

1180

Hadi

Critical Care

23

Fadi

1076

فللحصول على أسماء الأقسام الخاصة بالمرضى Section دون أي تكرار يُستخدَم الاستعلام الآتي:

SELECT DISTINCT Section

FROM patients;

 

 

 

 

 

 

 

وتظهر النتائج بالشكل الآتي:

Section

Cardiology

Neurology

Maternity

Critical Care

الحصول على سجل واحد فقط

تُمكن الاستفادة من عبارة DISTINCT للحصول على سجلٍ واحدٍ فقط لكل مجموعةٍ من السجلات التي تحتوي نفس القيمة، ولضمان الحصول على السجل المطلوب تستخدم عبارة ORDER BY في الاستعلام، ليصبح بالشكل:

SELECT DISTINCT ON (col) cols

FROM tbl

ORDER BY cols;

مثال

إن كان الجدول weather الآتي موجودًا في قاعدة البيانات:

Report

Time

Location

Mostly Cloudy

4:30

Aleppo

Showers

4:30

Damascus

Partly Cloudy

13:00

Damascus

Showers

5:00

Aleppo

Partly Cloudy

17:00

Aleppo

Sunny

15:00

Damascus

Showers

12:30

Aleppo

عند تنفيذ الاستعلام الآتي:

SELECT DISTINCT ON (Location) Location, Time, Report

FROM weather

ORDER BY Location, Time DESC;

تُجلب السجلات الأحدث (اعتمادًا على الترتيب الزمني التنازليّ) لكل موقعٍ دون تكرار أيّ منها، وتظهر النتائج:

Report

Time

Location

Partly Cloudy

17:00

Aleppo

Sunny

15:00

Damascus

 

 

 

 

 

 

 

المعامل EXISTS

يستخدم المعامل EXISTS للتأكد من وجود سجلات ناتجة عن الاستعلام الفرعي المستخدم في الاستعلام الرئيسي.

محتويات

·         1مثال

·         2المعامل NOT EXISTS

·         3مثال

·         4التوافقية

·         5مصادر

مثال

إن كان في قاعدة البيانات الجدولان الآتيان:

الجدول الأول: جدول الطلاب students

RegDate

CourseID

LastName

FirstName

StudentID

07-JUL-2017

0206

Najjar

Rama

1147

08-NOV-2017

0604

Kordi

Jenan

1148

07-JUL-2017

0206

Bitar

Rahaf

1149

20-AUG-2017

0607

Taweel

Farah

1150

08-NOV-2017

0610

Arab

Rami

1151

24-OCT-2017

0803

Akkad

Aya

1152

08-NOV-2017

0504

Haddad

Abed

1153

20-AUG-2017

0801

Fares

Tasneem

1154

24-OCT-2017

0607

Hamsho

Monther

1155

30-SEP-2017

0607

Abd Allah

Hiba

1156

الجدول الثاني: جدول الدورات التدريبية courses

DepartmentID

Lecturer

Course

CourseID

EN01

Dr. Reem Hadi

English (Adv)

0204

EN01

Dr. Shadi Balid

English (Int)

0206

EN02

Dr. Firas Abd

English (TOEFL)

0211

IT01

Eng. Nasser Sharif

Artificial Intelligence

0604

IT01

Eng. Amal Safi

Networks

0607

IT01

Eng. Salem Najm

ICDL

0610

IT02

Eng. Nasser Sharif

SQL Programming

0703

IT02

Eng. Amal Safi

FrontEnd Programming

0704

IT03

Mr. Maher Siraj

Photoshop Design

0801

IT03

Ms. Nadia Taleb

Illustrator Design

0802

IT03

Mr. Maher Siraj

UI Design

0803

فإن الاستعلام الآتي:

SELECT Course

FROM courses

WHERE EXISTS

  (SELECT *

  FROM students

  WHERE CourseID = courses.CourseID);

يعرض أسماء الدورات التدريبية التي يوجد فيها طالب أو أكثر دون أيّ من الدورات الخالية، أي تظهر الدورات الآتية:

Course

English (Int)

Artificial Intelligence

Networks

ICDL

Photoshop Design

UI Design

المعامل NOT EXISTS

يعمل بمهمة معاكسة للمعامل EXISTS أي للتأكد من عدم وجود سجلات ناتجة عن الاستعلام الفرعي المستخدم في الاستعلام الرئيسي.

مثال

إن تنفيذ الاستعلام الآتي:

SELECT Course

FROM courses

WHERE NOT EXISTS

  (SELECT *

  FROM students

  WHERE CourseID = courses.CourseID);

سيعرِض أسماء الدورات التدريبية التي لم يُسجّل فيها أي طالب، لتظهر النتائج:

Course

English (Adv)

English (TOEFL)

SQL Programming

FrontEnd Programming

Illustrator Design

 

المعامل LIKE

يستخدم هذا المعامل لتحديد نمط معين للسلسلة النصية يُحدد الشرط وفقًا له، ويوضح الجدول الآتي الرموز المستخدمة في صياغة هذا النمط:

الرمز

استخدامه

%

أي سلسلة نصّية خالية أو بمحرف أو أكثر

_

محرف وحيد

مثال

إن كان الجدول الآتي customers في قاعدة البيانات:

Bill

OrderID

FullName

CustomerID

160

0291

Abd al-Salam Hadi

1156

170

0302

Ahmad Mostafa

1157

210

0203

Reem Hammad

1158

350

0294

Abd Allah Sadiq

1159

185

0255

Raghad al-Hamdan

1160

165

0276

Abd al-Razzaq Salloum

1161

175

0247

Hussam Siraj

1162

180

0208

Hiba Maktabi

1163

170

0219

Abd al-Rahman Rida

1164

220

0210

Abd al-Qader Khalil

1165

إن تنفيذ الاستعلام الآتي:

SELECT *
FROM customers
WHERE FullName LIKE 'H%' OR (FullName LIKE 'A%' AND FullName NOT LIKE '_b_%');

حيث أن :

أي سلسلة نصية في بدايتها H

'H%'

أي سلسلة نصية في بدايتها A

'A%'

أي سلسلة نصية في بدايتها على الأقل ثلاث محارف والمحرف الثاني حصراً b

'%_b_'

سيؤدي لعرض كافة النتائج للزبائن الذين تبدأ أسماؤهم بحرف H أو بحرف A  ولكن دون أن يكون الحرف الثاني b ويليه حرف ثم أي تسلسل للمحارف، وستظهر النتائج:

Bill

OrderID

FullName

CustomerID

170

0302

Ahmad Mostafa

1157

175

0247

Hussam Siraj

1162

180

0208

Hiba Maktabi

1163

المعاملات المنطقية في SQL

غالبًا ما تستخدم المعاملات المنطقية (AND و OR و NOT) في عبارة WHERE للربط ما بين الشروط أو نفيها، إذ يستخدم المعامل AND للربط ما بين الشروط للتأكد من تحققها جميعًا، أما معامل OR فيستخدم للربط ما بين الشروط للتأكد من تحقّق شرطٍ أو أكثر من بينها، أما NOT فيستخدم بغرض النفي، وتكون قيمة التعبير النهائية منطقية (Boolean) إما TRUE أو FALSE.

ويُضاف لها معامل XOR في محرك MySQL والذي يتحقق من تحقّق شرطٍ واحدٍ فقط دون الشروط الأخرى.

مثال

إن كان الجدول الآتي cars موجودًا في قاعدة البيانات:

Colour

Price

Year

Company

Model

CarID

White

22,500

2018

KIA

Optima

05081

Red

25,995

2017

KIA

Optima Hybrid

05082

Red

31,900

2018

KIA

Stinger

05083

Black

31,990

2017

KIA

Cadenza

05084

Blue

23,240

2018

KIA

Niro

05085

Grey

14,200

2018

KIA

Rio 5-Door

05086

Blue

18,200

2018

KIA

Forte5

05087

Blue

32,250

2017

KIA

Soul EV

05088

إن تنفيذ الاستعلام الآتي:

SELECT * 
FROM cars
WHERE Year=2018 AND NOT (Colour = Red OR Colour = Blue);

سيُظهِر كافة السيارات التي تكون فيها قيمة السنة 2018 وأي قيمة للون باستثناء القيمتين Red أو Blue، وستظهر النتائج الآتية:

Colour

Price

Year

Company

Model

CarID

White

22,500

2018

KIA

Optima

05081

Grey

14,200

2018

KIA

Rio 5-Door

05086

 

 

 

 

 

 

 

 

 

 

تحديد مجال أو عدد محدّد من القيم في SQL

محتويات

·         1معامل IN

o        1.1مثال

·         2معامل BETWEEN

o        2.1مثال

·         3التوافقية

·         4مصادر

معامل IN

يستخدم لتحديد عددٍ معيّنٍ من القيم المحتملة لأحد حقول البيانات.

مثال

إن كان الجدولان الآتيان موجوديَن في قاعدة البيانات:

الجدول الأول: جدول السيارات cars

Colour

Price

Year

Company

Model

CarID

White

22,500

2018

KIA

Optima

05081

Red

25,995

2017

KIA

Optima Hybrid

05082

Red

31,900

2018

KIA

Stinger

05083

Black

31,990

2017

KIA

Cadenza

05084

Blue

23,240

2018

KIA

Niro

05085

Grey

14,200

2018

KIA

Rio 5-Door

05086

Blue

18,200

2018

KIA

Forte5

05087

الجدول الثاني: جدول الزبائن customers

Remaining

CarID

Name

CustomerID

19,500

05081

Kareem al-Hamdan

0158

17,500

05081

Rasha Mostafa

0160

10,200

05087

Jaber Hammad

0161

19,990

05084

Wessam Fattah

0162

إن تنفيذ الاستعلام الآتي:

SELECT *

FROM cars

WHERE Colour IN ( 'Red' , 'Black', 'White');

سيُظهِر كافة السيارات التي تكون فيها قيمة اللون إحدى القيم Red أو Black أو White، وستظهر النتائج الآتية:

Colour

Price

Year

Company

Model

CarID

White

22,500

2018

KIA

Optima

05081

Red

25,995

2017

KIA

Optima Hybrid

05082

Red

31,900

2018

KIA

Stinger

05083

Black

31,990

2017

KIA

Cadenza

05084

لمعرفة السيارات التي لم تُشترَ من قبل أيّ من الزبائن يمكن استخدام الاستعلام الآتي:

SELECT *

FROM cars

WHERE CarID NOT IN(

  SELECT CarID

  FROM customers

  );

وذلك اعتمادًا على مفهوم الاستعلام الفرعي، لتظهر النتائج الآتية:

Colour

Price

Year

Model

Company

CarID

Red

25,995

2017

Optima Hybrid

KIA

05082

Red

31,900

2018

Stinger

KIA

05083

Blue

23,240

2018

Niro

KIA

05085

Grey

14,200

2018

Rio 5-Door

KIA

05086

معامل BETWEEN

يستخدم لتحديد قيمتي البداية والنهاية لمجال من القيم، ويستخدم معه المعامل AND للوصل ما بين القيمتين.

مثال

لِعرض كافة السيارات التي يقع رقمها التسلسلي في المجال ما بين القيمتين 5081 و 5084 يصبح الاستعلام بالشكل الآتي:

SELECT *

FROM cars

WHERE CarID BETWEEN 5081 AND 5084;

لتظهر النتائج:

Colour

Price

Year

Model

Company

CarID

White

22,500

2018

Optima

KIA

05081

Red

25,995

2017

Optima Hybrid

KIA

05082

Red

31,900

2018

Stinger

KIA

05083

Black

31,990

2017

Cadenza

KIA

05084

 

معاملات الربط بين نتائج الاستعلامات في SQL

تستخدم لدمج نتائج عدد من الاستعلامات وفق ثلاثة معاملات:                                     

الضم UNION: وهي عملية احتواء نتائج كافة الاستعلامات التي يربط بينها المعامل UNION دون أي تكرار في السجلات.

التقاطع INTERSECT: عملية تقاطع النتائج ما بين الاستعلامات، أي إظهار النتائج المشتركة فقط ما بين الاستعلامات التي يربط بينها المعامل INTERSECT.

الاستثناء EXCEPT: عملية استثناء نتائج الاستعلام الذي يلي المعامل EXCEPT، وتختلف الكلمة المفتاحية لهذا المعامل في محرك Oracle إذ هي MINUS بدلًا من EXCEPT.

انظر إلى مخططات فن Venn Diagrams لرسومات توضيحية.

 

 

محتويات

·         1مثال

·         2عرض السجلات المكررة UNION ALL

o        2.1مثال

·         3التوافقية

·         4مصادر

مثال

إن كان الجدول الآتي patients موجودًا في قاعدة البيانات:

Doctor

Section

Age

Patient

PatientID

Nasser

Cardiology

76

Salem

1029

Abd Allah

Neurology

17

Hasan

896

Reem

Maternity

23

Nadine

964

Fateh

Cardiology

65

Rami

1070

Kareem

Neurology

19

Abd al-Rahim

1150

Hadi

Critical Care

65

Roushd

1097

Reem

Maternity

27

Sana

1034

Abd Allah

Neurology

49

Helen

963

Hadi

Critical Care

58

Ahmad

1154

Kareem

Neurology

40

Maher

1069

Amnah

Maternity

30

Zeina

1028

إن كان الاستعلام الآتي:

SELECT *

FROM patients

WHERE Age<45

UNION

SELECT *

FROM patients

WHERE Doctor='Abd Allah';

فإن المعامل UNION يربط نتائج الاستعلامين ليشمل السجلات الواردة في كليهما أي ستظهر السجلات التي عمر المريض فيها أقل من 45 سنة والسجلات التي اسم الطبيب فيها هو Abd Allah، لتظهر النتائج الآتية:

Doctor

Section

Age

Patient

PatientID

Abd Allah

Neurology

17

Hasan

896

Reem

Maternity

23

Nadine

964

Kareem

Neurology

19

Abd al-Rahim

1150

Reem

Maternity

27

Sana

1034

Abd Allah

Neurology

49

Helen

963

Kareem

Neurology

40

Maher

1069

Amnah

Maternity

30

Zeina

1028

أما في الاستعلام الآتي:

SELECT *

FROM patients

WHERE Age<45

INTERSECT

SELECT *

FROM patients

WHERE Doctor='Abd Allah';

فإن المعامل INTERSECT يُبقي السجلات المشتركة ما بين الاستعلامين فقط ولا يظهر سواها، تظهر النتائج الآتية:

Doctor

Section

Age

Patient

PatientID

Abd Allah

Neurology

17

Hasan

896

أما في الاستعلام الآتي:

SELECT *

FROM patients

WHERE Age<45

EXCEPT -- MINUS in Oracle DB

SELECT *

FROM patients

WHERE Doctor='Abd Allah';

فتظهر سجلات الاستعلام الأول من بعد استثناء سجلات الاستعلام الثاني منها أي سيُحذف منها كل سجل فيه اسم الطبيب Abd Allah ، لتظهر النتائج:

Doctor

Section

Age

Patient

PatientID

Reem

Maternity

23

Nadine

964

Kareem

Neurology

19

Abd al-Rahim

1150

Reem

Maternity

27

Sana

1034

Kareem

Neurology

40

Maher

1069

Amnah

Maternity

30

Zeina

1028

عرض السجلات المكررة UNION ALL

تستخدم الكلمة المفتاحية ALL لضمان عرض السجلات بتكرارها دون حذفه.

مثال

ليكن لدينا الجدولان الآتيان في قاعدة البيانات:

الجدول الأول: المدرسون teachers

Course

Name

TeacherID

English (Adv)

Dr. Reem Hadi

1024

Artificial Intelligence

Eng. Nasser Sharif

1025

Photoshop Design

Mr. Maher Siraj

1026

 

 

 

 

 

الجدول الثاني: الطلاب students

Course

Name

StudentID

Photoshop Design

Aya Akkad

820

Networks

Hiba Abd Allah

821

SQL Programming

Ammar Helali

822

Artificial Intelligence

Loujain Zein

823

إن تنفيذ الاستعلام الآتي:

SELECT Course FROM teachers

UNION ALL

SELECT Course FROM students

ORDER BY Course;

سيؤدي لظهور أسماء الدورات التدريبية دون حذف أي تكرار فيها كما يلي:

Course

Artificial Intelligence

Artificial Intelligence

English (Adv)

Networks

Photoshop Design

Photoshop Design

SQL Programming

أما بحذف الكلمة المفتاحية ALL من الاستعلام، أي بالشكل:

SELECT Course FROM teachers

UNION ALL

SELECT Course FROM students

ORDER BY Course;

سيؤدي لحذف النتائج المكررة لتصبح بالشكل:

Course

Artificial Intelligence

English (Adv)

Networks

Photoshop Design

SQL Programming

 

 

 

معاملات المقارنة مع نتائج الاستعلام الفرعي

تستخدم المعاملات SOME و ANY و ALL بهدف المقارنة مع القيم الناتجة (لعمودٍ واحدٍ) عن أحد الاستعلامات الفرعية، وستُذكر تباعًا.

محتويات

·         1معامل ANY

·         2معامل SOME

·         3معامل ALL

·         4مثال

·         5التوافقية

·         6مصادر

معامل ANY

إذ تعيد المقارنة قيمة TRUE في حال تطابق التعبير مع قيمة أيّ من السجلات الناتجة عن الاستعلام الفرعي وقيمة FALSE في حال عدم وجود أي نتيجة مطابقة.

معامل SOME

إذ تعيد المقارنة قيمة TRUE في حال وجود بعض القيم في السجلات الناتجة عن الاستعلام الفرعي والمطابقة لقيمة التعبير الذي تُقارن معه، وهي بهذا مماثلة لنتيجة المعامل ANY.

معامل ALL

إذ تعيد المقارنة قيمة TRUE في حال تطابق التعبير مع كل قيمة موجودة في السجلات الناتجة عن الاستعلام الفرعي وقيمة FALSE في حال عدم وجود نتيجة مخالفة واحدة على الأقل.

مثال

ليكن الجدولان الآتيان موجودان في قاعدة البيانات:

الجدول الأول boys: والذي يعبّر عن أداء الفتيان في أحد الامتحانات

Mark

Name

StudentID

97

Mohammad

127

59

Hasan

128

72

Ayham

129

63

Kareem

130

88

Yamen

131

76

Ahmad

132

الجدول الثاني girls: والذي يعبّر عن أداء الفتيات في نفس الامتحان السابق

Mark

Name

StudentID

76

Sarah

133

82

Rama

134

95

Zeina

135

99

Aalaa

136

63

Farah

137

79

Aya

138

إن تنفيذ الاستعلام الآتي:

SELECT Name, Mark FROM girls WHERE mark = ANY (SELECT mark FROM boys);

سيعرض الاسم والنتيجة للفتيات اللواتي حصلن على علامات متماثلة مع أيّ من العلامات الناتجة عن الاستعلام الفرعي (علامات السجلات الموجودة في جدول الفتيان)، لتظهر النتيجة الآتية:

Mark

Name

76

Sarah

63

Farah

وإن تنفيذ الاستعلام الآتي:

SELECT Name, Mark FROM girls WHERE mark > ALL (SELECT mark FROM boys);

سيعرض الاسم والنتيجة للطالبة التي حصلت على العلامة الأعلى من كافة العلامات الناتجة عن الاستعلام الفرعي (علامات السجلات الموجودة في جدول الفتيان)، لتظهر النتيجة الآتية:

Mark

Name

99

Aalaa

 

 

 

بنى التحكم

الاختبار الشرطي IF في SQL

تستخدم صيغة IF لاختبار شرط معين للتأكّد من تحقّقه أو عدم تحقّقه وإجراء ما يتناسب مع ذلك، وتكون البنية العامة لها بالشكل الآتي:

IF condition THEN statements
[ ELSEIF condition THEN statements
[ ELSEIF condition THEN statements
    ...]]
[ ELSE   statements ]
END IF;

إذ تعبّر الكلمة condition عن الشرط المُختبَر، وكلمة statements عن التعليمات التي ستُجرى أو قد تكون تعابير بدلًا من التعليمات.

ويلاحظ  في محركي PostgreSQL و Oracle أن الكلمة المفتاحية ELSEIF تصبح ELSIF، وفي محرك SQL Server فهي كلمتان منفصلتان أيّ ELSE IF، أما في محرك SQLite فلا يوجد شرط IF ويُستعاض عنه بشرط CASE.

مثال

ليكن الجدول rivers الآتي موجودًا في قاعدة البيانات:

Continent

Outflow

LengthMiles

LengthKm

River

Serial

South America

Atlantic Ocean

4345

6992

Amazon

1

Africa

Mediterranean

4258

6853

Nile

2

North America

Gulf of Mexico

3902

6275

Mississippi

3

Asia

Bohai Sea

3395

5464

Yellow River

4

Africa

Atlantic Ocean

2922

4700

Congo

5

Asia

Laptev Sea

2736

4400

Lena

6

Africa

Gulf of Guinea

2611

4200

Niger

7

Europe

Caspian Sea

2266

3645

Volga

8

Asia

Andaman Sea

1901

3060

Salween

9

إن تنفيذ استعلام SELECT الآتي:

SELECT Name, Length = 
  IF LengthKm>5000 THEN 'Long'
  ELSEIF LengthKm>3500 THEN 'Medium'
  ELSE 'Short'
  END  
FROM rivers;

سيظهر تقديرًا لطول النهر في عمود Length وذلك بالاعتماد على الشرط المُختبَر في حالات اختبار الشرط IF، لتظهر النتائج الآتية:

Length

LengthKm

Name

Long

6992

Amazon

Long

6853

Nile

Long

6275

Mississippi

Long

5464

Yellow River

Medium

4700

Congo

Medium

4400

Lena

Medium

4200

Niger

Medium

3645

Volga

Short

3060

Salween

ويمكن تحديد عدد الأنهار الإجمالي مقارنة بالعدد 5 كما في الشيفرة الآتية:

IF   (SELECT COUNT(*) FROM rivers) > 5  
PRINT 'There are more than 5 rivers.'  
ELSE PRINT 'There are 5 or less rivers.' ;

ولدى تنفيذها في محرك SQL Server ستُطبَع العبارة:

There are more than 5 rivers.

 

 

 

 

 

 

 

 

الشرط CASE في SQL

تستخدم لاختبار شرط معين بشكل مشابه لتعليمات if/else في لغات البرمجة الأخرى لتعيد أحد التعابير الممكنة، وتكون البنية العامة لها بالشكل الآتي:

CASE WHEN condition THEN result

  [WHEN ...]

  [ELSE result]

END

إذ تعبر الكلمة condition عن الشرط المُختبَر، وكلمة result عن التعبير المُعاد.

محتويات

·         1مثال

·         2استخدام CASE مع العبارة ORDER BY

o        2.1مثال

·         3التوافقية

·         4مصادر

مثال

ليكن الجدول الآتي students موجودًا في قاعدة البيانات:

GPA

Age

Name

StudentID

3.68

25

Mona

1024

3.57

24

Radi

1081

2.50

25

Leen

1012

4.00

26

Sarah

1085

1.96

22

Amin

1066

2.87

23

Yusuf

1056

إن تنفيذ استعلام SELECT الآتي:

SELECT Name, Result =  

  CASE  

    WHEN GPA = 4 THEN 'A+'

    WHEN GPA > 3.7 THEN 'A'

    WHEN GPA > 3.3 THEN 'A-'

    WHEN GPA > 3 THEN 'B+'

    WHEN GPA > 2.7 THEN 'B'

    WHEN GPA > 2.3 THEN 'B-'

    WHEN GPA > 2 THEN 'C+'

    WHEN GPA > 1.7 THEN 'C'

    WHEN GPA > 1.3 THEN 'C-'

    WHEN GPA > 1 THEN 'D+'

    WHEN GPA > 0 THEN 'D'

    ELSE 'F' 

  END 

FROM students;

سيظهر الأحرف التقييميّة بحسب القيمة الموجودة في عمود GPA وذلك بالاعتماد على الشرط المُختبَر في حالات CASE، لتظهر النتائج الآتية:

Result

Name

B+

Mona

B+

Radi

C+

Leen

A+

Sarah

C-

Amin

B-

Yusuf

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

استخدام CASE مع العبارة ORDER BY

يمكن تحديد الترتيب ضمن عبارة ORDER BY وفقًا لشرط محدد وذلك باستخدام الكلمات المفتاحية CASE و WHEN و THEN و END.

مثال

إن كان الجدول الآتي rivers موجودًا في قاعدة البيانات:

Continent

Outflow

LengthMiles

LengthKm

River

Serial

South America

Atlantic Ocean

4345

6992

Amazon

1

Africa

Mediterranean

4258

6853

Nile

2

North America

Gulf of Mexico

3902

6275

Mississippi

3

Asia

Bohai Sea

3395

5464

Yellow River

4

Africa

Atlantic Ocean

2922

4700

Congo

5

Asia

Laptev Sea

2736

4400

Lena

6

Africa

Gulf of Guinea

2611

4200

Niger

7

Europe

Caspian Sea

2266

3645

Volga

8

Asia

Andaman Sea

1901

3060

Salween

9

 

 

لترتيب السجلات وفقًا لأطوالها في قارة Africa ووفقًا لأسمائها في القارات البقية، يُنفذ الاستعلام الآتي:

SELECT *

FROM rivers

ORDER BY

  CASE Country

  WHEN 'Africa' THEN length

  ELSE Name

  END;

وستظهر النتائج الآتية:

Continent

LengthKm

River

Africa

4200

Niger

Africa

4700

Congo

Africa

6853

Nile

Asia

4400

Lena

Asia

3060

Salween

Asia

5464

Yellow River

Europe

3645

Volga

North America

6275

Mississippi

South America

6992

Amazon

 

حلقة WHILE في SQL

تهدف حلقة WHILE إلى تكرار عددٍ من التعليمات باستمرار تحقق الشرط ضمنها، إذ يُتأكَّد من تحقّق الشرط قبل البدء بتنفيذ التعليمات التي تحتويه، وتكون البنية العامّة لها:

[ <<label>> ]
WHILE boolean-expression LOOP
  statements
END LOOP [ label ];

إذ يمكن تحديد تسمية label لها وتوضع التعليمات statements ضمنها بعد الكلمة المفتاحية LOOP. أما في محرك MySQL فتصبح بالشكل الآتي:

[begin_label:] WHILE search_condition DO
  statement_list
END WHILE [end_label];

وفي محرك SQL Server تكون بالشكل:

WHILE boolean_expression   
  { sql_statement | statement_block}

إذ تبتدئ كتلة التعليمات statement_block بالكلمة المفتاحية BEGIN وتنتهي بالكلمة المفتاحية END.

مثال

في حلقة WHILE الآتية تستمر زيادة الفاتورة bill بقيمة 500 وإنقاص نفس القيمة من البضائع goods إلى أن تبلغ قيمة bill القيمة 2000 أو أكثر أو أن تصبح قيمة goods القيمة صفر أو أقل، وحينها تنتهي الحلقة.

WHILE bill < 2000 AND goods > 0 LOOP
  bill = bill + 500;
  goods = goods - 500;
END LOOP;

 

العمليات

لمحة عن العمليات

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

 

 

الأمر START TRANSACTION

يُستخدم هذا الأمر للإعلام بالبدء بإجراء مجموعة من العمليات التي قد تنتهي بأمر COMMIT أو ROLLBACK، وله الصيغة التالية:

START TRANSACTION;

وتختلف هذه الصيغة باستخدام الكلمة المفتاحية BEGIN في محرك SQL Server لتصبح:

BEGIN TRANSACTION;

أما في محرك SQLite فهي الكلمة المفتاحية BEGIN فقط، أيّ:

BEGIN;

وفي محرك Oracle يصبح الأمر على النحو الآتي:

SET TRANSACTION NAME 'name';

ويكون هذا الأمر مسؤولًا عن البدء بالعمليات وتسميتها بآن واحد بالاسم الذي يُحدد عبر name.

مثال

إذا كان الجدول الآتي موجودًا في قاعدة البيانات:

Bill

OrderID

FullName

CustomerID

160

0291

Abd al-Salam Hadi

1156

170

0302

Ahmad Mostafa

1157

210

0203

Reem Hammad

1158

350

0294

Abd Allah Sadiq

1159

185

0255

Raghad al-Hamdan

1160

165

0276

Abd al-Razzaq Salloum

1161

175

0247

Hussam Siraj

1162

تبدأ العمليات في الشيفرة الآتية باستخدام BEGIN TRANSACTION لتُجرَى العمليات بعدها (حذف السجلات التي تكون فيها قيمة الفاتورة أكبر من 200) وتُحفَظ التغييرات عبر الأمر COMMIT:

BEGIN TRANSACTION;  
DELETE FROM customers  
  WHERE Bill>200;  
COMMIT;

 

 

 

 

 

 

 

الأمر COMMIT في SQL

يستخدم هذا الأمر بهدف حفظ التغييرات المُجراة على قاعدة البيانات نتيجة لتنفيذ العمليات، إذ تحفظ كافة التغييرات منذ آخر أمر COMMIT أو ROLLBACK.

صيغة الأمر:

COMMIT [TRANSACTION];

مثال

إن كان جدول الزبائن customers موجودًا في قاعدة البيانات على النحو الآتي:

Bill

OrderID

FullName

CustomerID

160

0291

Abd al-Salam Hadi

1156

170

0302

Ahmad Mostafa

1157

210

0203

Reem Hammad

1158

350

0294

Abd Allah Sadiq

1159

185

0255

Raghad al-Hamdan

1160

165

0276

Abd al-Razzaq Salloum

1161

175

0247

Hussam Siraj

1162

فعند تطبيق الاستعلام الآتي:

BEGIN TRANSACTION;  
DELETE FROM customers
WHERE Bill>200;

إذ إن BEGIN TRANSACTION تبدأ بالعملية التي ستحذف السجلات التي قيمة فاتورتها أكبر من 200 (عدد السجلات المحذوفة 2)، ولحفظ التغييرات التي جرت على قاعدة البيانات التي تحوي الجدول السابق يُستخدم الأمر:

COMMIT;

 

 

الأمر ROLLBACK

يستخدم هذا الأمر لإلغاء العمليات المُجراة على قاعدة البيانات مما يعني تجاهل التغييرات التي طرأت عليها.

صيغة الأمر:

ROLLBACK [TRANSACTION];

وفي محركات SQLite و MySQL و PostgreSQL تمكن العودة إلى نقطة محددة حُفظت مسبقًا، وذلك عبر الأمر:

ROLLBACK TO SAVEPOINT savePointName;

إذ إن savePointName هو اسم نقطة الحفظ التي سيُرجع لها بتجاهل أية تغييرات طرأت بعدها.

مثال

إن كان جدول الزبائن customers موجودًا في قاعدة البيانات على النحو الآتي:

Bill

OrderID

FullName

CustomerID

160

0291

Abd al-Salam Hadi

1156

170

0302

Ahmad Mostafa

1157

210

0203

Reem Hammad

1158

350

0294

Abd Allah Sadiq

1159

185

0255

Raghad al-Hamdan

1160

165

0276

Abd al-Razzaq Salloum

1161

175

0247

Hussam Siraj

1162

فعند تطبيق الاستعلام الآتي:

BEGIN TRANSACTION;  
DELETE FROM customers
WHERE Bill>200;

إذ إن BEGIN TRANSACTION تبدأ بالعملية التي ستحذف السجلات التي قيمة فاتورتها أكبر من 200 (عدد السجلات المحذوفة 2)، وللتراجع عن هذه التعديلات ليُعاد الجدول كما كان يُستخدم الأمر:

ROLLBACK;

 

 

 

 

 

 

 

 

التعامل مع المستخدمين

إنشاء مستخدم جديد CREATE USER

يُستخدم هذا الأمر لإنشاء مستخدم جديد، وله الصيغ الآتية (بحسب محركات قواعد البيانات المختلفة).

محتويات

·         1في محرك البيانات PostgreSQL

o        1.1أمثلة

·         2في محركي البيانات MySQL وOracle

o        2.1خيارات المصادر resource_option

o        2.2خيارات كلمة المرور password_option

·         3أمثلة

o        3.1مثال

·         4التوافقية

·         5مصادر

في محرك البيانات PostgreSQL

CREATE USER name [ [ WITH ] option [ ... ] ]

إذ إن name هو اسم المستخدم المنشَأ ويمكن أن يكون الخيار option أحد الكلمات المفتاحية الآتية:

الخيار

مهمته

 SUPERUSER

لجعل المستخدم SUPERUSER أي له كافة صلاحيات الوصول access privileges في قاعدة البيانات

CREATEDB

لإعطاء المستخدم صلاحية إنشاء قاعدة بيانات جديدة

CREATEROLE

لإعطاء المستخدم صلاحية إنشاء مستخدم آخر جديد

CONNECTION LIMIT connlimit

لتحديد عدد من الاتصالات connlimit التزامنية التي يستطيع المستخدم القيام بها مع قاعدة البيانات

PASSWORD 'password'

لتحديد كلمة المرور password للمستخدم

VALID UNTIL 'timestamp'

لتحديد مدة صلاحية كلمة المرور لهذا المستخدم حتى التاريخ والتوقيت timestamp، وإن لم يُحدد فهي صالحة دائمًا

أمثلة

لإنشاء مستخدم جديد باسم Ahmad وبكلمة مرور ah1751m صالحة حتى تاريخ 1/1/2019، يستخدم الأمر الآتي:

CREATE USER Ahmad WITH PASSWORD 'ah1751m' VALID UNTIL '2019-01-01';

ولإنشاء مستخدم جديد باسم Baraa وإعطائه صلاحية إنشاء قاعدة بيانات جديدة ومستخدمين جدد، يستخدم الأمر الآتي:

CREATE USER Baraa WITH CREATEDB CREATEROLE;

في محركي البيانات MySQL وOracle

CREATE USER [IF NOT EXISTS] name

  [IDENTIFIED BY PASSWORD 'password']

  [WITH resource_option]

  [password_option]

إذ ينشئ هذا الأمر مستخدمًا جديدًا باسم user، ويُمكن تحديد كلمة المرور password له، إضافة إلى بعض خيارات المصادر وخيارات أخرى متعلقة بكلمة المرور، وستُذكر تباعًا.

 

 

 

 

 

 

خيارات المصادر resource_option

 

الخيار

مهمته

MAX_QUERIES_PER_HOUR count

لتحديد العدد الأقصى للاستعلامات المسموحة خلال الساعة بالعدد count

MAX_UPDATES_PER_HOUR count

لتحديد العدد الأقصى للتحديثات (التعديلات) المسموحة خلال الساعة بالعدد count

MAX_CONNECTIONS_PER_HOUR count

لتحديد العدد الأقصى للاتصالات المسموحة خلال الساعة بالعدد count

خيارات كلمة المرور password_option

مهمته

الخيار

لضمان استمرار كلمة المرور لهذا المستخدم بشكل دائم

PASSWORD EXPIRE NEVER

لتحديد n يومًا لصلاحية كلمة المرور

PASSWORD EXPIRE INTERVAL n DAY

أمثلة

لإنشاء مستخدم جديد باسم Ahmad وبكلمة مرور ah1751m صالحة لمدة 180 يومًا، يستخدم الأمر الآتي:

CREATE USER Ahmad IDENTIFIED BY PASSWORD 'ah1751m' PASSWORD EXPIRE INTERVAL 180 DAY;

ولإنشاء مستخدم جديد باسم Baraa وتحديد العدد الأقصى لاستعلاماته خلال الساعة (500 استعلام)، يستخدم الأمر الآتي:

CREATE USER Baraa WITH MAX_QUERIES_PER_HOUR 500;

في محرك البيانات SQL Server

CREATE USER name  

  [WITH PASSWORD = 'password' ;

إذ إن name هو اسم المستخدم المنشَأ وتُحدَّد كلمة المرور بالكلمة المفتاحية PASSWORD.

مثال

لإنشاء مستخدم جديد باسم Ahmad وبكلمة مرور ah1751m، يستخدم الأمر الآتي:

CREATE USER Ahmad WITH PASSWORD 'ah1751m';

تعديل المستخدم ALTER USER

يُستخدم هذا الأمر للتعديل من خصائص وسماحيات المستخدم، وله الصيغ الآتية (بحسب محركات قواعد البيانات المختلفة):

محتويات

·         1في محرك البيانات PostgreSQL

o        1.1أمثلة

·         2في محركي البيانات MySQL وOracle

o        2.1خيارات المصادر resource_option

o        2.2خيارات كلمة المرور password_option

o        2.3أمثلة

·         3في محرك البيانات SQL Server

o        3.1مثال

·         4التوافقية

·         5مصادر

في محرك البيانات PostgreSQL

ALTER USER {name | CURRENT_USER} [ WITH ] option [ ... ]

إذ إن name هو اسم المستخدم الذي ستطرأ التعديلات عليه، ويمكن أن يكون الخيار option أحد الكلمات المفتاحية الآتية:

الخيار

مهمته

 SUPERUSER

لجعل المستخدم SUPERUSER أي له كافة صلاحيات الوصول access privileges في قاعدة البيانات

CREATEDB

لإعطاء المستخدم صلاحية إنشاء قاعدة بيانات جديدة

CREATEROLE

لإعطاء المستخدم صلاحية إنشاء مستخدم آخر جديد

CONNECTION LIMIT connlimit

لتحديد عدد من الاتصالات connlimit التزامنية التي يستطيع المستخدم القيام بها مع قاعدة البيانات

PASSWORD 'password'

لتحديد كلمة المرور password للمستخدم

VALID UNTIL 'timestamp'

لتحديد مدة صلاحية كلمة المرور لهذا المستخدم حتى التاريخ والتوقيت timestamp، وإن لم يُحدد فهي صالحة دائمًا

RENAME to new_name

لإعادة تسمية المستخدم باسم جديد new_name

أمثلة

لتعديل كلمة المرور للمستخدم Ahmad لتصبح '1751ah'، يستخدم الأمر الآتي:

ALTER USER Ahmad WITH PASSWORD '1751ah';

أو لإزالة كلمة المرور الخاصة به:

ALTER USER Ahmad WITH PASSWORD NULL;

ولإعطائه صلاحية إنشاء قاعدة بيانات جديدة ومستخدمين جدد، يستخدم الأمر الآتي:

ALTER USER Ahmad CREATEROLE CREATEDB;

 

 

في محركي البيانات MySQL وOracle

ALTER USER [IF NOT EXISTS] name

  [IDENTIFIED BY PASSWORD 'password']

  [WITH resource_option]

  [password_option]

إذ إن name هو اسم المستخدم الذي ستطرأ التعديلات عليه، ويمكن تعديل أي من خيارات المصادر وخيارات أخرى متعلقة بكلمة المرور، وستُذكر تباعًا.

خيارات المصادر resource_option

الخيار

مهمته

MAX_QUERIES_PER_HOUR count

لتحديد العدد الأقصى للاستعلامات المسموحة خلال الساعة بالعدد count

MAX_UPDATES_PER_HOUR count

لتحديد العدد الأقصى للتحديثات (التعديلات) المسموحة خلال الساعة بالعدد count

MAX_CONNECTIONS_PER_HOUR count

لتحديد العدد الأقصى للاتصالات المسموحة خلال الساعة بالعدد count

خيارات كلمة المرور password_option

مهمته

الخيار

لضمان استمرار كلمة المرور لهذا المستخدم بشكل دائم

PASSWORD EXPIRE NEVER

لتحديد n يومًا لصلاحية كلمة المرور

PASSWORD EXPIRE INTERVAL n DAY

أمثلة

لتعديل كلمة المرور للمستخدم Ahmad لتصبح '1751ah' وبصلاحية لمدة 200 يومًا، يستخدم الأمر الآتي:

ALTER USER Ahmad IDENTIFIED BY PASSWORD '1751ah' PASSWORD EXPIRE INTERVAL 180 DAY;

ولإعطائه حدًا أقصى لاستعلاماته خلال الساعة (500 استعلام)، يستخدم الأمر الآتي:

ALTER USER Ahmad WITH MAX_QUERIES_PER_HOUR 500;

في محرك البيانات SQL Server

ALTER USER name   

  WITH <set_item> ;

إذ إن name هو اسم المستخدم الذي ستطرأ التعديلات عليه و من خلال set_item يمكن تعديل أحد الخصائص الآتية:

الخاصية

مهمتها

NAME = newUserName

لتعديل اسم المستخدم ليصبح newUserName

PASSWORD = 'newpassword'

لتعديل كلمة المرور لتصبح 'newpassword'

مثال

لتعديل اسم المستخدم Ahmad ليصبح accountant وكلمة مروره لتصبح '1751ah' ، يستخدم الأمر الآتي:

ALTER USER Ahmad NAME = accountant, PASSWORD = '1751ah' ;

حذف مستخدم DROP USER

يُستخدَم هذا الأمر لحذف مستخدم، وله الصيغة العامّة الآتية:

DROP USER [IF EXISTS] name;

إذ يحذف المستخدم ذو الاسم name إن وُجد.

مثال

لحذف المستخدمَين accountant و customer (إن وُجدا)  يُستخدم الأمر الآتي:

DROP USER IF EXISTS accountant, customer;

منح صلاحيات الوصول GRANT

يستخدم هذا الأمر لمنح صلاحيات الوصول access privileges لمستخدمٍ أو مجموعة مستخدمين أو أكثر، وله إحدى الصيغ العامّة الآتية (بحسب محركات البيانات المختلفة):

محتويات

·         1في محرك البيانات PostgreSQL

o        1.1أمثلة

·         2في محركي البيانات MySQL و Oracle

o        2.1خيارات نوع الصلاحية priv_type

o        2.2خيارات مستوى الصلاحية priv_level

o        2.3خيارات المصادر resource_option

o        2.4أمثلة

·         3في محرك البيانات SQL Server

o        3.1أمثلة

·         4التوافقية

·         5مصادر

 

 

في محرك البيانات PostgreSQL

GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES }

  [, ...] | ALL [ PRIVILEGES ] }

  ON [ TABLE ] tbl_name [, ...]

  TO { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } [ WITH GRANT OPTION ];

إعطاء صلاحية تنفيذ استعلامات SELECT و INSERT و UPDATE و DELETE وإنشاء مفتاح ثانوي عبر الكلمة المفتاحية REFERENCES أو كافة الصلاحيات على الجدول tbl_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER، وعند إضافة العبارة WITH GRANT OPTION فإنها تتيح للمستخدم إعطاء الصلاحيات لمستخدم آخر.

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )

  [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }

  ON [ TABLE ] tbl_name [, ...]

  TO { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } [ WITH GRANT OPTION ];

إعطاء صلاحية تنفيذ استعلامات SELECT و INSERT و UPDATE وإنشاء مفتاح ثانوي عبر الكلمة المفتاحية REFERENCES أو كافة الصلاحيات على العمود column_name (أو أكثر من عمود) في الجدول tbl_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER، وعند إضافة العبارة WITH GRANT OPTION فإنها تتيح للمستخدم إعطاء الصلاحيات لمستخدم آخر.

GRANT { { CREATE | CONNECT | TEMPORARY} [, ...] | ALL [ PRIVILEGES ] }

  ON DATABASE database_name [, ...]

  TO { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] }[ WITH GRANT OPTION ];

إعطاء الصلاحيات بإنشاء العناصر (كالجداول أو الفهارس، ...إلخ.) CREATE أو الاتصال بقاعدة البيانات CONNECT أو إنشاء جداول مؤقتة TEMPORARY في قاعدة البيانات باسم database_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER، وعند إضافة العبارة WITH GRANT OPTION فإنها تتيح للمستخدم إعطاء الصلاحيات لمستخدم آخر.

GRANT { EXECUTE | ALL [ PRIVILEGES ] }

  ON FUNCTION function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]

  TO { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } [ WITH GRANT OPTION ];

إعطاء الصلاحيات بتنفيذ EXECUTE (أو كافة الصلاحيات المتاحة ALL PRIVILEGESللدالة المحددة باسم function_name (والتي تحدد معاملاتها بالنوع argmode كدخل أو خرج والاسم arg_name ونوع البيانات arg_type) وذلك  للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER، وعند إضافة العبارة WITH GRANT OPTION فإنها تتيح للمستخدم إعطاء الصلاحيات لمستخدم آخر.

أمثلة

لمنح صلاحية إدخال سجلات جديدة للجدول books لكافة المستخدمين يُستخدم الأمر:

GRANT INSERT ON books TO PUBLIC;

ولمنح كافة الصلاحيات المتعلقة بقاعدة البيانات centre_db للمستخدم الحالي والسماح له بمنح الصلاحيات لمستخدم آخر، يُستخدَم الأمر:

GRANT ALL PRIVILEGES ON DATABASE centre_db

TO CURRENT_USER WITH GRANT OPTION;

ولمنح صلاحية تنفيذ الدالة get_final_bill للمستخدم mohammad يُستخدم الأمر:

GRANT EXECUTE ON FUNCTION get_final_bill (customer_id int) TO mohammad;

في محركي البيانات MySQL و Oracle

GRANT

  priv_type [(column_list)]

  ON [ {TABLE | FUNCTION} ] priv_level

  TO user

  [WITH {GRANT OPTION | resource_option} ...]

وذلك لإعطاء المستخدم user نوع صلاحية priv_type على الأعمدة column_list الموجودة في العنصر المحدد (جدول أو دالة) بمستوى معين من الصلاحيات priv_level ومنحه إمكانية إعطاء الصلاحيات لمستخدم آخر WITH GRANT OPTION أو تحديد بعض خيارات المصادر resource_option، وتوضح الجداول الآتية الخيارات الممكنة لكلّ مما سبق.

خيارات نوع الصلاحية priv_type

الخيار

مهمته

ALL [PRIVILEGES]

كافة الصلاحيات

ALTER

صلاحية تعديل الجدول ALTER TABLE

CREATE

صلاحية إنشاء قاعدة بيانات جديدة أو جدول جديد

CREATE USER

صلاحية إنشاء مستخدم جديد

CREATE VIEW

صلاحية إنشاء عرض جديد

DELETE

صلاحية الحذف DELETE

DROP

صلاحية الحذف DROP

EXECUTE

صلاحية التنفيذ

INDEX

صلاحية إنشاء أو حذف الفهارس

INSERT

صلاحية إضافة سجلات جديدة

REFERENCES

صلاحية ربط الجداول عبر المفتاح الثانوي

SELECT

صلاحية تنفيذ استعلام SELECT

UPDATE

صلاحية تنفيذ استعلام UPDATE

خيارات مستوى الصلاحية priv_level

المستوى

دلالته

*

كافة الجداول في قاعدة البيانات الحالية

*.*

كافة الجداول في كافة قواعد البيانات الموجودة

db_name.*

كافة الجداول الموجودة في قاعدة البيانات db_name

db_name.tbl_name

الجدول tbl_name الموجود في قاعدة البيانات db_name

tbl_name

الجدول tbl_name

خيارات المصادر resource_option

الخيار

مهمته

MAX_QUERIES_PER_HOUR count

لتحديد العدد الأقصى للاستعلامات المسموحة خلال الساعة بالعدد count

MAX_UPDATES_PER_HOUR count

لتحديد العدد الأقصى للتحديثات (التعديلات) المسموحة خلال الساعة بالعدد count

MAX_CONNECTIONS_PER_HOUR count

لتحديد العدد الأقصى للاتصالات المسموحة خلال الساعة بالعدد count

أمثلة

لمنح صلاحية إدخال سجلات جديدة للجدول books الموجود في قاعدة البيانات centre_db للمستخدم ahmad مع إمكانية إعطائه الصلاحيات لمستخدم آخر وبحد أقصى 5 اتصالات خلال الساعة، يُستخدم الأمر:

GRANT INSERT ON TABLE centre_db.books TO ahmad WITH GRANT OPTION MAX_CONNECTIONS_PER_HOUR 5;

ولمنح كافة الصلاحيات المتعلقة بكافة الجداول الموجودة في قاعدة البيانات centre_db للمستخدم mohammad يُستخدَم الأمر:

GRANT ALL PRIVILEGES ON centre_db.* TO mohammad;

في محرك البيانات SQL Server

GRANT { ALL [ PRIVILEGES ] } 

  | permission [ ( column [ ,...n ] ) ] [ ,...n ] 

  [ ON object ] TO name [ ,...n ]  

  [ WITH GRANT OPTION ];

إذ يمكن منح بعض الصلاحيات أو كلها على الأعمدة المحدد باللائحة column والموجودة في العنصر object للمستخدم باسم name مع إعطائه إمكانية منح الصلاحيات لمستخدم آخر WITH GRANT OPTION، وتختلف الصلاحيات المتاحة بحسب العنصر المحدد object كما هو موضح في الجدول الآتي:

العنصر

الصلاحيات المتاحة

قاعدة بيانات

CREATE DATABASE

CREATE FUNCTION

CREATE TABLE

CREATE VIEW

دالة تعيد قيمة أوليّة scalar

EXECUTE

دالة تعيد جدول من النتائج

DELETE

INSERT

SELECT

UPDATE

جدول

DELETE

INSERT

REFERENCES

SELECT

UPDATE

عرض VIEW

DELETE

INSERT

SELECT

UPDATE

وللعودة إلى كافة الأذونات permission التي يتيحها محرك SQL Server تمكن الاستفادة من الصفحة.

أمثلة

لمنح صلاحية إنشاء عرض view للمستخدم mohammad في قاعدة البيانات centre_db والسماح له بمنح الصلاحيات لمستخدم آخر يُستخدم الأمر:

GRANT CREATE VIEW ON centre_db TO mohammad WITH GRANT OPTION;

ولمنح كافة الصلاحيات المتعلقة بالجدول books للمستخدم sarah يُستخدَم الأمر:

GRANT ALL ON books TO sarah;

إلغاء صلاحيات الوصول REVOKE

يستخدم هذا الأمر لإلغاء صلاحيات الوصول access privileges لمستخدمٍ أو مجموعة مستخدمين أو أكثر، وله إحدى الصيغ العامّة الآتية (بحسب محركات البيانات المختلفة):

محتويات

·         1في محرك البيانات PostgreSQL

o        1.1أمثلة

·         2في محركي البيانات MySQL و Oracle

o        2.1خيارات نوع الصلاحية priv_type

o        2.2خيارات مستوى الصلاحية priv_level

o        2.3أمثلة

·         3في محرك البيانات SQL Server

o        3.1أمثلة

·         4التوافقية

·         5مصادر

في محرك البيانات PostgreSQL

REVOKE { { SELECT | INSERT | UPDATE | DELETE | REFERENCES }

  [, ...] | ALL [ PRIVILEGES ] }

  ON [ TABLE ] tbl_name [, ...]

  FROM { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] };

إلغاء صلاحية تنفيذ استعلامات SELECT و INSERT و UPDATE و DELETE وإنشاء مفتاح ثانوي عبر الكلمة المفتاحية REFERENCES أو كافة الصلاحيات على الجدول tbl_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER.

REVOKE { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )

  [, ...] | ALL [ PRIVILEGES ] ( col_name [, ...] ) }

  ON [ TABLE ] tbl_name [, ...]

  FROM { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } ;

إلغاء صلاحية تنفيذ استعلامات SELECT و INSERT و UPDATE وإنشاء مفتاح ثانوي عبر الكلمة المفتاحية REFERENCES أو كافة الصلاحيات على العمود col_name (أو أكثر من عمود) في الجدول tbl_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي.

REVOKE { { CREATE | CONNECT | TEMPORARY} [, ...] | ALL [ PRIVILEGES ] }

  ON DATABASE database_name [, ...]

  FROM { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] };

إلغاء الصلاحيات بإنشاء العناصر (كالجداول أو الفهارس، ...إلخ.) CREATE أو الاتصال بقاعدة البيانات CONNECT أو إنشاء جداول مؤقتة TEMPORARY في قاعدة البيانات باسم database_name للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER.

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }

  ON FUNCTION function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]

  FROM { [GROUP ] name | PUBLIC | CURRENT_USER [, ...] } ;

إلغاء الصلاحيات بتنفيذ EXECUTE (أو كافة الصلاحيات المتاحة ALL PRIVILEGES) للدالة المحددة باسم function_name (والتي تحدد معاملاتها بالنوع argmode كدخل أو خرج والاسم arg_name ونوع البيانات arg_type) وذلك للمستخدم باسم name أو مجموعة مستخدمين GROUP name أو لكافة المستخدمين PUBLIC أو للمستخدم الحالي CURRENT_USER.

أمثلة

لإلغاء صلاحية إدخال سجلات جديدة للجدول books لكافة المستخدمين يُستخدم الأمر:

REVOKE INSERT ON books FROM PUBLIC;

ولإلغاء كافة الصلاحيات المتعلقة بقاعدة البيانات centre_db للمستخدم الحالي يُستخدَم الأمر:

REVOKE ALL PRIVILEGES ON DATABASE centre_db

FROM CURRENT_USER;

ولإلغاء صلاحية تنفيذ الدالة get_final_bill للمستخدم mohammad يُستخدم الأمر:

REVOKE EXECUTE ON FUNCTION get_final_bill (customer_id int) FROM mohammad;

في محركي البيانات MySQL و Oracle

REVOKE

  priv_type [(column_list)]

  ON [ {TABLE | FUNCTION} ] priv_level

  FROM user

وذلك لإلغاء صلاحية المستخدم user من النوع priv_type على الأعمدة column_list الموجودة في العنصر المحدد (جدول أو دالة) بمستوى معين من الصلاحيات priv_level، وتوضح الجداول الآتية الخيارات الممكنة لكلّ مما سبق.

خيارات نوع الصلاحية priv_type

الخيار

مهمته

ALL [PRIVILEGES]

كافة الصلاحيات

ALTER

صلاحية تعديل الجدول ALTER TABLE

CREATE

صلاحية إنشاء قاعدة بيانات جديدة أو جدول جديد

CREATE USER

صلاحية إنشاء مستخدم جديد

CREATE VIEW

صلاحية إنشاء عرض جديد

DELETE

صلاحية الحذف DELETE

DROP

صلاحية الحذف DROP

EXECUTE

صلاحية التنفيذ

INDEX

صلاحية إنشاء أو حذف الفهارس

INSERT

صلاحية إضافة سجلات جديدة

REFERENCES

صلاحية ربط الجداول عبر المفتاح الثانوي

SELECT

صلاحية تنفيذ استعلام SELECT

UPDATE

صلاحية تنفيذ استعلام UPDATE

 

خيارات مستوى الصلاحية priv_level

المستوى

دلالته

*

كافة الجداول في قاعدة البيانات الحالية

*.*

كافة الجداول في كافة قواعد البيانات الموجودة

db_name.*

كافة الجداول الموجودة في قاعدة البيانات db_name

db_name.tbl_name

الجدول tbl_name الموجود في قاعدة البيانات db_name

tbl_name

الجدول tbl_name

أمثلة

لإلغاء صلاحية إدخال سجلات جديدة للجدول books الموجود في قاعدة البيانات centre_db للمستخدم ahmad يُستخدم الأمر:

REVOKE INSERT ON TABLE centre_db.books FROM ahmad;

ولإلغاء كافة الصلاحيات المتعلقة بكافة الجداول الموجودة في قاعدة البيانات centre_db للمستخدم mohammad يُستخدَم الأمر:

REVOKE ALL PRIVILEGES ON centre_db.* FROM mohammad;

 

في محرك البيانات SQL Server

REVOKE { ALL [ PRIVILEGES ] } 

  | permission [ ( column [ ,...n ] ) ] [ ,...n ] 

  [ ON object ] FROM name [ ,...n ] ;

إذ يمكن إلغاء بعض الصلاحيات أو كلها على الأعمدة المحدد باللائحة column والموجودة في العنصر object من المستخدم باسم name، وتختلف الصلاحيات الملغية بحسب العنصر المحدد object كما هو موضح في الجدول الآتي:

العنصر

الصلاحيات المتاحة

قاعدة بيانات

CREATE DATABASECREATE FUNCTION

CREATE TABLE

CREATE VIEW

دالة تعيد قيمة أوليّة scalar

EXECUTE

دالة تعيد جدول من النتائج

DELETEINSERT

SELECT

UPDATE

جدول

DELETEINSERT

REFERENCES

SELECT

UPDATE

عرض VIEW

DELETEINSERT

SELECT

UPDATE

وللعودة إلى كافة الأذونات permission التي يتيحها محرك SQL Server تمكن الاستفادة من هذه الصفحة.

أمثلة

لإلغاء صلاحية إنشاء عرض view للمستخدم mohammad في قاعدة البيانات centre_db يُستخدم الأمر:

REVOKE CREATE VIEW ON centre_db FROM mohammad;

ولإلغاء كافة الصلاحيات المتعلقة بالجدول books للمستخدم sarah يُستخدَم الأمر:

REVOKE ALL ON books FROM sarah;

التعامل مع الفهارس

إنشاء فهرس CREATE INDEX

يستخدم هذا الأمر لإنشاء فهرس للجدول وفق البنية العامّة الآتية:

CREATE INDEX [ name ] ON tbl ( col [, ...]);

إذ يُنشأ الفهرس باسم name للجدول المسمى tbl الذي يحتوي على العمود المسمى col، وتُعتَبر الفهارس إحدى المفاهيم الأساسية في قواعد البيانات إذ تُسرِّع أداء الاستعلامات من خلال تقليل عدد صفحات البيانات التي تُمسح بياناتها (scanned) في القاعدة.

مثال

يستخدم الأمر الآتي لإنشاء مؤشر باسم idx على الجدول records عبر العمود title:

CREATE INDEX idx ON records (title);

تعديل الفهرس ALTER INDEX

يستخدم هذا الأمر لتعديل الفهرس المُنشأ عبر الأمر CREATE INDEX، وله الصيغ الآتية:

ALTER INDEX [ IF EXISTS ] name RENAME TO new_name

لتغيير اسم الفهرس المسمى name (إن وُجد) ليصبح باسم new_name.

ALTER INDEX [ IF EXISTS ] name SET ( storage_parameter = value [, ... ] )

لتعديل أيّ من قيم معاملات التخزين المتعلقة بالفهرس (إن وُجد).

ALTER INDEX [ IF EXISTS ] name RESET ( storage_parameter [, ... ] )

لإعادة ضبط كافة قيم معاملات التخزين لهذا الفهرس (إن وُجد) إلى القيم الافتراضية. أما في محرك SQL فيجب تحديد الكائن object الذي سيُعدّل فهرسه لتصبح البنية العامة بالشكل:

ALTER INDEX index_name ON <object>  
{  
    DISABLE  
    | SET ( <set_index_option> [ ,...n ] )   
    | PAUSE
} ;

إذ إن الكلمة المفتاحية DISABLE تستخدم لتعطيل الفهرس، و SET لضبط قيم خياراته، أما PAUSE فلإيقافه بشكل مؤقّت.

مثال

لضبط قيمة التخزين fillfactor للفهرس distributers لتصبح 75 يُستخدَم الأمر:

ALTER INDEX distributors SET (fillfactor = 75);

حذف الفهرس DROP INDEX

يستخدم هذا الأمر لحذف فهرس أو أكثر في قاعدة البيانات وفق البنية العامّة الآتية:

DROP INDEX [ IF EXISTS ] name [ CASCADE | RESTRICT ]

إذ يُحذف الفهرس المحدد باسم name، وتمنع IF EXISTS حدوث أي خطأ في حال عدم وجود هذا الفهرس في قاعدة البيانات، أما الكلمة المفتاحية CASCADE فهي للإعلام بحذف أي كائنات objects معتمدة على الفهرس المحذوف، وبالحالة الافتراضية فإن RESTRICT تمنع حذف الفهرس إن كان هناك اعتماد عليه من قبل كائن ما.

محتويات

·         1بعض أمور التوافقية في المحركات

·         2مثال

·         3التوافقية

·         4مصادر

بعض أمور التوافقية في المحركات

في محرك Oracle: لدى حذف الفهرس فيُلغى تفعيل كافة الكائنات المعتمدة عليه تلقائيًا.

في محركي SQL Server و MySQL: يجب ذكر الجدول في الأمر ليصبح بالشكل الآتي:

DROP INDEX index_name ON tbl_name

مثال

لحذف الفهرس title_index يستخدم الأمر الآتي:

DROP INDEX title_index;

التعامل مع قواعد البيانات

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

يستخدم هذا الأمر لإنشاء قاعدة بيانات جديدة، وله البنية العامة التالية:

CREATE DATABASE name;

إذ إن name هو اسم قاعدة البيانات التي ستُنشأ ولا يسمح بتنفيذ هذا الاستعلام ضمن بنية عمليات (transaction block).

مثال

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

CREATE DATABASE CompanyRecords;

حذف قاعدة البيانات DROP DATABASE

يستخدم هذا الأمر لحذف قاعدة البيانات، وله البنية العامة التالية:

DROP DATABASE [IF EXISTS] name;

إذ إن name هو اسم قاعدة البيانات التي ستُحذف ولا يسمح بتنفيذ هذا الاستعلام إلا من مالك قاعدة البيانات ولا يمكن التراجع عن الحذف فيما بعد، وتمنع العبارة IF EXISTS حدوث أي خطأ في حال عدم وجودة قاعدة بيانات بهذا الاسم.

يتضمن الحذف كافة الملفات المرتبطة بقاعدة البيانات بالصيغ التالية:

.TRN

.BAK

.DAT

.HSH

.MRG

.frm

.ibd

.MYD

.MYI

.TRG

 

.ndb

.par

.cfg

.db

مثال

لحذف قواعد البيانات Students و Teachers يُستخدم الأمر:

DROP DATABASE IF EXISTS Students, Teachers;

فإذا وُجدت قاعدة بيانات باسم Students أو Teachers ستحذف.

الأمر USE في SQL

يستخدم هذا الأمر لتحديد قاعدة البيانات التي يتَعامَل معها لنقل السياق context لها، وله الصيغة الآتية:

USE { database_name} [;]

مثال

لاستخدام قاعدة البيانات المُسماة centre يكون الأمر بالشكل:

USE centre;

التعامل مع الجداول

مفاتيح الجداول

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

محتويات

·         1المفتاح الأوليّ PRIMARY KEY

·         2المفتاح الثانويّ FOREIGN KEY

o        2.1مثال

·         3تعيين قيود المفاتيح الأولية والثانوية لأعمدة الجدول

o        3.1تعيين أعمدة المفاتيح لجدول جديد

§         3.1.1مثال

·         4تعيين أعمدة المفاتيح لجدول موجود

o        4.1مثال

·         5حذف قيود المفاتيح من الجدول

·         6التوافقية

·         7مصادر

المفتاح الأوليّ PRIMARY KEY

هو عمود (أو أكثر) من الجدول والذي يميّز السجلات عن بعضها، تكون القيم فيه فريدة (غير مكررة) ولا يمكن ألّا يحتوي قيمة (قيمته NULL)، ويكون للجدول مفتاح أولي وحيد.

المفتاح الثانويّ FOREIGN KEY

هو عمود (أو أكثر) من الجدول والذي يمكن عدّه مرجعيةً (reference) لعمود آخر في جدول ثانٍ (وغالبًا ما يكون هذا العمود هو المفتاح الأولي للجدول الثاني).

مثال

تحتوي قاعدة بيانات أحد المراكز التعليمية الجداول الآتية:

الجدول الأول: جدول الطلاب students

المفتاح الأولي فيه هو عمود StudentID والمفتاح الثانوي هو عمود CourseID للربط مع جدول الدورات التدريبية courses

RegDate

CourseID

LastName

FirstName

StudentID

07-JUL-2017

0206

Najjar

Rama

1147

08-NOV-2017

0604

Kordi

Jenan

1148

07-JUL-2017

0206

Bitar

Rahaf

1149

20-AUG-2017

0607

Taweel

Farah

1150

08-NOV-2017

0610

Arab

Rami

1151

24-OCT-2017

0803

Akkad

Aya

1152

08-NOV-2017

0504

Haddad

Abed

1153

20-AUG-2017

0801

Fares

Tasneem

1154

24-OCT-2017

0607

Hamsho

Monther

1155

30-SEP-2017

0607

Abd Allah

Hiba

1156

07-JUL-2017

0509

Khatib

Mohammad

1157

20-AUG-2017

0801

Sharif

Ibrahim

1158

24-OCT-2017

0802

Fehmi

Hanin

1159

20-AUG-2017

0204

Zein

Loujain

1160

08-NOV-2017

0503

Helali

Ammar

1161

الجدول الثاني: جدول الدورات التدريبية courses

المفتاح الأولي فيه هو عمود CourseID والمفتاح الثانوي هو عمود DepartmentID للربط مع جدول الأقسام departments

DepartmentID

Lecturer

Course

CourseID

EN01

Dr. Reem Hadi

English (Adv)

0204

EN01

Dr. Shadi Balid

English (Int)

0206

EN02

Dr. Firas Abd

English (TOEFL)

0211

IT01

Eng. Nasser Sharif

Artificial Intelligence

0604

IT01

Eng. Amal Safi

Networks

0607

IT01

Eng. Salem Najm

ICDL

0610

IT02

Eng. Nasser Sharif

SQL Programming

0703

IT02

Eng. Amal Safi

FrontEnd Programming

0704

IT03

Mr. Maher Siraj

Photoshop Design

0801

IT03

Ms. Nadia Taleb

Illustrator Design

0802

IT03

Mr. Maher Siraj

UI Design

0803

الجدول الثالث: جدول الأقسام departments

المفتاح الأولي فيه هو DepartmentID وبقاعدة البيانات في هذا المثال لا توجد مرجعية له لربطه مع جدول آخر.

Head

DepatementName

DepartmentID

Dr. Firas Abd

General English

EN01

Dr. Saer Raslan

Advanced English

EN02

Dr. Osama Najjar

Information Technology

IT01

Eng. Amal Safi

Programming

IT02

Eng. Fares Ahmad

Graphic Design

IT03

تعيين قيود المفاتيح الأولية والثانوية لأعمدة الجدول

تعيين أعمدة المفاتيح لجدول جديد

لتعيين قيود المفاتيح الأوليّة والثانويّة تضاف العبارة المفتاحية PRIMARY KEY و FOREIGN KEY في تعليمة إنشاء الجدول CREATE TABLE.

مثال

لإضافة المفاتيح على الجدول السابق students، يصبح الاستعلام بالشكل الآتي:

CREATE TABLE students(
  StudentID INTEGER NOT NULL,
  LastName TEXT,
  FirstName TEXT,
  CourseID INTEGER,
  RegDate DATE,
  PRIMARY KEY (StudentID),
  FOREIGN KEY (CourseID) REFERENCES courses (CourseID)
);

أما عندما يكون هناك أكثر من عمود للمفتاح فتُضاف كافة الأعمدة المطلوبة ضمن القوسين بجانب الكلمة المفتاحية لتصبح بالشكل:

PRIMARY KEY (StudentID, FirstName)

تعيين أعمدة المفاتيح لجدول موجود

يُمكن تعيين أعمدة المفاتيح لجدول موجود مسبقًا من خلال الكلمة المفتاحية ADD في تعليمة تعديل الجدول ALTER TABLE ليصبح استعلام إضافة المفتاح الأوليّ بالشكل الآتي:

ALTER TABLE tbl_name
ADD PRIMARY KEY (col_name);

وإضافة المفتاح الثانوي بالشكل:

ALTER TABLE tbl_name
ADD FOREIGN KEY (col_name) REFERENCES tbl_name2 (col_name2);

مثال

لإضافة المفتاحين الأوليّ والثانويّ للجدول السابق students يُستخدَم الاستعلام الآتي:

ALTER TABLE students
ADD PRIMARY KEY (StudentID)
ADD FOREIGN KEY (CourseID) REFERENCES courses (CourseID);

حذف قيود المفاتيح من الجدول

يُمكن حذف قيود المفاتيح لجدول موجود مسبقًا من خلال الكلمة المفتاحية DROP في تعليمة تعديل الجدول ALTER TABLE ليصبح الاستعلام عند حذف المفتاح الأوليّ بالشكل الآتي:

ALTER TABLE students
DROP PRIMARY KEY;

وحذف مفتاح الثانوي بالشكل:

ALTER TABLE students
DROP FOREIGN KEY;

 

 

 

إنشاء جدول CREATE TABLE

يستخدم هذا الأمر لإنشاء جدولٍ جديدٍ في قاعدة البيانات وفق البنية العامّة الآتية:

CREATE TABLE [ IF NOT EXISTS ] tbl_name ( [

  { col_name data_type [ column_constraint [ ... ] | table_constraint }

    [, ... ]

] )

إذ يُنشأ الجدول الجديد باسم tbl_name وتُحدَّد أعمدته ما بين القوسين وذلك بتحديد اسم العمود col_name ونوع بياناته data_type وتحديد القيود على مستوى العمود أو الجدول.

محتويات

·         1قيود العمود

·         2قيود الجدول

·         3مثال

·         4التوافقية

·         5مصادر

قيود العمود

يُمكن ضبط بعض القيود على العمود مثل:

القيد

دلالته

NOT NULL

ألا تكون قيمة الحقل NULL

DEFAULT default_expr

لتحديد القيمة الافتراضية للحقل

UNIQUE

ألا تتكرر القيم ما بين السجلات ضمن نفس الحقل (العمود)

PRIMARY KEY

لتحديد العمود كمفتاح أولي للجدول

REFERENCES reftable [ ( refcolumn )]

لتحديد العمود refcolum كمفتاح ثانوي بمرجعية للجدول reftable

قيود الجدول

يُمكن تحديد بعض القيود على مستوى الجدول مثل:

القيد

دلالته

UNIQUE ( column_name [, ... ] )

عدم تكرار القيم ما بين السجلات ضمن الحقل (العمود) المحدد

PRIMARY KEY ( column_name [, ... ] )

لتحديد العمود (أو الأعمدة) ما بين القوسين كمفتاح أولي للجدول

FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]

لتحديد العمود (أو الأعمدة) ما بين القوسين كمفتاح ثانوي بمرجعية للجدول reftable

مثال

لإنشاء الجدول الآتي باسم students:

StudentID

FirstName

LastName

E-mail

CourseID

RegDate

           

والذي يحتوي على 5 أعمدة بأنواع بيانات مختلفة على ألا يتكرر عنوان البريد الالكتروني بين أكثر من طالب وألا يكون حقل تاريخ التسجيل فارغًا، ويكون حقل StudentID مفتاحًا أوليًا وحقل CourseID مفتاحًا ثانويًا يربط هذا الجدول مع جدول آخر (courses)، ولتحقيق ذلك يستخدم الأمر الآتي:

CREATE TABLE students ();

 

    StudentID    INT         PRIMARY KEY,

    FirstName    VARCHAR(20) ,

    LastName     VARCHAR(20) ,

    E-mail       VARCHAR(50) UNIQUE,

    CourseID     INT         REFERENCES courses (courseID),

    RegDate      DATE        NOT NULL     

);

تعديل الجدول ALTER TABLE

يُستخدَم هذا الأمر لتعديل تعريف الجدول المُنشأ مسبقًا عبر الأمر CREATE TABLE، وله الصيغ الآتية:

ALTER TABLE [ IF EXISTS ] name
    RENAME [ COLUMN ] col_name TO new_col_name

لإعادة تسمية عمود اسمه col_name في الجدول الذي اسمه name (إن وُجد) باسمٍ جديد new_col_name.

ALTER TABLE [ IF EXISTS ] name 
    RENAME CONSTRAINT const_name TO new_const_name

لإعادة تسمية قيد اسمه const_name في الجدول الذي اسمه name (إن وُجد) باسمٍ جديد new_const_name.

ALTER TABLE [ IF EXISTS ] name
    RENAME TO new_name

لإعادة تسمية الجدول الذي اسمه name (إن وُجد) باسمٍ جديد new_name.

ALTER TABLE [ IF EXISTS ] name
    action [, ... ]

لتنفيذ تعديل على الجدول من بين التعديلات الآتية:

التعديل المُنفّذ

الشيفرة action

إضافة عمود جديد (إن لم يوجد مسبقًا) باسم column_name وبنوع بيانات data_type وإضافة قيود له

ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ column_constraint [ ... ] ]

حذف عمود باسم column_name (إن وُجد) وتستخدم الكلمة المفتاحية CASCADE في حال وجود أي اعتماد على هذا العمود من أي عنصر آخر خارج الجدول (مثل حالة المفتاح الثانوي)

DROP [ COLUMN ] [ IF EXISTS ] column_name [CASCADE ]

تعديل نوع البيانات بالعمود column_name ليصبح بنوع data_type

ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type

تعديل القيمة الافتراضية للعمود column_name لتصبح بقيمة expression

ALTER [ COLUMN ] column_name SET DEFAULT expression

حذف القيمة الافتراضية الحالية للعمود column_name

ALTER [ COLUMN ] column_name DROP DEFAULT

إضافة/حذف قيد ألا تكون القيمة خالية NOT NULL في العمود column_name

ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL

تعديل قيمة إحدى صفات attribute_option العمود column_name لتصبح value

ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )

إعادة ضبط قيمة إحدى صفات  attribute_option العمود column_name لتصبح القيمة الافتراضية

ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )

إضافة قيد على مستوى الجدول

ADD table_constraint

حذف القيد constraint_name (إن وُجد)

DROP CONSTRAINT [ IF EXISTS ]  constraint_name

لتعديل أيّ من قيم معاملات التخزين المتعلقة بالجدول

SET ( storage_parameter = value [, ... ] )

لإعادة ضبط قيمة أحد معاملات التخزين المتعلقة بالجدول

RESET ( storage_parameter [, ... ] )

لنقل ملكية الجدول إلى مالك جديد new_owner أو المستخدم الحالي CURRENT_USER

OWNER TO { new_owner | CURRENT_USER }

أمثلة

لإضافة عمود جديد إلى جدول الطلاب students باسم address يستخدم الأمر الآتي:

ALTER TABLE students ADD COLUMN address varchar(50);

ولتعديل عدد محارفه المتاحة:

ALTER TABLE students ALTER COLUMN address TYPE varchar(100);

ولإضافة قيد ألا يكون بقيمة NULL:

ALTER TABLE students ALTER COLUMN address SET NOT NULL;

ولإزالة هذا القيد:

ALTER TABLE students ALTER COLUMN address DROP NOT NULL;

ولإضافة قيد على مستوى الجدول students بأن يكون هذا العمود مفتاحًا ثانويًا باسم st_fk يرتبط مع الجدول addresses عبر العمود address:

ALTER TABLE students ADD CONSTRAINT st_fk FOREIGN KEY (address) REFERENCES addresses (address);

ولجعل هذا العمود بقيمة فريدة بقيدٍ باسم add_uniq:

ALTER TABLE students ADD CONSTRAINT add_uniq UNIQUE (address);

ولحذفه من جديد:

ALTER TABLE students DROP COLUMN address;

ولجعل العمود studentID مفتاحًا أوليًا للجدول students:

ALTER TABLE students ADD PRIMARY KEY (studentID);

ولإعادة تسمية الجدول باسم schoolStudents:

ALTER TABLE students RENAME TO schoolStudents;

حذف الجدول DROP TABLE

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

DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

إذ يُحذف الجدول المحدد باسم name، وتمنع IF EXISTS حدوث أي خطأ في حال عدم وجود هذا الجدول في قاعدة البيانات، أما الكلمة المفتاحية CASCADE فهي للإعلام بحذف أي كائنات objects معتمدة عليه (مثل Views)، وبالحالة الافتراضية فإن RESTRICT تمنع حذفه إن كان هناك اعتماد عليه من قبل كائن ما.

أما لحذف كافة السجلات من الجدول دون الحاجة إلى حذفه يمكن استخدام الأمر DELETE.

مثال

لحذف الجدولين Students و Teachers من قاعدة البيانات يستخدم الأمر الآتي:

DROP TABLE Students, Teachers;

أما لحذف الجدول Courses دون تنفيذ أي أمر في حال عدم وجوده:

DROP TABLE IF EXISTS Courses;

التعامل مع الدوال

بعض الدوال المساعدة في SQL

محتويات

·         1الدوال الرياضية

·         2الدوال النصيّة

·         3مثال

·         4توافقية الدوال مع محركات البيانات

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

الدالة

مهمتها

COUNT(*)

تعيد عدد السجلات الموجودة في الجدول

MAX(col_name)

تعيد القيمة الأكبر في حقل col_name في سجلات الجدول

MIN(col_name)

تعيد القيمة الأصغر في حقل col_name في سجلات الجدول

AVG(col_name)

تعيد قيمة المتوسط الحسابي لقيم الحقل col_name في سجلات الجدول

SUM(col_name)

تعيد قيمة مجموع قيم الحقل col_name في سجلات الجدول

SQRT(m)

تعيد قيمة الجذر التربيعي للقيمة m (قد تكون قيمة أحد الحقول)

RAND()

تعيد قيمة عشوائية مُولّدة واقعة في المجال ما بين القيمة 0 والقيمة 1

MOD(N,M)

تعيد باقي قسمة N على M

OCT(N)

تعيد سلسلة من الخانات الثنائية bits تعبر عن تمثيل العدد N بالنظام الثماني Octal

HEX(N)

تعيد سلسلة نصية تعبّر عن تمثيل N بالنظام الست عشري Hexadecimal

PI()

تعيد قيمة النسبة PI

POW(X,Y) | POWER(X,Y)

تعيد قيمة العدد X مرفوعًا للقوة Y

ROUND(X)

تعيد أقرب صحيح يمكن تقريب العدد X له

الدوال النصيّة

الدالة

مهمتها

CONCAT('string1','string2')

تعيد سلسلة نصية وحيدة ناتجة عن لربط السلسلتين 'string1' و 'string2'

LOWER('string')

تعيد سلسلة نصية بعد تحويل كافة الأحرف الواردة في السلسلة 'string' إلى حالة الأحرف الصغيرة

UPPER('string')

تعيد سلسلة نصية بعد تحويل كافة الأحرف الواردة في السلسلة 'string' إلى حالة الأحرف الكبيرة

CHAR_LENGTH('string')

تعيد عدد أحرف السلسلة النصية 'string'

TRIM('string')

تعيد السلسلة النصية 'string' بعد إزالة الفراغات على طرفيها (إن وُجدت)

مثال

إذا كان الجدول الآتي cars موجودًا في قاعدة البيانات:

Colour

Price

Year

Company

Model

CarID

White

22,500

2018

KIA

Optima

05081

Red

25,995

2017

KIA

Optima Hybrid

05082

Red

31,900

2018

KIA

Stinger

05083

Black

31,990

2017

KIA

Cadenza

05084

Blue

23,240

2018

KIA

Niro

05085

Grey

14,200

2018

KIA

Rio 5-Door

05086

Blue

18,200

2018

KIA

Forte5

05087

Blue

32,250

2017

KIA

Soul EV

05088

Red

23,385

2017

Nissan

Altima

05089

White

46,195

2017

Nissan

Armada

05090

Black

33,495

2017

Nissan

Maxima

05091

Black

30,715

2017

Nissan

Murano

05092

Grey

31,265

2017

Nissan

Pathfinder

05093

White

17,875

2017

Nissan

Sentra

05094

Red

12,875

2017

Nissan

Versa

05095

إن تنفيذ الاستعلام الآتي:

SELECT count(*)  AS Total Number, MAX(Price) AS Most Expensive, MIN(Price) AS Cheapest, ROUND(AVG(Price)) AS Average, SUM(Price) AS Total Sum

FROM cars;

سيُظهر العدد الإجمالي للسيارات الموجودة في الجدول بمسمى Total Number وقيمة السيارة الأعلى سعرًا بمسمى Most Expensive وقيمة السيارة الأقل سعرًا Cheapest والمتوسط الحسابي لسعر السيارات من بعد تقريبه لأقرب عدد صحيح Average والمجموع الإجمالي لأسعار السيارات Total Sum، لتظهر النتائج الآتية:

Total Sum

Average

Cheapest

Most Expensive

Total Number

396,080

26,404

12,875

46,195

15

وعند تنفيذ الاستعلام الآتي:

SELECT CONCAT(UPPER(Model), ' - ' , Company, ' - ' , LOWER(Colour)) AS Name

FROM cars

ORDER BY RAND();

سيظهر عمود واحد يحتوي على نوع السيارة (بعد تحويله لأحرف كبيرة) متبوعًا بشركتها المنتجة ولونها (بعد تحويله لأحرف صغيرة)، وترتيب النتائج الصادرة ترتيبًا عشوائيًا، لتظهر النتائج الآتية:

Name

RIO 5-DOOR - KIA - grey

STINGER - KIA - red

ARMADA - Nissan - white

SOUL EV - KIA - blue

PATHFINDER - Nissan - grey

MAXIMA - Nissan - black

ALTIMA - Nissan - red

OPTIMA HYBRID - KIA - red

OPTIMA - KIA - white

MURANO - Nissan - black

CADENZA - KIA - black

NIRO - KIA - blue

FORTE5 - KIA - blue

SENTRA - Nissan - white

VERSA - Nissan - red

توافقية الدوال مع محركات البيانات

الدالة

MySQL

PostgreSQL

Oracle

SQLite

SQL Server

COUNT(*)

نعم

نعم

نعم

نعم

نعم

MAX(col_name)

نعم

نعم

نعم

نعم

نعم

MIN(col_name)

نعم

نعم

نعم

نعم

نعم

AVG(col_name)

نعم

نعم

نعم

نعم

نعم

SUM(col_name)

نعم

نعم

نعم

نعم

نعم

SQRT(m)

نعم

نعم

نعم

لا

نعم

RAND()

نعم

RANDOM()

DBMS_RANDOM.VALUE()

RANDOM()

نعم

MOD(N,M)

نعم

نعم

نعم

%

%

OCT(N)

نعم

لا

لا

لا

لا

HEX(N)

نعم

TO_HEX(N)

RAWTOHEX(N)

نعم

لا

PI()

نعم

نعم

نعم

نعم

نعم

POW(X,Y) | POWER(X,Y)

نعم

نعم

نعم

لا

نعم

ROUND(X)

نعم

نعم

نعم

نعم

نعم

CONCAT('string1','string2')

نعم

نعم

نعم

||

نعم

LOWER('string')

نعم

نعم

نعم

نعم

نعم

UPPER('string')

نعم

نعم

نعم

نعم

نعم

CHAR_LENGTH('string')

نعم

نعم

LENGTH('string')

LENGTH('string')

LEN('string')

·          

إنشاء دالة CREATE FUNCTION في SQL

يستخدم هذا الأمر لتعريف دالة جديدة، وله البنية العامّة الآتية:

CREATE  [ OR REPLACE ] FUNCTION name ( [[argmode] [ argname ] argtype [, ...] ] )   [RETURNS rettype]
AS 'definition'

إذ ينشئ هذا الأمر دالةً جديدةً (أو يستبدلها في حال وجود دالة سابقة) باسم name وتوضع معاملاتها ما بين القوسين وذلك بتحديد نوع المعامل argmode (كدخل IN أو خرج OUT أو دخل وخرج معًا INOUT) ومن ثم اسم المعامل argname ونوع قيمته argtype وكما يمكن تحديد نوع القيمة المُعادة rettype.

أمثلة

لإنشاء دالة باسم add لجمع عددين صحيحين وإعادة الناتج، يُستخدَم الأمر:

CREATE FUNCTION add(x INTEGER, y INTEGER) RETURNS INTEGER AS
  RETURN x + y;

لإنشاء دالة باسم hello تعيد العبارة النصية Hello مضافةً لها السلسلة s التي تدخل للدالة في لائحة المعاملات، يُستخدَم الأمر:

CREATE FUNCTION hello (s VARCHAR(20)) RETURNS VARCHAR(50) AS
  RETURN CONCAT('Hello, ',s,'!');

إذ إن الدالة CONCAT تستخدم للربط ما بين السلاسل النصية التي تدخل في معاملاتها. لإنشاء دالة باسم get_count تعيد عدد السجلات الموجودة في جدول students عبر متحول باسم num، يُستخدَم الأمر:

CREATE FUNCTION get_count (OUT num INTEGER) AS
SELECT COUNT(*) INTO num FROM students;

تعديل الدالة ALTER FUNCTION في SQL

يستخدم هذا الأمر لتعديل تعريف دالة مُعرَّفة مسبقًا عبر الأمر CREATE FUNCTION، وله الصيغ الآتية:

ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
    RENAME TO new_name;

لإعادة تسمية الدالة name (والتي معاملاتها محددة بالنوع argmode والاسم argname ونوع البيانات argtype) باسم جديد new_name.

ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER };

لنقل ملكية الدالة name (والتي معاملاتها محددة بالنوع argmode والاسم argname ونوع البيانات argtype) إلى مالك جديد new_owner أو المستخدم الحالي CURRENT_USER. أما لتغيير مهمة الدالة (بنيتها الداخلية body) فيُستخدم الأمر بالشكل:

ALTER FUNCTION name   ( [ [ argmode ] [ argname ] argtype [, ...] ] )  
RETURNS return_data_type  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
;

إذ يمكن تعديل أيّ من الخصائص الواردة بتعريف الدالة كما هو الحال عند إنشائها عبر الأمر CREATE FUNCTION.

أمثلة

لإعادة تسمية الدالة sqrt لتصبح باسم square_root، يستخدم الأمر:

ALTER FUNCTION sqrt(integer) RENAME TO square_root;

لتعديل الدالة get_count المُنشأة مسبقًا لتعيد عدد السجلات التي يكون فيها معدل الطالب أكبر من 2 بدلًا من العدد الإجمالي، يستخدم الأمر:

ALTER FUNCTION get_count (OUT num INTEGER) AS
SELECT COUNT(*) INTO num FROM students
WHERE GPA>2;

حذف الدالة DROP FUNCTION

يستخدم هذا الأمر لحذف دالة (أو إجراء) أو أكثر مُعرَّفة مسبقًا عبر الأمر CREATE FUNCTION، وله البنية العامّة الآتية:

DROP {FUNCTION | PROCEDURE} [ IF EXISTS ] name [ ( [argtype [, ...] ] ) ] [, ...]  [ CASCADE | RESTRICT ]

إذ تُحذف الدالة المحدد باسم name، وتمنع IF EXISTS حدوث أي خطأ في حال عدم وجود دالة بهذا الاسم في قاعدة البيانات، ويُحدد نوع البيانات لمتغيرات الدالة ما بين قوسين لاحتمال تكرار نفس اسم الدالة بلائحة مختلفة لمتغيراتها، أما الكلمة المفتاحية CASCADE فهي للإعلام بحذف أي كائنات objects معتمدة على الدالة، وبالحالة الافتراضية فإن RESTRICT تمنع حذفها إن كان هناك اعتماد عليها من قبل كائن ما.

ويمكن الاستغناء عن لائحة المتغيرات للدالة في حال كان اسمها فريدًا.

مثال

لحذف الدالتين باسم findSqrt (مع اختلاف نوع العدد) يستخدم الأمر الآتي:

DROP FUNCTION findSqrt(INTEGER), findSqrt(BIGINTEGER);

تعبير الإعادة RETURN في SQL

تستخدم لإنهاء الدالة وإعادة قيمة ما للموقع الذي استُدعيت فيه الدالة، وتكون الصيغة العامّة بالشكل الآتي:

RETURN [expression];

إذ إن expression هي قيمة التعبير التي ستُعاد (وقد تكون قيمة أوليّة scalar مباشرة أو قيمة مركّبة كسجل)، أما إن كانت الدالة تحتوي بتعريفها متحولات للخرج (من نوع OUT) أو عند الحاجة للخروج من الدالة فيُكتفى بكلمة RETURN فقط، أي بالشكل الآتي:

RETURN;

مثال

تعيد الدالة الآتية double_it المُعرَّفة من المستخدم عبر محرك Oracle القيمة العددية (نوعها NUMBER) المُدخلة إليها بعد مضاعفتها:

FUNCTION double_it (n NUMBER) RETURN NUMBER IS
BEGIN
  RETURN n * 2;
END double_it;

التعامل مع العرض

إنشاء العرض CREATE VIEW

يستخدم هذا الأمر لإنشاء عرضٍ والذي هو عبارة عن جدول افتراضي يُبنى بالاعتماد على نتائج استعلامٍ ما، وله البنية العامّة الآتية:

CREATE VIEW name [ ( col_name [, ...] ) ]
AS query

إذ إن name هو اسم العرض المُنشَأ وتُحدّد الأعمدة المطلوبة بين قوسين، وتُعبِّر كلمة query عن الاستعلام الذي سيُؤخذ العرضُ منه، ويُمكن استخدام هذا العرض المنشأ في عبارة FROM بأي استعلام SELECT آخر.

مثال

لإنشاء عرض باسم novels يحتوي كافة الكتب الروائية المتوفرة في سجلات المكتبة الموجودة بالجدول books، يستخدم الأمر التالي:

CREATE VIEW novels AS
  SELECT *
  FROM books
  WHERE category= 'Novel';

تعديل العرض ALTER VIEW

يستخدم هذا الأمر لتعديل عرضٍ مُنشَأ مسبقًا عبر الأمر CREATE VIEW، وله الصيغ الآتية:

ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] col_name SET DEFAULT expression;

لتحديد قيمة افتراضية expression للعمود col_name الموجود في العرض name (إن وُجد).

ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] col_name DROP DEFAULT;

لحذف القيمة الافتراضية للعمود col_name الموجود في العرض name (إن وُجد).

ALTER VIEW [ IF EXISTS ] name OWNER TO new_owner;

لنقل ملكية العرض name إلى المالك new_owner.

ALTER VIEW [ IF EXISTS ] name RENAME TO new_name;

لإعادة تسمية العرض name باسم new_name.

ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] );

لتعديل أيّ من قيم الخيارات options العرض name.

ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] );

لإعادة ضبط أيّ من قيم الخيارات options العرض name لتصبح القيمة الافتراضية.

ALTER VIEW name [(column_list)]
    AS select_statement;

لتعديل تعريف العرض name ليصبح اعتمادًا على استعلام جديد select_statement.

مثال

لإعادة تعريف العرض novels المنشَأ مسبقًا نستخدم الأمر التالي:

ALTER VIEW novels AS 
  SELECT * 
  FROM books
  WHERE category = novel OR category = 'story' ;

لضبط القيمة الافتراضية 'anonymous' لعمود author في العرض novels يستخدم الأمر:

ALTER VIEW novels ALTER author SET DEFAULT 'anonymous';

لإعادة تسمية العرض باسم novels ليصبح stories، يستخدم الأمر التالي:

ALTER VIEW novels RENAME TO stories;

حذف العرض DROP VIEW

يستخدم هذا الأمر لحذف view أو أكثر مُنشئ مسبقًا عبر الأمر CREATE VIEW، وله البنية العامّة الآتية:

DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

إذ يُحذف view المحدد باسم name، وتمنع IF EXISTS حدوث أي خطأ في حال عدم وجوده في قاعدة البيانات، أما الكلمة المفتاحية CASCADE فهي للإعلام بحذف أي كائنات objects معتمدة عليه، وبالحالة الافتراضية فإن RESTRICT تمنع حذفه إن كان هناك اعتماد عليه من قبل كائن ما.

مثال

لحذف view باسم showKinds يستخدم الأمر الآتي:

DROP VIEW showKinds;

 

  • Like 2
رابط هذا التعليق
شارك

الشكر لله ثم لك ولاخواننا واساتذتنا جزاهم الله عنا كل خير 🌹

3 دقائق مضت, derbali ammar said:

عانيت الامرين كلما اردت البحث عن معلومة معينة 

لا تنسى لكل مجتهد نصيب وعنائك هذا سيجعلك تتعلم اسرع لانك اولا تعلمت كيفيه البحث عن المعلومه ثانيا وصلت للمعلومه

بالتوفيق اخى الفاضل

  • Like 1
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

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

×   Your previous content has been restored.   Clear editor

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

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information