SELECT ودوال MySQL المفيدة
إذا درست كورس SQL في هذا الموقع، فأنت تعرف SELECT جيداً. هنا سنركز على ما تضيفه MySQL: الدوال المدمجة التي تعالج النصوص والأرقام والتواريخ مباشرة داخل الاستعلام، فتحصل على البيانات جاهزة للعرض. وإذا كانت هذه بدايتك مع SQL، فستتعلم الأساس هنا أيضاً.
بيانات المتجر
Section titled “بيانات المتجر”أضفنا إلى جدول products الذي أنشأناه في الدرس السابق هذه المنتجات (ستتعلم أمر INSERT بالتفصيل في درس قادم):
INSERT INTO products (name, category, price, stock, added_on) VALUES ('كتاب البرمجة للمبتدئين', 'كتب', 120.00, 15, '2026-09-01'), ('سماعة لاسلكية', 'إلكترونيات', 450.50, 8, '2026-09-15'), ('حقيبة مدرسية', 'أدوات مدرسية', 280.00, 0, '2026-10-02'), ('آلة حاسبة علمية', 'إلكترونيات', 199.99, 20, '2026-10-10'), ('قصص الأطفال', 'كتب', 65.00, 30, '2026-10-20'), ('مجموعة أقلام', 'أدوات مدرسية', 35.75, 50, NULL), ('مسطرة', 'أدوات مدرسية', 10.00, 0, NULL);SELECT الأساسي
Section titled “SELECT الأساسي”SELECT name, price FROM products;الناتج:
| name | price |
|---|---|
| كتاب البرمجة للمبتدئين | 120.00 |
| سماعة لاسلكية | 450.50 |
| حقيبة مدرسية | 280.00 |
| آلة حاسبة علمية | 199.99 |
| قصص الأطفال | 65.00 |
| مجموعة أقلام | 35.75 |
| مسطرة | 10.00 |
لاحظ أن الأسعار تظهر دائماً برقمين بعد الفاصلة: 120.00 وليس 120، بفضل النوع DECIMAL(8, 2).
دمج النصوص: CONCAT
Section titled “دمج النصوص: CONCAT”SELECT CONCAT(name, ' - ', price, ' جنيه') AS label FROM products LIMIT 3;الناتج:
| label |
|---|
| كتاب البرمجة للمبتدئين - 120.00 جنيه |
| سماعة لاسلكية - 450.50 جنيه |
| حقيبة مدرسية - 280.00 جنيه |
CONCAT تجمع أي عدد من القيم في نص واحد، وتحوّل الأرقام لنصوص تلقائياً. و AS label اسم مستعار للعمود الناتج. مفيدة لتجهيز نص جاهز للعرض في الموقع مباشرة.
طول النص العربي: CHAR_LENGTH
Section titled “طول النص العربي: CHAR_LENGTH”SELECT name, CHAR_LENGTH(name) AS letters, LENGTH(name) AS bytesFROM products WHERE id = 2;الناتج:
| name | letters | bytes |
|---|---|---|
| سماعة لاسلكية | 13 | 25 |
هذا فرق مهم جداً للنصوص العربية:
CHAR_LENGTH: عدد الحروف (13، شاملة المسافة).LENGTH: عدد البايتات (25)، لأن كل حرف عربي يشغل بايتين في utf8mb4، بينما المسافة بايت واحد.
مع النصوص العربية استخدم CHAR_LENGTH دائماً، مثلاً للتحقق من أن اسم المنتج لا يتجاوز عدداً معيناً من الحروف.
الأرقام: ROUND
Section titled “الأرقام: ROUND”لنحسب السعر بعد ضريبة 14%:
SELECT name, price, ROUND(price * 1.14, 2) AS with_tax FROM products LIMIT 3;الناتج:
| name | price | with_tax |
|---|---|---|
| كتاب البرمجة للمبتدئين | 120.00 | 136.80 |
| سماعة لاسلكية | 450.50 | 513.57 |
| حقيبة مدرسية | 280.00 | 319.20 |
ROUND(قيمة, 2) تقرّب لرقمين عشريين. ودوال أخرى مفيدة: CEIL للتقريب لأعلى، و FLOOR للتقريب لأسفل، و ABS للقيمة المطلقة.
دوال النصوص الأخرى
Section titled “دوال النصوص الأخرى”SELECT UPPER('mysql') AS up, LOWER('SQL') AS low;الناتج:
| up | low |
|---|---|
| MYSQL | sql |
ومن الدوال المفيدة أيضاً: TRIM لحذف المسافات الزائدة، و REPLACE(نص, قديم, جديد) للاستبدال، و SUBSTRING(نص, بداية, طول) لقص جزء من النص.
دوال التاريخ
Section titled “دوال التاريخ”التواريخ من أقوى ميزات MySQL:
SELECT name, YEAR(added_on) AS y, MONTHNAME(added_on) AS m, DATEDIFF('2026-11-01', added_on) AS days_agoFROM products WHERE id <= 3;الناتج:
| name | y | m | days_ago |
|---|---|---|---|
| كتاب البرمجة للمبتدئين | 2026 | September | 61 |
| سماعة لاسلكية | 2026 | September | 47 |
| حقيبة مدرسية | 2026 | October | 30 |
| الدالة | وظيفتها |
|---|---|
NOW() |
التاريخ والوقت الحاليان |
CURDATE() |
تاريخ اليوم فقط |
YEAR() و MONTH() و DAY() |
أجزاء التاريخ |
MONTHNAME() |
اسم الشهر (بالإنجليزية افتراضياً) |
DATEDIFF(أ, ب) |
عدد الأيام بين تاريخين |
DATE_ADD(تاريخ, INTERVAL 7 DAY) |
إضافة مدة لتاريخ |
مثلاً: «المنتجات التي أُضيفت منذ أقل من 30 يوماً» تصبح WHERE DATEDIFF(CURDATE(), added_on) < 30.
جرّب بنفسك
Section titled “جرّب بنفسك”- اعرض كل منتج بصيغة «اسم المنتج (التصنيف)» باستخدام
CONCAT. - اعرض أسماء المنتجات التي يزيد عدد حروفها على 12 حرفاً.
- اعرض كل منتج وسعره بعد خصم 15% مقرّباً لرقمين.
- اعرض عدد الأيام منذ إضافة كل منتج حتى اليوم باستخدام
CURDATE().
أخطاء شائعة
Section titled “أخطاء شائعة”- استخدام LENGTH مع العربية: يعطي عدد البايتات لا الحروف. استخدم
CHAR_LENGTH. - الدمج بعلامة +: في MySQL
'أ' + 'ب'لا تدمج النصوص بل تحاول جمعها كأرقام! استخدمCONCAT. - CONCAT مع NULL: إذا كانت أي قيمة
NULL، تصبح النتيجة كلهاNULL. استخدمIFNULLالتي ستتعرف عليها في الدرس القادم.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي دالة تعطي عدد الحروف الصحيح لنص عربي في MySQL؟
CHAR_LENGTH تعدّ الحروف، أما LENGTH فتعدّ البايتات، والحرف العربي يشغل أكثر من بايت.
سؤال
ما ناتج SELECT ROUND(10.456, 2)؟
ROUND تقرّب لأقرب قيمة برقمين عشريين، فالرقم الثالث 6 يرفع الثاني إلى 6.
الخلاصة
Section titled “الخلاصة”CONCATلدمج النصوص والأرقام، وASلتسمية العمود الناتج.CHAR_LENGTHللحروف وLENGTHللبايتات، ومع العربية استخدم الأولى.ROUNDوCEILوFLOORللأرقام، وUPPERوTRIMوREPLACEللنصوص.NOWوCURDATEوYEARوDATEDIFFوDATE_ADDللتواريخ.- اجعل MySQL تجهّز البيانات بالدوال بدلاً من معالجتها في برنامجك.