تخطَّ إلى المحتوى

SELECT ودوال MySQL المفيدة

الدرس 3 من 12 · MySQL

إذا درست كورس SQL في هذا الموقع، فأنت تعرف SELECT جيداً. هنا سنركز على ما تضيفه MySQL: الدوال المدمجة التي تعالج النصوص والأرقام والتواريخ مباشرة داخل الاستعلام، فتحصل على البيانات جاهزة للعرض. وإذا كانت هذه بدايتك مع SQL، فستتعلم الأساس هنا أيضاً.

أضفنا إلى جدول 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 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).

SELECT CONCAT(name, ' - ', price, ' جنيه') AS label FROM products LIMIT 3;

الناتج:

label
كتاب البرمجة للمبتدئين - 120.00 جنيه
سماعة لاسلكية - 450.50 جنيه
حقيبة مدرسية - 280.00 جنيه

CONCAT تجمع أي عدد من القيم في نص واحد، وتحوّل الأرقام لنصوص تلقائياً. و AS label اسم مستعار للعمود الناتج. مفيدة لتجهيز نص جاهز للعرض في الموقع مباشرة.

SELECT name, CHAR_LENGTH(name) AS letters, LENGTH(name) AS bytes
FROM products WHERE id = 2;

الناتج:

name letters bytes
سماعة لاسلكية 13 25

هذا فرق مهم جداً للنصوص العربية:

  • CHAR_LENGTH: عدد الحروف (13، شاملة المسافة).
  • LENGTH: عدد البايتات (25)، لأن كل حرف عربي يشغل بايتين في utf8mb4، بينما المسافة بايت واحد.

مع النصوص العربية استخدم CHAR_LENGTH دائماً، مثلاً للتحقق من أن اسم المنتج لا يتجاوز عدداً معيناً من الحروف.

لنحسب السعر بعد ضريبة 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 للقيمة المطلقة.

SELECT UPPER('mysql') AS up, LOWER('SQL') AS low;

الناتج:

up low
MYSQL sql

ومن الدوال المفيدة أيضاً: TRIM لحذف المسافات الزائدة، و REPLACE(نص, قديم, جديد) للاستبدال، و SUBSTRING(نص, بداية, طول) لقص جزء من النص.

التواريخ من أقوى ميزات MySQL:

SELECT name,
YEAR(added_on) AS y,
MONTHNAME(added_on) AS m,
DATEDIFF('2026-11-01', added_on) AS days_ago
FROM 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.

  1. اعرض كل منتج بصيغة «اسم المنتج (التصنيف)» باستخدام CONCAT.
  2. اعرض أسماء المنتجات التي يزيد عدد حروفها على 12 حرفاً.
  3. اعرض كل منتج وسعره بعد خصم 15% مقرّباً لرقمين.
  4. اعرض عدد الأيام منذ إضافة كل منتج حتى اليوم باستخدام CURDATE().
  • استخدام LENGTH مع العربية: يعطي عدد البايتات لا الحروف. استخدم CHAR_LENGTH.
  • الدمج بعلامة +: في MySQL 'أ' + 'ب' لا تدمج النصوص بل تحاول جمعها كأرقام! استخدم CONCAT.
  • CONCAT مع NULL: إذا كانت أي قيمة NULL، تصبح النتيجة كلها NULL. استخدم IFNULL التي ستتعرف عليها في الدرس القادم.

سؤال

أي دالة تعطي عدد الحروف الصحيح لنص عربي في MySQL؟

سؤال

ما ناتج SELECT ROUND(10.456, 2)؟

  • CONCAT لدمج النصوص والأرقام، و AS لتسمية العمود الناتج.
  • CHAR_LENGTH للحروف و LENGTH للبايتات، ومع العربية استخدم الأولى.
  • ROUND و CEIL و FLOOR للأرقام، و UPPER و TRIM و REPLACE للنصوص.
  • NOW و CURDATE و YEAR و DATEDIFF و DATE_ADD للتواريخ.
  • اجعل MySQL تجهّز البيانات بالدوال بدلاً من معالجتها في برنامجك.