SQL: الاستعلامات الأساسية

تخيل أنك تدخل مكتبة وتريد العثور على كتاب. لن تأخذ كل كتاب إلى المنزل — بدلاً من ذلك، ستخبر أمينة المكتبة: "أريد العثور على روايات خيال علمي نُشرت بعد 2020، مرتبة حسب تاريخ النشر من الأحدث إلى الأقدم، واعرض لي أول 5." تتوافق هذه العملية مع الخطوات الأساسية لاستعلام SQL: اختيار البيانات، تصفية الشروط، الفرز، وتحديد الكمية.

في الدرس السابق، تعلمنا كيفية إنشاء قواعد البيانات والجداول، وإدراج البيانات. في هذا الدرس، سنتعلم كيفية استعلام البيانات بدقة التي نحتاجها من قاعدة البيانات.


1. المفاهيم الأساسية

(1) جملة SELECT

SELECT هي الجملة الأكثر استخدامًا في SQL، تُستخدم لاسترداد البيانات من جداول قاعدة البيانات. هيكلها الأساسي هو:

SQL
SELECT column1, column2, ...
FROM table_name;

(2) استعلام أعمدة محددة مقابل جميع الأعمدة

استعلام أعمدة محددة (موصى به):

SQL
SELECT name, salary FROM employees;

استعلام جميع الأعمدة:

SQL
SELECT * FROM employees;
💡 نصيحة: في التطوير الفعلي، يُنصح بتحديد أسماء الأعمدة التي تحتاجها صراحةً بدلاً من استخدام *. هذا يحسن كفاءة الاستعلام ويجعل الشيفرة أوضح.

(3) تصفية شرط WHERE

تُستخدم عبارة WHERE لتصفية السجلات، وإرجاع الصفوف التي تحقق الشروط فقط:

SQL
SELECT column1, column2
FROM table_name
WHERE condition;

(4) عوامل المقارنة

العامل الوصف مثال
= يساوي salary = 50000
<> أو != لا يساوي status <> 'Inactive'
> أكبر من salary > 50000
< أصغر من age < 30
>= أكبر من أو يساوي salary >= 50000
<= أصغر من أو يساوي age <= 30

(5) العوامل المنطقية: AND / OR

SQL
SELECT name, salary, department_id
FROM employees
WHERE salary > 50000 AND department_id = 1;

SELECT name, salary, department_id
FROM employees
WHERE department_id = 1 OR department_id = 2;
💡 نصيحة: عند خلط AND و OR، يكون لـ AND أولوية أعلى. استخدم الأقواس () لتوضيح الأولوية وتجنب الغموض.

(6) IN / BETWEEN / LIKE

IN — مطابقة أي قيمة في مجموعة:

SQL
SELECT name, department_id
FROM employees
WHERE department_id IN (1, 2, 3);

BETWEEN — مطابقة القيم ضمن نطاق (شامل للحدود):

SQL
SELECT name, salary
FROM employees
WHERE salary BETWEEN 40000 AND 80000;

LIKE — مطابقة نصية غامضة:

SQL
-- الموظفين whose أسماؤهم تبدأ بـ "J"
SELECT name FROM employees WHERE name LIKE 'J%';

-- الموظفين whose أسماؤهم 4 أحرف وتبدأ بـ "John"
SELECT name FROM employees WHERE name LIKE 'John_';

(7) فرز ORDER BY

تُستخدم ORDER BY لفرز مجموعة النتائج:

SQL
-- فرز حسب الراتب من الأعلى إلى الأقل
SELECT name, salary
FROM employees
ORDER BY salary DESC;

-- فرز حسب القسم تصاعديًا، ثم حسب الراتب تنازليًا
SELECT name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary DESC;

(8) تحديد الصفوف LIMIT

تُستخدم LIMIT لتقييد عدد السجلات المرجعة:

SQL
-- إرجاع أول 5 سجلات فقط
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;

-- تخطي أول 5، وإرجاع الـ 5 التالية (ترقيم الصفحات)
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5 OFFSET 5;
💡 نصيحة: تُستخدم LIMIT عادة مع ORDER BY؛ وإلا فإن ترتيب السجلات المرجعة غير محدد.



2. بناء الجملة/الاستخدام الأساسي

(1) الهيكل الكامل لجملة الاستعلام

