MySQL: دليل شامل لوظائف MySQL المدمجة وتطبيقاتها العملية

آخر تحديث: 2026-08-26

تُعد الدوال بمثابة «سكين الجيش السويسري» في لغة SQL — فهي تتولى تحويل البيانات وتنسيقها وإجراء الحسابات عليها.

يقدم هذا الدرس نظرة عامة منهجية على الدوال المدمجة الأكثر استخدامًا في MySQL.

100%
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. ما ستتعلمه



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.

📖 ملخص


📝 تمارين

  1. المسألة الأساسية (مستوى الصعوبة ⭐): استخدم الدالتين CONCAT و LPAD لتوليد رقم طلب بالصيغة «ORD000001».

  2. مشكلة متقدمة (مستوى الصعوبة: ⭐⭐): استرجع عدد الطلبات لكل يوم خلال آخر 30 يومًا، باستخدام DATE_FORMAT لتنسيق التواريخ.

  3. سؤال التحدي (الصعوبة: ⭐⭐⭐): احسب عمر كل مستخدم واستخدم عبارة CASE WHEN لتصنيفهم إلى أربع فئات: «مراهق»، «شاب»، «في منتصف العمر»، و«مسن».

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%