SQLنسخ البيانات في جدول آخر

الموضوع في 'الانترنت والمواقع المفيدة' بواسطة ابوفارس, بتاريخ ‏30 يوليو 2023.

  1. ابوفارس

    ابوفارس ادارة المنتدى إداري

    إنضم إلينا في:
    ‏12 يوليو 2014
    المشاركات:
    690
    الإعجابات المتلقاة:
    200
    نقاط الجائزة:
    43
    الجنس:
    ذكر
    SQLنسخ البيانات في جدول آخر
    • طريقة نسخ البيانات من جدول لآخر
    • تجهيز قاعدة البيانات التي سنطبق عليها
    • أمثلة حول نسخ البيانات من جدول و إضافتها في جدول آخر
    طريقة نسخ البيانات من جدول لآخر
    نسخ البيانات من جدول لآخر أمر سهل للغاية لأنه مجرد دمج للأمر

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


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

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

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


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

    INSERTINTO table2
    SELECT * FROM table1
    WHERE condition;
    إذا كان الجدولين غير متطابقين أو تريد تحديد الأعمدة التي سيتم النسخ منها و إليها, شكل الإستعلام سيكون كالتالي.

    INSERTINTO table2 (column1, column2, column3, ...)
    SELECT column1, column2, column3, ...
    FROM table1
    WHERE condition;

    • مكان الكلمة
      table1
      نضع إسم الجدول الذي سننسخ البيانات منها.
    • مكان الكلمة
      table2
      نضع إسم الجدول الذي سننسخ البيانات فيه.
    • بعد الكلمة
      WHERE
      يمكننا وضع شروط لتحديد القيم التي سيتم نسخها من الجدول
      table1
      .
    تجهيز قاعدة البيانات التي سنطبق عليها
    قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها

    harmash
    و تنشئ فيها التالي:


    • جدول إسمه
      table1
      يحتوي على بيانات 5 أسطر.
    • جدول إسمه
      table2
      شكله مطابق تماماً للجدول
      table1
      و لكنه فارغ.
    الإستعلام
    -- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
    DROPDATABASEIFEXISTS harmash;
    -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
    CREATEDATABASE harmash;
    -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
    USE harmash;
    -- يتألف من 5 أعمدة table1 هنا قمنا بإنشاء جدول جديد إسمه
    -- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
    CREATETABLE table1 (
    id INTNOT NULLPRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    gender VARCHAR(20),
    country VARCHAR(50),
    salary DECIMAL(7,2)
    );
    -- table1 أعمدته متطابقة مع أعمدة الجدول table2 هنا قمنا بإنشاء جدول جديد إسمه
    -- أيضاً لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
    CREATETABLE table2 (
    id INTNOT NULLPRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    gender VARCHAR(20),
    country VARCHAR(50),
    salary DECIMAL(7,2)
    );
    -- table1 هنا قمنا بإضافة 5 أسطر في الجدول
    -- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
    -- مكان كل حقل لن نقوم بوضع قيمة فيه null بما أننا لم نحدد أسماء الأعمدة التي سنملأها لاحظ أننا مجبورين على وضع كلمة
    -- الموضوعة في بداية كل أمر سيتم إستبدالها بترقيم تلقائي من قبل قاعدة البيانات null و لا تنسى أن الكلمة
    INSERTINTO table1 VALUES (null, "rami", "male", "Lebanon", 700);
    INSERTINTO table1 VALUES (null, "ahmad", "male", "Syria", 800);
    INSERTINTO table1 VALUES (null, "hanan", "female", "KSA", 750);
    INSERTINTO table1 VALUES (null, "saly", "female", "Lebanon", 650);
    INSERTINTO table1 VALUES (null, "samir", "male", "Egypt", 600);

    بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات

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



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

    table1
    .


    idusergendercountrysalary
    1ramimaleLebanon700.00
    2ahmadmaleSyria800.00
    3hananfemaleKSA750.00
    4salyfemaleLebanon650.00
    5samirmaleEgypt600.00

    شكل الجدول

    table2
    الذي لا يحتوي على أي بيانات.


    idusergendercountrysalary
    أمثلة حول نسخ البيانات من جدول و إضافتها في جدول آخر

    المثال الأول
    الإستعلام التالي يقوم بنسخ كل القيم الموجودة في الجدول

    table1
    و يضيفها في الجدول
    table2
    و من ثم يقوم بعرض البيانات التي وضعها في الجدول
    table2
    .


    الإستعلام
    INSERTINTO table2 -- table2 هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في الجدول
    SELECT * FROM table1; -- table1 هنا قمنا بتحديد أنه سيتم نسخ كل بيانات الجدول
    SELECT * FROM table2; -- table2 هنا قمنا بعرض كل البيانات التي أصبح يحتويها الجدول
    سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
    لاحظ أن الجدول

    table2
    أصبح يحتوي على نفس البيانات الموجودة في الجدول
    table1
    .


    idusergendercountrysalary
    1ramimaleLebanon700.00
    2ahmadmaleSyria800.00
    3hananfemaleKSA750.00
    4salyfemaleLebanon650.00
    5samirmaleEgypt600.00

    إنتبه
    بالنسبة للحقل

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


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

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


    إذا قمت بتنفيذ الإستعلام السابق من جديد سيظهر لك الخطأ Duplicate entry '1' for key 'PRIMARY' و الذي يعني ما قلناه بالضبط.



    المثال الثاني
    الإستعلام التالي يقوم بنسخ كل القيم الموجودة في الجدول

    table1
    باستثناء القيم الموضوعة في العمود
    id
    .


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

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


    الإستعلام
    الإستعلام التالي هو ما يجب كتابته بالضبط للحصول على الإحصاء المطلوب.

    INSERTINTO table2(username, gender, country, salary) -- table2 هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في أعمدة محددة في الجدول
    SELECT username, gender, country, salary FROM table1; -- table1 هنا قمنا بتحديد أنه سيتم نسخ بيانات أعمدة محددة من الجدول
    SELECT * FROM table2; -- table2 هنا قمنا بعرض كل البيانات التي أصبح يحتويها الجدول
    سنحصل على النتيجة التالية عند تنفيذ الإستعلام.
    لاحظ أن الجدول

    table2
    تم إضافة بيانات الجدول
    table1
    فيه من جديد و لكن هذه المرة تم إعطاء رقم تعرفة
    id
    مختلف لكل سطر بشكل تلقائي.


    idusergendercountrysalary
    1ramimaleLebanon700.00
    2ahmadmaleSyria800.00
    3hananfemaleKSA750.00
    4salyfemaleLebanon650.00
    5samirmaleEgypt600.00
    6ramimaleLebanon700.00
    7ahmadmaleSyria800.00
    8hananfemaleKSA750.00
    9salyfemaleLebanon650.00
    10samirmaleEgypt600.00


    المثال الثالث
    الإستعلام التالي يقوم بنسخ القيم الموجودة في العمودين

    username
    و
    country
    من الجدول
    table1
    و يضيفها في الجدول
    table2
    و من ثم يقوم بعرض البيانات التي أصبح يحتويها الجدول
    table2
    .


    الإستعلام

    INSERTINTO table2(username, country) -- table2 هنا قمنا بتحديد أنه سيتم وضع البيانات المنسوخة في أعمدة محددة في الجدول
    SELECT username, country FROM table1; -- table1 هنا قمنا بتحديد أنه سيتم نسخ بيانات أعمدة محددة من الجدول
    SELECT * FROM table2; -- table2 هنا قمنا بعرض كل البيانات التي أصبح يحتويها الجدول

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

    table2
    أضيف عليه بيانات الأعمدة التي تم تحديدها فقط من الجدول
    table1
    و الأعمدة الأخرى يظهر فيها القيمة
    NULL
    .


    idusergendercountrysalary
    1ramimaleLebanon700.00
    2ahmadmaleSyria800.00
    3hananfemaleKSA750.00
    4salyfemaleLebanon650.00
    5samirmaleEgypt600.00
    6ramimaleLebanon700.00
    7ahmadmaleSyria800.00
    8hananfemaleKSA750.00
    9salyfemaleLebanon650.00
    10samirmaleEgypt600.00
    11ramiNULLLebanonNULL
    12ahmadNULLSyriaNULL
    13hananNULLKSANULL
    14salyNULLLebanonNULL
    15samirNULLEgyptNULL
     

مشاركة هذه الصفحة