الجزاء الثاني شرح أوامر ودوال SQL بالتفصيل

شرح أوامر ودوال  SQL  , الأمر SQL DROP DATABASE  , حذف قاعدة البيانات SQL , كورس تعلم SQL من البداية إلى الاحتراف , كورس تعلم قواعد بيانات SQL بالعربي  . الجزاء الأول Sql , الجزاء الثاني Sql , الجزاء الثالث Sql , الجزاء الرابع  Sql , الجزاء الخامس قواعد بيانات Sql

الأمر CREATE DATABASE

الأمر CREATE DATABASE يستخدم لإنشاء قاعدة بيانات جديدة.
و هنا نود التنبيه أنك لا تستطيع إنشاء أكثر من قاعدة بيانات بنفس الإسم.


الشكل العام لإستخدامه

CREATE DATABASE db_name;
	

مكان الكلمة db_name نضع الإسم الذي سيتم إعطاؤه لقاعدة البيانات.

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

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

الإستعلام

CREATE DATABASE harmash;
		

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

محاولة إنشاء قاعدة بيانات موجودة أصلاً

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

Can't create database 'db_name'; database exists

قم بمحاولة إعادة إنشاء قاعدة البيانات السابقة, أي قم بإعادة تنفيذ الإستعلام التالي.

الإستعلام

CREATE DATABASE harmash;
		

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيظهر لك خطأ كالتالي.
هذا الخطأ يعني أنه لا يمكنك إنشاء قاعدة بيانات جديدة إسمها harmash لأنه يوجد في الأصل قاعدة بيانات إسمها harmash.

طريقة التأكد من أن قاعدة البيانات المراد إنشاءها غير موجودة في الأساس

إذا أردت إنشاء قاعدة بيانات فقط في حال كانت غير موجودة أصلاً و تجنب ظهور الخطأ Can't create database; database exists يمكنك إضافة جملة IF NOT EXISTS قبل إسم قاعدة البيانات التي تريد إنشاءها كالتالي.

CREATE DATABASE IF NOT EXISTS db_name;
	

الإستعلام التالي ينشئ قاعدة بيانات جديدة إسمها harmash في حال لم يكن هناك قاعدة بيانات أصلاً بهذا الإسم.

الإستعلام

CREATE DATABASE IF NOT EXISTS harmash;
		

بعد تنفيذ الإستعلام السابق في phpMyAdmin لن يتم إنشاء قاعدة بيانات جديدة إسمها harmash أو حذف قاعدة البيانات التي إسمها harmash و إنشاء واحدة جديدة.
ما سيحدث فقط هو أنه سيتم تجاهل تنفيذ أمر إنشاء قاعدة البيانات و لن يظهر أي خطأ في نتيجة الإستعلام كما حدث سابقاً.

الطريقة الأفضل لإنشاء قاعدة بيانات

دائماً أكتب الأمر CREATE DATABASE IF NOT EXISTS عند محاولة إنشاء قاعدة بيانات حتى تتجنب ظهور أي خطأ في الإستعلام.
أي أخطاء تتوقع حدوثها عند محاولة تنفيذ الإستعلامات, حاول تجنبها حتى و إن تطلب منك ذلك عملاً إضافياً لأنك في النهاية ستكتب الأوامر بشكل إحترافي و آمن.

الأمر DROP DATABASE

الأمر DROP DATABASE يستخدم لحذف قاعدة البيانات بشكل نهائي.
عند حذف قاعدة بيانات, لا يمكن العودة و التراجع عن هذه الخطوة لذا كن حذر جداً عند استخدام هذا الأمر.


الشكل العام لإستخدامه

      DROP DATABASE db_name;
    

مكان الكلمة db_name نضع إسم قاعدة البيانات التي نريد حذفها.

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

في البداية, تذكر أننا في الدرس السابق قمنا بإنشاء قاعدة بيانات إسمها harmash كما يظهر في الصورة التالية.


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

الإستعلام

        DROP DATABASE harmash;
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم حذف قاعدة البيانات harmash و ستختفي من القائمة اليسرى التي تظهر فيها جميع قواعد البيانات كالتالي.

محاولة حذف قاعدة بيانات غير موجودة أصلاً

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

Can't drop database 'db_name'; database doesn't exist

قم بمحاولة إعادة حذف قاعدة البيانات السابقة, أي قم بإعادة تنفيذ الإستعلام التالي.

الإستعلام

        DROP DATABASE harmash;
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيظهر لك خطأ كالتالي.
هذا الخطأ يعني أنه لا يمكنك حذف قاعدة بيانات إسمها harmash لأنه لا يوجد في الأصل قاعدة بيانات إسمها harmash.

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

إذا أردت حذف قاعدة بيانات فقط في حال كانت موجودة و تجنب ظهور الخطأ can't drop database; database exists يمكنك إضافة جملة IF EXIST قبل إسم قاعدة البيانات التي تريد حذفها كالتالي.

      DROP DATABASE IF EXISTS db_name;
    

الإستعلام التالي يحذف قاعدة بيانات إسمها harmash في حال كان هناك قاعدة بيانات أصلاً بهذا الإسم.

الإستعلام

        DROP DATABASE IF EXISTS harmash;
      

بما أننا قمنا سابقاً بحذف قاعدة البيانات harmash, فالبمنطق لا يمكن حذفها من جديد لأنها أصلاً لم تعد موجودة.
بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم تجاهل تنفيذ أمر حذف قاعدة البيانات و لن يظهر أي خطأ في نتيجة الإستعلام كما حدث سابقاً.

الطريقة الأفضل لحذف قاعدة بيانات

دائماً أكتب الأمر DROP DATABASE IF EXISTS عند محاولة حذف قاعدة بيانات حتى تتجنب ظهور أي خطأ في الإستعلام.
أي أخطاء تتوقع حدوثها عند محاولة تنفيذ الإستعلامات, حاول تجنبها حتى و إن تطلب منك ذلك عملاً إضافياً لأنك في النهاية ستكتب الأوامر بشكل إحترافي و آمن.

تطبيق كل الأوامر السابقة في تمرين واحد

حتى الآن أنت تعلمت كيف تنشئ قاعدة بيانات جديدة و كيف تحذف قاعدة بيانات موجودة.


المطلوب

الآن, أكتب إستعلام يقوم بإنشاء قاعدة بيانات إسمها training ثم قم بتنفيذه حتى تتأكد أنه تم إنشاء قاعدة البيانات بنجاح.
بعدها أكتب إستعلام يقوم بحذف قاعدة البيانات training و تأكد أنه قد تم حذفها بنجاح و لم تعد تظهر مع قواعد البيانات الأخرى.

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

أنواع البيانات التي يمكن تخزينها في قواعد البيانات

أي معلومة تنوي تخيزنها في قاعدة البيانات, يجب أن يكون لها نوع محدد و هذا النوع له ضوابط أيضاً, و إليك بعض الأمثلة:

  • إذا كنت تريد تخزين أسماء المستخدمين, يمكنك أن تحدد أن إسم المستخدم سيكون عبارة عن أحرف لا يتعدى عددها 30 حرف مثل Ziad.

  • إذا كنت تريد تخزين تواريخ ميلاد المستخدمين, يمكنك أن تحدد أن عمر المستخدم سيكون عبارة عن تاريخ له شكل فورمات معين مثل 10-1-2003.

من المهم جداً تحديد نوع المعلومة التي نريد تخزينها في قاعدة البيانات بشكل صحيح, لأن ذلك سيسهل عملية استردادها بالإضافة إلى تخزينها بشكل صحيح.
فمثلاً إذا قمت باعتماد النوع الصحيح لتواريخ ميلاد المستخدمين, يمكنك بكل سهولة حساب أعمار المستخدمين و ترتيبهم على حسب أعمارهم.


معلومة تقنية

أنواع البيانات التي يمكن تخزينها في قواعد البيانات عديدة و قد تختلف أسماءها من قاعدة بيانات لأخرى بالإضافة إلى قدرتها الإستيعابية.
هنا نود الإشارة أن هذا الإختلاف لن يشكل أي مشكلة لك لاحقاً في حال قررت استخدام نوع محدد من قواعد البيانات و لا داعي للقلق إطلاقاً حوله الآن, و حتى أنه لا يوجد داعي لأن تعرف جميع أنواع البيانات المتوفرة في قاعدة البيانات لأنك ببساطة لن تستخدم إلا ما تحتاجه منها و قد لا تعمل لسنوات و أنت لا تستخدم سوى 8 أنواع منها.


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

النوع دواعي الإستخدام
INT يستخدم هذا النوع لتخزين أعداد صحيحة, أي أعداد لا تحتوي فاصلة عشرية.
مثال: 123
FLOAT يستخدم هذا النوع لتخزين أعداد عشرية, أي أعداد تحتوي على فاصلة.
مثال: 10.5
DOUBLE يستخدم هذا النوع لتخزين أعداد عشرية, أي أعداد تحتوي على فاصلة.
مثال: 10.5
هذا النوع هو تماماً كالنوع FLOAT و لكن قدرته الإستيعابية أكبر مع العلم أن كلاهما يسع أرقام كبيرة جداً.
DECIMAL يستخدم هذا النوع لتخزين أي قيم مالية بالفورمات الذي نريده لأنه يضمن أن تتخزن في قاعدة البيانات كما تم حفظها بالضبط.
مثال: إذا كان الفورمات الموضوع للتخزين هو (5,2) يمكن تخزين القيمة التالية فيه 15.49
- العدد 2 معناه أن الرقم يمكن أن يحتوي على رقمين بعد الفاصلة.
- العدد 5 معناه أن الرقم يمكن أن يحتوي على 5 أرقام كحد أقصى و بالتالي في حال وجود رقمين قبل الفاصلة فإنه يمكن وجود ثلاث أرقام بعد الفاصلة فقط.

ملاحظة: في حال كان الفورمات الموضوع للتخزين هو (5,2) و كان الرقم المراد حفظه في قاعدة البيانات لا يحتوي على رقمين بعد الفاصلة أو لا يحتوي فاصلة أصلاً, سيتم إضافة صفرين بشكل تلقائي له.
على سبيل المثال إذا قمت بإدخال القيمة 15 سيتم تخزينها 15.00 في قاعدة البيانات.
BOOLEAN يستخدم هذا النوع لتخزين قيمة واحدة من أصل قيمتين هما 1 و 0.
بشكل عام, القيمة 1 يقصد بها True و القيمة 0 يقصد بها False.
مثال: 1
VARCHAR يستخدم هذا النوع لتخزين نصوص سواء كان هذا النص عبارة عن كلمة واحدة, جملة, أو مقال كبير.
مثال: Welcome to harmash.com
DATE يستخدم هذا النوع لتخزين التواريخ على الشكل التالي YYYY-MM-DD.
مثال: 2020-01-24

متى نتعامل مع أنواع البيانات؟

أنواع البيانات تتعامل معها عند إنشاء أعمدة الجداول, عند تغيير أنوع أعمدة الجداول, و عند تعريف دوال.
في الدرس التالي ستبدأ بالتعامل مع هذه الأنواع.

الأمر CREATE TABLE

الأمر CREATE TABLE يستخدم لإنشاء جدول في قاعدة البيانات.
و هنا نود التنبيه أنك لا تستطيع إنشاء أكثر من جدول في قاعدة البيانات بنفس الإسم.

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


الشكل العام لإستخدامه

في حال كنت ستنشئ عامود واحد فقط عند إنشاء الجدول فسيكون شكل الإستعلام كالتالي.

      CREATE TABLE table_name (column_name datatype); 
    

  • مكان الكلمة table_name نضع الإسم الذي سيتم إعطاؤه للجدول.

  • مكان الكلمة column_name نضع إسم العامود الذي سيتم إنشاؤه في الجدول.

  • مكان الكلمة datatype نضع نوع البيانات التي يمكن إدخالها في العامود.


في حال كنت ستنشئ أكثر من عامود عند إنشاء الجدول فسيكون شكل الإستعلام كالتالي.

      CREATE TABLE table_name (
      column_name_1 datatype,
      column_name_2 datatype,
      column_name_3 datatype,
      ....
      ); 
    

هنا نقوم بكتابة الإستعلام على أكثر من سطر لأن التعامل معه هكذا أسهل.
بعد ذكر إسم و نوع كل عامود تريد وضعه ضع فاصلة إذا أردت إنشاء عامود آخر بعده.

قاعدة البيانات التي سنطبق عليها

في الدرس السابق قمنا بإنشاء قاعدة بيانات إسمها harmash, قم بتحديدها لأننا سنتعامل معها.

إنشاء جدول جديد في قاعدة البيانات

الإستعلام التالي ينشئ جدول جديد إسمه books يتألف من أربع أعمدة.
ملاحظة: يجب تحديد قاعدة البيانات التي تريد إنشاء جدول فيها - أي القاعدة harmash - قبل تنفيذ هذا الأمر لأنك في الأساس تنوي إنشاء الجدول فيها.

الإستعلام

        CREATE TABLE books (
        title VARCHAR(200),         -- و يمكنه أن يحتوي على 200 حرف VARCHAR و نوع title العامود الأول إسمه
        number_of_pages INT,        -- أي يمكن وضع أرقام صحيحة فيه ,INT و نوع title العامود الثاني إسمه
        author_name VARCHAR(50),    -- و يمكنه أن يحتوي على 50 حرف VARCHAR و نوع title العامود الثالث إسمه
        publishing_date DATE        -- أي يمكن وضع تواريخ فيه فقط ,DATE و نوع title العامود الرابع إسمه
        );
      

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


في حال أردت رؤية أسماء أعمدة الجدول books من نافذة phpMyAdmin يمكنك النقر على الرمز + الموضوع بجانب إسمها حتى يظهرهم لك.


في حال أردت رؤية معلومة مفصلة عن أعمدة الجدول books من نافذة phpMyAdmin يمكنك النقر على كلمة Columns الموضوع بجانب إسمها حتى يظهرهم لك.
هذه الصفحة تتيح لك رؤية كل تفاصيل أعمدة الجدول مع إمكانية إعادة تسميتها, تعديل أنواعها و حذفها إن أردت بدون كتابة أي أمر و لكن لا تهتم بهذه الأمور لأنك مهتم بتعلم كيف فعل كل شيء بواسطة أوامر SQL و ليس بواسطة phpMyAdmin.


في حال أردت الخروج من الجدول books و الرجوع للقسم الذي تكتب فيه أوامر SQL يمكنك النقر على إسم قاعدة البيانات و من ثم التوجه لقسم SQL كالتالي.
هذه الصفحة تتيح لك رؤية كل تفاصيل أعمدة الجدول مع إمكانية إعادة تسميتها, تعديل أنواعها و حذفها إن أردت بدون كتابة أي أمر و لكن لا تهتم بهذه الأمور لأنك مهتم بتعلم كيفية فعل كل شيء بواسطة أوامر SQL و ليس بواسطة phpMyAdmin.

محاولة إنشاء جدول موجود أصلاً في قاعدة البيانات

في حال حاولت إنشاء جدول و كان هناك جدول آخر في نفس قاعدة البيانات عنده نفس الإسم الذي تريد استخدامه, سيظهر لك الخطأ التالي عند تنفيذ الإستعلام.

Table 'table_name' already exists

قم بمحاولة إعادة إنشاء الجدول السابق في قاعدة البيانات, أي قم بإعادة تنفيذ الإستعلام التالي.

الإستعلام

        CREATE TABLE books (
        title VARCHAR(200),
        number_of_pages INT,
        author_name VARCHAR(50),
        publishing_date DATE
        );
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيظهر لك خطأ كالتالي.
هذا الخطأ يعني أنه لا يمكنك إنشاء جدول في قاعدة البيانات harmash إسمه books لأنه في الأصل يوجد فيها جدول إسمه books.

طريقة التأكد من أن الجدول المراد إنشاؤه غير موجود في الأساس

في حال أردت تنفيذ الإستعلام الذي يقضي بإنشاء جدول في قاعدة البيانات فقط في حال كان لا يوجد فيها جدول آخر عنده نفس الإسم و بالتالي تجنب ظهور الخطأ Table 'table_name' already exists يمكنك إضافة جملة IF NOT EXISTS قبل إسم الجدول الذي تريد إنشاؤه كالتالي.

      CREATE TABLE IF NOT EXISTS table_name;
    

الإستعلام التالي ينشئ جدول جديد إسمه books في حال لم يكن هناك جدول آخر في نفس قاعدة البيانات بهذا الإسم.

الإستعلام

        CREATE TABLE IF NOT EXISTS books (
        title VARCHAR(200),
        number_of_pages INT,
        author_name VARCHAR(50),
        publishing_date DATE
        );
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin لن يتم إنشاء جدول جديد إسمه books في قاعدة البيانات harmash أو حذف الجدول الذي إسمه books منها و إنشاء واحد جديد.
ما سيحدث فقط هو أنه سيتم تجاهل تنفيذ أمر إنشاء الجدول و لن يظهر أي خطأ في نتيجة الإستعلام كما حدث سابقاً.

تطبيق كل الأوامر السابقة في تمرين واحد

حتى الآن أنت تعلمت كيف تنشئ قاعدة بيانات جديدة, كيف تحذف قاعدة بيانات موجودة و كيف تنشئ جدول جديد.


المطلوب

الآن, أكتب إستعلام يقوم بإنشاء قاعدة بيانات إسمها training ثم قم بتنفيذه حتى تتأكد أنه تم إنشاء قاعدة البيانات بنجاح.
بعدها أكتب إستعلام يقوم بإنشاء جدول إسمه users يتألف من 3 أعمدة كالتالي:

  • العامود الأول username VARCHAR(50)

  • العامود االثاني password VARCHAR(100)

  • العامود الثالث income DECIMAL(5,2)

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

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

الأمر DROP TABLE

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


الشكل العام لإستخدامه

      DROP TABLE table_name; 
    

مكان الكلمة table_name نضع إسم الجدول الذي نريد حذفه.

قاعدة البيانات التي سنطبق عليها

سنتعامل مع قاعدة البيانات harmash و التي أنشأنا فيها جدول إسمه books في الدرس السابق كما يظهر في الصورة التالية.

حذف جدول من قاعدة البيانات

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

الإستعلام

        DROP TABLE books;
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم حذف الجدول books من قاعدة البيانات التي قمت بتحديدها قبل تنفيذ الإستعلام.

محاولة حذف جدول غير موجود أصلاً في قاعدة البيانات

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

Unknown table 'db_name.table_name'

قم بمحاولة إعادة حذف الجدول السابق في قاعدة البيانات, أي قم بإعادة تنفيذ الإستعلام التالي.

الإستعلام

        DROP TABLE books;
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيظهر لك خطأ كالتالي.
هذا الخطأ يعني أنه لا يمكنك حذف جدول في قاعدة البيانات harmash إسمه books لأنه أصلاً غير موجود فيها.

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

في حال أردت تنفيذ الإستعلام الذي يقضي بحذف جدول من قاعدة البيانات فقط في حال كان الجدول موجود فيها و بالتالي تجنب ظهور الخطأ Unknown table 'db_name.table_name' يمكنك إضافة جملة IF EXISTS قبل إسم الجدول الذي تريد حذفه كالتالي.

      DROP TABLE IF EXISTS table_name;
    

الإستعلام التالي يحذف جدول إسمه books في حال كانت قاعدة البيانات في الأصل فيها جدول بهذا الإسم.

الإستعلام

        DROP TABLE IF EXISTS books;
      

بما أننا قمنا سابقاً بحذف الجدول books من قاعدة البيانات harmash, فالبمنطق لا يمكن حذفه من جديد لأنه أصلاً لم يعد موجود.
بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم تجاهل تنفيذ أمر حذف قاعدة البيانات و لن يظهر أي خطأ في نتيجة الإستعلام كما حدث سابقاً.

تطبيق كل الأوامر السابقة في تمرين واحد

حتى الآن أنت تعلمت كيف تنشئ قاعدة بيانات جديدة, كيف تحذف قاعدة بيانات موجودة, كيف تنشئ جدول جديد, و كيف تحذف جدول موجود.


المطلوب

