إتقان SQL للمقابلات
أساسيات SQL تحت الضغط
4 دقيقة للقراءة
في مقابلات علوم البيانات، ستكتب SQL على سبورة أو مستند مشترك أو IDE عبر الإنترنت. الأخطاء مكلفة. أتقن هذه الأساسيات حتى تصبح تلقائية.
ترتيب تنفيذ الاستعلام
ترتيب تنفيذ SQL يختلف عن طريقة كتابته:
-- ترتيب الكتابة
SELECT columns
FROM table
WHERE condition
GROUP BY column
HAVING aggregate_condition
ORDER BY column
-- ترتيب التنفيذ (احفظ هذا!)
1. FROM -- أي جدول(جداول)؟
2. WHERE -- فلترة الصفوف
3. GROUP BY -- إنشاء المجموعات
4. HAVING -- فلترة المجموعات
5. SELECT -- اختيار الأعمدة
6. ORDER BY -- ترتيب النتائج
لماذا هذا مهم: لا يمكنك استخدام اسم مستعار من SELECT في WHERE (لم يُنشأ بعد)، لكن يمكنك استخدامه في ORDER BY.
ورقة مرجعية لأنواع JOIN
| نوع JOIN | يُرجع | استخدم عندما |
|---|---|---|
| INNER JOIN | الصفوف المتطابقة فقط | تحتاج بيانات من كلا الجدولين |
| LEFT JOIN | كل اليسار + اليمين المتطابق | الاحتفاظ بكل السجلات الأساسية |
| RIGHT JOIN | كل اليمين + اليسار المتطابق | نادراً (أعد كتابته كـ LEFT) |
| FULL OUTER | كل الصفوف من كليهما | تحتاج صورة كاملة |
| CROSS JOIN | الجداء الديكارتي | توليد التركيبات |
نمط المقابلة: "احصل على كل المستخدمين وطلباتهم، بما في ذلك المستخدمين بدون طلبات"
-- صحيح: LEFT JOIN يحافظ على كل المستخدمين
SELECT u.user_id, u.name, o.order_id, o.amount
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id;
-- خطأ شائع: INNER JOIN يفقد المستخدمين بدون طلبات
SELECT u.user_id, u.name, o.order_id, o.amount
FROM users u
INNER JOIN orders o ON u.user_id = o.user_id;
GROUP BY و HAVING
GROUP BY ينشئ صفوفاً مجمّعة. HAVING يفلتر تلك المجموعات (WHERE يفلتر قبل التجميع).
-- جد العملاء الذين أنفقوا أكثر من $1000 إجمالاً
SELECT
customer_id,
COUNT(*) as order_count,
SUM(amount) as total_spent
FROM orders
WHERE status = 'completed' -- فلترة قبل التجميع
GROUP BY customer_id
HAVING SUM(amount) > 1000 -- فلترة بعد التجميع
ORDER BY total_spent DESC;
خطأ مقابلة شائع: استخدام WHERE بدلاً من HAVING لشروط التجميع.
التعامل مع NULL
NULLs ألغام في المقابلات. اعرف هذه القواعد:
| العملية | النتيجة |
|---|---|
| NULL = NULL | NULL (ليس TRUE!) |
| NULL <> NULL | NULL (ليس TRUE!) |
| NULL + 5 | NULL |
| COALESCE(NULL, 0) | 0 |
| COUNT(*) | يعد NULLs |
| COUNT(column) | يتجاهل NULLs |
| SUM(column) | يتجاهل NULLs |
-- جد المستخدمين بدون طلبات (order_id هو NULL بعد LEFT JOIN)
SELECT u.user_id, u.name
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
WHERE o.order_id IS NULL; -- استخدم IS NULL، ليس = NULL
فحوصات سريعة للمقابلة
قبل تقديم أي إجابة SQL:
- الأسماء المستعارة: هل كل أسماء الجداول والأعمدة المستعارة متسقة؟
- JOINs: هل استخدمت نوع JOIN الصحيح؟
- NULLs: هل يمكن أن تؤثر قيم NULL على نتائجك؟
- GROUP BY: هل يتضمن SELECT كل الأعمدة غير المجمّعة في GROUP BY؟
- حالات الحافة: ماذا يحدث مع جداول فارغة أو قيم صفرية؟
السرعة تأتي من ذاكرة العضلات. تدرب على هذه الأنماط حتى تصبح تلقائية، ثم يمكنك التركيز على المنطق الأصعب خلال المقابلات. :::