SQL
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column [ASC|DESC]
LIMIT count [OFFSET offset];

يجب اتباع ترتيب كتابة العبارات بدقة:

الترتيب العبارة الغرض
1 SELECT تحديد الأعمدة المراد استعلامها
2 FROM تحديد الجدول المصدر
3 WHERE تصفية الصفوف
4 ORDER BY فرز النتائج
5 LIMIT تحديد عدد الصفوف المرجعة

(2) التقنيات الشائعة

SQL
-- استخدام الأسماء المستعارة لجعل أسماء الأعمدة أكثر قابلية للقراءة
SELECT name AS employee_name, salary AS employee_salary
FROM employees;

-- إزالة القيم المكررة
SELECT DISTINCT department_id
FROM employees;

-- استخدام التعبيرات في SELECT
SELECT name, salary, salary * 12 AS annual_salary
FROM employees;
💡 نصيحة:

  • يمكن أن تحتوي الأسماء المستعارة على أحرف عربية، لكن يُفضل الإنجليزية للعمل الجماعي
  • يقوم DISTINCT بإزالة التكرارات بناءً على تركيبة جميع الأعمدة المحددة
  • التعبيرات لا تعدل البيانات الأصلية؛ تؤثر فقط على عرض نتائج الاستعلام


3. الأمثلة

▶ مثال: استعلام موظفي قسم محدد

المطلب: استعلام جميع أسماء الموظفين ورواتبهم في القسم رقم 1، مرتبة حسب الراتب من الأعلى إلى الأقل.

SQL
SELECT name, salary
FROM employees
WHERE department_id = 1
ORDER BY salary DESC;
▶ جرّب الكود

الإخراج المتوقع:

TEXT 📖 للعرض فقط
+----------+--------+
| name     | salary |
+----------+--------+
| John     |  85000 |
| Bob      |  62000 |
| Alice    |  55000 |
+----------+--------+

التوضيح:

▶ مثال: استعلام متعدد الشروط

المطلب: استعلام الموظفين whose رواتبهم بين 60000 و 90000، ورقم القسم 1 أو 2. اعرض الاسم ورقم القسم والراتب. فرز حسب رقم القسم تصاعديًا، ثم الراتب تنازليًا.

SQL
SELECT name, department_id, salary
FROM employees
WHERE salary BETWEEN 60000 AND 90000
  AND department_id IN (1, 2)
ORDER BY department_id ASC, salary DESC;
▶ جرّب الكود

الإخراج المتوقع:

TEXT 📖 للعرض فقط
+----------+---------------+--------+
| name     | department_id | salary |
+----------+---------------+--------+
| John     |             1 |  85000 |
| Bob      |             1 |  62000 |
| Jane     |             2 |  75000 |
+----------+---------------+--------+

التوضيح:

▶ مثال: استعلام غامض وترقيم صفحات

المطلب: العثور على موظفين whose أسماؤهم تحتوي على "J"، مرتبة حسب تاريخ التوظيف تنازليًا، عرض السجلات 2 إلى 3 فقط.

SQL
SELECT name, hire_date, salary
FROM employees
WHERE name LIKE '%J%'
ORDER BY hire_date DESC
LIMIT 2 OFFSET 1;
▶ جرّب الكود

الإخراج المتوقع:

TEXT 📖 للعرض فقط
+--------+------------+--------+
| name   | hire_date  | salary |
+--------+------------+--------+
| Jane   | 2022-03-15 |  68000 |
| Julia  | 2021-08-20 |  52000 |
+--------+------------+--------+

التوضيح:



4. السيناريوهات

(1) السيناريو 1: تصفية الموظفين أصحاب الرواتب المرتفعة حسب نطاق الراتب

تحتاج الموارد البشرية لتصدير قائمة بالموظفين whose رواتبهم تزيد عن 70000، بما في ذلك الاسم والقسم والراتب، مرتبة حسب الراتب من الأعلى إلى الأقل.

SQL
SELECT e.name AS employee_name,
       d.name AS department_name,
       e.salary AS salary
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE e.salary > 70000
ORDER BY e.salary DESC;

ملاحظات:

(2) السيناريو 2: قائمة موظفين مُرَقَّمة صفحات

