أهلاً وسهلاً بكم في دورة تحليل البيانات باستخدام Postgres. في هذا الدرس، سوف نتعمق أكثر في الاستعلامات (queries) ونحكي عن ترتيب تنفيذ الاستعلام (execution order)، وأنواع الاستعلامات، والدوال التجميعية (aggregations)، والدوال (functions).
من المهم جداً أن تتذكروا أن ترتيب تنفيذ الاستعلام ليس من الأعلى إلى الأسفل كما قد نكتبه. بل هناك ترتيب معين يتبعه قاعدة البيانات.
فإذا كان لدينا استعلام بالشكل التالي:
SELECT COUNT(*)
FROM customers c
JOIN countries
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...
OFFSET ...
الترتيب الفعلي لتنفيذه هو:
| الخطوة | العملية |
|---|---|
| 1 | FROM - استخراج البيانات من الجداول |
| 2 | JOIN - ربط الجداول |
| 3 | WHERE - تصفية الصفوف |
| 4 | GROUP BY - تجميع البيانات |
| 5 | HAVING - تصفية المجموعات |
| 6 | SELECT - اختيار الأعمدة |
| 7 | DISTINCT / UNION - إزالة التكرارات أو دمج النتائج |
| 8 | ORDER BY - ترتيب النتائج |
اشترك في النشرة البريدية
دروس جديدة، مقالات، وأدوات مباشرة لبريدك.
| 9 | LIMIT / OFFSET - تحديد عدد الصفوف |
أولاً، يتم تنفيذ جزء FROM. هنا نستخرج كل البيانات من الجداول المحددة. إذا كان هناك اسم مستعار (alias) مثل c للـ customers، يتم تحديده هنا.
ثانياً، ننتقل إلى JOIN لربط الجداول معاً.
بعد الانتهاء من JOIN، ننتقل إلى WHERE لتصفية الصفوف حسب الشروط المحددة. هناك نوعان من التصفية: WHERE و HAVING.
ثم ننتقل إلى GROUP BY لتجميع البيانات.
بعد GROUP BY، ننتقل إلى HAVING وهي عملية تصفية تحدث بعد التجميع.
بعد HAVING، يتم تنفيذ SELECT لاختيار الأعمدة التي حددناها.
إذا استخدمنا DISTINCT أو UNION، يتم تنفيذها الآن. DISTINCT تزيل التكرارات، و UNION تدمج البيانات من استعلامات متعددة.
بعدها، يتم تنفيذ ORDER BY لترتيب النتائج تصاعدياً أو تنازلياً.
أخيراً، يتم تنفيذ LIMIT و OFFSET لتحديد عدد الصفوف المراد عرضها.
في الاستعلامات البسيطة، نستخدم WHERE للتصفية. على سبيل المثال:
SELECT * FROM employees WHERE id = 1هذا الاستعلام يرجع الموظف الذي id له يساوي 1.
| العامل | المعنى |
|---|---|
= | يساوي |
> | أكبر من |
< | أصغر من |
>= | أكبر من أو يساوي |
<= | أصغر من أو يساوي |
!= | لا يساوي |
يمكن دمج عدة شروط باستخدام AND و OR:
SELECT * FROM employees
WHERE id > 1 AND department_id = 1هذا الاستعلام يرجع جميع الموظفين الذين id لهم أكبر من 1 و department_id لهم يساوي 1.
أما مع OR:
SELECT * FROM employees
WHERE department_id = 1 OR department_id = 2هذا يرجع جميع الموظفين الذين department_id لهم إما 1 أو 2.
يمكن استخدام BETWEEN للتحقق من نطاق معين:
SELECT * FROM employees WHERE id BETWEEN 2 AND 3هذا يرجع الموظفين الذين id لهم بين 2 و 3 (شاملاً).
إذا كنت تريد البحث عن قيم في مصفوفة (array)، استخدم IN:
SELECT * FROM employees
WHERE department_id IN (1, 3)هذا الاستعلام يرجع جميع الموظفين الذين department_id لهم إما 1 أو 3.
SELECT name FROM employees WHERE name LIKE '%e'هنا % تعني أي شيء قبل الحرف. هذا يرجع جميع الموظفين الذين أسماؤهم تنتهي بحرف e.
SELECT name FROM employees WHERE name LIKE 's%'هذا يرجع جميع الموظفين الذين أسماؤهم تبدأ بحرف s.
SELECT name FROM employees WHERE name LIKE '%a%'هذا يرجع جميع الموظفين الذين أسماؤهم تحتوي على حرف a.
عامل LIKE حساس لحالة الأحرف (case sensitive). إذا أردت تجاهل حالة الأحرف، استخدم ILIKE:
SELECT name FROM employees WHERE name ILIKE '%e'الفرق هو أن ILIKE ستجد أسماء تنتهي بـ e أو E.
تذكر أن LIKE و ILIKE عمليتان مكلفتان جداً، لذا استخدمهما بحذر.
عملية UNION تدمج نتائج استعلامين أو أكثر من جداول مختلفة.
فإذا كان لدينا جدولان: students_2019 و students_2020، ونريد الحصول على قائمة بجميع الطلاب من السنتين:
SELECT name, email FROM students_2019
UNION
SELECT name, email FROM students_2020هذا يرجع جميع الطلاب من السنتين معاً، مع حذف أي تكرارات تلقائياً.
عند استخدام UNION، يجب مراعاة:
data types) متطابقةاستخدم UNION ALL:
SELECT name FROM students_2019
UNION ALL
SELECT name FROM students_2020هذا يرجع جميع البيانات، حتى لو كانت مكررة.
عملية INTERSECT ترجع فقط البيانات المشتركة بين جدولين.
فإذا كان لدينا جدولان: books و backup_books:
SELECT isbn, title FROM books
INTERSECT
SELECT isbn, title FROM backup_booksهذا يرجع فقط الكتب التي موجودة في كلا الجدولين.
يمكنك ترتيب نتائج الاستعلام تصاعدياً أو تنازلياً:
SELECT name FROM employees ORDER BY nameالترتيب الافتراضي هو تصاعدي (ASC). لـ ترتيب تنازلي، استخدم DESC:
SELECT name FROM employees ORDER BY name DESCلتحديد عدد الصفوف المراد عرضها:
SELECT name FROM employees LIMIT 3هذا يرجع فقط أول 3 موظفين.
لتخطي عدد معين من الصفوف:
SELECT name FROM employees LIMIT 3 OFFSET 3هذا يتخطى أول 3 موظفين ويعرض الموظفين من 4 إلى 6.
LIMIT و OFFSET يُستخدمان بشكل كبير في التصفح (pagination). مثلاً، إذا أردت عرض 10 نتائج في كل صفحة:
LIMIT 10 OFFSET 0LIMIT 10 OFFSET 10LIMIT 10 OFFSET 20عندما تريد عرض بيانات مجمعة، استخدم GROUP BY:
SELECT department_id, COUNT(*) as employee_count
FROM employees
GROUP BY department_idهذا الاستعلام يرجع عدد الموظفين في كل قسم.