islam مشرفة منتدى عالم حواء
عدد المساهمات : 197 نقاط : 110382 تاريخ التسجيل : 03/11/2009 الجنس :
| موضوع: استعلامات MySQL بشكل متقدم الخميس يونيو 10, 2010 7:49 am | |
| بسم الله الرحمن الرحيم
استخدام قيمة الحقل عند تحديثه !
هل تعلم انه يمكنك استخدام قيمة الحقل عند تحديثه ، ستقول كيف ؟ .. حسنا المعروف دائما هو
UPDATE TABLE SET FIELD = "قيمة جديدة";
لكن ماذا لو اردت استخدام قيمة الحقل واضافة عليها شئ جديد مثلا .. لدي جدول يحتوي على اسماء دكاترة واريد اضافة ال prefix التالي : "د."
بكل بساطة :
UPDATE TABLE SET FIELD = CONCAT("د." , FIELD) ;
اظن الفكرة اتضحت الان فالعملية SET تشبه عملية الاسناد في البرمجة (=) حيث يمكنك استعمال صيغة مباشرة "قيمة جديدة" او صيغة معقدة وحتى عملية رياضيه اذا كان المحتوى عبارة عن ارقام .. فمثلا لو اردنا استعمال حقل كعداد لزيارات موضوع معين عندها يمكننا زيادة العداد بدون ان ناخذ القيمة القديمة
UPDATE TABLE SET FIELD = FIELD + 1 ;
* اضافة : ايضا يمكننا استخدام دالة Replace لاستبدال جزء معين من الحقل بجزء جديد مثال لدالة Replace
SELECT REPLACE("[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] , "Flasher" , "Abdulaziz")
مثال لاستبدال حقل
UPDATE TABLE SET FIELD = REPLACE(FIELD , "Search" , "Replace")
Joins يمكن باكثر من طريقة دمج عدة جداول مع بعضها البعض او حتى دمج جدول مع نفسه ! ( غريب اليس كذلك)
أولا تحتاج الى هذه الجداول مكونه لديك (لغرض الامثلة فقط) :
CREATE TABLE `employee` (`name` VARCHAR (50), `id` INT (4) AUTO_INCREMENT, `salary` INT (4) DEFAULT '0', PRIMARY KEY(`id`)); CREATE TABLE `items` (`id` INT (4) AUTO_INCREMENT, `employee_id` INT (4), `data` TINYTEXT, PRIMARY KEY(`id`));
INSERT INTO `employee` (`name`,`id`,`salary`) VALUES ('Ahmed',NULL,0); INSERT INTO `employee` (`name`,`id`,`salary`) VALUES ('Abdulaziz',NULL,0); INSERT INTO `employee` (`name`,`id`,`salary`) VALUES ('Mohammed',NULL,0);
INSERT INTO `items` (`id`,`employee_id`,`data`) VALUES (NULL,1,'Labtop ') INSERT INTO `items` (`id`,`employee_id`,`data`) VALUES (NULL,1,'Car ') INSERT INTO `items` (`id`,`employee_id`,`data`) VALUES (NULL,2,'Desk ')
Inner-Join
هو دمج جدول مع جدول اخر عندما يتم توفر كل الجانبين بمعنى لا بد ان يربط الجدول الاول بالجدول الثاني والجدول الثاني يربط بالاول (باختصار يتم استبعاد اي سجل لا يوجد له رابط على الجدول الاخر) مثال
mysql> Select * from employee,items where employee.id = items.employee_id -> ; +-----------+----+--------+----+-------------+---------+ | name | id | salary | id | employee_id | data | +-----------+----+--------+----+-------------+---------+ | Ahmed | 1 | 0 | 1 | 1 | Labtop | | Ahmed | 1 | 0 | 2 | 1 | Car | | Abdulaziz | 2 | 0 | 3 | 2 | Desk | +-----------+----+--------+----+-------------+---------+ 3 rows in set (0.00 sec)
تلاحظ انه تم ظهور Ahmed مرتين لوجود سجلين له في جدول items وظهور Abdulaziz مرة واحده لوجود سجل واحد فقط في جدول items لكن 'Mohammed' لم يظهر له شئ لان لايوجد item يربط به
* ملاحظة يمكن كتابة الكود اعلاه بشكل اخر :
SELECT employee.*,items.* FROM employee JOIN items ON employee.id = items.employee_id
Left-Join
مايميزها عن Inner Join أنها لاتشترط حضور سجل من الطرف الاخر
mysql> SELECT employee.*,items.* FROM employee LEFT JOIN items ON employee.id = items.employee_id ; +-----------+----+--------+------+-------------+---------+ | name | id | salary | id | employee_id | DATA | +-----------+----+--------+------+-------------+---------+ | Ahmed | 1 | 0 | 1 | 1 | Labtop | | Ahmed | 1 | 0 | 2 | 1 | Car | | Abdulaziz | 2 | 0 | 3 | 2 | Desk | | Mohammed | 3 | 0 | NULL | NULL | NULL | +-----------+----+--------+------+-------------+---------+ 4 rows IN SET (0.00 sec)
تلاحظ انه ظهر السجل الخاص ب Mohammed وحقول جدول items كلها NULL من فوائد Left Join يمكنك حساب عدد السجلات المرتبطة بسجل رئيسي مثل سجل الموظف Mohammed
mysql> SELECT employee.*,count(items.id) AS itemsNumber FROM employee LEFT JOIN items ON employee.id = items.employee_id GROUP BY employee.id; +-----------+----+--------+-------------+ | name | id | salary | itemsNumber | +-----------+----+--------+-------------+ | Ahmed | 1 | 0 | 2 | | Abdulaziz | 2 | 0 | 1 | | Mohammed | 3 | 0 | 0 | +-----------+----+--------+-------------+ 3 rows IN SET (0.00 sec)
ونفس الفكرة عند حساب تعليقات موضوع في المنتديات مثلا .
Right-Join
ادائها معاكس ل Left Join حيث انها تشترط وجود سجل في الجانب الايمن (Items)ولاتشترط وجود شئ في الجانب الايسر (Employee).
اضافة جملة Where
عند حاجتك لاستخدام جملة where لابد من استخدامها بعد ال Join
SELECT employee.*,count(items.id) AS itemsNumber FROM employee LEFT JOIN items ON employee.id = items.employee_id WHERE employee.salary > 1000 GROUP BY employee.id;
Self-Join
دمج الجدول مع نفسه .. سنضيف تعديلا على جدول الموظفين (سنضيف حقل لرقم المدير) طبعا المدير سيكون احد الموظفين لذلك لاداعي لانشاء جدول للمدراء
ALTER TABLE `employee` ADD `manager_id` INT(4)
الان اعط كل من Ahmed و Abdulaziz رقم المدير الخاص بهم هو 3 أي ان محمد هو مديرهم جميعا
UPDATE `employee` SET `manager_id`=3 WHERE `id`=1; UPDATE `employee` SET `manager_id`=3 WHERE `id`=2
الان سنقوم بعملية دمج الجدول مع نفسه ليخرج لدينا جدول جديد اسمه جدول المدراء
mysql> SELECT employee.*,managers.name AS managerName FROM employee -> LEFT JOIN employee AS managers ON managers.id = employee.manager_id; +-----------+----+--------+------------+-------------+ | name | id | salary | manager_id | managerName | +-----------+----+--------+------------+-------------+ | Ahmed | 1 | 0 | 3 | Mohammed | | Abdulaziz | 2 | 0 | 3 | Mohammed | | Mohammed | 3 | 0 | NULL | NULL | +-----------+----+--------+------------+-------------+ 3 rows IN SET (0.00 sec)
اتمنى وفقت في كتابة شئ مفيد وجديد | |
|
نيوتن المراقب العام للمنتدى
عدد المساهمات : 1202 نقاط : 112322 تاريخ التسجيل : 04/11/2009 الجنس : دولــتــي :
| موضوع: رد: استعلامات MySQL بشكل متقدم الخميس يونيو 10, 2010 8:07 am | |
| | |
|
المهندس المدير العام
عدد المساهمات : 2256 نقاط : 115660 تاريخ التسجيل : 27/10/2009 الجنس : دولــتــي :
| موضوع: رد: استعلامات MySQL بشكل متقدم السبت يونيو 12, 2010 4:09 am | |
|
ممتاااااز و لكن عندي ملاحظة و هي ان يتم وضع الاكواد التي بالموضوع بشكل
يمكن التعرف عليها
مثل: - الكود:
-
يتم كتابة الكود هنا و الف شكر مرة أخرى | |
|
عامر رئاسة الإشراف
عدد المساهمات : 494 نقاط : 108435 تاريخ التسجيل : 23/02/2010 الجنس : دولــتــي :
| موضوع: رد: استعلامات MySQL بشكل متقدم السبت يونيو 12, 2010 4:18 am | |
| جزيت الفردوس أختي الفاضلة اسلام و شكرا جزيلا لك أخي العزيز المهندس على الشرح المفيد | |
|