SQL: الاستعلامات الأساسية
تخيل أنك تدخل مكتبة وتريد العثور على كتاب. لن تأخذ كل كتاب إلى المنزل — بدلاً من ذلك، ستخبر أمينة المكتبة: "أريد العثور على روايات خيال علمي نُشرت بعد 2020، مرتبة حسب تاريخ النشر من الأحدث إلى الأقدم، واعرض لي أول 5." تتوافق هذه العملية مع الخطوات الأساسية لاستعلام SQL: اختيار البيانات، تصفية الشروط، الفرز، وتحديد الكمية.
في الدرس السابق، تعلمنا كيفية إنشاء قواعد البيانات والجداول، وإدراج البيانات. في هذا الدرس، سنتعلم كيفية استعلام البيانات بدقة التي نحتاجها من قاعدة البيانات.
1. المفاهيم الأساسية
(1) جملة SELECT
SELECT هي الجملة الأكثر استخدامًا في SQL، تُستخدم لاسترداد البيانات من جداول قاعدة البيانات. هيكلها الأساسي هو:
SELECT column1, column2, ...
FROM table_name;
- بعد
SELECT، حدد الأعمدة المراد استعلامها - بعد
FROM، حدد الجدول المراد الاستعلام منه - كل جملة SQL تنتهي بفاصلة منقوطة
;
(2) استعلام أعمدة محددة مقابل جميع الأعمدة
استعلام أعمدة محددة (موصى به):
SELECT name, salary FROM employees;
استعلام جميع الأعمدة:
SELECT * FROM employees;
*. هذا يحسن كفاءة الاستعلام ويجعل الشيفرة أوضح.
(3) تصفية شرط WHERE
تُستخدم عبارة WHERE لتصفية السجلات، وإرجاع الصفوف التي تحقق الشروط فقط:
SELECT column1, column2
FROM table_name
WHERE condition;
(4) عوامل المقارنة
| العامل | الوصف | مثال |
|---|---|---|
= |
يساوي | salary = 50000 |
<> أو != |
لا يساوي | status <> 'Inactive' |
> |
أكبر من | salary > 50000 |
< |
أصغر من | age < 30 |
>= |
أكبر من أو يساوي | salary >= 50000 |
<= |
أصغر من أو يساوي | age <= 30 |
(5) العوامل المنطقية: AND / OR
AND: يجب أن تكون جميع الشروط صحيحةOR: يجب أن يكون شرط واحد على الأقل صحيحًا
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 — مطابقة أي قيمة في مجموعة:
SELECT name, department_id
FROM employees
WHERE department_id IN (1, 2, 3);
BETWEEN — مطابقة القيم ضمن نطاق (شامل للحدود):
SELECT name, salary
FROM employees
WHERE salary BETWEEN 40000 AND 80000;
LIKE — مطابقة نصية غامضة:
%يطابق أي عدد من الأحرف (بما في ذلك الصفر)_يطابق حرفًا واحدًا بالضبط
-- الموظفين 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 لفرز مجموعة النتائج:
ASC: تصاعدي (الافتراضي، يمكن حذفه)DESC: تنازلي
-- فرز حسب الراتب من الأعلى إلى الأقل
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 لتقييد عدد السجلات المرجعة:
-- إرجاع أول 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) الهيكل الكامل لجملة الاستعلام
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) التقنيات الشائعة
-- استخدام الأسماء المستعارة لجعل أسماء الأعمدة أكثر قابلية للقراءة
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، مرتبة حسب الراتب من الأعلى إلى الأقل.
SELECT name, salary
FROM employees
WHERE department_id = 1
ORDER BY salary DESC;
الإخراج المتوقع:
+----------+--------+
| name | salary |
+----------+--------+
| John | 85000 |
| Bob | 62000 |
| Alice | 55000 |
+----------+--------+
التوضيح:
WHERE department_id = 1يحتفظ فقط بالصفوف التي رقم القسم فيها 1ORDER BY salary DESCيفرز حسب الراتب تنازليًا- النتائج تحتوي فقط على عمودي
nameوsalary
▶ مثال: استعلام متعدد الشروط
المطلب: استعلام الموظفين whose رواتبهم بين 60000 و 90000، ورقم القسم 1 أو 2. اعرض الاسم ورقم القسم والراتب. فرز حسب رقم القسم تصاعديًا، ثم الراتب تنازليًا.
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;
الإخراج المتوقع:
+----------+---------------+--------+
| name | department_id | salary |
+----------+---------------+--------+
| John | 1 | 85000 |
| Bob | 1 | 62000 |
| Jane | 2 | 75000 |
+----------+---------------+--------+
التوضيح:
BETWEEN 60000 AND 90000يصفية نطاق الراتبIN (1, 2)يصفية الأقسامANDيجمع الشرطين- فرز حسب القسم تصاعديًا أولاً، ثم حسب الراتب تنازليًا داخل نفس القسم
▶ مثال: استعلام غامض وترقيم صفحات
المطلب: العثور على موظفين whose أسماؤهم تحتوي على "J"، مرتبة حسب تاريخ التوظيف تنازليًا، عرض السجلات 2 إلى 3 فقط.
SELECT name, hire_date, salary
FROM employees
WHERE name LIKE '%J%'
ORDER BY hire_date DESC
LIMIT 2 OFFSET 1;
الإخراج المتوقع:
+--------+------------+--------+
| name | hire_date | salary |
+--------+------------+--------+
| Jane | 2022-03-15 | 68000 |
| Julia | 2021-08-20 | 52000 |
+--------+------------+--------+
التوضيح:
LIKE '%J%'يطابق السجلات التي تحتوي على "J" في أي موضعORDER BY hire_date DESCيفرز حسب تاريخ التوظيف من الأحدث إلى الأقدمLIMIT 2 OFFSET 1يتخطى السجل الأول، ويعيد الثاني والثالث (أي الصفحة 2 بسجلين لكل صفحة)
4. السيناريوهات
(1) السيناريو 1: تصفية الموظفين أصحاب الرواتب المرتفعة حسب نطاق الراتب
تحتاج الموارد البشرية لتصدير قائمة بالموظفين whose رواتبهم تزيد عن 70000، بما في ذلك الاسم والقسم والراتب، مرتبة حسب الراتب من الأعلى إلى الأقل.
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;
ملاحظات:
- يستخدم
JOINلربط جدول الأقسام للحصول على أسماء الأقسام (يُغطى بالتفصيل في الدروس اللاحقة) eوdهي أسماء مستعارة للجداول تبسّط الكتابة- الأسماء المستعارة تستخدم أسماء وصفية لإخراج أوضح
(2) السيناريو 2: قائمة موظفين مُرَقَّمة صفحات
صفحة قائمة الموظفين في تطبيق ويب تعرض 10 سجلات لكل صفحة. عندما ينقر المستخدم على الصفحة 3، تحتاج لتخطي أول 20 سجل وعرض السجلات 21-30.
-- الصفحة 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 هوFROM→WHERE→SELECT→ORDER BY. عندما يتم تنفيذWHERE، لم يتم إنشاء الأسماء المستعارة بعد. إذا كنت بحاجة للتصفية حسب اسم مستعار، استخدم استعلامًا فرعيًا أوHAVING(يُغطى في الدروس اللاحقة).
س: هل يتضمن
BETWEENقيم الحدود؟ ج: نعم.BETWEEN 10 AND 20يعادل>= 10 AND <= 20. كلا قيمتي النقطة النهاية مشمولتان في النتائج.
س: هل
LIKEحساس لحالة الأحرف؟ ج: يعتمد على ترتيب قاعدة البيانات. MySQL غير حساس لحالة الأحرف افتراضيًا، بينما PostgreSQL حساس لحالة الأحرف افتراضيًا. لفرض حساسية حالة الأحرف، يمكن لـ PostgreSQL استخدامLIKE، و MySQL يمكنها استخدام الكلمة المفتاحيةBINARY.
📖 ملخص
غطت هذه الدرس المهارات الأساسية لاستعلام SQL:
- SELECT — تحديد الأعمدة المراد استعلامها؛ استخدم
*لاستعلام جميع الأعمدة - WHERE — تصفية الصفوف بشروط، يدعم عوامل المقارنة (
=،>،<،<>،>=،<=) - العوامل المنطقية —
AND(كلاهما)،OR(أحدهما)؛ استخدم الأقواس للتحكم في الأولوية - IN — مطابقة أي قيمة في مجموعة
- BETWEEN — مطابقة القيم ضمن نطاق (شامل للحدود)
- LIKE — مطابقة غامضة؛
%يطابق أحرف متعددة،_يطابق حرفًا واحدًا - ORDER BY — فرز؛
ASCتصاعدي (الافتراضي)،DESCتنازلي - LIMIT / OFFSET — تحديد الصفوف المرجعة، تمكين ترقيم الصفحات
ترتيب كتابة جمل الاستعلام: SELECT → FROM → WHERE → ORDER BY → LIMIT
📝 تمارين
(1) التمرين 1: استعلام أساسي
استعلم عن جميع السجلات في جدول departments، معرضًا فقط أعمدة name و location.
(2) التمرين 2: تصفية شروط وفرز
استعلم عن الموظفين في جدول employees whose رواتبهم أكبر من أو تساوي 60000 وتاريخ توظيفهم بعد 1 يناير 2022. اعرض الاسم والراتب وتاريخ التوظيف، مرتبة حسب الراتب تنازليًا.
(3) التمرين 3: استعلام شامل
استعلم عن الموظفين في جدول employees whose أرقام أقسامهم 1 أو 3، وأسماؤهم لا تبدأ بـ "J". اعرض الاسم ورقم القسم والراتب. فرز حسب رقم القسم تصاعديًا، الراتب تنازليًا. إرجاع أول 3 سجلات فقط.
الدرس التالي: عمليات البيانات: INSERT و UPDATE و DELETE