بسم الله الرحمن الرحيم
استخدام قيمة الحقل عند تحديثه !
هل تعلم انه يمكنك استخدام قيمة الحقل عند تحديثه ، ستقول كيف ؟ .. حسنا المعروف دائما هو
لكن ماذا لو اردت استخدام قيمة الحقل واضافة عليها شئ جديد مثلا .. لدي جدول يحتوي على اسماء دكاترة واريد اضافة ال prefix التالي : \"د.\" بكل بساطة :
اظن الفكرة اتضحت الان فالعملية SET تشبه عملية الاسناد في البرمجة (=) حيث يمكنك استعمال صيغة مباشرة \"قيمة جديدة\" او صيغة معقدة وحتى عملية رياضيه اذا كان المحتوى عبارة عن ارقام .. فمثلا لو اردنا استعمال حقل كعداد لزيارات موضوع معين عندها يمكننا زيادة العداد بدون ان ناخذ القيمة القديمة
* اضافة :
ايضا يمكننا استخدام دالة Replace لاستبدال جزء معين من الحقل بجزء جديد
مثال لدالة Replace
مثال لاستبدال حقل
Joins
يمكن باكثر من طريقة دمج عدة جداول مع بعضها البعض او حتى دمج جدول مع نفسه ! ( غريب اليس كذلك) أولا تحتاج الى هذه الجداول مكونه لديك (لغرض الامثلة فقط) :
Inner-Join هو دمج جدول مع جدول اخر عندما يتم توفر كل الجانبين بمعنى لا بد ان يربط الجدول الاول بالجدول الثاني والجدول الثاني يربط بالاول (باختصار يتم استبعاد اي سجل لا يوجد له رابط على الجدول الاخر)
مثال
وظهور Abdulaziz مرة واحده لوجود سجل واحد فقط في جدول items
لكن \'Mohammed\' لم يظهر له شئ لان لايوجد item يربط به * ملاحظة يمكن كتابة الكود اعلاه بشكل اخر :
Left-Join مايميزها عن Inner Join أنها لاتشترط حضور سجل من الطرف الاخر
تلاحظ انه ظهر السجل الخاص ب Mohammed وحقول جدول items كلها NULL
من فوائد Left Join يمكنك حساب عدد السجلات المرتبطة بسجل رئيسي مثل سجل الموظف
Mohammed
Self-Join دمج الجدول مع نفسه ..
سنضيف تعديلا على جدول الموظفين (سنضيف حقل لرقم المدير) طبعا المدير سيكون احد الموظفين لذلك لاداعي لانشاء جدول للمدراء
الان سنقوم بعملية دمج الجدول مع نفسه ليخرج لدينا جدول جديد اسمه جدول المدراء
اتمنى وفقت في كتابة شئ مفيد وجديد
وللحديث بقية.
UPDATE TABLE SET FIELD = \"قيمة جديدة\";
لكن ماذا لو اردت استخدام قيمة الحقل واضافة عليها شئ جديد مثلا .. لدي جدول يحتوي على اسماء دكاترة واريد اضافة ال prefix التالي : \"د.\" بكل بساطة :
UPDATE TABLE SET FIELD = CONCAT(\"د.\" , FIELD) ;
اظن الفكرة اتضحت الان فالعملية SET تشبه عملية الاسناد في البرمجة (=) حيث يمكنك استعمال صيغة مباشرة \"قيمة جديدة\" او صيغة معقدة وحتى عملية رياضيه اذا كان المحتوى عبارة عن ارقام .. فمثلا لو اردنا استعمال حقل كعداد لزيارات موضوع معين عندها يمكننا زيادة العداد بدون ان ناخذ القيمة القديمة
UPDATE TABLE SET FIELD = FIELD + 1 ;
* اضافة :
ايضا يمكننا استخدام دالة Replace لاستبدال جزء معين من الحقل بجزء جديد
مثال لدالة Replace
SELECT REPLACE(\"www.Flasher.ws\" , \"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 \')
`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 -> ;
+-----------+----+--------+----+-------------+---------+
| 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)
وظهور 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)
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
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)
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;
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
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)
-> 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)
اتمنى وفقت في كتابة شئ مفيد وجديد
وللحديث بقية.
المصدر: http://www.flasher.ws/main/articles/10-استعلامات-MySQL-بشكل-متقدم---1
التعليقات على المقالة 1
ايوب 26/12/2013
رد