الآن, أكتب إستعلام يقوم بإنشاء قاعدة بيانات إسمها training ثم قم بتنفيذه حتى تتأكد أنه تم إنشاء قاعدة البيانات بنجاح.
بعدها أكتب إستعلام يقوم بإنشاء جدول إسمه products يتألف من 5 أعمدة كالتالي:

  • العامود الأول title VARCHAR(30)

  • العامود االثاني description VARCHAR(255)

  • العامود الثالث production_date DATE

  • العامود الرابع expiry_date DATE

  • العامود الخامس price DECIMAL(3,2)

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

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

الأمر USE

الأمر USE يستخدم لتحديد قاعدة البيانات التي نريد التعامل معها من خلال إسمها.

إذا كنت تريد تنفيذ مجموعة من الإستعلامات دفعة واحدة و بدون الحاجة لتحديد قاعدة البيانات المراد التعامل معها سواء من صفحة phpMyAdmin أو من أي برنامج تستخدمه للتعامل مع قواعد البيانات, يمكنك استخدام هذا الأمر لتحديد قاعدة البيانات المراد التعامل معها قبل تنفيذ الإستعلامات.

عملياً, نستخدم هذا الأمر في العادة عند تجهيز مجموعة من الإستعلامات هدفها بناء قاعدة البيانات و بناء كل شيء موضوع فيها بنقرة واحدة.


الشكل العام لإستخدامه

      USE db_name;
    

مكان الكلمة db_name نضع إسم قاعدة البيانات التي نريد تحديد أننا سنتعامل معها عند تنفيذ أي إستعلام موضوع بعدها.

إنشاء قاعدة بيانات و من ثم تحديدها و التعامل معها

الإستعلام التالي يقوم بإنشاء قاعدة بيانات إسمها harmash و من ثم يقوم بتحديد أننا سنتعامل معها.
بعدها يقوم بإنشاء جدول فيها إسمه users يتألف من 3 أعمدة هي username, email و phone.

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

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- phone و email ,username يتألف من ثلاث أعمدة هي users هنا قمنا بإنشاء جدول جديد إسمه
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE users (
        username VARCHAR(30),
        email    VARCHAR(50),
        phone    VARCHAR(20)
        );
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها كالتالي.

مشكلة عدم وجود قاعدة بيانات محددة

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

No database selected

قم بمحاولة تنفيذ الأمر التالي بدون تحديد أنك تتعامل مع قاعدة البيانات harmash في صفحة phpMyAdmin.
ملاحظة: هنا نتعمد أن نظهر لك خطأ في النتيجة حتى تعرف أهمية تحديد إسم قاعدة البيانات التي تريد التعامل معها.

الإستعلام

        -- price و description ,title الأمر التالي يقوم بإنشاء جدول يتألف من ثلاث أعمدة هي
        -- سيحدث خطأ عند محاولة تنفيذ هذا الأمر لأنه لم يتم تحديد أي قاعدة بيانات سيتم إنشاؤه فيها
        CREATE TABLE products (
        title       VARCHAR(200),
        description VARCHAR(50),
        price       DECIMAL(5,2)
        );
      

في phpMyAdmin سيظهر الخطأ الذي ذكرناه كالتالي عند تنفيذ الإستعلام.
تذكر: لا يوجد خطأ في الإستعلام بحد ذاته, بل الخطأ فقط هو عدم تحديد قاعدة البيانات التي سيتم تنفيذ الإستعلام عليها.


إذا قمت بتنفيذ الإستعلام السابق مع إضافة الأمر USE harmash; قبله, سيتم تنفيذ الإستعلام بدون أية مشاكل سواء قمت بتحديد أنك تتعامل مع قاعدة البيانات harmash في صفحة phpMyAdmin أم لم تقم بذلك لأنك حددت قاعدة البيانات في الإستعلام.

الإستعلام

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- price و description ,title الأمر التالي يقوم بإنشاء جدول يتألف من ثلاث أعمدة هي
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE products (
        title       VARCHAR(200),
        description VARCHAR(50),
        price       DECIMAL(5,2)
        );
      

بعد تنفيذ الإستعلام السابق سيتم إنشاء الجدول products في قاعدة البيانات harmash و سيصبح فيها جدولين كالتالي.
ملاحظة: قم بالنقر على زر تحديث قائمة قواعد البيانات في حال لم يظهر لك الجدول products حتى يتم إعادة رسمها من جديد.

SQLأمر إضافة سطر جديد في الجدول

الأمر INSERT INTO

الأمر INSERT INTO يستخدم لإضافة سطر جديد ( Row أو Record ) من المعلومات في الجدول.
إذاَ نستخدم هذا الأمر لإضافة بيانات جديدة في الجداول.


الشكل العام لإستخدامه

في حال لم تكن ستمرر قيم لكل الحقول الموجودة في السطر, يجب أن تحدد إسم كل عامود ستمرر قيمة له.

      INSERT INTO table_name (column1, column2, column3, ...)
      VALUES (value1, value2, value3, ...);
    

  • مكان الكلمة table_name نضع إسم الجدول الذي سنضيف فيه السطر.

  • بداخل القوسين اللذين نضعهما بعد إسم الجدول نحدد أسماء الأعمدة التي نريد أن نضع فيها القيم.

  • بداخل القوسين اللذين نضعهما بعد كلمة VALUES نمرر القيم التي سيتم وضعها في الأعمدة بنفس الترتيب.


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

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

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

تجهيز قاعدة البيانات التي سنطبق عليها

بما أننا سنتعلم كيف نضيف معلومات في الجداول, لا بد لنا أن نتعامل مع قاعدة بيانات فيها جدول جاهز حتى نضيف البيانات فيه.
قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه users يتألف من 3 أعمدة.

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- phone و email ,username يتألف من ثلاث أعمدة هي users هنا قمنا بإنشاء جدول جديد إسمه
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE users (
        username VARCHAR(30),
        email    VARCHAR(50),
        phone    VARCHAR(20)
        );
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها كالتالي.

الآن, قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها.

إضافة سطر جديد في الجدول بدون تحديد أسماء الأعمدة

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

الإستعلام

        INSERT INTO users
        VALUES ('mhamad', 'mhamad@example.com', '+96170123456');
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إظهار عبارة 1 row inserted و التي تعني أنه تم إضافة سطر جديد في الجدول كالتالي.

إضافة سطر جديد في الجدول مع تحديد أسماء الأعمدة

قم بتنفيذ الإستعلام التالي لإضافة سطر جديد من المعلومات في الجدول users.
هنا قمنا بتحديد أسماء الحقول التي سنمرر لها القيم.

الإستعلام

        INSERT INTO users (username, email, phone)
        VALUES ('rima', 'rima@example.com', '+96301102030');
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إظهار عبارة 1 row inserted و التي تعني أنه تم إضافة سطر جديد في الجدول كالتالي.

إضافة سطر جديد في الجدول مع عدم تمرير قيم لكل الأعمدة

في البداية, تذكر أنه عند عدم تمرير قيم لكل الأعمدة ستكون مجبر على تحديد أسماء الأعمدة التي ستمرر لها القيم, و القيم يجب أن يتم تمريرها بنفس ترتيب الأعمدة التي ذكرت أسماءها.

قم بتنفيذ الإستعلام التالي لإضافة سطر جديد من المعلومات في الجدول users.
لاحظ أننا لم نمرر قيم لكل الحقول الموجودة في السطر.

الإستعلام

        INSERT INTO users (username, email)
        VALUES ('jana', 'jana@example.com');
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إظهار عبارة 1 row inserted و التي تعني أنه تم إضافة سطر جديد في الجدول كالتالي.

رؤية جميع الأسطر التي تم إضافتها في الجدول في phpMyAdmin

لرؤية جميع الأسطر الموجودة في أي جدول يمكنك النقر على إسم الجدول كالتالي.

لاحظ أن السطر الأخير يظهر فيه القيمة NULL مكان الحقل phone لأنك لم تدخل رقم هاتف المستخدم jana.

مفهوم الترقيم التلقائي للأسطر

ببساطة فكرته أن يتم وضع رقم موحد لكل سطر يتم إضافته في الجدول و بشكل تلقائي مما يمكنك لاحقاً من العودة إلى هذا السطر بكل سهولة من خلال رقمه.
بشكل عام, كلما أنشأنا جدول جديد نضيف فيه حقل يتم ترقيمه بشكل تلقائي و في العادة نقوم بتسميته id و نقول له باللغة العربية رقم التعرفة.

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


الحصول على ترقيم تلقائي

لإنشاء عامود في الجدول يتم وضع ترقيم لأسطره بشكل تلقائي في قواعد بيانات MySQL يجب أن يتم تعريف نوع هذا العامود كالتالي.

      column_name INT NOT NULL PRIMARY KEY AUTO_INCREMENT
    

  • مكان الكلمة column_name نضع إسم العامود الذي سيتم إنشاؤه في الجدول.

  • INT تعني أن العامود سيوضع فيه أعداد صحيحة.

  • NOT NULL تعني أن العامود لا يمكن أن يكون فارغ و هذا الأمر منطقي لأنه سيتم وضع رقم تلقائي لكل سطر يتم إضافته في الجدول.

  • PRIMARY KEY تعني أن هذا الحقل لا يمكنه أن يحتوي على رقم متكرر و لهذا يعتبر المفتاح الرئيسي للوصول لأي سطر (أو سجل) موجود في الجدول.

  • AUTO_INCREMENT تعني أن الأرقام التي ستزيد قيمتها بشكل تلقائي لكل سطر.



إختلاف الأوامر بين قواعد البيانات

نود الإشارة إلى أن الترقيم التلقائي موجود في كل قواعد البيانات و لكن قد تجد أنهم يستخدموا كلمة أخرى بدلاً من الكلمة AUTO_INCREMENT و إليك بعض الأمثلة:

  • في قواعد بيانات Access و SQLite نكتب AUTOINCREMENT بدلاً منها.

  • في قواعد بيانات SQL Server نكتب IDENTITY(1,1) بدلاً منها.

في النهاية, مهما كان نوع قاعدة البيانات التي ستتعامل معها, فكرة الترقيم التلقائي هي نفسها تماماً.

تجهيز قاعدة البيانات التي سنطبق عليها

بما أننا سنتعلم كيف ننشئ عامود في الجدول يتم إعطاء كل سطر فيه رقم بشكل تلقائي, سنقوم بتجهيز قاعدة البيانات التي سنتعامل معها.
قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash.

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها كالتالي.

الآن, قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها.

إنشاء جدول يعطي ترقيم تلقائي لكل سطر يضاف فيه

قم بتنفيذ الإستعلام التالي لإنشاء جدول جديد إسمهusers و يتألف من 3 أعمدة.
لاحظ أننا قمنا بوضع خاصية AUTO_INCREMENT للعامود الأول لأننا نريد جعل قيمته تزيد بشكل تلقائي في كل سطر نضيفه في الجدول.

الإستعلام

        CREATE TABLE users (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(50),
        email VARCHAR(100)
        );
      

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

إضافة سطر في جدول يعطي ترقيم تلقائي

قم بتنفيذ الإستعلام التالي لإضافة خمسة سطور جديدة في الجدول users.
لاحظ أننا لم نذكر إسم العامود id و لم نمرر له قيمة و ذلك لأن قاعدة البيانات ستضع قيمة في الحقل id لكل سطر يتم إنشاؤه.

الإستعلام

        INSERT INTO users (username, email) VALUES ('mhamad', 'mhamad@example.com');
        INSERT INTO users (username, email) VALUES ('hassan', 'hassan@example.com');
        INSERT INTO users (username, email) VALUES ('sara', 'sara@example.com');
        INSERT INTO users (username, email) VALUES ('rami', 'rami@example.com');
        INSERT INTO users (username, email) VALUES ('maria', 'maria@example.com');
      

الآن, أنقر على إسم الجدول users لرؤية جميع الأسطر التي أضفتها فيه كالتالي.


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

الأمر SELECT

الأمر SELECT يستخدم لجلب نسخة من البيانات التي تم إدخالها سابقاً في الجداول.
بشكل عام, يستخدم هذا الأمر للحصول على نسخة من البيانات الموجودة في الجداول بهدف عرضها سواء في صفحات الويب, التطبيقات أو الإحتفاظ بنسخة منها.


الشكل العام لإستخدامه

      SELECT column1, column2, ...
      FROM table_name;
    

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

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- يتألف من ستة أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE employees (
        id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(50),
        last_name  VARCHAR(20),
        is_married BOOLEAN,
        salary     DECIMAL(7,2),
        birthday   Date
        );

        -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
        -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
        -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
        -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
        INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
        INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
        INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
        INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
        INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
        INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
        INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
        INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
        INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
        INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.

جلب جميع البيانات الموجودة في الجدول

عند استخدام الأمر SELECT لجلب أي معلومة تم إدخالها في الجدول يمكنك ذكر أسماء الحقول التي نريد رؤيتها فقط في كل سطر. و في حال أردت رؤية جميع الحقول الموجودة في كل سطر يمكنك وضع رمز النجمة * بعد الكلمة SELECT.

مثال

قم بتنفيذ الإستعلام التالي لجلب جميع البيانات المخزنة في الجدول employees.
إذاً هذا الإستعلام يعرض جميع المعلومات المتوفرة حول الموظفين.

الإستعلام

        SELECT * FROM employees;
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

تحديد أسماء الحقول التي سيتم جلبها من الجدول

قم بتنفيذ الإستعلام التالي لجلب جميع البيانات الموجودة في الحقول first_name و last_name و salary.
إذاً هذا الإستعلام يعرض أسماء جميع الموظفين و رواتبهم.

الإستعلام

        SELECT first_name, last_name, salary
        FROM employees;
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

first_name last_name salary
Ahmad Alhazem 800.00
Rami Algharib 750.00
Said Alnaja 900.00
Noura Jamali 845.00
Amani Sarrouf 1000.00
Mhamad Harmush 700.00
Ahmad Asaadi 850.00
Mostafa Shawki 920.00
Jana Alkassem 780.00
Houssam Zahrani 880.00

تغيير أسماء الأعمدة عند جلبها من الجدول

لتبديل إسم أي جدول سيتم إرجاعه في النتيجة نضع الكلمة AS بعد إسم أي جدول نريد تبديله و من ثم نضع الكلمة التي سيتم تبديل إسم الجدول بها.
ملاحظة: هناك عدة طرق للتعامل مع الكلمة AS و لكننا سنتطرق لبعضها فقط لأنها ليست موضوع الدرس.


مثال

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

  • إسم العامود first_name قمنا بتبديله إلى First Name

  • إسم العامود last_name قمنا بتبديله إلى Last Name

  • إسم العامود salary قمنا بتبديله إلى Salary

الإستعلام

        SELECT first_name AS 'First Name', last_name AS 'Last Name', salary AS 'Salary'
        FROM employees;
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

First Name Last Name Salary
Ahmad Alhazem 800.00
Rami Algharib 750.00
Said Alnaja 900.00
Noura Jamali 845.00
Amani Sarrouf 1000.00
Mhamad Harmush 700.00
Ahmad Asaadi 850.00
Mostafa Shawki 920.00
Jana Alkassem 780.00
Houssam Zahrani 880.00

مفهوم دمج الأعمدة التي تم جلبها من قاعدة البيانات

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

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

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


الشكل العام لدمج قيم الأعمدة

إذا كنت تتعامل مع أرقام, يمكنك وضع رمز الجمع + أو رمز الطرح - أو رمز الضرب * أو رمز القسمة / بينهم و عندها ستحصل على ناتج العملية.

      -- يمكنك تطبيق هذا الشكل
      SELECT column1 + column2 + ... 

      -- أو يمكنك إضافة إسم للعامود الذي سينتج عن دمج الأعمدة
      SELECT column1 + column2 + ... AS 'newly_column_name'
    

إذا كنت تتعامل مع نصوص أو قيم تريدها أن تعرض كما هي, يمكنك دمجمهم بواسطة الدالة CONCAT() كالتالي.

      -- يمكنك تطبيق هذا الشكل
      SELECT CONCAT(column1 + column2 + ...)

      -- أو يمكنك إضافة إسم للعامود الذي سينتج عن دمج الأعمدة
      SELECT CONCAT(column1 + column2 + ...) AS 'newly_column_name'
    

أمثلة بسيطة على دمج القيم الرقمية و النصية

جميع الأمثلة التالية تتنفذ بشكل مباشر, أي لا تحتاج أن تحدد أي قاعدة بيانات قبلها.


المثال الأول

في المثال التالي قمنا باستخدام الأمر SELECT بشكل يجلب لنا ناتج جمع ثلاث أرقام.
ملاحظة: النتيجة ستكون عبارة عن جدول لأن الأمر SELECT دائماً يرجع النتيجة كجدول.

الإستعلام

        SELECT 5 + 2 + 7;
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

5 + 2 + 7
14


المثال الثاني

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

الإستعلام

        SELECT 5 + 2 + 7 AS 'Total';
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Total
14


في المثال التالي حاولنا دمج كلمتين عند استخدام الأمر SELECT حتى يظهروا كنص واحد.
ملاحظة: هنا لن يظهر خطأ في الإستعلام و لكننا سنحصل على نتيجة خطائة, لأننا لم ندمج النصوص بواسطة الدالة CONCAT().

الإستعلام

        SELECT 'Mhamad' + 'Harmush';
      

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

'Mhamad' + 'Harmush'
0


المثال الرابع

في المثال التالي قمنا باستخدام الدالة CONCAT() لدمج كلمتين عند استخدام الأمر SELECT حتى يظهروا كنص واحد كما أننا قمنا بوضع إسم للجدول.

الإستعلام

        SELECT CONCAT('Mhamad', 'Harmush') AS 'Full Name';
      

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

Full Name
MhamadHarmush


المثال الخامس

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

الإستعلام

        SELECT CONCAT('Mhamad', ' ' ,'Harmush') AS 'Full Name';
      

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

Full Name
Mhamad Harmush

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- يتألف من أربعة أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE employees (
        id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(50),
        last_name  VARCHAR(50),
        salary     DECIMAL(7,2)
        );

        -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
        -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
        -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
        -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
        INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", 800);
        INSERT INTO employees VALUES (null, "Rami", "Algharib", 750);
        INSERT INTO employees VALUES (null, "Said", "Alnaja", 900);
        INSERT INTO employees VALUES (null, "Noura", "Jamali", 845);
        INSERT INTO employees VALUES (null, "Amani", "Sarrouf", 1000);
        INSERT INTO employees VALUES (null, "Mhamad", "Harmush", 700);
        INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", 850);
        INSERT INTO employees VALUES (null, "Mostafa", "Shawki", 920);
        INSERT INTO employees VALUES (null, "Jana", "Alkassem", 780);
        INSERT INTO employees VALUES (null, "Houssam", "Zahrani", 880);
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.

جلب البيانات من الجدول مع دمجها و عرضها بشكل أجمل

الإستعلام التالي يجلب إسم كل موظف و إسم عائلته و يدمجهم في عامود واحد إسمه Employee.
و يجلب راتب كل موظف ويدمجه مع الرمز $ في عامود واحد إسمه Salary.

الإستعلام

        SELECT
        CONCAT(first_name, ' ', last_name) AS 'Employee',
        CONCAT(salary, "$") AS 'Salary'
        FROM
        employees;
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Employee Salary
Ahmad Alhazem 800.00$
Rami Algharib 750.00$
Said Alnaja 900.00$
Noura Jamali 845.00$
Amani Sarrouf 1000.00$
Mhamad Harmush 700.00$
Ahmad Asaadi 850.00$
Mostafa Shawki 920.00$
Jana Alkassem 780.00$
Houssam Zahrani 880.00$

مقدمة

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

عند جلب البيانات من الجداول, يمكنك ذكر إسم العامود في نفس الإستعلام أكثر من مرة فترجع قيمته أكثر من مرة في الجدول الذي سينتج عن الإستعلام.
و بما أنك تستطيع التعديل على البيانات التي ترجع كما رأيت في الدرس السابق, يمكنك الإستفادة كثيراً إذا عرفت كيف تستخدم الأسلوبين مع بعض للتعامل البيانات.

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

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى لإنشاء قاعدة بيانات جديدة إسمها harmash و إنشاء جدول فيها إسمه products يحتوي على بيانات 6 منتجات.

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- يتألف من أربعة أعمدة products هنا قمنا بإنشاء جدول جديد إسمه
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE products (
        id    INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        name  VARCHAR(50),
        price DECIMAL(7,2)
        );

        -- هنا قمنا بإضافة 6 أسطر في الجدول, أي أضفنا معلومات 6 منتجات
        -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
        -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
        -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
        INSERT INTO products VALUES (null, 'Keyboard', 15.00);
        INSERT INTO products VALUES (null, 'Camera', 44.99);
        INSERT INTO products VALUES (null, 'HDD 1TB', 70.00);
        INSERT INTO products VALUES (null, 'SSD 1TB', 274.66);
        INSERT INTO products VALUES (null, 'Mouse', 8.50);
        INSERT INTO products VALUES (null, 'Table', 44.55);
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول products بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.

