اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

كتاب ثمين و هام في 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