جمل Sql لعلها تكون مفيدة

السلام عليكم ورحمة الله وبركاته

الفترة السابقة كنت مشغول بنقل محتويات قاعدة بيانات "دليل عز " من سكريبتات متعددة إلى قاعدة بيانات البرمجة الجديدة "بوابة عز".

تخيلو التعب 5 سكريبتات الدروس العربي (نكت - رسائل قصيرة SMS - دروس - حواء - جافا سكريبت) و3 سكريبتات 4images (العاب فلاش - ألبوم صور - ثيمات الهواتف المحمولة) و Pafiledb في السكريبتات وسكريبت أكبر من Pafiledb للبرامج وغير سكريبت الأناشيد والأبتسامات وترجمة الكلمات !!

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

  1. لنسخ بيانات من جدول غلى جدول أخر وطبعاً مع أختلاف أسماء الحقول وعددها وتقسيمة البيانات على الحقول.
INSERT INTO 
  `new_db`.`new_table` (`new_col1`, `new_col2`, `new_col3`)
  SELECT 
    `old_col1`, `old_col2`, `old_col3`
    FROM `old_db`.`old_table`

أعتقد الجملة بسيطة وهي تعني اننا بعد كتابة جملة الأدخال لا نقوم بكتابة القيم المراد ادخالها بل نقوم بجلبها عن طريق أمر SELECT من جدول ثاني. مثال :-

INSERT INTO 
  `new_db`.`dir_cat` ( `cat_id` , `cat_name` , `cat_num` , `cat_sid` )
    SELECT
      `id` , `name` , `num` , `in`
      FROM `old_db`.`cat`

أعتقد هذا مثال بسيط, نرى مثال أخر :-

INSERT INTO
  `new_db`.`dir_site` ( `site_id` , `site_time` , `site_active` , `site_uid` )
  SELECT `id` , `tadd` , CONCAT('1') , CONCAT('1')
    FROM `old_db`.`sites`
    ORDER BY `tadd` ASC

نرى أن هذا المثال أستخدمنا به ORDER BY وهذا لنقل البيانات مرتبه تبعاً لحقل معين فمثلاً هنا كان تبعاً لتاريخ أضافتها. بالأضافة ﻷستخدام دالة CONCAT وهي دالة في الـSQL وهي فائدتها الدمج. مثلاً.

SELECT CONCAT(`firest_name`, ' : ', `last_name`)
  FROM `table`

هنا قمنا بجلب حقل الأسم الاول ثم وضعنا مسافه ونفطتين ":" ثم الأسم الثاني "لا تنسي عمل Alis لكي تستطيع مناداتها بشكل سهل"

هنا مثال أخر :-

INSERT INTO 
  `new_db`.`dir_site` ( `site_id` , `site_time` , `site_active` , `site_uid` )
    SELECT `id` , `tadd` , CONCAT('1') , CONCAT('1')
      FROM `old_db`.`sites`
      WHERE `tadd` > '22-11-2006'

نرى هنا اننا حددنا شرط لجلب البيانات من الجداول القديمة حيث أننا لا نريد المواقع الموجوده قبل تاريخ 22-11-2006 وهذا عن طريق WHERE وكذلك يمكننا أستخدام جميع خصائص الجملة SELECT

  1. تعديل كمية كبيرة من البيانات في جدول أعتماداً على جدول أخر

يمكننا تعديل قيمة في جدول أعتماداً على جدول أخر ، فمثلاُ لو أردنا بعد أضافة الأقسام والمواقع عد المواقع بداخل كل قسم فبالتالي يجب علينا كتابة ملف PHP يقوم بهذا الأجرا

$sql = mysql_query("SELECT `cat_id` FROM `cat`");
while ($fch = mysql_fetch_array($sql))
{
  $sql_count = mysql_query("SELECT COUNT(`site_id`) as `site_count` WHERE `site_cid`=".$fch\['cat_id'\]);

  $fch_count = mysql_fetch_array($sql_count);

  mysql_query("UPDATE `cat` SET `cat_num`=".$fch_count\['site_count'\]." WHERE `cat_id`=".$fch\['cat_id'\]);
}

وهذا سليم ويقوم بالعمل فعلاً ولكنه سيأخذ وقت طويل كما انه سيأخذ حمل على السرفر كبير ، مثلاً لو لدينا 300 قسم فبالتالي عدد الأستعلامات سيكون 601 أستعلام وهذا رقم كبير طبعاً رغم انه لا يؤذي السرفر. إذاً ما البديل ؟ أنظر المثال :-

UPDATE `dir_cat`
  SET `cat_num` = (
    SELECT count( `site_id` ) 
      FROM `dir_site`
      WHERE `site_cid` =`dir_cat`.`cat_id` )

هنا قمنا بعمل UPDATE عادي جداً ولكن بدل كتابة القيمة المراد ادخالها في الحقل كتبنا جملة SELECT جديدة تجلب العدد بلاً منك :D.

هذه جمل بسيطة أتت على بالي فأحببت تسجيلها