القائمة الرئيسية

الصفحات

الدرس التاسع SQL

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

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

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


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

      SELECT DISTINCT column_name
      FROM table_name;
    

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

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

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

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

الإستعلام

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

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

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

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

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

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


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

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

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


المثال الأول

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

الإستعلام

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

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

country
Lebanon
Syria
KSA
Egypt
Oman
Yaman


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

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

الإستعلام

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

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

country
Egypt
KSA
Lebanon
Oman
Syria
Yaman

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

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

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

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


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

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

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

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

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



أنواع الدمج

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

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



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

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

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

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

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

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

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

الإستعلام

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


الإستعلام

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

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

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

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

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

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

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

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

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


الإستعلام

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

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

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