صفحة قائمة الموظفين في تطبيق ويب تعرض 10 سجلات لكل صفحة. عندما ينقر المستخدم على الصفحة 3، تحتاج لتخطي أول 20 سجل وعرض السجلات 21-30.

SQL
-- الصفحة 3، 10 سجلات لكل صفحة
SELECT id, name, department_id, salary
FROM employees
ORDER BY id ASC
LIMIT 10 OFFSET 20;

صيغة ترقيم الصفحات: OFFSET = (رقم_الصفحة - 1) × عدد_السجلات_لكل_صفحة

الصفحة LIMIT OFFSET
الصفحة 1 10 0
الصفحة 2 10 10
الصفحة 3 10 20


❓ أسئلة شائعة

س: ما الفرق بين SELECT * وتحديد أسماء الأعمدة؟ ج: SELECT * يُرجع جميع الأعمدة في الجدول، بينما تحديد أسماء الأعمدة يُرجع فقط الأعمدة التي تحتاجها. في بيئة الإنتاج، يُنصح بتحديد أسماء الأعمدة صراحةً — الاستعلامات أسرع وأكثر قابلية للقراءة وأقل عرضة للأخطاء عند تغيير هيكل الجدول.

س: هل يمكنني استخدام الأسماء المستعارة في WHERE؟ ج: لا. ترتيب تنفيذ SQL هو FROMWHERESELECTORDER BY. عندما يتم تنفيذ WHERE، لم يتم إنشاء الأسماء المستعارة بعد. إذا كنت بحاجة للتصفية حسب اسم مستعار، استخدم استعلامًا فرعيًا أو HAVING (يُغطى في الدروس اللاحقة).

س: هل يتضمن BETWEEN قيم الحدود؟ ج: نعم. BETWEEN 10 AND 20 يعادل >= 10 AND <= 20. كلا قيمتي النقطة النهاية مشمولتان في النتائج.

س: هل LIKE حساس لحالة الأحرف؟ ج: يعتمد على ترتيب قاعدة البيانات. MySQL غير حساس لحالة الأحرف افتراضيًا، بينما PostgreSQL حساس لحالة الأحرف افتراضيًا. لفرض حساسية حالة الأحرف، يمكن لـ PostgreSQL استخدام LIKE، و MySQL يمكنها استخدام الكلمة المفتاحية BINARY.


📖 ملخص

غطت هذه الدرس المهارات الأساسية لاستعلام SQL:

  1. SELECT — تحديد الأعمدة المراد استعلامها؛ استخدم * لاستعلام جميع الأعمدة
  2. WHERE — تصفية الصفوف بشروط، يدعم عوامل المقارنة (=، >، <، <>، >=، <=)
  3. العوامل المنطقيةAND (كلاهما)، OR (أحدهما)؛ استخدم الأقواس للتحكم في الأولوية
  4. IN — مطابقة أي قيمة في مجموعة
  5. BETWEEN — مطابقة القيم ضمن نطاق (شامل للحدود)
  6. LIKE — مطابقة غامضة؛ % يطابق أحرف متعددة، _ يطابق حرفًا واحدًا
  7. ORDER BY — فرز؛ ASC تصاعدي (الافتراضي)، DESC تنازلي
  8. LIMIT / OFFSET — تحديد الصفوف المرجعة، تمكين ترقيم الصفحات

ترتيب كتابة جمل الاستعلام: SELECTFROMWHEREORDER BYLIMIT


📝 تمارين

(1) التمرين 1: استعلام أساسي

استعلم عن جميع السجلات في جدول departments، معرضًا فقط أعمدة name و location.

(2) التمرين 2: تصفية شروط وفرز

استعلم عن الموظفين في جدول employees whose رواتبهم أكبر من أو تساوي 60000 وتاريخ توظيفهم بعد 1 يناير 2022. اعرض الاسم والراتب وتاريخ التوظيف، مرتبة حسب الراتب تنازليًا.

(3) التمرين 3: استعلام شامل

استعلم عن الموظفين في جدول employees whose أرقام أقسامهم 1 أو 3، وأسماؤهم لا تبدأ بـ "J". اعرض الاسم ورقم القسم والراتب. فرز حسب رقم القسم تصاعديًا، الراتب تنازليًا. إرجاع أول 3 سجلات فقط.


الدرس التالي: عمليات البيانات: INSERT و UPDATE و DELETE

Web-Tutorial.com

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

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

100%