بسم الله الرحمن الرحيم
استخدام قيمة الحقل عند تحديثه !
هل تعلم انه يمكنك استخدام قيمة الحقل عند تحديثه ، ستقول كيف ؟ .. حسنا المعروف دائما هو
لكن ماذا لو اردت استخدام قيمة الحقل واضافة عليها شئ جديد مثلا .. لدي جدول يحتوي على اسماء دكاترة واريد اضافة ال prefix التالي : "د."
بكل بساطة :
اظن الفكرة اتضحت الان فالعملية SET تشبه عملية الاسناد في البرمجة (=) حيث يمكنك استعمال صيغة مباشرة "قيمة جديدة" او صيغة معقدة وحتى عملية رياضيه اذا كان المحتوى عبارة عن ارقام .. فمثلا لو اردنا استعمال حقل كعداد لزيارات موضوع معين عندها يمكننا زيادة العداد بدون ان ناخذ القيمة القديمة
* اضافة :
ايضا يمكننا استخدام دالة Replace لاستبدال جزء معين من الحقل بجزء جديد
مثال لدالة Replace
مثال لاستبدال حقل
Joins
يمكن باكثر من طريقة دمج عدة جداول مع بعضها البعض او حتى دمج جدول مع نفسه ! ( غريب اليس كذلك)
أولا تحتاج الى هذه الجداول مكونه لديك (لغرض الامثلة فقط) :
Inner-Join
هو دمج جدول مع جدول اخر عندما يتم توفر كل الجانبين بمعنى لا بد ان يربط الجدول الاول بالجدول الثاني والجدول الثاني يربط بالاول (باختصار يتم استبعاد اي سجل لا يوجد له رابط على الجدول الاخر)
مثال
تلاحظ انه تم ظهور Ahmed مرتين لوجود سجلين له في جدول items
وظهور Abdulaziz مرة واحده لوجود سجل واحد فقط في جدول items
لكن 'Mohammed' لم يظهر له شئ لان لايوجد item يربط به
* ملاحظة يمكن كتابة الكود اعلاه بشكل اخر :
Left-Join
مايميزها عن Inner Join أنها لاتشترط حضور سجل من الطرف الاخر
تلاحظ انه ظهر السجل الخاص ب Mohammed وحقول جدول items كلها NULL
من فوائد Left Join يمكنك حساب عدد السجلات المرتبطة بسجل رئيسي مثل سجل الموظف
Mohammed
ونفس الفكرة عند حساب تعليقات موضوع في المنتديات مثلا .
Right-Join
ادائها معاكس ل Left Join حيث انها تشترط وجود سجل في الجانب الايمن (Items)ولاتشترط وجود شئ في الجانب الايسر (Employee).
اضافة جملة Where
عند حاجتك لاستخدام جملة where لابد من استخدامها بعد ال Join
Self-Join
دمج الجدول مع نفسه ..
سنضيف تعديلا على جدول الموظفين (سنضيف حقل لرقم المدير) طبعا المدير سيكون احد الموظفين لذلك لاداعي لانشاء جدول للمدراء
الان اعط كل من Ahmed و Abdulaziz رقم المدير الخاص بهم هو 3 أي ان محمد هو مديرهم جميعا
الان سنقوم بعملية دمج الجدول مع نفسه ليخرج لدينا جدول جديد اسمه جدول المدراء
اتمنى وفقت في كتابة شئ مفيد وجديد
وللحديث بقية.
استخدام قيمة الحقل عند تحديثه !
هل تعلم انه يمكنك استخدام قيمة الحقل عند تحديثه ، ستقول كيف ؟ .. حسنا المعروف دائما هو
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 ')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_idLeft-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)اتمنى وفقت في كتابة شئ مفيد وجديد
وللحديث بقية.
المصدر: https://www.flasher.ws/main/articles/10-استعلامات-MySQL-بشكل-متقدم---1