مثال حول وضع إسم العامود أكثر من مرة في الإستعلام

الإستعلام التالي يجلب إسم المنتج, سعره, ضريبة قيمتها 10 بالمئة من أصل سعر المنتج, سعر المنتج النهائي بعد الضريبة.

لقراءة المعلومات التي سنعرضها بشكل مفهوم فعلنا التالي:

  • العامود الذي يعرض أسماء المنتجات قمنا بتسميته Product

  • العامود الذي يعرض أسعار المنتجات قمنا بتسميته Price ($) حتى تكون العملة التي نتعامل معها واضحة.

  • العامود الذي يعرض نسية الضريبة على كل منتج قمنا بتسميته Tax ($)

  • العامود الذي يعرض أسعار المنتجات بعد الضريبة قمنا بتسميته Final Price ($)

الإستعلام

        SELECT 
        name AS 'Product',                            -- إسم المنتج عرضناه كما هو
        price AS 'Price ($)',                         -- سعر المنتج عرضناه كما هو
        price * 0.1 AS 'Tax ($)',                     -- نسبة الضريبة 10% تساوي سعر المنتج × 0.1
        price + (price * 0.1) AS 'Final Price ($)'    -- سعر المنتج بعد الضريبة = سعر المنتج + نسبة الضريبة
        FROM
        products
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Product Product Price ($) Tax ($) Final Price ($)
Keyboard 15.00 1.500 16.500
Camera 44.99 4.499 49.489
HDD 1TB 70.00 7.000 77.000
SSD 1TB 274.66 27.466 302.126
Mouse 8.50 0.850 9.350
Table 44.55 4.455 49.005

إذاً من خلال سعر المنتج فقط, قمنا بتوليد عامودين إضافيين عرضنا فيهما نسبة الضريبة و سعر المنتج بعد الضريبة.
طبعاً بإمكانك التعديل و الإضافة على الإستعلام كيفما شئت, فمثلاً يمكنك وضع حسم على سعر المنتج بنسبة محددة بدل أن تضع ضريبة عليه.

الدالة FORMAT()

عند التعديل على القيم التي سيرجعها الإستعلام قد يتغير نوعها كما لاحظت في الأمثلة السابقة.
فمثلاً, عند عرض أسعار المنتجات كما هي كنا نلاحظ أنه يوجد رقمين فقط بعد الفاصلة و لكن عند إجراء أي عملية حسابية على هذا السعر لاحظنا أن الأسعار أصبح يظهر فيها أربع أرقام بعد الفاصلة لأن قاعدة البيانات قامت بتحويل نوع السعر من DECIMAL إلى FLOAT عند إجراء العمليات الحسابية.

إذا كنت تريد تحديد عدد الأرقام التي ستظهر بعد الفاصلة يمكنك استخدام الدالة FORMAT().
عند استدعاء هذه الدالة يجب أن تمرر لها رقمين. الأول هو الرقم الذي تريد تحويله, القاني يمثل عدد الأرقام التي تريد عرضها بعد الفاصلة.


المثال الأول

إذا قمت بتنفيذ الإستعلام التالي سيعرض لك الرقم الموضوع كما هو بالضبط.

الإستعلام

        SELECT 10.55 AS 'Number without format'
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Number without format
10.55


المثال الثاني

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

الإستعلام

        SELECT FORMAT(10.55) AS 'Number without format'
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Number without format
11

مثال حول تعديل القيم التي سيرجعها الإستعلام بواسطة الدالة FORMAT()

الإستعلام التالي يجلب إسم المنتج, سعره بالدولار, باليورو, بالليرة اللبنانية و بالريال السعودي.

لقراءة المعلومات التي سنعرضها بشكل مفهوم فعلنا التالي:

  • العامود الذي يعرض أسماء المنتجات قمنا بتسميته Product

  • العامود الذي يعرض أسعار المنتجات بالدولار قمنا بتسميته Price ($) و هو نفسه السعر الأصلي لأننا إفترضنا أن الأسعار تم إدخالها بالأساس بالدولار.

  • العامود الذي يعرض أسعار المنتجات باليورو قمنا بتسميته Price (€)

  • العامود الذي يعرض أسعار المنتجات بالليرة قمنا بتسميته Price (LL)

  • العامود الذي يعرض أسعار المنتجات بالريال قمنا بتسميته Price (SAR)

ملاحظة: السعر بالليرة و الريال لم نعرضها مع فواصل. السعر بالدولار عرضناه كما هو. السعر باليورو عرضناه برقمين بعد بالفاصلة.

الإستعلام

        SELECT 
        name AS 'Product',
        price AS 'Price ($)',                      -- السعر بالدولار عرضناه كما هو لأن السعر الأساسي بالدولار
        FORMAT(price * 0.9, 2) AS 'Price (€)',     -- 0.9 للتحويل من الدولار إلى اليورو ضربنا السعر بنسبة
        FORMAT(price * 1500, 0) AS 'Price (LL)',   -- 1500 للتحويل من الدولار إلى الليرة ضربنا السعر بنسبة
        FORMAT(price * 3.75, 0) AS 'Price (SAR)'   -- 3.75 للتحويل من الدولار إلى الريال ضربنا السعر بنسبة
        FROM
        products
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Product Price ($) Price (€) Price (LL) Price (SAR)
Keyboard 15.00 13.50 22,500 56
Camera 44.99 40.49 67,485 169
HDD 1TB 70.00 63.00 105,000 263
SSD 1TB 274.66 247.19 411,990 1,030
Mouse 8.50 7.65 12,750 32
Table 44.55 40.10 66,825 167

أهمية وضع الشروط في الإستعلامات

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

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

بشكل عام, في SQL نستخدم الأمر WHERE لوضع الشروط و مع هذه الكلمة يجب أن تستخدم إحدى الرموز التالية.

الرمز إستخدامه
= يستخدم هذا الرمز مع الأرقام و النصوص و التواريخ لتنفيذ الأمر في حال كانت القيم التي يتم مقارنتها متساوية.
!= يستخدم هذا الرمز مع الأرقام و النصوص و التواريخ لتنفيذ الأمر في حال كانت القيم التي يتم مقارنتها غير متساوية.
<> يستخدم هذا الرمز مع الأرقام و النصوص و التواريخ لتنفيذ الأمر في حال كانت القيم التي يتم مقارنتها غير متساوية.
> يستخدم هذا الرمز مع الأرقام و التواريخ لتنفيذ الأمر في حال كانت القيم التي يتم مقارنتها أكبر من قيمة محددة.
>= يستخدم هذا الرمز مع الأرقام و التواريخ لتنفيذ الأمر في حال كانت القيم التي يتم مقارنتها أكبر أو تساوي قيمة محددة.
< يستخدم هذا الرمز مع الأرقام و التواريخ لتنفيذ الأمر في حال كانت القيم التي يتم مقارنتها أصغر من قيمة محددة.
<= يستخدم هذا الرمز مع الأرقام و التواريخ لتنفيذ الأمر في حال كانت القيم التي يتم مقارنتها أصغر أو تساوي قيمة محددة.

في حال أردت وضع أكثر من شرط أو أكثر من خيار حتى تحدد ما إن كان سيتم تنفيذ الأوامر, يمكنك إستخدام الكلمات التالية.

الكلمة إستخدامها
AND نستخدم هذه الكلمة لتنفيذ الأمر في حال تحقق الشرط الموضوع قبلها و الشرط الموضوع بعدها.
هنا يجب أن يتحقق كلا الشرطين حتي يتم تنفيذ الأمر.
OR نستخدم هذه الكلمة لتنفيذ الأمر في حال تحقق الشرط الموضوع قبلها أو الشرط الموضوع بعدها.
هنا يكفي أن يتحقق إحدى الشرطين حتي يتم تنفيذ الأمر.
IN (value1, value2, ...) نستخدم هذه الكلمة لتنفيذ الأمر في حال كانت القيمة الموجود قبلها تساوي إحدى القيم الموضوع فيها.
BETWEEN value1 AND value2 نستخدم هذه الجملة لتنفيذ الأمر في حال كانت القيمة موجود بين قيمتين.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- يتألف من أربعة أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE employees (
        id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(50),
        last_name  VARCHAR(20),
        salary     DECIMAL(7,2)
        );

        -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
        -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
        -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
        -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
        INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", 800);
        INSERT INTO employees VALUES (null, "Rami", "Algharib", 750);
        INSERT INTO employees VALUES (null, "Said", "Alnaja", 900);
        INSERT INTO employees VALUES (null, "Noura", "Jamali", 845);
        INSERT INTO employees VALUES (null, "Amani", "Sarrouf", 1000);
        INSERT INTO employees VALUES (null, "Mhamad", "Harmush", 700);
        INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", 850);
        INSERT INTO employees VALUES (null, "Mostafa", "Shawki", 920);
        INSERT INTO employees VALUES (null, "Jana", "Alkassem", 780);
        INSERT INTO employees VALUES (null, "Houssam", "Zahrani", 880);
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.

أمثلة حول جلب بيانات ضمن شروط محددة


المثال الأول

عندما تريد الوصول لسطر محدد في أي جدول عليك التعامل مع الحقل الموجود فيه و الذي لا يمكن أن يحتوي على قيم مكررة.
فمثلاً لا يمكنك الإعتماد على أسماء الأشخاص لأنك قد تجد أكثر من شخص عندهم نفس الإسم.

الآن, بما أن الشيء الوحيد الذي لا يمكن أن يتكرر في الجدول الذي نتعامل معه هو رقم التعرفة id يمكننا الإعتماد عليه للتمييز بين موظف و آخر.

الإستعلام التالي يجلب كل معلومات الموظف الذي يملك رقم id يساوي 6.

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE id = 6;              -- يساوي 6 id بشرط أن يكون كل سطر ستحضره يملك رقم
      

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

id first_name last_name salary
6 Mhamad Harmush 700.00


المثال الثاني

الإستعلام التالي يجلب معلومات كل موظف يتلقى راتب أكبر أو يساوي 800 دولار.

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary >= 800;       -- أكبر أو يساوي 800 salary بشرط أن يكون كل سطر ستحضره يملك
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام, لاحظ أنه يوجد 7 موظفين راتبهم أعلى أو يساوي 800 دولار.

id first_name last_name salary
1 Ahmad Alhazem 800.00
3 Said Alnaja 900.00
4 Noura Jamali 845.00
5 Amani Sarrouf 1000.00
7 Ahmad Asaadi 850.00
8 Mostafa Shawki 920.00
10 Houssam Zahrani 880.00


المثال الثالث

الإستعلام التالي يجلب معلومات كل موظف يتلقى راتب أقل من 800 دولار.

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary < 800;        -- أكبرأقل من 800 salary بشرط أن يكون كل سطر ستحضره يملك
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام, لاحظ أنه يوجد 3 موظفين راتبهم أقل من 800 دولار.

id first_name last_name salary
2 Rami Algharib 750.00
6 Mhamad Harmush 700.00
9 Jana Alkassem 780.00


المثال الرابع

الإستعلام التالي يجلب معلومات كل موظف يتلقى راتب لا يساوي 800 دولار.

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary != 800;       -- لا يساوي 800 salary بشرط أن يكون كل سطر ستحضره يملك
      

يمكن كتابة الإستعلام بهذه الطريقة أيضاً.

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary <> 800;       -- لا يساوي 800 salary بشرط أن يكون كل سطر ستحضره يملك
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام, لاحظ أنه يوجد 9 موظفين راتبهم لا يساوي 800 دولار.

id first_name last_name salary
2 Rami Algharib 750.00
3 Said Alnaja 900.00
4 Noura Jamali 845.00
5 Amani Sarrouf 1000.00
6 Mhamad Harmush 700.00
7 Ahmad Asaadi 850.00
8 Mostafa Shawki 920.00
9 Jana Alkassem 780.00
10 Houssam Zahrani 880.00


المثال الخامس

الإستعلام التالي يجلب معلومات كل موظف يتلقى راتب أعلى من 2000 دولار.

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary > 2000;       -- أعلى من 2000 salary بشرط أن يكون كل سطر ستحضره يملك
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام, لاحظ أنه لا يوجد أي موظف راتبه أعلى من 2000 دولار.

id first_name last_name salary


المثال السادس

الإستعلام التالي يجلب معلومات كل موظف يتلقى راتب أعلى من 800 دولار و إسمه 'Mhamad'.

الإستعلام

        SELECT * FROM employees                          -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary > 800 AND first_name = 'Mhamad';    -- 'Mhamad' يساوي first_name أعلى من 800 و يملك salary بشرط أن يكون كل سطر ستحضره يملك
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام, لاحظ أنه لا يوجد أي موظف راتبه أعلى من 800 دولار و إسمه 'Mhamad' بنفس الوقت.
ملاحظة: صحيح أنه يوجد موظف إسمه 'Mhamad' و لكن بما أن رابته أقل من 800 دولار لن يتم وضعه في الجدول.

id first_name last_name salary


المثال السابع

الإستعلام التالي يجلب معلومات كل موظف يتلقى راتب أعلى من 800 دولار أو إسمه 'Mhamad'.

الإستعلام

        SELECT * FROM employees                         -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary > 800 OR first_name = 'Mhamad';    -- 'Mhamad' يساوي first_name أعلى من 800 أو يملك salary بشرط أن يكون كل سطر ستحضره يملك
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام, لاحظ أنه يوجد 6 موظفين رابتهم أعلى من 800 دولار و يوجد موظف راتبه أقل من 800 دولار و لكن إسمه 'Mhamad' لهذا تم وضعه معهم في الجدول.

id first_name last_name salary
3 Said Alnaja 900.00
4 Noura Jamali 845.00
5 Amani Sarrouf 1000.00
6 Mhamad Harmush 700.00
7 Ahmad Asaadi 850.00
8 Mostafa Shawki 920.00
10 Houssam Zahrani 880.00


المثال الثامن

الإستعلام التالي يجلب معلومات كل موظف يتلقى راتب يساوي 800 أو 850 أو 900 دولار.

الإستعلام

        SELECT * FROM employees             -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary IN (800, 850, 900);    -- يساوي 800 أو 850 أو 900 salary بشرط أن يكون كل سطر ستحضره يملك
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام, لاحظ أنه يوجد 3 موظفين راتبهم أقل من 800 دولار.

id first_name last_name salary
1 Ahmad Alhazem 800.00
3 Said Alnaja 900.00
7 Ahmad Asaadi 850.00


المثال التاسع

الإستعلام التالي يجلب معلومات كل موظف يتلقى راتب بين 800 و 900 دولار.

الإستعلام

        SELECT * FROM employees              -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary BETWEEN 800 AND 900;    -- على الأقل 800 و على الأكثر 900 salary بشرط أن يكون كل سطر ستحضره يملك
      

يمكن كتابة الإستعلام بهذه الطريقة أيضاً.

        SELECT * FROM employees                   -- employees أحضر جميع المعلومات المتوفرة في الجدول
        WHERE salary >= 800 AND salary <= 900;    -- على الأقل 800 و على الأكثر 900 salary بشرط أن يكون كل سطر ستحضره يملك
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام, لاحظ أنه يوجد 3 موظفين راتبهم أقل من 800 دولار.

id first_name last_name salary
1 Ahmad Alhazem 800.00
3 Said Alnaja 900.00
4 Noura Jamali 845.00
7 Ahmad Asaadi 850.00
10 Houssam Zahrani 880.00

مفهوم ترتيب البيانات

في الدرس السابق, عند جلب عدد أسطر من الجدول كنا نلاحظ أننا كنا نسترجعها بنفس الترتيب الذي أدخلناها به.
في هذا الدرس سنتعلم كيف نقوم بترتيب السطور التي سيتم إرجاعها نسبةً للقيم الموضوعة في عامود محدد أو أكثر.

في SQL يمكنك ترتيب البيانات التي نجلبها بشكل تصاعدي ( Ascending ) أو تنازلي ( Descending ) سواء كنت تتعامل مع بيانات نصية أو رقمية. فمثلاً تستطيع ترتيب نتيجة الإستعلام نسبة لرواتب الموظفين من الأصغر إلى الأكبر, و ترتيب أسماء الموظفين بشكل أبجدي من الألف إلى الياء و هكذا.

لتحديد الطريقة التي سيتم فيها ترتيب البيانات التي نجلبها بواسطة الأمر SELECT نضع الكلمة ORDER BY في نهاية الإستعلام و نضع بعدها إسم العامود أو الأعمدة التي نريد ترتيب السطور على أساسها.

إفتراضياً الكلمة ORDER BY ترتب السطور بشكل تصاعدي. إذا أردت ترتيب السطور بشكل تنازلي يجب أن تضيف الكلمة DESC في النهاية.


الشكل العام لإستخدامه

      SELECT column1, column2, ...
      FROM table_name
      ORDER BY column1, column2, ... ASC|DESC; 
    

  • بعد الكلمة SELECT نضع أسماء الأعمدة التي سيتم إرجاع قيمها في الإستعلام.

  • مكان الكلمة table_name نضع إسم الجدول الذي سنجلب البيانات منه.

  • بعد الكلمة ORDER BY نضع إسم العامود أو الأعمدة التي سيتم ترتيب السطور على أساسها.

  • في النهاية نضع الكلمة DESC إذا أردنا ترتيب البيانات بشكل تنازلي و نضع ASC إذا أردنا ترتيب بشكل تصاعدي.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- يتألف من ستة أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE employees (
        id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(50),
        last_name  VARCHAR(20),
        is_married BOOLEAN,
        salary     DECIMAL(7,2),
        birthday   Date
        );

        -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
        -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
        -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
        -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
        INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
        INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
        INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
        INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
        INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
        INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
        INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
        INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
        INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
        INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

أمثلة حول ترتيب البيانات التي يتم جلبها


المثال الأول

الإستعلام التالي يجلب كل معلومات الموظفين مع ترتيب الأسطر بشكل تصاعدي نسبةً لرواتب الموظفين.
أي سيتم عرض الموظف الذي ينال الراتب الأدنى في الأول, و الموظف الذي ينال الراتب الأعلى في الأخير.

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        ORDER BY salary;           -- salary قم بترتيب الأسطر بشكل تصاعدي على حسب قيمة الحقل
      

يمكن كتابة وضع الكلمة ASC في نهاية الإستعلام و لكن لا داعي لذلك لأنه إفتراضياً سيتم ترتيبهم بشكل تصاعدي.

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        ORDER BY salary ASC;       -- salary قم بترتيب الأسطر بشكل تصاعدي على حسب قيمة الحقل
      

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

id first_name last_name is_married salary birthday
6 Mhamad Harmush 0 700.00 1993-11-12
2 Rami Algharib 0 750.00 1992-05-08
9 Jana Alkassem 0 780.00 1991-08-12
1 Ahmad Alhazem 0 800.00 1990-10-23
4 Noura Jamali 0 845.00 1994-12-04
7 Ahmad Asaadi 1 850.00 1995-03-10
10 Houssam Zahrani 1 880.00 1985-09-20
3 Said Alnaja 1 900.00 1988-07-12
8 Mostafa Shawki 1 920.00 1990-02-14
5 Amani Sarrouf 1 1000.00 1991-10-27


المثال الثاني

الإستعلام التالي يجلب كل معلومات الموظفين مع ترتيب الأسطر بشكل تنازلي نسبةً لرواتب الموظفين.
أي سيتم عرض الموظف الذي ينال الراتب الأعلى في الأول, و الموظف الذي ينال الراتب الأدنى في الأخير.

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        ORDER BY salary DESC;      -- salary قم بترتيب الأسطر بشكل تنازلي على حسب قيمة الحقل
      

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

