دوال النصوص (String Functions)
دوال النصوص في SQL (String Functions) هي مجموعة قوية من الأدوات المدمجة في لغة SQL لمعالجة وتنسيق البيانات النصية. من خلال دوال النصوص في SQL، يمكنك دمج النصوص، استخراج أجزاء منها، تحويل الحالة، إزالة المسافات، البحث والاستبدال، وغير ذلك الكثير. في هذا الدرس الشامل من سلسلة تعلم لغة SQL باللغة العربية، سنتعلم أهم دوال النصوص في SQL مثل CONCAT, SUBSTRING, UPPER, LOWER, TRIM, LENGTH, REPLACE وكيفية استخدامها في استعلامات SQL لمعالجة البيانات النصية في قواعد البيانات بشكل احترافي.
1. ما هي دوال النصوص في SQL؟
دوال النصوص في SQL (String Functions) هي دوال مدمجة في لغة SQL تُستخدم لمعالجة وتحويل البيانات النصية. تتيح لك دوال النصوص في SQL تنفيذ عمليات متنوعة على الأعمدة النصية مثل الدمج، الاستخراج، التحويل، والبحث، مما يجعل استعلامات SQL أكثر مرونة وقوة.
أهم دوال النصوص في SQL
| دالة SQL | الوصف | مثال |
|---|---|---|
CONCAT() |
دمج نصوص متعددة في SQL | CONCAT('Hello', ' ', 'World') |
SUBSTRING() |
استخراج جزء من نص في SQL | SUBSTRING('Hello', 1, 3) |
UPPER() |
تحويل إلى أحرف كبيرة في SQL | UPPER('hello') |
LOWER() |
تحويل إلى أحرف صغيرة في SQL | LOWER('HELLO') |
TRIM() |
إزالة المسافات في SQL | TRIM(' text ') |
LENGTH() |
حساب طول النص في SQL | LENGTH('Hello') |
REPLACE() |
استبدال نص في SQL | REPLACE('Hello', 'H', 'J') |
2. دالة CONCAT في SQL - دمج النصوص
دالة CONCAT في SQL تُستخدم لدمج نصين أو أكثر في نص واحد. هذه من أكثر دوال النصوص في SQL استخداماً لإنشاء أسماء كاملة، عناوين، أو رسائل مخصصة.
صيغة CONCAT في SQL
-- MySQL/PostgreSQL
CONCAT(string1, string2, string3, ...)
-- SQL Server
string1 + string2 + string3
-- أو استخدم CONCAT في SQL Server أيضاً
CONCAT(string1, string2, string3, ...)
مثال 1: دمج الاسم الأول والأخير في SQL
+----+------------+-----------+--------+
| id | first_name | last_name | salary |
+----+------------+-----------+--------+
| 1 | أحمد | محمد | 5000 |
| 2 | فاطمة | علي | 6000 |
| 3 | سارة | خالد | 7000 |
+----+------------+-----------+--------+
SELECT
id,
CONCAT(first_name, ' ', last_name) AS full_name,
salary
FROM employees;
+----+---------------+--------+
| id | full_name | salary |
+----+---------------+--------+
| 1 | أحمد محمد | 5000 |
| 2 | فاطمة علي | 6000 |
| 3 | سارة خالد | 7000 |
+----+---------------+--------+
مثال 2: إنشاء رسائل مخصصة باستخدام CONCAT في SQL
SELECT
CONCAT('مرحباً ', first_name, '! راتبك الحالي هو ', salary, ' ريال') AS welcome_message
FROM employees;
+------------------------------------------------+
| welcome_message |
+------------------------------------------------+
| مرحباً أحمد! راتبك الحالي هو 5000 ريال |
| مرحباً فاطمة! راتبك الحالي هو 6000 ريال |
| مرحباً سارة! راتبك الحالي هو 7000 ريال |
+------------------------------------------------+
مثال 3: CONCAT_WS في SQL - دمج مع فاصل
-- CONCAT_WS = CONCAT With Separator
SELECT
CONCAT_WS(' - ', first_name, last_name, salary) AS employee_info
FROM employees;
+------------------------+
| employee_info |
+------------------------+
| أحمد - محمد - 5000 |
| فاطمة - علي - 6000 |
| سارة - خالد - 7000 |
+------------------------+
3. دالة SUBSTRING في SQL - استخراج جزء من النص
دالة SUBSTRING في SQL تُستخدم لاستخراج جزء محدد من نص. هذه من دوال النصوص في SQL المهمة جداً لاستخراج أكواد، أرقام، أو أجزاء معينة من البيانات النصية.
صيغة SUBSTRING في SQL
-- MySQL/PostgreSQL/SQL Server
SUBSTRING(string, start_position, length)
-- أو
SUBSTR(string, start_position, length)
-- ملاحظة: الموضع يبدأ من 1 في SQL
مثال 1: استخراج أول 3 أحرف في SQL
+----+--------------+-------+
| id | product_code | price |
+----+--------------+-------+
| 1 | LAP-2024-001 | 3500 |
| 2 | MOU-2024-002 | 50 |
| 3 | SCR-2024-003 | 800 |
+----+--------------+-------+
SELECT
product_code,
SUBSTRING(product_code, 1, 3) AS category,
SUBSTRING(product_code, 5, 4) AS year,
SUBSTRING(product_code, 10, 3) AS serial
FROM products;
+--------------+----------+------+--------+
| product_code | category | year | serial |
+--------------+----------+------+--------+
| LAP-2024-001 | LAP | 2024 | 001 |
| MOU-2024-002 | MOU | 2024 | 002 |
| SCR-2024-003 | SCR | 2024 | 003 |
+--------------+----------+------+--------+
مثال 2: استخراج اسم النطاق من البريد الإلكتروني في SQL
SELECT
email,
SUBSTRING(email, POSITION('@' IN email) + 1) AS domain
FROM users;
4. دالتا UPPER و LOWER في SQL - تحويل الحالة
دالتا UPPER و LOWER في SQL تُستخدمان لتحويل النصوص إلى أحرف كبيرة أو صغيرة. هذه من دوال النصوص في SQL المفيدة جداً لتوحيد البيانات والمقارنات غير الحساسة لحالة الأحرف.
صيغة UPPER و LOWER في SQL
UPPER(string) -- تحويل إلى أحرف كبيرة في SQL
LOWER(string) -- تحويل إلى أحرف صغيرة في SQL
مثال 1: توحيد البيانات باستخدام UPPER في SQL
+----+-------------------+
| id | email |
+----+-------------------+
| 1 | Ahmed@Gmail.com |
| 2 | FATIMA@yahoo.com |
| 3 | sara@Outlook.COM |
+----+-------------------+
SELECT
email AS original,
UPPER(email) AS uppercase,
LOWER(email) AS lowercase
FROM users;
+-------------------+-------------------+-------------------+
| original | uppercase | lowercase |
+-------------------+-------------------+-------------------+
| Ahmed@Gmail.com | AHMED@GMAIL.COM | ahmed@gmail.com |
| FATIMA@yahoo.com | FATIMA@YAHOO.COM | fatima@yahoo.com |
| sara@Outlook.COM | SARA@OUTLOOK.COM | sara@outlook.com |
+-------------------+-------------------+-------------------+
مثال 2: البحث غير الحساس لحالة الأحرف في SQL
-- البحث عن جميع رسائل Gmail بغض النظر عن الحالة
SELECT *
FROM users
WHERE LOWER(email) LIKE '%gmail.com';
5. دالة TRIM في SQL - إزالة المسافات
دالة TRIM في SQL تُستخدم لإزالة المسافات الزائدة من بداية ونهاية النص. هذه من دوال النصوص في SQL الضرورية لتنظيف البيانات المُدخلة من المستخدمين.
صيغة TRIM في SQL
TRIM(string) -- إزالة المسافات من الطرفين في SQL
LTRIM(string) -- إزالة المسافات من اليسار في SQL
RTRIM(string) -- إزالة المسافات من اليمين في SQL
TRIM(BOTH ' ' FROM string) -- إزالة حرف معين من الطرفين
مثال 1: تنظيف البيانات باستخدام TRIM في SQL
+----+------------------+
| id | name |
+----+------------------+
| 1 | ' أحمد ' |
| 2 | 'فاطمة ' |
| 3 | ' سارة' |
+----+------------------+
SELECT
name AS original,
TRIM(name) AS trimmed,
LENGTH(name) AS original_length,
LENGTH(TRIM(name)) AS trimmed_length
FROM users;
+------------+---------+-----------------+-----------------+
| original | trimmed | original_length | trimmed_length |
+------------+---------+-----------------+-----------------+
| ' أحمد ' | 'أحمد' | 8 | 4 |
| 'فاطمة ' | 'فاطمة' | 9 | 5 |
| ' سارة' | 'سارة' | 7 | 4 |
+------------+---------+-----------------+-----------------+
6. دالة LENGTH في SQL - حساب طول النص
دالة LENGTH في SQL تُستخدم لحساب عدد الأحرف في نص. هذه من دوال النصوص في SQL المفيدة للتحقق من صحة البيانات والبحث عن نصوص بطول معين.
صيغة LENGTH في SQL
-- MySQL/PostgreSQL
LENGTH(string)
-- SQL Server
LEN(string)
مثال 1: التحقق من طول كلمة المرور في SQL
SELECT
username,
password,
LENGTH(password) AS password_length,
CASE
WHEN LENGTH(password) < 8 THEN 'ضعيفة'
WHEN LENGTH(password) BETWEEN 8 AND 12 THEN 'متوسطة'
ELSE 'قوية'
END AS password_strength
FROM users;
مثال 2: البحث عن أسماء قصيرة في SQL
-- البحث عن الأسماء التي طولها أقل من 5 أحرف
SELECT name, LENGTH(name) AS name_length
FROM employees
WHERE LENGTH(name) < 5;
7. دالة REPLACE في SQL - استبدال النصوص
دالة REPLACE في SQL تُستخدم لاستبدال جميع حالات نص معين بنص آخر. هذه من دوال النصوص في SQL القوية لتحديث وتنظيف البيانات النصية.
صيغة REPLACE في SQL
REPLACE(string, old_substring, new_substring)
مثال 1: تحديث أرقام الهواتف في SQL
SELECT
phone,
REPLACE(phone, '-', '') AS phone_clean,
REPLACE(phone, '05', '+9665') AS phone_international
FROM customers;
+--------------+-------------+---------------------+
| phone | phone_clean | phone_international |
+--------------+-------------+---------------------+
| 055-123-4567 | 0551234567 | +96655-123-4567 |
| 050-987-6543 | 0509876543 | +96650-987-6543 |
+--------------+-------------+---------------------+
مثال 2: إخفاء معلومات حساسة في SQL
SELECT
name,
CONCAT(
SUBSTRING(phone, 1, 3),
'-***-',
SUBSTRING(phone, -4)
) AS masked_phone
FROM customers;
8. دوال نصية إضافية في SQL
دالة LEFT و RIGHT في SQL
-- استخراج أول N حرف من اليسار في SQL
SELECT LEFT('Hello World', 5); -- النتيجة: 'Hello'
-- استخراج آخر N حرف من اليمين في SQL
SELECT RIGHT('Hello World', 5); -- النتيجة: 'World'
دالة REVERSE في SQL
-- عكس النص في SQL
SELECT REVERSE('Hello'); -- النتيجة: 'olleH'
دالة REPEAT في SQL
-- تكرار نص في SQL
SELECT REPEAT('*', 5); -- النتيجة: '*****'
-- مثال عملي: إنشاء خط فاصل
SELECT CONCAT(name, ' ', REPEAT('-', 20)) AS separator
FROM employees;
دالة POSITION أو LOCATE في SQL
-- البحث عن موضع نص في SQL
SELECT POSITION('World' IN 'Hello World'); -- النتيجة: 7
-- أو استخدم LOCATE في MySQL
SELECT LOCATE('World', 'Hello World'); -- النتيجة: 7
9. أمثلة عملية متقدمة لدوال النصوص في SQL
مثال 1: تنسيق أسماء العملاء في SQL
SELECT
CONCAT(
UPPER(LEFT(first_name, 1)),
LOWER(SUBSTRING(first_name, 2)),
' ',
UPPER(LEFT(last_name, 1)),
LOWER(SUBSTRING(last_name, 2))
) AS formatted_name
FROM customers;
مثال 2: استخراج معلومات من البريد الإلكتروني في SQL
SELECT
email,
SUBSTRING(email, 1, POSITION('@' IN email) - 1) AS username,
SUBSTRING(email, POSITION('@' IN email) + 1) AS domain,
CASE
WHEN LOWER(email) LIKE '%gmail.com' THEN 'Gmail'
WHEN LOWER(email) LIKE '%yahoo.com' THEN 'Yahoo'
WHEN LOWER(email) LIKE '%outlook.com' THEN 'Outlook'
ELSE 'Other'
END AS provider
FROM users;
مثال 3: تنظيف وتوحيد أرقام الهواتف في SQL
SELECT
phone AS original,
REPLACE(REPLACE(REPLACE(phone, '-', ''), ' ', ''), '(', '') AS cleaned,
CONCAT(
'+966',
SUBSTRING(REPLACE(REPLACE(phone, '-', ''), ' ', ''), 2)
) AS international
FROM customers;
مثال 4: إنشاء اسم مستخدم تلقائي في SQL
SELECT
first_name,
last_name,
LOWER(CONCAT(
LEFT(first_name, 1),
last_name,
SUBSTRING(CAST(id AS CHAR), -3)
)) AS auto_username
FROM employees;
مثال 5: تقرير مفصل للعملاء في SQL
SELECT
CONCAT(UPPER(first_name), ' ', UPPER(last_name)) AS full_name,
LOWER(TRIM(email)) AS email_clean,
CONCAT(
'العميل: ', first_name,
' | البريد: ', SUBSTRING(email, 1, 20),
' | الهاتف: ', REPLACE(phone, '-', '')
) AS customer_summary,
LENGTH(CONCAT(first_name, last_name)) AS name_length
FROM customers
WHERE LENGTH(TRIM(email)) > 0;
10. نصائح وأفضل الممارسات لدوال النصوص في SQL
1. استخدم TRIM دائماً عند مقارنة النصوص في SQL
-- سيء: قد تفشل المقارنة بسبب المسافات
WHERE name = 'أحمد'
-- جيد: إزالة المسافات قبل المقارنة في SQL
WHERE TRIM(name) = 'أحمد'
2. استخدم LOWER أو UPPER للمقارنات غير الحساسة في SQL
عند البحث أو المقارنة، استخدم دوال النصوص في SQL مثل LOWER أو UPPER لتجنب مشاكل حالة الأحرف.
3. احذر من NULL في دوال النصوص في SQL
-- سيء: إذا كان middle_name هو NULL، النتيجة NULL
CONCAT(first_name, ' ', middle_name, ' ', last_name)
-- جيد: استخدام COALESCE في SQL
CONCAT(first_name, ' ', COALESCE(middle_name, ''), ' ', last_name)
4. استخدم الفهارس مع دوال النصوص في SQL بحذر
استخدام دوال النصوص في SQL على الأعمدة في WHERE قد يمنع استخدام الفهارس. حاول تخزين البيانات المُعالجة مسبقاً عند الإمكان.
5. وثّق الاستعلامات المعقدة في SQL
عند استخدام عدة دوال نصوص في SQL معاً، أضف تعليقات توضيحية لتسهيل الصيانة.
ملخص دوال النصوص في SQL
- CONCAT في SQL: دمج نصوص متعددة في نص واحد
- SUBSTRING في SQL: استخراج جزء محدد من نص
- UPPER/LOWER في SQL: تحويل حالة الأحرف للتوحيد
- TRIM في SQL: إزالة المسافات الزائدة من النصوص
- LENGTH في SQL: حساب عدد الأحرف في نص
- REPLACE في SQL: استبدال نص بنص آخر
- دوال إضافية في SQL: LEFT, RIGHT, REVERSE, REPEAT, POSITION
- Best Practice: استخدم TRIM و LOWER/UPPER للمقارنات الآمنة في SQL
الخطوة التالية: دوال التاريخ والوقت (Date Functions)
أكمل رحلتك التعليمية وانتقل إلى الدرس التالي لتعلم دوال التاريخ والوقت (Date Functions) وتطوير مهاراتك في قواعد البيانات.
الانتقال إلى الدرس التالي