شرح أوامر ودوال 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
و ستظهر أمامك في القائمة اليسرى التي تظهر فيها جميع قواعد البيانات كالتالي.
محاولة إنشاء قاعدة بيانات موجودة أصلاً
في حال حاولت إنشاء قاعدة بيانات جديدة و كان هناك قاعدة بيانات أخرى عندها نفس الإسم الذي تريد استخدامه, سيظهر لك الخطأ التالي عند تنفيذ الإستعلام.
قم بمحاولة إعادة إنشاء قاعدة البيانات السابقة, أي قم بإعادة تنفيذ الإستعلام التالي.
الإستعلام
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
و ستختفي من القائمة اليسرى التي تظهر فيها جميع قواعد البيانات كالتالي.
محاولة حذف قاعدة بيانات غير موجودة أصلاً
في حال حاولت حذف قاعدة بيانات و لم تكن قاعدة البيانات موجودة أصلاً أو أن أنك قمت بمسحها سابقاً و نسيت أنك فعلت ذلك, سيظهر لك الخطأ التالي عند تنفيذ الإستعلام.
قم بمحاولة إعادة حذف قاعدة البيانات السابقة, أي قم بإعادة تنفيذ الإستعلام التالي.
الإستعلام
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.
محاولة إنشاء جدول موجود أصلاً في قاعدة البيانات
في حال حاولت إنشاء جدول و كان هناك جدول آخر في نفس قاعدة البيانات عنده نفس الإسم الذي تريد استخدامه, سيظهر لك الخطأ التالي عند تنفيذ الإستعلام.
قم بمحاولة إعادة إنشاء الجدول السابق في قاعدة البيانات, أي قم بإعادة تنفيذ الإستعلام التالي.
الإستعلام
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
من قاعدة البيانات التي قمت بتحديدها قبل تنفيذ الإستعلام.
محاولة حذف جدول غير موجود أصلاً في قاعدة البيانات
في حال حاولت حذف جدول لم يكن موجود أصلاً في قاعدة البيانات, سيظهر لك الخطأ التالي عند تنفيذ الإستعلام.
قم بمحاولة إعادة حذف الجدول السابق في قاعدة البيانات, أي قم بإعادة تنفيذ الإستعلام التالي.
الإستعلام
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
بداخلها كالتالي.
مشكلة عدم وجود قاعدة بيانات محددة
في حال قمت بتنفيذ أي أمر خاص بالتعامل شيء موجود في قاعدة بيانات و لكنك لم تقم بتحديد قاعدة البيانات التي تريده أن يتنفذ عليها سيظهر لك الخطأ التالي.
قم بمحاولة تنفيذ الأمر التالي بدون تحديد أنك تتعامل مع قاعدة البيانات 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 | |
---|---|---|---|
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
, مع عدم إحضار قيم مكررة.
هذا الإستعلام سيتنفذ على ثلاث مراحل كالتالي:
يجلب
id
وfirst_name
وlast_name
كل موظف موجود في الجدولemployees
.يجلب
id
وfirst_name
وlast_name
كل عميل موجود في الجدولcustomers
.يدمج النتيجتين السابقتين في جدول واحد لا يحتوي على أي قيم مكررة.
الإستعلام
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
, و لا يهم إن كانت النتيجة تحتوي على قيم مكررة.
هذا الإستعلام سيتنفذ على ثلاث مراحل كالتالي:
يجلب
id
وfirst_name
وlast_name
كل موظف موجود في الجدولemployees
.يجلب
id
وfirst_name
وlast_name
كل عميل موجود في الجدولcustomers
.يدمج النتيجتين السابقتين في جدول واحد.
الإستعلام
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 هو تغيير قيمة الحقل 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 |