id first_name last_name is_married salary birthday
5 Amani Sarrouf 1 1000.00 1991-10-27
8 Mostafa Shawki 1 920.00 1990-02-14
3 Said Alnaja 1 900.00 1988-07-12
10 Houssam Zahrani 1 880.00 1985-09-20
7 Ahmad Asaadi 1 850.00 1995-03-10
4 Noura Jamali 0 845.00 1994-12-04
1 Ahmad Alhazem 0 800.00 1990-10-23
9 Jana Alkassem 0 780.00 1991-08-12
2 Rami Algharib 0 750.00 1992-05-08
6 Mhamad Harmush 0 700.00 1993-11-12


المثال الثالث

الإستعلام التالي يجلب كل معلومات الموظفين مع ترتيب الأسطر بشكل تصاعدي نسبةً لتاريخ ميلاد الموظفين.
أي سيتم عرض الموظف الأكبر سناً في الأول, و الموظف الأصغر سناً في الأخير.

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        ORDER BY birthday;         -- birthday قم بترتيب الأسطر بشكل تصاعدي على حسب قيمة الحقل
      

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

id first_name last_name is_married salary birthday
10 Houssam Zahrani 1 880.00 1985-09-20
3 Said Alnaja 1 900.00 1988-07-12
8 Mostafa Shawki 1 920.00 1990-02-14
1 Ahmad Alhazem 0 800.00 1990-10-23
9 Jana Alkassem 0 780.00 1991-08-12
5 Amani Sarrouf 1 1000.00 1991-10-27
2 Rami Algharib 0 750.00 1992-05-08
6 Mhamad Harmush 0 700.00 1993-11-12
4 Noura Jamali 0 845.00 1994-12-04
7 Ahmad Asaadi 1 850.00 1995-03-10


المثال الرابع

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

الإستعلام

        SELECT * FROM employees    -- employees أحضر جميع المعلومات المتوفرة في الجدول
        ORDER BY first_name;       -- first_name قم بترتيب الأسطر بشكل تصاعدي على حسب قيمة الحقل
      

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

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
7 Ahmad Asaadi 1 850.00 1995-03-10
5 Amani Sarrouf 1 1000.00 1991-10-27
10 Houssam Zahrani 1 880.00 1985-09-20
9 Jana Alkassem 0 780.00 1991-08-12
6 Mhamad Harmush 0 700.00 1993-11-12
8 Mostafa Shawki 1 920.00 1990-02-14
4 Noura Jamali 0 845.00 1994-12-04
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12


المثال الخامس

الإستعلام التالي يجلب كل معلومات الموظفين مع ترتيب الأسطر بشكل تصاعدي نسبةً لإسم الحالة الإجتماعية أولاً (متزوج أم لا) بعدها يتم ترتيبهم من جديد نسبة لراتبهم من الأعلى إلى الأدنى.
أي سيتم عرض الموظف على حسب قيم العامود is_married بشكل تصاعدي و من ثم قيم العامود salary بشكل تنازلي.

الإستعلام

        SELECT * FROM employees                   -- employees أحضر جميع المعلومات المتوفرة في الجدول
        ORDER BY is_married ASC, salary DESC;     -- salary و من ثم ترتيبهم بشكل تنازلي على حسب قيمة الحقل is_married قم بترتيب الأسطر بشكل تصاعدي على حسب قيمة الحقل
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه تم ترتيب جميع الأسطر بشكل تصاعدي بناءاً على القيم الموضوعة في العامود is_married بشكل تصاعدي أولاً.
بعدها تم ترتيب القيم الموضوعة في العامود salary بشكل تنازلي و لكن تم ترتيبها بداخل كل قسم يملك نفس قيمة is_married على حدا.

id first_name last_name is_married salary birthday
4 Noura Jamali 0 845.00 1994-12-04
1 Ahmad Alhazem 0 800.00 1990-10-23
9 Jana Alkassem 0 780.00 1991-08-12
2 Rami Algharib 0 750.00 1992-05-08
6 Mhamad Harmush 0 700.00 1993-11-12
5 Amani Sarrouf 1 1000.00 1991-10-27
3 Said Alnaja 1 900.00 1988-07-12
8 Mostafa Shawki 1 920.00 1990-02-14
10 Houssam Zahrani 1 880.00 1985-09-20
7 Ahmad Asaadi 1 850.00 1995-03-10


المثال الخامس

الإستعلام التالي يجلب كل معلومات الموظفين مع ترتيب الأسطر بشكل تصاعدي نسبةً للنص الذي ينتج عن دمج الحقلين first_name و last_name.
أي سيتم عرض إسم الموظف و إسم عائلته في حقل واحد و على أساسه سيتم ترتيب الأسطر.

الإستعلام

        SELECT                                                    -- هنا سنقوم بتحديد أسماء الأعمدة التي سنجلب منها البيانات
        id AS 'Id',                                           -- Id إلى id هنا قمنا بتغير إسم العامود
        CONCAT(first_name, ' ', last_name) AS 'Full Name',    -- Full Name و وضعهما في عامود إسمه last_name و first_name هنا قمنا بدمج العامودين
        salary AS 'Salary'                                    -- Salary إلى salary هنا قمنا بتغير إسم العامود
        FROM
        employees                                             -- هنا قمنا بتحديد إسم الجدول الذي سنجلب منه المعلومات
        ORDER BY
        CONCAT(first_name, ' ', last_name);                   -- Full Name هنا قمنا بترتيب أسطر الجدول بناءاً على نفس القيم التي سيتم دمجها في الجدول
      

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

id Full Name salary
1 Ahmad Alhazem 800.00
7 Ahmad Asaadi 850.00
5 Amani Sarrouf 1000.00
10 Houssam Zahrani 880.00
9 Jana Alkassem 780.00
6 Mhamad Harmush 700.00
8 Mostafa Shawki 920.00
4 Noura Jamali 845.00
2 Rami Algharib 750.00
3 Said Alnaja 900.00

مفهوم البيانات المكررة

عند تخزين البيانات في الجداول فمن الطبيعي جداً أن يتم تخزين نفس القيمة أكثر من مرة.
فعلى سبيل المثال يمكن وجود 50 شخص إسمهم محمد في الجدول الذي يحتوي على أسماء المستخدمين.

في حال أردت جلب مجموعة من البيانات المخزنة في عامود محدد و لكنك تريد أن تكون نتيجة الإستعلام تحتوي قيم مكررة يمكنك إضافة الكلمة DISTINCT بعد الكلمة SELECT.


الشكل العام لإستخدامه

      SELECT DISTINCT column_name
      FROM table_name;
    

  • مكان الكلمة column_name نضع إسم العامود الذي سيتم إرجاع قيم غير مكررة منه.

  • مكان الكلمة table_name نضع إسم الجدول الذي سنجلب البيانات منه.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه users يحتوي على بيانات 10 مستخدمين.

الإستعلام

        -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
        DROP DATABASE IF EXISTS harmash;

        -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
        CREATE DATABASE harmash;

        -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
        USE harmash;

        -- يتألف من 4 أعمدة users هنا قمنا بإنشاء جدول جديد إسمه
        -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
        CREATE TABLE users (
        id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(50),
        last_name  VARCHAR(50),
        country    VARCHAR(50)
        );

        -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 مستخدمين
        -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
        -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
        -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
        INSERT INTO users VALUES (null, "Rami", "Masri", "Lebanon");
        INSERT INTO users VALUES (null, "Ahmad", "Naji", "Syria");
        INSERT INTO users VALUES (null, "Hanan", "Mostafa", "KSA");
        INSERT INTO users VALUES (null, "Saly", "Harmush", "Lebanon");
        INSERT INTO users VALUES (null, "Samir", "Saleh", "Lebanon");
        INSERT INTO users VALUES (null, "Hamad", "Akel", "Syria");
        INSERT INTO users VALUES (null, "Abdullah", "Helmi", "Egypt");
        INSERT INTO users VALUES (null, "Rashed", "Masri", "Oman");
        INSERT INTO users VALUES (null, "Majed", "Alali", "Yaman");
        INSERT INTO users VALUES (null, "Rayan", "Kasabi", "KSA");
      

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول users.

id first_name last_name country
1 Rami Masri Lebanon
2 Ahmad Naji Syria
3 Hanan Mostafa KSA
4 Saly Harmush Lebanon
5 Samir Saleh Lebanon
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi KSA

أمثلة حول إرجاع قيم غير مكررة


المثال الأول

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

الإستعلام

        SELECT DISTINCT country     -- أحضر أسماء البلدان مع عدم تكرارها أكثر من مرة
        FROM users;                 -- users أحضرها من الجدول
      

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

country
Lebanon
Syria
KSA
Egypt
Oman
Yaman


المثال الثاني

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

الإستعلام

        SELECT DISTINCT country     -- أحضر أسماء البلدان مع عدم تكرارها أكثر من مرة
        FROM users                  -- users أحضرها من الجدول
        ORDER BY country;           -- و قم بترتيبها بناءاً على إسم البلدان بشكل تصاعدي
      

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

country
Egypt
KSA
Lebanon
Oman
Syria
Yaman

مفهوم دمج الجداول في جدول واحد

في البداية, سبق و تعلمنا أننا نستخدم الأمر SELECT لجلب القيم من الجدول, سواء أردنا جلبها كلها أو تحديد القيم التي نريد جلبها منها و في النهاية النتيجة النهائية سيتم إرجاعها لنا كجدول.

في حال أردت تنفيذ أمرين SELECT أو أكثر و من ثم وضع نتيجتهم في جدول واحد فقط يمكنك استخدام العامل UNION حتى تدمجهم مع بعض.

إذاً العامل UNION يستخدم لدمج بيانات الأعمدة التي يتم جلبها بواسطة الأمر SELECT في جدول واحد.


شروط دمج قيم الجداول

يجب مراعاة الشروط التالية حتى يسمح لك بدمج قيم الجداول في جدول واحد:

  • عدد أعمدة الجداول التي نريد دمجها يجب أن يكون متطابق, فمثلاً يكون الجدولين الذين نريد دمجهما يتألفان من 3 أعمدة.

  • أعمدة الجداول التي سيتم دمجها يجب أن تكون من نفس النوع, فمثلاً لا يمكنك دمج عامود نوعه INT مع عامود نوعه DATE.

  • يجب أن تراعي ترتيب الأعمدة التي تريد دمجها مع بعضها, أي يجب أن تجلبها بنفس الترتيب.



أنواع الدمج

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

إذا لم ترد وجود قيم مكررة, قم بدمج الجداول بواسطة العامل UNION.
إذا كان لا يهمك ما إن كان يوجود قيم مكررة أم لا, قم بدمج الجداول بواسطة العامل UNION ALL.



الشكل العام لدمج الجداول

في حال كنت تريد دمج قيم الجداول مع عدم وضع قيم مكررة.

    SELECT column_name(s) FROM table1     -- هنا نحدد أسماء الأعمدة التي نريد جلبها بالترتيب من الجدول الأول
    UNION                                 -- في جدول واحد مع عدم وضع قيم مكررة SELECT سيقوم بدمج نتيجة الأمرين UNION العامل
    SELECT column_name(s) FROM table2;    -- هنا نحدد أسماء الأعمدة التي نريد جلبها بالترتيب من الجدول الثاني
  

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

    SELECT column_name(s) FROM table1     -- هنا نحدد أسماء الأعمدة التي نريد جلبها بالترتيب من الجدول الأول
    UNION ALL                             -- في جدول واحد مع السماح بوجود قيم مكررة SELECT سيقوم بدمج نتيجة الأمرين UNION ALL العامل
    SELECT column_name(s) FROM table2;    -- هنا نحدد أسماء الأعمدة التي نريد جلبها بالترتيب من الجدول الثاني
  

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من أربعة أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE employees (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(50),
      salary     DECIMAL(7,2)
      );

      -- يتألف من خمسة أعمدة customers هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE customers (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(50),
      email      VARCHAR(100)
      );

      -- أي أضفنا معلومات 5 موظفين ,employees هنا قمنا بإضافة 5 أسطر في الجدول
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", 800);
      INSERT INTO employees VALUES (null, "Rami", "Asaadi", 750);
      INSERT INTO employees VALUES (null, "Said", "Alnaja", 900);
      INSERT INTO employees VALUES (null, "Noura", "Jamali", 845);
      INSERT INTO employees VALUES (null, "Amani", "Sarrouf", 1000);

      -- أي أضفنا معلومات 5 عملاء ,customers هنا قمنا بإضافة 5 أسطر في الجدول
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO customers VALUES (null, "Ahmad", "Alhazem", "ahmad@example.com");
      INSERT INTO customers VALUES (null, "Rami", "Asaadi", "rami@example.com");
      INSERT INTO customers VALUES (null, "Mostafa", "Shawki", "mostafa@example.com");
      INSERT INTO customers VALUES (null, "Jana", "Alkassem", "jana@example.com");
      INSERT INTO customers VALUES (null, "Houssam", "Zahrani", "houssm@example.com");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدولين employees و customers بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


الجدول employees يتضمن معلومات 5 موظفين كالتالي.

id first_name last_name salary
1 Ahmad Alhazem 800.00
2 Rami Asaadi 750.00
3 Said Alnaja 900.00
4 Noura Jamali 845.00
5 Amani Sarrouf 1000.00

الجدول customers يتضمن معلومات 5 عملاء كالتالي.

id first_name last_name email
1 Ahmad Alhazem ahmad@example
2 Rami Asaadi rami@example
3 Mostafa Shawki mostafa@example
4 Jana Alkassem jana@example
5 Houssam Zahrani houssm@example

لاحظ أن أول سطرين في الجدولين employees و customers عندهما نفس قيمة id و first_name و last_name.
تعمدنا وضع القيم بهذا الشكل حتى تلاحظ كيف سيتم دمج قيم الجدولين employees و customers عند استخدام UNION و عند استخدام >UNION ALL.

مثال حول دمج بيانات الجداول باستخدام UNION

الإستعلام التالي فكرته إحضار البيانات الموجودة في ثلاث أعمدة في الجدولين employees و customers, مع عدم إحضار قيم مكررة.

هذا الإستعلام سيتنفذ على ثلاث مراحل كالتالي:

  1. يجلب id و first_name و last_name كل موظف موجود في الجدول employees.

  2. يجلب id و first_name و last_name كل عميل موجود في الجدول customers.

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


الإستعلام

      SELECT id, first_name, last_name from customers   -- قمنا بجلب قيم 3 أعمدة موجودة فيه customers الجدول
      UNION                                             -- في جدول واحد مع عدم وضع قيم مكررة SELECT سيقوم بدمج نتيجة الأمرين UNION العامل
      SELECT id, first_name, last_name from employees   -- قمنا بجلب قيم 3 أعمدة موجودة فيه employees الجدول
    

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

id first_name last_name
1 Ahmad Alhazem
2 Rami Asaadi
3 Mostafa Shawki
4 Jana Alkassem
5 Houssam Zahrani
3 Said Alnaja
4 Noura Jamali
5 Amani Sarrouf

مثال حول دمج بيانات الجداول باستخدام UNION ALL

الإستعلام التالي فكرته إحضار البيانات الموجودة في ثلاث أعمدة في الجدولين employees و customers, و لا يهم إن كانت النتيجة تحتوي على قيم مكررة.

هذا الإستعلام سيتنفذ على ثلاث مراحل كالتالي:

  1. يجلب id و first_name و last_name كل موظف موجود في الجدول employees.

  2. يجلب id و first_name و last_name كل عميل موجود في الجدول customers.

  3. يدمج النتيجتين السابقتين في جدول واحد.


الإستعلام

      SELECT id, first_name, last_name from customers   -- قمنا بجلب قيم 3 أعمدة موجودة فيه customers الجدول
      UNION ALL                                         -- في جدول واحد SELECT سيقوم بدمج نتيجة الأمرين UNION ALL العامل
      SELECT id, first_name, last_name from employees   -- قمنا بجلب قيم 3 أعمدة موجودة فيه employees الجدول
    

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

id first_name last_name
1 Ahmad Alhazem
2 Rami Asaadi
3 Mostafa Shawki
4 Jana Alkassem
5 Houssam Zahrani
1 Ahmad Alhazem
2 Rami Asaadi
3 Said Alnaja
4 Noura Jamali
5 Amani Sarrouf

الأمر DELETE

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


