MySQL: دليل شامل لوظائف MySQL المدمجة وتطبيقاتها العملية
آخر تحديث: 2026-08-26
تُعد الدوال بمثابة «سكين الجيش السويسري» في لغة SQL — فهي تتولى تحويل البيانات وتنسيقها وإجراء الحسابات عليها.
يقدم هذا الدرس نظرة عامة منهجية على الدوال المدمجة الأكثر استخدامًا في MySQL.
graph TB
A[MySQL Built-in Functions] --> B[Mathematical Functions<br/>ROUND/CEIL/FLOOR/RAND]
A --> C[String Functions<br/>CONCAT/LENGTH/SUBSTRING]
A --> D[Date Functions<br/>NOW/DATE_FORMAT/DATEDIFF]
A --> E[Conditional Functions<br/>IF/IFNULL/CASE]
A --> F[Aggregate Functions<br/>COUNT/SUM/AVG/MAX/MIN]
A --> G[Type Conversion<br/>CAST/CONVERT]
1. ما ستتعلمه
- الدوال الحسابية (ROUND/CEIL/FLOOR/MOD)
- دوال السلاسل (CONCAT/LENGTH/SUBSTRING/REPLACE)
- دوال التاريخ (NOW/DATE_FORMAT/DATEDIFF/DATE_ADD)
- دوال تحويل الأنواع (CAST/CONVERT)
- الدوال الشرطية (IF/IFNULL/CASE)
2. قصص واقعية عن تنقية البيانات
(1) المشكلة: عدم اتساق تنسيقات البيانات
بيانات تسجيل المستخدم:
| الاسم | رقم الهاتف | تاريخ الإنشاء |
|---|---|---|
| جون | 138-0000-1111 | 3 يوليو 2026 |
| جين | 13800002222 | 3 يوليو 2026 |
أرقام الهواتف مكتوبة بتنسيقات غير متسقة، والتواريخ مكتوبة بشكل عشوائي.
(2) حل الدوال
SQL
-- Standardize Phone Number Formats
SELECT name, REPLACE(phone, '-', '') AS clean_phone FROM users;
-- Standardize Date Formats
SELECT name, STR_TO_DATE(created_at, '%Y/%m/%d') AS clean_date FROM users;
3. الدوال الرياضية
| الوظيفة | الوصف | مثال |
|---|---|---|
| التقريب إلى عدد محدد من المنازل العشرية. | ||
ROUND(x, d) |
تقريب إلى d منازل عشرية | ROUND(3.1415, 2) → 3.14 |
CEIL(x) |
ملخص | CEIL(3.1) → 4 |
FLOOR(x) |
التقريب لأسفل | FLOOR(3.9) → 3 |
ABS(x) |
القيمة المطلقة | ABS(-5) → 5 |
MOD(a, b) |
المودولوس | MOD(10, 3) → 1 |
POWER(x, y) |
تشغيل الطاقة | POWER(2, 3) → 8 |
SQRT(x) |
الجذر التربيعي | SQRT(16) → 4 |
RAND() |
رقم عشوائي بين 0 و1 | RAND() → 0.723... |
▶ مثال: تطبيقات الدوال الرياضية
SQL
-- Calculate the discounted price and round it off
SELECT
product_name,
price,
ROUND(price * 0.85, 2) AS sale_price
FROM products;
-- Calculate the number of pages (Round up)
SELECT CEIL(103 / 10) AS total_pages; -- 11 pages
-- Random sort
SELECT * FROM users ORDER BY RAND() LIMIT 5;
4. دوال السلاسل
| الوظيفة | الوصف | مثال |
|---|---|---|
CONCAT(s1, s2, ...) |
ربط السلاسل | CONCAT('Hello', ' ', 'World') |
CONCAT_WS(sep, s1, ...) |
التسلسل باستخدام فاصل | CONCAT_WS('-', '2026', '07', '03') |
LENGTH(s) |
طول البايت | LENGTH('Hello') → 5 |
CHAR_LENGTH(s) |
طول الحرف | CHAR_LENGTH('你好') → 2 |
UPPER(s) |
تحويل إلى أحرف كبيرة | UPPER('hello') → HELLO |
LOWER(s) |
تحويل إلى أحرف صغيرة | LOWER('HELLO') → hello |
TRIM(s) |
إزالة المسافات في بداية ونهاية الجملة | TRIM(' hi ') → hi |
LTRIM(s) |
إزالة المسافات في بداية الجملة | LTRIM(' hi') → hi |
RTRIM(s) |
إزالة المسافات الزائدة في نهاية الجملة | RTRIM('hi ') → hi |
SUBSTRING(s, pos, len) |
جزء من السلسلة | SUBSTRING('Hello', 2, 3) → ell |
LEFT(s, n) |
n حرفًا إلى اليسار | LEFT('Hello', 3) → Hel |
RIGHT(s, n) |
n حرفًا إلى اليمين | RIGHT('Hello', 3) → llo |
REPLACE(s, old, new) |
استبدال | REPLACE('Hi World', 'Hi', 'Hello') |
REVERSE(s) |
عكس | REVERSE('Hello') → olleH |
LPAD(s, len, pad) |
الحشو الأيسر | LPAD('5', 3, '0') → 005 |
RPAD(s, len, pad) |
ملء من اليمين | RPAD('Hi', 5, '.') → مرحبًا... |
▶ مثال: تطبيقات دوال السلسلة
SQL
-- Full name (combined)
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
-- Clean phone numbers
SELECT REPLACE(REPLACE(phone, '-', ''), ' ', '') AS clean_phone FROM users;
-- Extract the email domainSELECT
email,
SUBSTRING(email, LOCATE('@', email) + 1) AS domain
FROM users;
-- Generate order number
SELECT CONCAT('ORD', LPAD(id, 6, '0')) AS order_no FROM orders;
الناتج:
TEXT
📖 للعرض فقط
+-------------+------------+
| email | domain |
+-------------+------------+
| a@gmail.com | gmail.com |
| b@163.com | 163.com |
+-------------+------------+
5. دوال التاريخ
| الوظيفة | الوصف | مثال |
|---|---|---|
NOW() |
التاريخ والوقت الحاليان | 2026-07-03 10:30:00 |
CURDATE() |
التاريخ الحالي | 2026-07-03 |
CURTIME() |
الوقت الحالي | 10:30:00 |
DATE(dt) |
استخراج جزء التاريخ | DATE('2026-07-03 10:30:00') |
YEAR(dt) |
سنة الاستخراج | YEAR('2026-07-03') → 2026 |
MONTH(dt) |
استخراج الشهر | MONTH('2026-07-03') → 7 |
DAY(dt) |
تاريخ الاستخراج | DAY('2026-07-03') → 3 |
HOUR(dt) |
استخراج الساعات | HOUR('10:30:00') → 10 |
DATE_FORMAT(dt, fmt) |
تنسيق التاريخ | DATE_FORMAT(NOW(), '%Y-%m-%d') |
STR_TO_DATE(s, fmt) |
تحويل سلسلة نصية إلى تاريخ | STR_TO_DATE('2026-07-03', '%Y-%m-%d') |
DATEDIFF(d1, d2) |
فارق التاريخ (بالأيام) | DATEDIFF('2026-07-10', '2026-07-03') → 7 |
DATE_ADD(dt, INTERVAL) |
تاريخ الإضافة | DATE_ADD(NOW(), INTERVAL 7 DAY) |
DATE_SUB(dt, INTERVAL) |
طرح التاريخ | DATE_SUB(NOW(), INTERVAL 1 MONTH) |
TIMESTAMPDIFF(unit, d1, d2) |
فارق التوقيت | TIMESTAMPDIFF(YEAR, birth, CURDATE()) |
▶ مثال: استخدام دوال التاريخ
SQL
-- Check today's data
SELECT * FROM orders WHERE DATE(created_at) = CURDATE();
-- View recent 7 days
SELECT * FROM orders WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);
-- Monthly Statistics
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY month
ORDER BY month;
-- Calculate Age
SELECT
name,
birth_date,
TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age
FROM users;
الناتج:
TEXT
📖 للعرض فقط
+---------+-------------+--------------+
| month | order_count | total_amount |
+---------+-------------+--------------+
| 2026-01 | 120 | 45000.00 |
| 2026-02 | 135 | 52000.00 |
| 2026-03 | 148 | 58000.00 |
+---------+-------------+--------------+
▶ مثال: تنسيق التاريخ
SQL
-- Common Formats
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2026-07-03
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d'); -- 2026/07/03
SELECT DATE_FORMAT(NOW(), '%H:%i:%s'); -- 10:30:00
SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y'); -- Friday, July 03, 2026
6. الدوال الشرطية
| الوظيفة | الوصف | مثال |
|---|---|---|
IF(expr, t, f) |
العبارات الشرطية | IF(score >= 60, 'Pass', 'Fail') |
IFNULL(expr, alt) |
استبدال NULL | IFNULL(email, 'N/A') |
NULLIF(a, b) |
تعادل العائدات NULL | NULLIF(1, 1) → NULL |
CASE WHEN ... THEN ... END |
تقييم الشروط المتعددة | انظر المثال |
▶ مثال: الدوال الشرطية
SQL
-- IF Decision
SELECT
name,
score,
IF(score >= 60, 'Pass', 'Fail') AS result
FROM students;
-- IFNULL Processing NULL
SELECT
name,
IFNULL(phone, 'No phone') AS phone
FROM users;
-- CASE Multiple conditions
SELECT
name,
score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
WHEN score >= 60 THEN 'D'
ELSE 'F'
END AS grade
FROM students;
الناتج:
TEXT
📖 للعرض فقط
+-------+-------+-------+
| name | score | grade |
+-------+-------+-------+
| Alice | 95 | A |
| Bob | 82 | B |
| Carol | 67 | D |
| Dave | 45 | F |
+-------+-------+-------+
7. معاينة الدالة التجميعية
| الوظيفة | الوصف | مثال |
|---|---|---|
COUNT(*) |
العدد | SELECT COUNT(*) FROM users |
SUM(col) |
المجموع | SELECT SUM(amount) FROM orders |
AVG(col) |
المتوسط | SELECT AVG(salary) FROM employees |
MAX(col) |
القيمة القصوى | SELECT MAX(price) FROM products |
MIN(col) |
القيمة الدنيا | SELECT MIN(age) FROM users |
لمزيد من التفاصيل، انظر الدرس 12، «التجميع والتصنيف».
❓ أسئلة شائعة
س ما هي نتيجة دالة CONCAT عندما تحتوي على قيمة NULL؟
ج تكون النتيجة NULL. استخدم
CONCAT_WS أو IFNULL للتعامل مع ذلك: CONCAT_WS(' ', 'Hello', NULL) → 'Hello'.س ما الفرق بين الدالة NOW() والدالة CURDATE()؟
ج تُرجع الدالة NOW() التاريخ والوقت، بينما تُرجع الدالة CURDATE() التاريخ فقط.
س أين يمكنني العثور على محددات تنسيق التاريخ؟
ج ابحث عن «محددات DATE_FORMAT في MySQL». ومن بين المحددات الشائعة: %Y (السنة)، %m (الشهر)، %d (اليوم)، %H (الساعة)، %i (الدقيقة)، و%s (الثانية).
س هل يمكن استخدام الدوال في جملة WHERE؟
ج نعم، لكن ذلك سيؤثر على الفهرسة. لا يمكن لـ
WHERE DATE(created_at) = CURDATE() استخدام فهرس؛ استخدم نطاقًا بدلاً من ذلك: WHERE created_at >= CURDATE() AND created_at < CURDATE() + 1.📖 ملخص
- دوال الرياضيات: ROUND/CEIL/FLOOR/MOD/RAND
- دوال السلاسل: CONCAT/LENGTH/UPPER/LOWER/TRIM/SUBSTRING/REPLACE
- دوال التاريخ: NOW/CURDATE/DATE_FORMAT/DATEDIFF/DATE_ADD/DATE_SUB
- الدوال الشرطية: IF/IFNULL/CASE WHEN
- دوال التجميع: COUNT/SUM/AVG/MAX/MIN
📝 تمارين
-
المسألة الأساسية (مستوى الصعوبة ⭐): استخدم الدالتين CONCAT و LPAD لتوليد رقم طلب بالصيغة «ORD000001».
-
مشكلة متقدمة (مستوى الصعوبة: ⭐⭐): استرجع عدد الطلبات لكل يوم خلال آخر 30 يومًا، باستخدام DATE_FORMAT لتنسيق التواريخ.
-
سؤال التحدي (الصعوبة: ⭐⭐⭐): احسب عمر كل مستخدم واستخدم عبارة CASE WHEN لتصنيفهم إلى أربع فئات: «مراهق»، «شاب»، «في منتصف العمر»، و«مسن».