الشكل العام لإستخدامه

    DELETE FROM table_name
    WHERE condition;
  

  • مكان الكلمة table_name نضع إسم الجدول الذي سنحذف سطر أو أكثر منه.

  • مكان الكلمة condition يمكننا وضع شرط لنحدد أية أسطر نريد أن نحذف في حال لم نكن نريد حذف جميع الأسطر.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه users يحتوي على بيانات 10 مستخدمين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 4 أعمدة users هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE users (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(50),
      country    VARCHAR(50)
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 مستخدمين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO users VALUES (null, "Rami", "Masri", "Lebanon");
      INSERT INTO users VALUES (null, "Ahmad", "Naji", "Syria");
      INSERT INTO users VALUES (null, "Hanan", "Mostafa", "KSA");
      INSERT INTO users VALUES (null, "Saly", "Harmush", "Lebanon");
      INSERT INTO users VALUES (null, "Samir", "Saleh", "Lebanon");
      INSERT INTO users VALUES (null, "Hamad", "Akel", "Syria");
      INSERT INTO users VALUES (null, "Abdullah", "Helmi", "Egypt");
      INSERT INTO users VALUES (null, "Rashed", "Masri", "Oman");
      INSERT INTO users VALUES (null, "Majed", "Alali", "Yaman");
      INSERT INTO users VALUES (null, "Rayan", "Kasabi", "KSA");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول users.

id first_name last_name country
1 Rami Masri Lebanon
2 Ahmad Naji Syria
3 Hanan Mostafa KSA
4 Saly Harmush Lebanon
5 Samir Saleh Lebanon
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi KSA

أمثلة حول حذف بيانات من الجدول


المثال الأول

الإستعلام التالي يحذف كل سطر يملك رقم التعرفة id يساوي 1 و من ثم يقوم بعرض جميع الأسطر المتبقية.
ملاحظة: بما أن رقم التعرفة هو رقم موحد حيث أنه يستحيل وجود سطر آخر يملك نفس رقم التعرفة, فالبطبع سيتم حذف سطر واحد فقط من الجدول.

الإستعلام

      DELETE FROM users WHERE id = 1;   -- 1 يساوي id أي سطر يملك رقم users إحذف من الجدول
      SELECT * FROM users;              -- users ثم أعرض جميع البيانات الموجودة في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أن أول سطر و الذي كان يملك رقم id يساوي 1 تم حذفه.

id first_name last_name country
2 Ahmad Naji Syria
3 Hanan Mostafa KSA
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi KSA


المثال الثاني

الإستعلام التالي يحذف كل سطر يملك country يساوي Lebanon و من ثم يقوم بعرض جميع الأسطر المتبقية.

الإستعلام

      DELETE FROM users WHERE country = 'Lebanon';   -- Lebanon يساوي country أي سطر يملك رقم users إحذف من الجدول
      SELECT * FROM users;                           -- users ثم أعرض جميع البيانات الموجودة في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه تم حذف كل سطر كان يملك country يساوي Lebanon.

id first_name last_name country
2 Ahmad Naji Syria
3 Hanan Mostafa KSA
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi KSA


المثال الثالث

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

الإستعلام

      DELETE FROM users;     -- users إحذف كل الأسطر الموجودة في الجدول
      SELECT * FROM users;   -- users ثم أعرض جميع البيانات الموجودة في الجدول
    

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

id first_name last_name country

الأمر UPDATE

الأمر UPDATE يستخدم لتحديث كل الحقول الموجودة تحت عامود محدد في الجدول أو لتحديث حقول محددة في العامود.
تنبيه: عند التعامل مع أمر التحديث عليك أن تكون حذر للغاية حتى لا تقوم بتحديث البيانات الخطأ لأنك لا تستطيع إرجاع القيم السابقة التي قمت بتغييرها.


الشكل العام لإستخدامه

    UPDATE table_name
    SET column1 = value1, column2 = value2, ...
    WHERE condition;
  

  • مكان الكلمة table_name نضع إسم الجدول الذي يحتوي على الحقول التي ننوي تحديث قيمها.

  • بعد الكلمة SET نضع إسم كل عامود نريد تحديث قيم الحقول الموجودة تحته و القيم التي نريد وضعها بدلاً منها.

  • مكان الكلمة condition يمكننا وضع شرط لنحدد أية أسطر نريد تحديث القيم الموضوعة فيه في حال لم نكن نريد تحديث الحقول في جميع الأسطر.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه users يحتوي على بيانات 10 مستخدمين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 4 أعمدة users هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE users (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(50),
      country    VARCHAR(50)
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 مستخدمين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO users VALUES (null, "Rami", "Masri", "Lebanon");
      INSERT INTO users VALUES (null, "Ahmad", "Naji", "Syria");
      INSERT INTO users VALUES (null, "Hanan", "Mostafa", "KSA");
      INSERT INTO users VALUES (null, "Saly", "Harmush", "Lebanon");
      INSERT INTO users VALUES (null, "Samir", "Saleh", "Lebanon");
      INSERT INTO users VALUES (null, "Hamad", "Akel", "Syria");
      INSERT INTO users VALUES (null, "Abdullah", "Helmi", "Egypt");
      INSERT INTO users VALUES (null, "Rashed", "Masri", "Oman");
      INSERT INTO users VALUES (null, "Majed", "Alali", "Yaman");
      INSERT INTO users VALUES (null, "Rayan", "Kasabi", "KSA");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول users.

id first_name last_name country
1 Rami Masri Lebanon
2 Ahmad Naji Syria
3 Hanan Mostafa KSA
4 Saly Harmush Lebanon
5 Samir Saleh Lebanon
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi KSA

أمثلة حول حذف بيانات من الجدول


المثال الأول

الإستعلام التالي يقوم بتحديث قيمة الحقل first_name للمستخدم الذي يملك رقم تعرفة id يساوي 1 إلى القيمة 'Ziad'.
ملاحظة: بما أن رقم التعرفة هو رقم موحد حيث أنه يستحيل وجود سطر آخر يملك نفس رقم التعرفة, فالبطبع سيتم تحديث الحقل first_name لسطر واحد فقط من الجدول.

الإستعلام

      UPDATE users               -- users هنا قمنا بتحديد أننا نريد تحديث قيم موجودة في الجدول
      SET first_name = 'Ziad'    -- 'Ziad' إلى first_name و من ثم تحديد أننا نريد تغيير قيمة الحقل
      WHERE id = 1;              -- 1 يساوي id لأي سطر يملك رقم

      SELECT * FROM users;       -- لمعرفة التغيرات الجديدة users هنا قمنا بعرض جميع البيانات الموجودة في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أن أول سطر و الذي كان يملك رقم id يساوي 1 تم تحديث قيمة الحقل first_name فيه و أصبحت قيمته 'Ziad'.

id first_name last_name country
1 Ziad Masri Lebanon
2 Ahmad Naji Syria
3 Hanan Mostafa KSA
4 Saly Harmush Lebanon
5 Samir Saleh Lebanon
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi KSA


المثال الثاني

الإستعلام التالي يقوم بتحديث قيمة الحقلين first_name و last_name للمستخدم الذي يملك رقم تعرفة id يساوي 3 إلى القيمتين 'Maria' و 'Chaar'.

الإستعلام

      UPDATE users                                    -- users هنا قمنا بتحديد أننا نريد تحديث قيم موجودة في الجدول
      SET first_name = 'Maria', last_name = 'Chaar'   -- 'Chaar' إلى last_name و الحقل 'Maria' إلى first_name و من ثم تحديد أننا نريد تغيير قيمة الحقل
      WHERE id = 3;                                   -- 3 يساوي id لأي سطر يملك رقم

      SELECT * FROM users;                            -- لمعرفة التغيرات الجديدة users هنا قمنا بعرض جميع البيانات الموجودة في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أن ثالث سطر و الذي كان يملك رقم id يساوي 3 تم تحديث قيمة الحقلين first_name و last_name فيه إلى القيمتين 'Maria' و 'Chaar'.

id first_name last_name country
1 Ziad Masri Lebanon
2 Ahmad Naji Syria
3 Maria Chaar KSA
4 Saly Harmush Lebanon
5 Samir Saleh Lebanon
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi KSA


المثال الثالث

الإستعلام التالي يقوم بتحديث قيمة كل حقل في العامود country إلى 'Canada' في حال كانت تساوي 'Lebanon'.

الإستعلام

      UPDATE users                  -- users هنا قمنا بتحديد أننا نريد تحديث قيم موجودة في الجدول
      SET country = 'Canada'        -- 'Canada' إلى country و من ثم تحديد أننا نريد تغيير قيمة الحقل
      WHERE country = 'Lebanon';    -- "Lebanon' يساوي country لأي سطر يملك إسم

      SELECT * FROM users;          -- لمعرفة التغيرات الجديدة users هنا قمنا بعرض جميع البيانات الموجودة في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه تم تغيير قيمة كل سطر كان يملك country يساوي 'Lebanon' إلى 'Canada'.

id first_name last_name country
1 Ziad Masri Canada
2 Ahmad Naji Syria
3 Maria Chaar KSA
4 Saly Harmush Canada
5 Samir Saleh Canada
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi KSA


المثال الرابع

الإستعلام التالي يقوم بتحديث قيمة الحقل country لكل الأسطر الموجودة في الجدول users إلى القيمة 'Palestine' لأنه لا يوجد شرط يحدد لأي أسطر سيتم تغييرها.

الإستعلام

      UPDATE users                  -- users هنا قمنا بتحديد أننا نريد تحديث قيم موجودة في الجدول
      SET country = 'Palestine';    -- 'Palestine' إلى country و من ثم تحديد أننا نريد تغيير قيمة الحقل

      SELECT * FROM users;          -- لمعرفة التغيرات الجديدة users هنا قمنا بعرض جميع البيانات الموجودة في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه تم تحديث قيمة الحقل country لكل الأسطر الموجودة في الجدول users إلى القيمة 'Palestine'.

id first_name last_name country
1 Ziad Masri Palestine
2 Ahmad Naji Palestine
3 Maria Chaar Palestine
4 Saly Harmush Palestine
5 Samir Saleh Palestine
6 Hamad Akel Palestine
7 Abdullah Helmi Palestine
8 Rashed Masri Palestine
9 Majed Alali Palestine
10 Rayan Kasabi Palestine

مفهوم تحديد عدد الأسطر التي سيتم إرجاعها

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

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

الآن و قبل أن نبدأ, إليك بعض النمازج لأهمية تحديد عدد الأسطر في المشاريع.


السيناريو الأول

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

جلب هذا العدد من البيانات في وقت واحد أمر مستحيل لأنه يتطلب وقت كبير جداً و مساحة كبيرة لإستيعابه و لهذا يتم تجزئته و إرساله على دفعات. فمثلاً بدلاً من أن تطلب معلومات المليار شخص دفعة واحدة, تجدهم يسمحوا لك بالحصول على معلومات 20 مستخدم على سبيل المثال كلما حاولت عرض المزيد من النتائج.

هذا الأمر يتم تطبيقه في كل المشاريع الأخرى و في أماكن عديدة في المشروع الواحد, فمثلاً موقع يوتيوب تجده يعرض لك أيضاً كمية محددة من الفيديوهات في كل صفحة, و تجده يعرض لك كيمة محددة من التعيلقات تحت كل فيديو مع إمكانية عرض المزيد من التعليقات كلما أردت ذلك.
لا تظن أن هذا الأمر مقتصر فقط على مواقع التواصل الإجتماعي بل حتى في المواقع العادية فمثلاً في مدونة هرمش أيضاً نعرض كمية محددة من المقالات و كمية محددة من التعليقات و ليس كل المقالات أو التعليقات الموضوعة تحت أي مقال دفعة واحدة.


السيناريو الثاني

في حال أراد مدير شركة إرسال 5 موظفين في شركته إلى مهمة تطلب منهم السفر خارج البلاد لعدة أيام أو أشهر.
هنا قد تجد أن المدير سيقرر من يختار من موظفينه لعدة عوامل مثل عمر الموظف المناسب للمهمة, هل يجب أن يكون إمرأة أو رجل أو لا يهم, هل هذا الشخص متزوج أم لا, منصب الشخص في الشركة, شهادة الموظف العلمية, سنوات الخبرة التي يملكها الموظف إلخ..
بعد أن قام المدير بوضع معاير التي يجب أن تتوفر في الموظفين قد يجد 40 شخص تتوفر فيهم هذه المواصفات.
بما أن المدير يحتاج 5 موظفين فقط لهذه المهمة فإنه يحتاج معرفة أول 5 موظفين تتوفر فيهم هذه المعايير حتى يتواصل معهم و يعينهم للمهمة.


معلومة تقنية

عملية إرجاع كمية محددة من الأسطر الموجودة في الجدول تسمى Pagination أو Paging.
إذاً أي موقع تجده على سبيل المقال يعرض لك 10 مقالات مختلفة في كل صفحة, أو معلومات 20 مستخدم مختلف في كل صفحة إلخ.. يطبق ما يسمى Pagination.


تحديد عدد الأسطر الأقصى التي يمكن أن ترجع

لتحديد عدد الأسطر الأقصى التي يمكن أن يرجعها الإستعلام في قواعد بيانات MySQL و SQLite نستخدم الكلمة LIMIT كالتالي.

    SELECT column_name(s)
    FROM table_name
    WHERE condition
    LIMIT [offset,] row_count;
  

  • بعد الكلمة SELECT نضع أسماء الأعمدة التي سيتم إرجاع قيمها في الإستعلام.

  • مكان الكلمة table_name نضع إسم الجدول الذي سنجلب البيانات منه.

  • بعد الكلمة WHERE يمكنك وضع شرط أو أكثر على الأسطر التي تريد أن يتم جلبها.

  • في النهاية نضع الكلمة LIMIT و من بعدها نضع رقم أو رقمين لتحديد عدد الأسطر التي سترجع.


بالنسبة للأرقام التي نضعها بعد الكلمة LIMIT:

  • في حال قمت بتمرير رقم واحد فقط مثل LIMIT 5, سيتم إعتبار أنك تريد إرجاع 5 أسطر كحد أقصى.

  • في حال قمت بتمرير رقمين مثل LIMIT 2,5, سيتم إعتبار أنك تريد إرجاع 5 أسطر كحد أقصى مع الإشارة إلى أنك ستبدأ من السطر رقم 2 من النتيجة التي تم إرجاعها.

إنتبه جيداً, النتيجة التي ترجع يتم إعتبار أول سطر فيها رقمه 0, السطر الثاني الذي يرجع فيها رقمه 1, السطر الثالث الذي يرجع فيها رقمه 2 و هكذا..
إذا كتبت LIMIT 2,5 تعني أنك تريد إرجاع 5 أسطر كحد أقصى إبتداءاً من السطر الثالث في النتيجة.


إختلاف الأوامر بين قواعد البيانات

نود الإشارة إلى أن تحديد عدد الأسطر موجود في كل قواعد البيانات و لكن قد تجد أنهم يستخدموا كلمات أخرى بدلاً من الكلمة LIMIT و إليك بعض الأمثلة:

في قواعد بيانات Access و SQL Server نستخدم الكلمة TOP كالتالي.

    SELECT TOP row_count column_name(s)
    FROM table_name
    WHERE condition;
  

في قواعد بيانات ORACLE نستخدم الكلمة ROWNUM كالتالي.

    SELECT column_name(s)
    FROM table_name
    WHERE ROWNUM <= row_count; 
  

في النهاية, مهما كان نوع قاعدة البيانات التي ستتعامل معها, فكرة الترقيم التلقائي هي نفسها تماماً.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 6 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE employees (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(20),
      is_married BOOLEAN,
      salary     DECIMAL(7,2),
      birthday   Date
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
      INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
      INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
      INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
      INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
      INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
      INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
      INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
      INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
      INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

أمثلة حول ترتيب البيانات التي يتم جلبها


المثال الأول

الإستعلام التالي يجلب معلومات أول ثلاثة موظفين في الجدول.

الإستعلام

      SELECT * FROM employees   -- employees أحضر جميع المعلومات المتوفرة في الجدول
      LIMIT 3;                  -- أحضر أول ثلاث أسطر تم إيجادها في الجدول
    

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

      SELECT * FROM employees   -- employees أحضر جميع المعلومات المتوفرة في الجدول
      LIMIT 0,3;                -- إبتداءاً من السطر رقم 0 و الذي هو نفسه السطر الأول أحضر أول 3 أسطر تم إيجادها في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12


المثال الثاني

الإستعلام التالي يجلب معلومات أول ثلاثة موظفين ولدوا عام 1990 أو بعده.

الإستعلام

      SELECT * FROM employees          -- employees أحضر جميع المعلومات المتوفرة في الجدول
      WHERE birthday >= '1990-01-01'   -- '1990-01-01' في السطر يملك تاريخ أكبر أو يساوي birthday بشرط أن يكون الحقل
      LIMIT 3;                         -- أحضر أول ثلاث أسطر تم إيجادها في الجدول
    

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

      SELECT * FROM employees          -- employees أحضر جميع المعلومات المتوفرة في الجدول
      WHERE birthday >= '1990-01-01'   -- '1990-01-01' في السطر يملك تاريخ أكبر أو يساوي birthday بشرط أن يكون الحقل
      LIMIT 0,3;                       -- إبتداءاً من السطر رقم 0 و الذي هو نفسه السطر الأول أحضر أول 3 أسطر تم إيجادها في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
4 Noura Jamali 0 845.00 1994-12-04


المثال الثالث

الإستعلام التالي يحضر أعلى راتب يتم إعطاؤه للموظف في الشركة.
الحيلة التي سنفعلها هنا للحصول على أعلى راتب هي ترتيب أسطر الجدول بشكل تنازلي ( أي من الأكبر إلى الأصغر ) على أساس الراتب و من ثم نعرض الراتب الموضوع في أول سطر لأنه حينها سيكون هو أعلى راتب في العامود كله.
ملاحظة: في هذا المثال بالتحديد كان بإمكان استخدام دالة إسمها MAX() للحصول على أعلى قيمة و لكن لا تشغل بالك بها لأنها ستمر معك لاحقاً في الدورة.

الإستعلام

      SELECT salary AS 'Highest Salary' -- و قمنا بإعطاء إسم للعامود salary هنا قمنا بتحديد أننا نريد قيم العامود
      FROM employees                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
      ORDER BY salary DESC              -- فقط من الأكبر إلى الأصغر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
      LIMIT 1;                          -- هنا قمنا بتحديد أننا نريد السطر الأول فقط الذي يرجعه هذا الإستعلام, أي القيمة الأولى التي سيتم إرجاعها
    

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

      SELECT salary AS 'Highest Salary' -- و قمنا بإعطاء إسم للعامود salary هنا قمنا بتحديد أننا نريد قيم العامود
      FROM employees                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
      ORDER BY salary DESC              -- فقط من الأكبر إلى الأصغر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
      LIMIT 0,1;                        -- هنا قمنا بتحديد أننا نريد السطر الأول فقط الذي يرجعه هذا الإستعلام, أي القيمة الأولى التي سيتم إرجاعها
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Highest Salary
1000.00


المثال الرابع

الإستعلام التالي يحضر أدنى راتب يتم إعطاؤه للموظف في الشركة.
الحيلة التي سنفعلها هنا للحصول على أدنى راتب هي ترتيب أسطر الجدول بشكل تصاعدي ( أي من الأصغر إلى الأكبر ) على أساس الراتب و من ثم نعرض الراتب الموضوع في أول سطر لأنه حينها سيكون هو أدنى راتب في العامود كله.
ملاحظة: في هذا المثال بالتحديد كان بإمكان استخدام دالة إسمها MIN() للحصول على أدنى قيمة و لكن لا تشغل بالك بها لأنها ستمر معك لاحقاً في الدورة.

الإستعلام

      SELECT salary AS 'Lowest Salary'  -- و قمنا بإعطاء إسم للعامود salary هنا قمنا بتحديد أننا نريد قيم العامود
      FROM employees                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
      ORDER BY salary                   -- فقط من الأصغر إلى الأكبر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
      LIMIT 1;                          -- هنا قمنا بتحديد أننا نريد السطر الأول فقط الذي يرجعه هذا الإستعلام, أي القيمة الأولى التي سيتم إرجاعها
    

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

      SELECT salary AS 'Lowest Salary'  -- و قمنا بإعطاء إسم للعامود salary هنا قمنا بتحديد أننا نريد قيم العامود
      FROM employees                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
      ORDER BY salary                   -- فقط من الأصغر إلى الأكبر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
      LIMIT 0,1;                        -- هنا قمنا بتحديد أننا نريد السطر الأول فقط الذي يرجعه هذا الإستعلام, أي القيمة الأولى التي سيتم إرجاعها
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Lowest Salary
700.00


المثال الخامس

الإستعلام التالي يحضر ثاني أعلى راتب يتم إعطاؤه للموظف في الشركة.
الحيلة التي سنفعلها هنا للحصول على ثاني أعلى راتب هي ترتيب أسطر الجدول بشكل تنازلي ( أي من الأكبر إلى الأصغر ) على أساس الراتب مع التأكد من أنه لا يوجد أي قيم مكررة في النتيجة و من ثم نعرض الراتب الموضوع في ثاني سطر لأنه حينها سيكون هو ثاني أعلى راتب في العامود كله.

الإستعلام

      SELECT DISTINCT salary AS 'Second Highest Salary' -- بدون وجود أي قيم مكررة و قمنا بإعطاء إسم للعامود salary هنا قمنا بتحديد أننا نريد قيم العامود
      FROM employees                                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
      ORDER BY salary DESC                              -- فقط من الأكبر إلى الأصغر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
      LIMIT 1,1;                                        -- إبتداءاً من السطر رقم 0 و الذي هو نفسه السطر الأول أحضر أول سطر تم إيجاده في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Second Highest Salary
920.00


المثال السادس

في حال أردت عرض أول أعلى ثلاث رواتب يمكنك وضع الإستعلامات التي كتبتها في الأمثلة السابقة نفسها بشكل متداخل و من ثم تجميعها بداخل أمر SELECT و هذا الأسلوب يسمى Sub Queries.

ملاحظة: لا تشغل بالك إطلاقاً بطريقة كتابة هذا الإستعلام لأنك ستتعلمه لاحقاً في الدورة و لكننا نريك المزيد من الإستخدامات للكلمة LIMIT ليس إلا.

الإستعلام

      -- الخارجي سيجلب كل الإستعلامات التي وضعناها بداخله و كل جدول يرجعوه سيتم وضعه كعامود فيه SELECT الأمر
      SELECT
      -- الإستعلام التالي يمثل أول عامود و القيمة التي ستوضع فيه
      (SELECT salary FROM employees ORDER BY salary DESC LIMIT 0,1) AS 'First Highest Salary',
      -- الإستعلام التالي يمثل ثاني عامود و القيمة التي ستوضع فيه
      (SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1,1) AS 'Second Highest Salary',
      -- الإستعلام التالي يمثل ثالث عامود و القيمة التي ستوضع فيه
      (SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 2,1) AS 'Third Highest Salary';
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

First Highest Salary Second Highest Salary Third Highest Salary
1000.00 920.00 900.00

مفهوم الحقول الفارغة

في البداية, المقصود بالحقول الفارغة ( Null Values ) هو أي حقل قيمته غير محددة بعد في الجدول كما سبق و رأينا.

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

طريقة إنشاء حقول لا يمكن أن تكون فارغة

في البداية سبق و تعاملنا مع هذا الأمر في قواعد البيانات التي كنا نجهزها في الدروس السابقة حيث كنا نضع في الجدول عامود إسمه id و من خصائصه أنه لا يمكن أن يكون فارغاً لدى أي سطر موضوع تحته و أنه يتم إعطاؤه ترقيم تلقائي.

الآن في حال أردت جعل العامود لا يسمح بأن يكون فيه أي حقول فارغة, يمكنك إضافة الكلمة NOT NULL عند تعريف العامود لحظة إنشاء الجدول.
عندها, حين تقوم بإدخال أي سطر في الجدول سيكون عليك إدخل قيمة لكل حقل لا يقبل أن يكون فارغاً و إلا فلن يسمح لك بإدخال السطر الذي كنت تريد إضافته.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه users يحتوي على بيانات 10 مستخدمين.

الجدول users يتألف من الحقول التالية:

  • id عبارة عن رقم يتم إعطاؤه بشكل تلقائي لكل سطر جديد يتم إضافته.

  • username يمثل إسم المستخدم و الذي يجب تحديده عند إضافة سطر جديد.

  • country يمثل بلد المستخدم, و الذي يمكن تحديده عند إضافة مستخدم جديد و يمكن تركه فارغاً.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 3 أعمدة users هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE users (
      id       INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      username VARCHAR(50) NOT NULL,
      country  VARCHAR(50)
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 مستخدمين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- مكان كل حقل لن نقوم بوضع قيمة فيه null بما أننا لم نحدد أسماء الأعمدة التي سنملأها لاحظ أننا مجبورين على وضع كلمة
      -- الموضوعة في بداية كل أمر سيتم إستبدالها بترقيم تلقائي من قبل قاعدة البيانات null و لا تنسى أن الكلمة
      INSERT INTO users VALUES (null, "rami", null);
      INSERT INTO users VALUES (null, "ahmad", null);
      INSERT INTO users VALUES (null, "hanan", "KSA");
      INSERT INTO users VALUES (null, "saly", "Lebanon");
      INSERT INTO users VALUES (null, "samir", null);
      INSERT INTO users VALUES (null, "hamad", "Syria");
      INSERT INTO users VALUES (null, "abdullah", null);
      INSERT INTO users VALUES (null, "rashed", "Oman");
      INSERT INTO users VALUES (null, "majed", "Yaman");
      INSERT INTO users VALUES (null, "rayan", null);
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول users.

id user country
1 rami NULL
2 ahmad NULL
3 hanan KSA
4 saly Lebanon
5 samir NULL
6 hamad Syria
7 abdullah NULL
8 rashed Oman
9 majed Yaman
10 rayan NULL

طريقة معرفة الحقول الفارغة

للتأكد ما إن كان الحقل يحتوي على قيمة أم أنه فارغ يجب استخدام العامل IS NULL أو العامل IS NOT NULL عند التشييك على قيمة الحقل.
لا تستخدم الرموز = و != و <> لمعرفة ما إن كان الحقل فارغاً لأنها تستخدم لهذا الغرض بل تستخدم لمقارنة القيم النصية و الرقمية و التواريخ فقط كما أشرنا سابقاً.


المثال الأول

الإستعلام التالي يقوم بعرض كل أسطر الجدول ما عدا الأسطر التي لا تملك قيمة في الحقل country.

الإستعلام

      SELECT * FROM users           -- users هنا قمنا بعرض جميع البيانات الموجودة في الجدول
      WHERE country IS NOT NULL;    -- فيه فارغاً country أي سطر سيتم عرضه يجب أن لا يكون الحقل
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه يوجد 5 مستخدمين معروفين من أي بلد, أي الحقل country عندهم ليس فارغاً.

id user country
3 hanan KSA
4 saly Lebanon
6 hamad Syria
8 rashed Oman
9 majed Yaman


المثال الثاني

الإستعلام التالي يقوم بعرض كل أسطر الجدول التي لا تملك قيمة في الحقل country.

الإستعلام

      SELECT * FROM users       -- users هنا قمنا بعرض جميع البيانات الموجودة في الجدول
      WHERE country IS NULL;    -- فيه فارغ country أي سطر سيتم عرضه يجب أن يكون الحقل
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه يوجد 5 مستخدمين غير معروفين من أي بلد, أي الحقل country عندهم فارغ.

id user country
1 rami NULL
2 ahmad NULL
5 samir NULL
7 abdullah NULL
10 rayan NULL

وضع قيم إفتراضية مكان الحقول الفارغة التي يتم جلبها

في حال كانت نتيجة الإستعلام تضمن حقول فارغة, يمكنك عرض كلمة يفهمها المستخدم بشكل أسهل مثل Not Specified أو Unknown أو غير محدد أو أي كلمة أخرى لها ذات المعنى.


الآن, لتبديل الحقول الفارغة التي قيمتها NULL عليك استخدام الدالة المخصصة في قاعدة البيانات لأجل هذا الغرض.

  • في قواعد بيانات MySQL نستخدم الدالة IFNULL() من أجل تبديل قيم الحقول الفارغة.

  • في قواعد بيانات SQL Server نستخدم الدالة ISNULL() من أجل تبديل قيم الحقول الفارغة.

  • في قواعد بيانات ORACLE نستخدم الدالة NVL() من أجل تبديل قيم الحقول الفارغة.

ملاحظة: في الأمثلة التالية إستخدمنا الدالة IFNULL() لأننا نطبق التمارين في قواعد بيانات MySQL.


مثال

الإستعلام التالي يقوم بعرض كل أسطر الجدول و يبدل أي قيمة فارغة في الحقل country بالكلمة 'unknown'.

الإستعلام

      SELECT
      id, username, IFNULL(country, 'Unknown') AS 'country'
      FROM
      users;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
نلاحظ أنه يوجد 5 مستخدمين تم وضع القيمة 'Unknown' لهم في الحقل country لأنه كان فارغاً عندهم.

id user country
1 rami Unknown
2 ahmad Unknown
3 hanan KSA
4 saly Lebanon
5 samir Unknown
6 hamad Syria
7 abdullah Unknown
8 rashed Oman
9 majed Yaman
10 rayan Unknown


ملاحظة

في المثال السابق قمنا بوضع الكلمة 'Unknown' كقيمة إفتراضية لأن الحقل يجب أن يحتوي على قيمة نصية في الأساس فكان وضع هذه القيمة مناسباً.
بينما لو كان الحقل في الأساس مخصص لقيم رقمية لكان الأفضل أن نضع 0 كقيمة إفتراضية.

الدالة MIN()

الدالة MIN() تستخدم للحصول على أصغر قيمة موجودة في العامود.
هذه الدالة مخصصة للتعامل مع الأرقام و التواريخ فقط بمعنى أنه يمكنك استخدامها لمعرفة أصغر رقم أو أصغر تاريخ موضوع في العامود.


الشكل العام لإستخدامها

    SELECT MIN(column_name)
    FROM table_name
    WHERE condition;
  

إذاً نستدعي الدالة MIN() مباشرةً بعد الكلمة SELECT.
إسم العامود الذي نريد الحصول على أصغر قيمة موجودة فيه نكتبه بين أقواس الدالة مكان الكلمة column_name.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 6 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE employees (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(20),
      is_married BOOLEAN,
      salary     DECIMAL(7,2),
      birthday   Date
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
      INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
      INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
      INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
      INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
      INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
      INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
      INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
      INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
      INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

أمثلة حول استخدام الدالة MIN()


المثال الأول

الإستعلام التالي يقوم بجلب أدنى راتب يتم إعطاؤه للموظف في الشركة.
أي سنعرض أصغر قيمة موجودة في العامود salary.

الإستعلام

      SELECT MIN(salary) AS 'Lowest Salary'   -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب أصغر قيمة في العامود
      FROM employees;                         -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Lowest Salary
700.00


المثال الثاني

الإستعلام التالي يقوم بجلب أقدم تاريخ ميلاد موضوع لموظف في الشركة.
أي سنعرض أقدم تاريخ موجود في العامود birthday.

الإستعلام

      SELECT MIN(birthday) AS 'Oldest Date'   -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة birthday هنا قمنا بجلب أقدم تاريخ في العامود
      FROM employees;                         -- birthday هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Oldest Date
1985-09-20

الدالة MAX()

الدالة MAX() تستخدم للحصول على أكبر قيمة موجودة في العامود.
هذه الدالة مخصصة للتعامل مع الأرقام و التواريخ فقط بمعنى أنه يمكنك استخدامها لمعرفة أكبر رقم أو أكبر تاريخ موضوع في العامود.


الشكل العام لإستخدامها

    SELECT MAX(column_name)
    FROM table_name
    WHERE condition;
  

إذاً نستدعي الدالة MAX() مباشرةً بعد الكلمة SELECT.
إسم العامود الذي نريد الحصول على أكبر قيمة موجودة فيه نكتبه بين أقواس الدالة مكان الكلمة column_name.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 6 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE employees (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(20),
      is_married BOOLEAN,
      salary     DECIMAL(7,2),
      birthday   Date
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
      INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
      INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
      INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
      INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
      INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
      INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
      INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
      INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
      INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

أمثلة حول استخدام الدالة MAX()


المثال الأول

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

الإستعلام

      SELECT MAX(salary) AS 'Highest Salary'   -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب أكبر قيمة في العامود
      FROM employees;                          -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Highest Salary
1000.00


المثال الثاني

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

الإستعلام

      SELECT MAX(birthday) AS 'Newest Date'   -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة birthday هنا قمنا بجلب أحدث تاريخ في العامود
      FROM employees;                         -- birthday هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Newest Date
1995-03-10

الدالة COUNT()

الدالة COUNT() تستخدم للحصول على عدد الحقول الغير فارغة الموجودة في العامود.
بشكل عام, نستخدم هذه الدالة لمعرفة إجمال عدد أسطر الجدول, أو لمعرفة عدد الأسطر التي تتوافق مع شرط محدد.


الشكل العام لإستخدامها

    SELECT COUNT(column_name)
    FROM table_name
    WHERE condition;
  

إذاً نستدعي الدالة COUNT() مباشرةً بعد الكلمة SELECT.
إسم العامود الذي نريد الحصول على عدد الحقول الغير فارغة الموجودة فيه نكتبه بين أقواس الدالة مكان الكلمة column_name.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه users يحتوي على بيانات 10 مستخدمين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 4 أعمدة users هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE users (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(50),
      country    VARCHAR(50)
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 مستخدمين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO users VALUES (null, "Rami", "Masri", "Lebanon");
      INSERT INTO users VALUES (null, "Ahmad", "Naji", "Syria");
      INSERT INTO users VALUES (null, "Hanan", "Mostafa", "KSA");
      INSERT INTO users VALUES (null, "Saly", "Harmush", null);
      INSERT INTO users VALUES (null, "Samir", "Saleh", null);
      INSERT INTO users VALUES (null, "Hamad", "Akel", "Syria");
      INSERT INTO users VALUES (null, "Abdullah", "Helmi", "Egypt");
      INSERT INTO users VALUES (null, "Rashed", "Masri", "Oman");
      INSERT INTO users VALUES (null, "Majed", "Alali", "Yaman");
      INSERT INTO users VALUES (null, "Rayan", "Kasabi", null);
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول users.

id first_name last_name country
1 Rami Masri Lebanon
2 Ahmad Naji Syria
3 Hanan Mostafa KSA
4 Saly Harmush NULL
5 Samir Saleh NULL
6 Hamad Akel Syria
7 Abdullah Helmi Egypt
8 Rashed Masri Oman
9 Majed Alali Yaman
10 Rayan Kasabi NULL

أمثلة حول استخدام الدالة COUNT()


المثال الأول

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

الإستعلام

      SELECT COUNT(id) AS 'Total Users'    -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة id هنا قمنا بجلب عدد القيم الموجودة في العامود
      FROM users;                          -- id هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

يمكنك وضع الرمز * مكان الحقل id و لكن هذا الأسلوب لا ينصح به.

      SELECT COUNT(*) AS 'Total Users'
      FROM users;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Total Users
10


المثال الثاني

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

الإستعلام

      SELECT COUNT(country) AS 'Total Countries'    -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة country هنا قمنا بجلب عدد القيم الموجودة في العامود
      FROM users;                                   -- country هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Total Countries
7


المثال الثالث

الإستعلام التالي يقوم بعرض إجمالي عدد البلدان المذكورة في عامود بلد المستخدمين مع عدم حساب نفس البلد أكثر من مرة.
ما فعلناه لحساب عدد البلدان المذكورة في عامود بلد المستخدمين country مع عدم حساب نفس البلد أكثر من مرة هو فلترة النتيجة العامود من أي تكرار باستخدام الكلمة DISTINCT قبل حساب كم حقل غير فارغ يوجد في العامود.

الإستعلام

      SELECT COUNT(DISTINCT country) AS 'Total Unique Countries'    -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة country هنا قمنا بجلب عدد القيم الموجودة في العامود
      FROM users;                                                   -- country هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
ملاحظة: عدد البلدان الغير مكررة هو 6 لأنه تم حساب البلد Syria مرة واحدة هذه المرة.

Total Unique Countries
6


المثال الرابع

الإستعلام التالي يقوم بعرض إجمالي عدد المستخدمين الذين أصلهم من سوريا.
ما فعلناه لحساب عدد المستخدمين هنا هو وضع شرط أن الحقل country يجب أن يساوي 'Syria' حتى يتم حسابه.
أي إذا لم تكن قيمة الحقل تساوي 'Syria' سيتم تجاهل الحقل كما يتم تجاهل الحقول الفارغة.

الإستعلام

      SELECT COUNT(country) AS 'Total Users From Syria'    -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة country هنا قمنا بجلب عدد القيم الموجودة في العامود
      FROM users                                           -- country هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
      WHERE country = 'Syria';                             -- حتى يتم حساب عدده 'Syria' يجب أن يساوي country هنا قمنا بتحديد أن 
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
ملاحظة: عدد المستخدمين الذين من سوريا هو 2 لأنه يوجد فقط مستخدمَين عندهما country يساوي 'Syria'.

Total Users From Syria
2

SQLحساب ناتج جمع قيم العامود بواسطة الدالة Sum()

الدالة SUM()

الدالة SUM() تستخدم للحصول على ناتج جمع قيم الحقول الغير فارغة الموجودة في العامود.
طبعاً يمكن استخدام هذه الدالة مع القيم الرقمية فقط.


الشكل العام لإستخدامها

    SELECT SUM(column_name)
    FROM table_name
    WHERE condition;
  

إذاً نستدعي الدالة SUM() مباشرةً بعد الكلمة SELECT.
إسم العامود الذي نريد الحصول على ناتج جمع القيم الرقمية الموجودة فيه نكتبه بين أقواس الدالة مكان الكلمة column_name.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 6 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE employees (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(20),
      is_married BOOLEAN,
      salary     DECIMAL(7,2),
      birthday   Date
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
      INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
      INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
      INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
      INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
      INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
      INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
      INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
      INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
      INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

أمثلة حول استخدام الدالة SUM()


المثال الأول

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

الإستعلام

      SELECT SUM(salary) AS 'Total Salaries ($)'    -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب ناتج جمع جميع القيم الموجودة في العامود
      FROM employees;                               -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Total Salaries ($)
8425.00


المثال الثاني

الإستعلام التالي يقوم بعرض إجمالي الرواتب التي يتم إعطاءها للموظفين المتزوجين كل شهر.
ما فعلناه لحساب إجمالي رواتب المتزوجين فقط هو وضع شرط أن الحقل is_married يجب أن يساوي 1 في السطر الذي سيتم حساب أخذ قيمة salary منه.
إذاً, في أي سطر لا تكون قيمة الحقل is_married تساوي 1 سيتم تجاهل الحقل salary الموضوعة في نفس السطر.

الإستعلام

      SELECT SUM(salary) AS 'Total Salaries For Married ($)'    -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب ناتج جمع جميع القيم الموجودة في العامود
      FROM employees                                            -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
      WHERE is_married = 1;                                     -- في ناتج الجمع salary يجب أن يساوي 1 حتى يتم حساب قيمة الحقل is_married هنا قمنا بتحديد أن الحقل
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Total Salaries For Married ($)
4550.00

الدالة AVG()

الدالة AVG() تستخدم للحصول على متوسط ( Average ) قيم الحقول الغير فارغة الموجودة في العامود.
طبعاً يمكن استخدام هذه الدالة مع القيم الرقمية فقط.


الشكل العام لإستخدامها

    SELECT AVG(column_name)
    FROM table_name
    WHERE condition;
  

إذاً نستدعي الدالة AVG() مباشرةً بعد الكلمة SELECT.
إسم العامود الذي نريد الحصول على متوسط القيم الرقمية الموجودة فيه نكتبه بين أقواس الدالة مكان الكلمة column_name.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 6 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE employees (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(20),
      is_married BOOLEAN,
      salary     DECIMAL(7,2),
      birthday   Date
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
      INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
      INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
      INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
      INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
      INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
      INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
      INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
      INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
      INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

أمثلة حول استخدام الدالة AVG()


المثال الأول

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

الإستعلام

      SELECT AVG(salary) AS 'Average Salary'    -- مع تغيير إسم العامود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود
      FROM employees;                           -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
ملاحظة: الرقم يظهر فيه أكثر من رقمين بعد الفاصلة لأن عمليات الجمع و القسمة التي أجرتها الدالة AVG() أدت إلى إرجاع النتيجة بالنوع FLOAT.

Average Salary
842.500000


المثال الثاني

الإستعلام التالي هو نفس الإستعلام السابق تماماً مع فرق واحد و هو أننا قمنا بتعديل شكل القيمة التي سيتم إرجاعها في النتيجة بواسطة الدالة FORMAT() حتى تظهر رقمين فقط بعد الفاصلة لتكون مشابهة للرواتب المخزنة في العامود salary.

الإستعلام

      SELECT FORMAT(AVG(salary), 2) AS 'Average Salary ($)'    -- مع تغيير شكل القيمة التي سترجع و إسم العامود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود
      FROM employees;                                          -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
    

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

Average Salary ($)
842.50


المثال الثالث

الإستعلام التالي يقوم بعرض متوسط الرواتب التي يتم إعطاءها للموظفين المتزوجين فقط كل شهر.
ما فعلناه لحساب متوسط رواتب المتزوجين فقط هو وضع شرط أن الحقل is_married يجب أن يساوي 1 في السطر الذي سيتم حساب أخذ قيمة salary منه.
إذاً, في أي سطر لا تكون قيمة الحقل is_married تساوي 1 سيتم تجاهل الحقل salary الموضوعة في نفس السطر. كما أننا قمنا بتعديل شكل القيمة التي سيتم إرجاعها في النتيجة بواسطة الدالة FORMAT() حتى تظهر رقمين فقط بعد الفاصلة لتكون مشابهة للرواتب المخزنة في العامود salary.

الإستعلام

      SELECT FORMAT(AVG(salary), 2) AS 'Average Salary ($)'    -- مع تغيير شكل القيمة التي سترجع و إسم العامود الذي سيتم عرضه في النتيجة salary هنا قمنا بجلب متوسط القيم الموجودة في العامود
      FROM employees                                           -- salary هنا قمنا بتحديد إسم الجدول الذي يحتوي على العامود
      WHERE is_married = 1;                                    -- في ناتج الجمع salary يجب أن يساوي 1 حتى يتم حساب قيمة الحقل is_married هنا قمنا بتحديد أن الحقل
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Average Salary For Married ($)
910.50

مفهوم التجميع

تجميع قيم الحقول المشتركة هو أمر مفيد جداً و يستخدم لإجراء إحصاءات على القيم المخزنة في الجداول.

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

لتحديد العامود الذي سيتم على أساسه تجميع قيم عامود آخر, نحدد العامود الأساسي باستخدام الكلمة GROUP BY.
بعد تجميع القيم تصبح قادر على استخدام الدوال COUNT() - MAX() - MIN() - SUM() - AVG() معهم.

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


الشكل العام لتجميع الحقول

إذا كنت ستجمع الحقول فقط, شكل الإستعلام سيكون كالتالي.

    SELECT column_name(s)
    FROM table_name
    GROUP BY column_name(s); 
  

إذا كنت ستجمع الحقول و تضع شروط على القيم التي سيتم تجميعها و ترتب النتيجة النهائية, شكل الإستعلام سيكون كالتالي.

    SELECT column_name(s)
    FROM table_name
    WHERE condition
    GROUP BY column_name(s)
    ORDER BY column_name(s); 
  

  • مكان الكلمة table_name نضع إسم الجدول الذي يحتوي على الحقول التي ننوي تجميعها و إجراء إحصاء عليها.

  • مكان الكلمة condition يمكننا وضع شروط على القيم التي سيتم تجميعها من الأساس.

  • بعد الكلمة GROUP BY نضع إسم كل عامود نريد أن يتم تجميع القيم بناءاً عليه.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 5 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE employees (
      id       INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      username VARCHAR(50) NOT NULL,
      gender   VARCHAR(20),
      country  VARCHAR(50),
      salary   DECIMAL(7,2)
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- مكان كل حقل لن نقوم بوضع قيمة فيه null بما أننا لم نحدد أسماء الأعمدة التي سنملأها لاحظ أننا مجبورين على وضع كلمة
      -- الموضوعة في بداية كل أمر سيتم إستبدالها بترقيم تلقائي من قبل قاعدة البيانات null و لا تنسى أن الكلمة
      INSERT INTO employees VALUES (null, "rami", "male", "Lebanon", 700);
      INSERT INTO employees VALUES (null, "ahmad", "male", "Syria", 800);
      INSERT INTO employees VALUES (null, "hanan", "female", "KSA", 750);
      INSERT INTO employees VALUES (null, "saly", "female", "Lebanon", 650);
      INSERT INTO employees VALUES (null, "samir", "male", "Egypt", 600);
      INSERT INTO employees VALUES (null, "hamad", "male", "KSA", 700);
      INSERT INTO employees VALUES (null, "abdullah", "male", "KSA", 800);
      INSERT INTO employees VALUES (null, "rashed", "male", "Oman", 900);
      INSERT INTO employees VALUES (null, "majed", "male", "Yaman", 820);
      INSERT INTO employees VALUES (null, "malak", "female", "Morocco", 860);
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id user gender country salary
1 rami male Lebanon 700.00
2 ahmad male Syria 800.00
3 hanan female KSA 750.00
4 saly female Lebanon 650.00
5 samir male Egypt 600.00
6 hamad male KSA 700.00
7 abdullah male KSA 800.00
8 rashed male Oman 900.00
9 majed male Yaman 820.00
10 malak female Morocco 860.00

أمثلة حول تجميع قيم الأعمدة


المثال الأول

الإستعلام التالي يقوم بتجميع أسماء البلدان الموجودة في جدول الموظفين.

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

ملاحظة: في هذا المثال بالتحديد كان من الأفضل و الأسهل إستخدام الكلمة DISTINCT بدلاً منها لأنها ستعطينا نفس النتيجة و لكن هدفنا الآن تعليمك كيف تستخدم GROUP BY خطوة خطوة لهذا وضعنا هذا المثال البسيط.

الإستعلام

      SELECT country
      FROM employees
      GROUP BY country;
    

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

      SELECT DISTINCT country
      FROM employees;
    

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

country
Egypt
KSA
Lebanon
Morocco
Oman
Syria
Yaman


المثال الثاني

الإستعلام التالي يقوم بحساب كم موظف موجود في كل بلد مذكور في جدول الموظفين.

ما فعلناه لإجراء هذا الإحصاء هو تجميع أسماء البلدان الموجودة في الحقل country بواسطة الكلمة GROUP BY.
بعدها قمنا باستخدام الدالة COUNT() لحساب عدد الموظفين الموجودين في كل مجموعة, أي الموظفين الذين عندهم نفس قيمة الحقل country.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      SELECT country, COUNT(id)   -- country يوجد سيتم حساب عدده بعد أن يتم تجميع قيم الحقل id إحصاء كم
      FROM employees
      GROUP BY country;           -- على أساسهم COUNT() سيتم تنفيذ الدالة country بعد أن يتم تجميع القيم الموجودة في العامود
    

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

      SELECT country AS 'country', COUNT(id) AS 'Number of Employees'
      FROM employees
      GROUP BY country;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام الذي غيّرنا أسماء أعمدته.
لاحظ أنه يوجد ثلاث موظفين من KSA و إثنين من Lebanon و باقي الدول يوجد واحد فيها.

Country Number of Employees
Egypt 1
KSA 3
Lebanon 2
Morocco 1
Oman 1
Syria 1
Yaman 1


المثال الثالث

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

ما فعلناه لإجراء هذا الإحصاء هو تجميع جنس الموظفين الموجود في الحقل gender بواسطة الكلمة GROUP BY.
بعدها قمنا باستخدام الدالة COUNT() لحساب عدد الموظفين الموجودين في كل مجموعة, أي عدد الموظفين الذين عندهم نفس قيمة الحقل gender.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      SELECT gender, COUNT(id)   -- gender يوجد في كل مجموعة, سيتم حسابه بعد تجميع قيم العامود id إحصاء كم
      FROM employees
      GROUP BY gender;           -- على أساسهم COUNT() سيتم تنفيذ الدالة gender بعد أن يتم تجميع القيم الموجودة في العامود
    

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

      SELECT gender AS 'Gender', COUNT(id) AS 'Number of Employees'
      FROM employees
      GROUP BY gender;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام الذي غيّرنا أسماء أعمدته.

Gender Number of Employees
female 3
male 7


المثال الرابع

الإستعلام التالي يقوم بحساب متوسط الرواتب الذي يتم دفعه للموظفين من كل بلد.

ما فعلناه لإجراء هذا الإحصاء هو تجميع أسماء البلدان الموجودة في الحقل country بواسطة الكلمة GROUP BY.
بعدها قمنا باستخدام الدالة AVG() لحساب متوسط رواتب الموظفين الموجودين في كل مجموعة, أي متوسط الموظفين الذين عندهم نفس قيمة الحقل country.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      SELECT country, AVG(salary)   -- country سيتم حسابه بعد أن يتم تجميع قيم الحقل salary متوسط الحقول
      FROM employees
      GROUP BY country;             -- على أساسهم AVG() سيتم تنفيذ الدالة country بعد أن يتم تجميع القيم الموجودة في العامود
    

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

      SELECT
      country AS 'country',
      FORMAT(AVG(salary), 2) AS 'Average Salary'
      FROM
      employees
      GROUP BY
      country;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام الذي غيّرنا أسماء أعمدته.

Country Average Salary
Egypt 600.00
KSA 750.00
Lebanon 675.00
Morocco 860.00
Oman 900.00
Syria 800.00
Yaman 820.00


المثال الخامس

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

ما فعلناه لإجراء هذا الإحصاء هو تجميع أسماء البلدان الموجودة في الحقل country بواسطة الكلمة GROUP BY.
بعدها قمنا باستخدام الدالة COUNT() لحساب عدد الموظفين الموجودين في كل مجموعة و الدالة SUM() لحساب مجموع الرواتب التي يتم إعطاءها لكل مجموعة, أي الموظفين الذين عندهم نفس قيمة الحقل country سيتم حساب عددهم مجموع مرتبهم بشكل خاص.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      SELECT country, COUNT(id), SUM(salary)   -- country يوجد في كل مجموعة, و كم هو مجموع الرواتب التي يتم دفعها لكل مجموعة سيتم حسابهم بعد تجميع قيم العامود id إحصاء كم
      FROM employees
      GROUP BY country;                        -- على أساسهم SUM() و COUNT() سيتم تنفيذ الدالتين country بعد أن يتم تجميع القيم الموجودة في العامود
    

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

      SELECT
      country AS 'country',
      COUNT(id) AS 'Number of Employees',
      SUM(salary) AS 'Total Salary',
      FROM
      employees
      GROUP BY
      country;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام الذي غيّرنا أسماء أعمدته.

Country Number of Employees Total Salary
Egypt 1 600.00
KSA 3 2250.00
Lebanon 2 1350.00
Morocco 1 860.00
Oman 1 900.00
Syria 1 800.00
Yaman 1 820.00


المثال السادس

الإستعلام التالي يقوم بتجميع الموظفين مرتين قبل إجراء الإحصاء على النحو التالي:

  • أول مرة يجمع الموظفين على حسب بلدانهم.

  • ثاني مرة يجمع الموظفين المنتمين لنفس البلد على حسب جنسهم.

بعدها يقوم بحساب عدد الموظفين في كل بلد و حسب جنسهم.

ما فعلناه لإجراء هذا الإحصاء هو تجميع أسماء البلدان الموجودة في الحقل country و أسماء الأجناس المذكورة في الحقل gender بواسطة الكلمة GROUP BY.
بعدها قمنا باستخدام الدالة COUNT() لحساب عدد الموظفين الموجودين في نفس البلد و الذين عندهم نفس الجنس, أي الموظفين الذين عندهم نفس قيمة الحقل country و نفس قيمة الحقل gender سيتم حساب عددهم بشكل خاص.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      SELECT country, gender, COUNT(id)   -- gender و country يوجد في كل مجموعة سيتم حسابه بعد تجميع قيم العامودين id إحصاء كم
      FROM employees
      GROUP BY country, gender;           -- على أساسهم COUNT() سيتم تنفيذ الدالة gender و من ثم في العامود country بعد أن يتم تجميع القيم الموجودة في العامود
    

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

      SELECT 
      country AS 'Country',
      gender AS 'Gender',
      COUNT(id) AS 'Number of Employees'
      FROM
      employees
      GROUP BY
      country, gender;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام الذي غيّرنا أسماء أعمدته.
لاحظ أنه في حال كان يوجد بلد فيه موظفين ذكور و إناث فإن إسم البلد يظهر مرتين حتى يفصل لك عدد الذكور عن عدد الإناث.

Country Gender Number of Employees
Egypt male 1
KSA female 1
KSA male 2
Lebanon female 1
Lebanon male 1
Morocco female 1
Oman male 1
Syria male 1
Yaman male 1

النتيجة التي حصلنا عليها نقرأها كالتالي:

  • هناك موظف واحد من Egypt

  • هناك ثلاث موظفين من KSA إثنين ذكور و أنثى واحدة.

  • هناك موظفَين من Lebanon و هما ذكر واحد و أنثى واحدة.

  • هناك موظفة واحدة من Morocco

  • هناك موظف واحد من Oman

  • هناك موظف واحد من Syria

  • هناك موظف واحد من Yaman



المثال السابع

الإستعلام التالي يقوم بحساب عدد الموظفين الذكور فقط في كل بلد مذكور في الجدول.

ما فعلناه لإجراء هذا الإحصاء تحديد أن قيمة gender يجب أن تكون 'male' في أي سطر سيتم جلب إسم البلد منه.
بعدها قمنا بتجميع أسماء البلدان الموجودة في الحقل country بواسطة الكلمة GROUP BY.
في النهاية قمنا باستخدام الدالة COUNT() لحساب عدد الموظفين الموجودين في كل مجموعة, أي الموظفين الذين عندهم نفس قيمة الحقل country و عندهم gender يساوي 'male'.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      SELECT country, COUNT(id)   -- country يوجد سيتم حساب عدده بعد أن يتم تجميع قيم الحقل id إحصاء كم
      FROM employees
      WHERE gender = 'male'       -- 'male' يساوي gender سيتم وضعه في المجموعة يجب أن يكون السطر الذي تم جلبه منه عنده الحقل country أي
      GROUP BY country;           -- على أساسهم COUNT() سيتم تنفيذ الدالة country بعد أن يتم تجميع القيم الموجودة في العامود
    

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

      SELECT country AS 'country', COUNT(id) AS 'Number of Male Employees'
      FROM employees
      WHERE gender = 'male'
      GROUP BY country;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام الذي غيّرنا أسماء أعمدته.
لاحظ أنه يوجد ثلاث موظفين من KSA و إثنين من Lebanon و باقي الدول يوجد واحد فيها.

Country Number of Male Employees
Egypt 1
KSA 2
Lebanon 1
Oman 1
Syria 1
Yaman 1

مفهوم وضع الشروط على الحقول التي تم تجميعها

في البداية المقصود من هذا الأمر هو وضع شروط على النتيجة التي سنحصل عليها بعد أن قمنا بتجميع الحقول و إجراء إحصاء ما.
بمعنى أخر, بعد أن تقوم بتجميع قيم الحقول بواسطة الكلمة GROUP BY يمكنك وضع شرط لفلترة النتيجة التي تم تجميعها أيضاً.

كمثال بسيط عن الحاجة لإعادة الفلترة بعد تجميع القيم, في حال كنت تريد إجراء إحصاء لمعرفة متوسط رواتب موظفي الشركة في كل بلد, و بعد معرفة متوسط الرواتب في كل بلد تريد معرفة أي بلدان تعطي موظفيها متوسط راتب يتجاوز 800 دولار.

لفلترة النتيجة التي حصلنا عليها بالأساس بعد أن قمنا بتجميع الحقول بواسطة الكلمة GROUP BY نضع الكلمة HAVING و بعدها الشرط الذي سيقوم بفلترة النتيجة أكثر.


الشكل العام لتجميع الحقول

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

    SELECT column_name(s)
    FROM table_name
    GROUP BY column_name(s)
    HAVING condition;
  

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

    SELECT column_name(s)
    FROM table_name
    WHERE condition
    GROUP BY column_name(s)
    HAVING condition
    ORDER BY column_name(s);
  

  • مكان الكلمة table_name نضع إسم الجدول الذي يحتوي على الحقول التي ننوي تجميعها و إجراء إحصاء عليها.

  • بعد الكلمة WHERE يمكننا وضع شروط على القيم التي سيتم تجميعها من الأساس.

  • بعد الكلمة HAVING يمكننا وضع شروط لفلترة النتيجة النهائية التي سيتم إرجاعها.

  • بعد الكلمة GROUP BY نضع إسم كل عامود نريد أن يتم تجميع القيم بناءاً عليه.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 5 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE employees (
      id       INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      username VARCHAR(50) NOT NULL,
      gender   VARCHAR(20),
      country  VARCHAR(50),
      salary   DECIMAL(7,2)
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- مكان كل حقل لن نقوم بوضع قيمة فيه null بما أننا لم نحدد أسماء الأعمدة التي سنملأها لاحظ أننا مجبورين على وضع كلمة
      -- الموضوعة في بداية كل أمر سيتم إستبدالها بترقيم تلقائي من قبل قاعدة البيانات null و لا تنسى أن الكلمة
      INSERT INTO employees VALUES (null, "rami", "male", "Lebanon", 700);
      INSERT INTO employees VALUES (null, "ahmad", "male", "Syria", 800);
      INSERT INTO employees VALUES (null, "hanan", "female", "KSA", 750);
      INSERT INTO employees VALUES (null, "saly", "female", "Lebanon", 650);
      INSERT INTO employees VALUES (null, "samir", "male", "Egypt", 600);
      INSERT INTO employees VALUES (null, "hamad", "male", "KSA", 700);
      INSERT INTO employees VALUES (null, "abdullah", "male", "KSA", 800);
      INSERT INTO employees VALUES (null, "rashed", "male", "Oman", 900);
      INSERT INTO employees VALUES (null, "majed", "male", "Yaman", 820);
      INSERT INTO employees VALUES (null, "malak", "female", "Morocco", 860);
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id user gender country salary
1 rami male Lebanon 700.00
2 ahmad male Syria 800.00
3 hanan female KSA 750.00
4 saly female Lebanon 650.00
5 samir male Egypt 600.00
6 hamad male KSA 700.00
7 abdullah male KSA 800.00
8 rashed male Oman 900.00
9 majed male Yaman 820.00
10 malak female Morocco 860.00

أمثلة حول وضع شروط بعد تجميع قيم الأعمدة


المثال الأول

الإستعلام التالي يقوم بعرض متوسط الرواتب الذي يتم دفعه للموظفين من كل بلد.

ما فعلناه لإجراء هذا الإحصاء هو تجميع أسماء البلدان الموجودة في الحقل country بواسطة الكلمة GROUP BY.
بعدها قمنا باستخدام الدالة AVG() لحساب متوسط رواتب الموظفين الموجودين في كل مجموعة, أي متوسط الموظفين الذين عندهم نفس قيمة الحقل country.

ملاحظة: في هذا الإستعلام لم نقم بفلترة النتيجة التي سترجع بل عرضناها كما هي.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      SELECT country, AVG(salary)   -- country سيتم حسابه بعد أن يتم تجميع قيم الحقل salary متوسط الحقول
      FROM employees
      GROUP BY country;             -- على أساسهم AVG() سيتم تنفيذ الدالة country بعد أن يتم تجميع القيم الموجودة في العامود
    

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

      SELECT
      country AS 'country',
      FORMAT(AVG(salary), 2) AS 'Average Salary'
      FROM
      employees
      GROUP BY
      country;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام الذي غيّرنا أسماء أعمدته.

Country Average Salary
Egypt 600.00
KSA 750.00
Lebanon 675.00
Morocco 860.00
Oman 900.00
Syria 800.00
Yaman 820.00


المثال الثاني

الإستعلام التالي يقوم بعرض متوسط الرواتب الذي يتم دفعه للموظفين من كل بلد و الذي يتجاوز 800 دولار.

ما فعلناه لإجراء هذا الإحصاء هو تجميع أسماء البلدان الموجودة في الحقل country بواسطة الكلمة GROUP BY.
بعدها قمنا باستخدام الدالة AVG() لحساب متوسط رواتب الموظفين الموجودين في كل مجموعة, أي متوسط الموظفين الذين عندهم نفس قيمة الحقل country.
بعدها قمنا بفلترة النتيجة لعرض متوسط البلدان التي يتجاوز متوسط رواتب الموظفين فيها 800$, و فعلنا ذلك من خلال وضع شرط بواسطة الكلمة HAVING حددنا فيه أننا نريد عرض الأسطر التي فيها salary أكبر من 800.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      SELECT country, AVG(salary)   -- country سيتم حسابه بعد أن يتم تجميع قيم الحقل salary متوسط الحقول
      FROM employees
      GROUP BY country              -- على أساسهم AVG() سيتم تنفيذ الدالة country بعد أن يتم تجميع القيم الموجودة في العامود
      HAVING AVG(salary) > 800;     -- أكبر من 800 فقط salary النتيجة النهائية سيتم عرض الأسطر التي تحتوي على متوسط
    

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

      SELECT
      country AS 'Country',
      FORMAT(AVG(salary), 2) AS 'Average Salary'
      FROM
      employees
      GROUP BY
      country
      HAVING
      AVG(salary) > 800;
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام الذي غيّرنا أسماء أعمدته.

Country Average Salary
Morocco 860.00
Oman 900.00
Yaman 820.00

طريقة نسخ البيانات من جدول لآخر

نسخ البيانات من جدول لآخر أمر سهل للغاية لأنه مجرد دمج للأمر SELECT الذي نستخدمه للحصول على البيانات من الجداول مع الأمر INSERT INTO الذي نستخدمه لإضافة البيانات في أي جدول.

لنسخ البيانات من جدول لآخر يجب أن يكون نوع الأعمدة التي سيتم النسخ منها متطابق مع نوع الأعمدة التي سيتم النسخ إليها.

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

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


الشكل العام لتجميع الحقول

إذا كان الجدولين متطابقين في الشكل, شكل الإستعلام سيكون كالتالي.

    INSERT INTO table2
    SELECT * FROM table1
    WHERE condition;
  

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

    INSERT INTO table2 (column1, column2, column3, ...)
    SELECT column1, column2, column3, ...
    FROM table1
    WHERE condition;
  

  • مكان الكلمة table1 نضع إسم الجدول الذي سننسخ البيانات منها.

  • مكان الكلمة table2 نضع إسم الجدول الذي سننسخ البيانات فيه.

  • بعد الكلمة WHERE يمكننا وضع شروط لتحديد القيم التي سيتم نسخها من الجدول table1.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها التالي:

  • جدول إسمه table1 يحتوي على بيانات 5 أسطر.

  • جدول إسمه table2 شكله مطابق تماماً للجدول table1 و لكنه فارغ.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 5 أعمدة table1 هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE table1 (
      id       INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      username VARCHAR(50) NOT NULL,
      gender   VARCHAR(20),
      country  VARCHAR(50),
      salary   DECIMAL(7,2)
      );

      -- table1 أعمدته متطابقة مع أعمدة الجدول table2 هنا قمنا بإنشاء جدول جديد إسمه
      -- أيضاً لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE table2 (
      id       INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      username VARCHAR(50) NOT NULL,
      gender   VARCHAR(20),
      country  VARCHAR(50),
      salary   DECIMAL(7,2)
      );

      -- table1 هنا قمنا بإضافة 5 أسطر في الجدول
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- مكان كل حقل لن نقوم بوضع قيمة فيه null بما أننا لم نحدد أسماء الأعمدة التي سنملأها لاحظ أننا مجبورين على وضع كلمة
      -- الموضوعة في بداية كل أمر سيتم إستبدالها بترقيم تلقائي من قبل قاعدة البيانات null و لا تنسى أن الكلمة
      INSERT INTO table1 VALUES (null, "rami", "male", "Lebanon", 700);
      INSERT INTO table1 VALUES (null, "ahmad", "male", "Syria", 800);
      INSERT INTO table1 VALUES (null, "hanan", "female", "KSA", 750);
      INSERT INTO table1 VALUES (null, "saly", "female", "Lebanon", 650);
      INSERT INTO table1 VALUES (null, "samir", "male", "Egypt", 600);
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدولين table1 و table2 بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول table1.

id user gender country salary
1 rami male Lebanon 700.00
2 ahmad male Syria 800.00
3 hanan female KSA 750.00
4 saly female Lebanon 650.00
5 samir male Egypt 600.00

شكل الجدول table2 الذي لا يحتوي على أي بيانات.

id user gender country salary

أمثلة حول نسخ البيانات من جدول و إضافتها في جدول آخر


المثال الأول

الإستعلام التالي يقوم بنسخ كل القيم الموجودة في الجدول table1 و يضيفها في الجدول table2 و من ثم يقوم بعرض البيانات التي وضعها في الجدول table2.

الإستعلام

      INSERT INTO table2       -- table2 هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في الجدول
      SELECT * FROM table1;    -- table1 هنا قمنا بتحديد أنه سيتم نسخ كل بيانات الجدول

      SELECT * FROM table2;    -- table2 هنا قمنا بعرض كل البيانات التي أصبح يحتويها الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
لاحظ أن الجدول table2 أصبح يحتوي على نفس البيانات الموجودة في الجدول table1.

id user gender country salary
1 rami male Lebanon 700.00
2 ahmad male Syria 800.00
3 hanan female KSA 750.00
4 saly female Lebanon 650.00
5 samir male Egypt 600.00

إنتبه

بالنسبة للحقل id فقد تم نسخ قيمه أيضاً لأن الجدول table2 لم يكن يتضمن أي قيمة مشابهة و لو كان يتضمن قيمة واحدة مشابهة لما تنفذ الإستعلام.

إذاً في حال حاولت تنفيذ الإستعلام السابق مجدداً بهدف إضافة كل قيم الجدول table1 من جديد في الجدول table2 سيظهر لك خطأ يخبرك بأنه لا يمكن تنفيذ الإستعلام لأنه من أول سطر حاولت إضافته إتضح لهم أن رقم التعرفة id الذي تحاول إضافته في الجدول table2 هو رقم موجود في الأساس به.

إذا قمت بتنفيذ الإستعلام السابق من جديد سيظهر لك الخطأ Duplicate entry '1' for key 'PRIMARY' و الذي يعني ما قلناه بالضبط.



المثال الثاني

الإستعلام التالي يقوم بنسخ كل القيم الموجودة في الجدول table1 باستثناء القيم الموضوعة في العامود id.

ما فعلناه هنا, هو ترك قاعدة البيانات تقوم بإعطاء أرقام تعرفة id لوحدها بشكل تلقائي لكل سطر يتم إضافته لأن نوع العامود بالأساس هو AUTO_INCREMENT و هكذا سنتمكن من نسخ كل القيم من جديد في الجدول table2 بدون أي مشاكل.

الإستعلام

الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

      INSERT INTO table2(username, gender, country, salary)   -- table2 هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في أعمدة محددة في الجدول
      SELECT username, gender, country, salary FROM table1;   -- table1 هنا قمنا بتحديد أنه سيتم نسخ بيانات أعمدة محددة من الجدول

      SELECT * FROM table2;    -- table2 هنا قمنا بعرض كل البيانات التي أصبح يحتويها الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
لاحظ أن الجدول table2 تم إضافة بيانات الجدول table1 فيه من جديد و لكن هذه المرة تم إعطاء رقم تعرفة id مختلف لكل سطر بشكل تلقائي.

id user gender country salary
1 rami male Lebanon 700.00
2 ahmad male Syria 800.00
3 hanan female KSA 750.00
4 saly female Lebanon 650.00
5 samir male Egypt 600.00
6 rami male Lebanon 700.00
7 ahmad male Syria 800.00
8 hanan female KSA 750.00
9 saly female Lebanon 650.00
10 samir male Egypt 600.00


المثال الثالث

الإستعلام التالي يقوم بنسخ القيم الموجودة في العامودين username و country من الجدول table1 و يضيفها في الجدول table2 و من ثم يقوم بعرض البيانات التي أصبح يحتويها الجدول table2.

الإستعلام

      INSERT INTO table2(username, country)   -- table2 هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في أعمدة محددة في الجدول
      SELECT username, country FROM table1;   -- table1 هنا قمنا بتحديد أنه سيتم نسخ بيانات أعمدة محددة من الجدول

      SELECT * FROM table2;                   -- table2 هنا قمنا بعرض كل البيانات التي أصبح يحتويها الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
لاحظ أن الجدول table2 أضيف عليه بيانات الأعمدة التي تم تحديدها فقط من الجدول table1 و الأعمدة الأخرى يظهر فيها القيمة NULL.

id user gender country salary
1 rami male Lebanon 700.00
2 ahmad male Syria 800.00
3 hanan female KSA 750.00
4 saly female Lebanon 650.00
5 samir male Egypt 600.00
6 rami male Lebanon 700.00
7 ahmad male Syria 800.00
8 hanan female KSA 750.00
9 saly female Lebanon 650.00
10 samir male Egypt 600.00
11 rami NULL Lebanon NULL
12 ahmad NULL Syria NULL
13 hanan NULL KSA NULL
14 saly NULL Lebanon NULL
15 samir NULL Egypt NULL

مفهوم القيم الإفتراضية لكل حالة

أحياناً, بعد جلب البيانات من الجداول قد تكون بحاجة لعرض قيم أخرى بدلاً من البيانات نفسها.
مثلاً في حال قمت ببناء قاعدة بيانات لمدرسة و فيها قمت بحفظ علامات الطلاب لكل مادة.
الآن, في حال أردت عرض علامات الطلاب في مادة معينة, قد تقوم بعرضها بشكل مختلف عن الشكل الذي حفظتها فيه كالتالي:

  • A في حال كانت علامة الطالب بين 90 و 100.

  • B في حال كانت علامة الطالب بين 89 و 80.

  • C في حال كانت علامة الطالب بين 79 و 70.

  • D في حال كانت علامة الطالب بين 69 و 60.

  • F في حال كانت علامة الطالب بين 59 و 0.

  • Error إذا لم تكن علامة الطالب بين 0 و 100.

إذاً في هذه الحالة سنضع قائمة من الإحتمالات على العامود الذي سيتم فيه عرض علامات الطلاب حتى نعرض الحرف المناسب بناءاً عليها.

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


الشكل العام لوضع قائمة إحتمالات على أي عامود

    CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
    END;
  

  • لوضع قائمة من القيم الإفتراضية التي سيتم وضعها مكان قيم العامود الأصلية, نضع الكلمتين CASE و End في المكان الذي كنا ننوي فيه عرض قيم العامود.

  • أي شرط تريد وضعه على قيم العامود, تضع قبله الكلمة WHEN و بعده الكلمة THEN التي تضع من بعدها القيمة التي سيتم وضعها في حال تحقق الشرط.

  • إذا أردت وضع قيمة إفتراضية يتم وضعها في حال لم يتطابق أي شرط, فيمكنك وضع الكلمة ELSE و وضع القائمة الإفتراضية بعدها.


ملاحظة

عند وضع قائمة إحتمالات, تأكد من وضع إحتمالات لكل القيم, لأنه في حال مرور قيمة لا توجد إطلاقاً ضمن قائمة الإحتمالات الموضوعة, سيتم وضع القيمة Null مكانها في النتيجة النهائية.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من ستة أعمدة students هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE students (
      id   INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(50),
      math INT
      );

      -- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 طلاب
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO students VALUES (null, "Ahmad", 82);
      INSERT INTO students VALUES (null, "Rami", 87);
      INSERT INTO students VALUES (null, "Said", 73);
      INSERT INTO students VALUES (null, "Noura", 92);
      INSERT INTO students VALUES (null, "Amani", 78);
      INSERT INTO students VALUES (null, "Mhamad", 65);
      INSERT INTO students VALUES (null, "Ahmad", 45);
      INSERT INTO students VALUES (null, "Mostafa", 95);
      INSERT INTO students VALUES (null, "Jana", 68);
      INSERT INTO students VALUES (null, "Houssam", 120);
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول students بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول students.

id name math
1 Ahmad 82
2 Rami 87
3 Said 73
4 Noura 92
5 Amani 78
6 Mhamad 65
7 Ahmad 45
8 Mostafa 95
9 Jana 68
10 Houssam 120

أمثلة حول وضع حالات للقيم التي سترجع


المثال الأول

الإستعلام التالي يقوم بعرض id كل طالب, name كل طالب, بالإضافة إلى ما إن كان الطالب ناجح في مادة الرياضيات أم لا.

طباعة ما إن كان الطلاب ناجح في المادة أم لا وضعناها كالتالي:

  • إذا كانت العلامة بين 60 و 100 فعندها يعتبر ناجحاً.

  • إذا كانت العلامة بين 0 و 59 فعندها يعتبر راسباً.

  • غير ذلك, هناك خطأ في العلامة المدخلة و يجب مراجعة الأستاذ.

الإستعلام

      SELECT                 -- لجلب بيانات من جدول SELECT هنا قمنا باستخدام الأمر
      id AS 'Id',        -- هنا قمنا بتحديد أول عامود سيتم عرض قيمه مع تغيير إسم العامود
      name AS 'Name',    -- هنا قمنا بتحديد ثاني عامود سيتم عرض قيمه مع تغيير إسم العامود
      CASE               -- هنا قمنا بتحديد ما سيتم عرضه في العامود الثالث, سيتم عرض قيمه من القائمة التالية
      WHEN math BETWEEN 60 AND 100 THEN 'Passed'   -- 'Passed' بين 60 و 100 سيتم وضع القيمة math إذا كانت قيمة الحقل
      WHEN math BETWEEN 0  AND 59  THEN 'Failed'   -- 'Failed' بين 0 و 59 سيتم وضع القيمة math إذا كانت قيمة الحقل
      ELSE 'Refer to Professor'                    -- 'Refer to Professor' أي قيمة أخرى, سيتم وضع الجملة math إذا كانت قيمة الحقل
      END AS 'Math Note'                               -- هنا قمنا بتغيير إسم العامود
      FROM
      students;          -- هنا قمنا بتحديد إسم الجدول الذي سيتم جلب البيانات منه
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Id Name Math Note
1 Ahmad Passed
2 Rami Passed
3 Said Passed
4 Noura Passed
5 Amani Passed
6 Mhamad Passed
7 Ahmad Failed
8 Mostafa Passed
9 Jana Passed
10 Houssam Refer to Professor


المثال الثاني

الإستعلام التالي يقوم بعرض معلومات الطالب كما هي, و علامة مادة الرياضيات math يعرضها مرة ثانية على شكل أحرف كالتالي:

  • A في حال كانت علامة الطالب بين 90 و 100.

  • B في حال كانت علامة الطالب بين 89 و 80.

  • C في حال كانت علامة الطالب بين 79 و 70.

  • D في حال كانت علامة الطالب بين 69 و 60.

  • F في حال كانت علامة الطالب بين 59 و 0.

  • Error إذا لم تكن علامة الطالب بين 0 و 100.

الإستعلام

      SELECT                           -- لجلب بيانات من جدول SELECT هنا قمنا باستخدام الأمر
      id AS 'Id',                  -- هنا قمنا بتحديد أول عامود سيتم عرض قيمه مع تغيير إسم العامود
      name AS 'Name',              -- هنا قمنا بتحديد ثاني عامود سيتم عرض قيمه مع تغيير إسم العامود
      math AS 'Math (Percent)',    -- هنا قمنا بتحديد ثالث عامود سيتم عرض قيمه مع تغيير إسم العامود
      CASE                         -- هنا قمنا بتحديد ما سيتم عرضه في العامود الرابع, سيتم عرض قيمه من القائمة التالية
      WHEN math BETWEEN 90 AND 100 THEN 'A'    -- 'A' بين 90 و 100 سيتم وضع الحرف math إذا كانت قيمة الحقل
      WHEN math BETWEEN 80 AND 89  THEN 'B'    -- 'B' بين 80 و 89 سيتم وضع الحرف math إذا كانت قيمة الحقل
      WHEN math BETWEEN 70 AND 79  THEN 'C'    -- 'C' بين 70 و 79 سيتم وضع الحرف math إذا كانت قيمة الحقل
      WHEN math BETWEEN 60 AND 69  THEN 'D'    -- 'D' بين 60 و 69 سيتم وضع الحرف math إذا كانت قيمة الحقل
      WHEN math BETWEEN 0  AND 59  THEN 'E'    -- 'E' بين 0 و 59 سيتم وضع الحرف math إذا كانت قيمة الحقل
      ELSE 'Refer to Professor'                -- 'Refer to Professor' أي قيمة أخرى, سيتم وضع الجملة math إذا كانت قيمة الحقل
      END AS 'Math (Letter)'                       -- هنا قمنا بتغيير إسم العامود
      FROM
      students;                    -- هنا قمنا بتحديد إسم الجدول الذي سيتم جلب البيانات منه
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

Id Name Math (Percent) Math (Letter)
1 Ahmad 82 B
2 Rami 87 B
3 Said 73 C
4 Noura 92 A
5 Amani 78 C
6 Mhamad 65 D
7 Ahmad 45 E
8 Mostafa 95 A
9 Jana 68 D
10 Houssam 120 Refer to Professor

مفهوم القيم الموحدة

عندما تحاول إنشاء حساب جديد في أي موقع إلكتروني, تلاحظ في بعض الأحيان أنه يطلب منك إدخال معلومات لم يدخلها أحد غيرك من قبل.
فمثلاً, عندما يطلب منك إدخال إسم المستخدم ( Username ) قد تجده يخبرك بأن الإسم الذي أدخلته غير متاح.
أيضاً, إذا كنت تملك حساب في موقع ما و حاولت إنشاء حساب آخر في نفس الموقع و باستخدام نفس البريد الإلكتروني ستجد الموقع لا يسمح لك بذلك.

إذا حاولت إنشاء حساب جديد في مدونة هرمش و قمت بإدخال mhamad كإسم المستخدم, سيظهر لك أنه لا يمكنك استخدام هذا الإسم كالتالي.

إذاً عندما أدخلنا هذا الإسم, قام المدونة بالبحث في قاعدة البيانات الخاصة بها عن إسم المستخدم الذي أدخلناه.
بما أنها وجدت مستخدم آخر يملك نفس إسم المستخدم الذي أدخلناه أخبرتنا أنه لا يمكننا إستخدام هذا الإسم, و لهذا تريدنا أن ندخل إسم آخر.


فوائدة القيم الموحدة في التطبيقات و المواقع

في الأمثلة التي ذكرناها سابقاً, الفائدة من جعل إسم المستخدم الموحد قد يكون لها فوائد عديدة و نذكر منها:

  • يمكنك تسجيل الدخول به.

  • يمكنك البحث عن أي مستخدم من خلال إسم المستخدم الخاص به.

  • يمكنك الإبلاغ عن أي مستخدم من خلال إسم المستخدم الخاص به.

  • في مواقع التواصل الإجتماعي مثل تويتر و فيسبوك, يمكنك أن تشير لأي حساب ( أي تفعل له Mention ) من خلال وضع الرمز @ و من ثم ذكر إسم المستخدم.


القيم الموحدة مفيدة جداً في قواعد البيانات حيث لاحظنا في دروس سابقة أن إعطاء رقم تعرفة موحد id لكل سطر في الجدول يتيح لنا إمكانية الوصول إليه بكل سهولة. و في الدروس الاحقة ستلاحظ أهمية القيم الموحدة في إنشاء علاقات بين الجدوال التي ننشئها في نفس قاعدة البيانات.

الكلمة UNIQUE

في حال أردت جعل العامود لا يقبل أن يتم تخزين نفس القيمة فيه أكثر من مرة يمكنك إضافة الخاصية UNIQUE إلى نوع العامود.
الآن, عليك معرفة أن طريقة استخدام هذه الكلمة تختلف من قاعدة بيانات لأخرى و لكنها تستخدم لنفس الغرض.

ملاحظة: في الأمثلة التي وضعناها في هذا الدرس, إعتمدنا أسلوب قواعد بيانات MySQL لأنها القاعدة التي نتعامل معها منذ بداية الدورة.


في قواعد بيانات MySQL

لإنشاء عامود لا يقبل أن يتم تخزين نفس القيمة فيه أكثر من مرة نضيف الخاصية UNIQUE كالتالي.

    CREATE TABLE table_name (
    column_name datatype,
    UNIQUE (column_name)
    );
  

بين أقواس الكلمة UNIQUE نكتب إسم العامود الذي نريده أن لا يحتوي على أي قيم مكررة.



في قواعد بيانات Access / SQL Server / Oracle

لإنشاء عامود لا يقبل أن يتم تخزين نفس القيمة فيه أكثر من مرة نضيف الخاصية UNIQUE كالتالي.

    CREATE TABLE table_name (
    column_name datatype UNIQUE
    );
  

إنشاء عامود لا يقبل قيم مكررة

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه users يحتوي على بيانات 5 مستخدمين.
ملاحظة: قمنا بإضافة الخاصية UNIQUE إلى العامود username لأننا لا نريد أن يكون هناك مستخدمين عندهم نفس إسم المستخدم.

الإستعلام

      -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
      DROP DATABASE IF EXISTS harmash;

      -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
      CREATE DATABASE harmash;

      -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
      USE harmash;

      -- يتألف من 4 أعمدة users هنا قمنا بإنشاء جدول جديد إسمه
      -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
      CREATE TABLE users (
      id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(50),
      last_name  VARCHAR(50),
      username   VARCHAR(30),
      UNIQUE(username)          -- لا يقبل تخزين قيم مكررة username هنا قمنا بتحديد أن العامود
      );

      -- هنا قمنا بإضافة 5 أسطر في الجدول, أي أضفنا معلومات 5 مستخدمين
      -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
      -- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
      -- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
      INSERT INTO users VALUES (null, "Ahmad", "Alhazem", "ahmad");
      INSERT INTO users VALUES (null, "Rami", "Algharib", "rami");
      INSERT INTO users VALUES (null, "Said", "Alnaja", "said");
      INSERT INTO users VALUES (null, "Noura", "Jamali", "noura");
      INSERT INTO users VALUES (null, "Amani", "Sarrouf", "amani");
    

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول users بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول users.

id first_name last_name username
1 Ahmad Alhazem ahmad
2 Rami Algharib rami
3 Said Alnaja said
4 Noura Jamali noura
5 Amani Sarrouf amani

تجربة إدخال قيم متكررة في عامود نوعه UNIQUE

الإستعلام التالي يحاول إضافة مستخدم جديد و إعطائه إسم مستخدم يملكه شخص آخر.

الإستعلام

      INSERT INTO users (first_name, last_name, username)     -- هنا قمنا بتحديد أسماء الأعمدة التي سنمرر لها القيم
      VALUES ("Ahmad", "Harmush", "ahmad");                   -- هنا قمنا بتمرير القيم التي سيتم إضافتها فيها
    

عند تنفيذ الإستعلام سيظهر الخطأ التالي.
معنى هذا الخطأ أنه يوجد في الأساس مستخدم عنده username يساوي 'ahmad' لهذا لا يمكن إضافة المستخدم الجديد.

Duplicate entry 'ahmad' for key 'username'

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

ما فعلناه لحل مشكلة Duplicate entry هو تغيير قيمة الحقل usernam إلى 'ahmad2020' لأنه لا يوجد مستخدم آخر يملك نفس هذه القيمة.

الإستعلام

      INSERT INTO users (first_name, last_name, username)     -- هنا قمنا بتحديد أسماء الأعمدة التي سنمرر لها القيم
      VALUES ("Ahmad", "Harmush", "ahmad2020");               -- هنا قمنا بتمرير القيم التي سيتم إضافتها فيها

      SELECT * FROM users;                                    -- لمعرفة التغيرات الجديدة users هنا قمنا بعرض جميع البيانات الموجودة في الجدول
    

سنحصل على النتيجة التالية عند تنفيذ الإستعلام.

id first_name last_name username
1 Ahmad Alhazem ahmad
2 Rami Algharib rami
3 Said Alnaja said
4 Noura Jamali noura
5 Amani Sarrouf amani
6 Ahmad Harmush ahmad2020