الوحدة 1 · الاستعلام بهدف واضح
السؤال قبل الـ query
12 دقراءة 3 دتمرين SQL
الدرس في لمحة
تعرّف على قاعدة بيانات Cartwheel، وحوّل طلبًا غامضًا إلى سؤال دقيق، ثم أجب عنه بـ SELECT والأعمدة المحسوبة وORDER BY وLIMIT.
لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.
في أسبوعك الأول في Cartwheel تصلك رسالة من رانيا عزيز، المديرة التنفيذية: «أيّ منتجاتنا غالية لكن ربحها ضئيل؟ أريد مراجعة الأسعار قبل كتالوج الربيع». يبدو الأمر بسيطًا، وهو في الوقت نفسه مثال مثالي على طبيعة العمل: شخص أمامه قرار حقيقي يطرح سؤالًا بكلمات عادية، وأنت تحوّله إلى query يجيب عن هذا السؤال بالضبط، لا أكثر ولا أقل.
Cartwheel متجر إلكتروني لمستلزمات المنزل والأنشطة الخارجية، يبيع في ثماني دول. تحتوي قاعدة بيانات SQLite الخاصة به على سنتين من السجلات، من يناير 2024 حتى ديسمبر 2025. كل query في هذه الدورة يعمل عليها، داخل متصفّحك.
تعرّف على قاعدة البيانات
قبل أن تكتب الـ query الحقيقي، ألقِ نظرة حولك. يحتفظ SQLite بفهرس لجداوله في sqlite_schema (الكود القديم يسمّيه sqlite_master، وما زال يعمل):
SELECT name
FROM sqlite_schema
WHERE type = 'table';تسعة جداول. لترى أعمدة جدول واحد وأنواعها، اطلب قائمة أعمدته:
SELECT name, type, "notnull"
FROM pragma_table_info('orders');وهذه طريقة ارتباط الجداول ببعضها. يشير كل سهم من جدول إلى الجدول الذي يرجع إليه، والتسمية هي المفتاح المشترك بينهما.
الجداول الثلاثة المميّزة هي العمود الفقري لمعظم الأسئلة: العميل يقدّم طلبًا، والطلب يضمّ عنصرًا واحدًا أو أكثر. المال موجود في order_items لا في orders: إيراد السطر هو quantity * unit_price * (1 - discount).
من الطلب إلى الـ query
في طلب رانيا كلمتان غامضتان. «غالية» قد تعني سعر القائمة. أما «ربحها ضئيل» فتحتاج إلى رقم: هامش الربح كنسبة مئوية من السعر، أي (unit_price - unit_cost) / unit_price، هو الطريقة المعتادة لمقارنة قمع تقطير قهوة بسعر 22 دولارًا بمكتب بسعر 449 دولارًا. اكتب الصيغة الدقيقة قبل أن تبدأ الكتابة: صف واحد لكل منتج، يعرض السعر ونسبة الهامش، والهوامش الأضعف أولًا.
SELECT
name,
unit_price,
unit_cost,
ROUND((unit_price - unit_cost) / unit_price * 100, 1) AS margin_pct
FROM products
ORDER BY margin_pct
LIMIT 5;ثلاث عادات تعمل هنا منذ الآن. العمود المحسوب يأخذ اسمًا مقروءًا بـ AS. ويستطيع ORDER BY أن يرتّب حسب هذا الاسم المستعار (alias). ويأتي LIMIT 5 في النهاية ليقصّ القائمة بعد ترتيبها.
حلقة عمل المحلّل
كل طلب في هذه الدورة يمرّ بالحلقة نفسها، ويستحق أن تجعلها عادة من الآن:
- أعِد صياغة السؤال بدقة، بما في ذلك ما يمثّله الصف الواحد في الإجابة.
- استكشف الجداول والأعمدة التي تحتاجها.
- اكتب الـ query، وابدأ صغيرًا ثم وسّعه.
- تحقّق من منطقية النتيجة: عدد الصفوف، مجموع تعرفه مسبقًا، حالة طرفية.
- أجب بجملة يستطيع غير المحلّل أن يتصرّف بناءً عليها.
بالنسبة إلى رانيا، قد تكون الخطوة 5 هكذا: «أضعف هوامشنا تقارب 40%، على Burr Coffee Grinder وCompact Writing Desk؛ ولا يوجد منتج معروض بأقل من تكلفته». جملة قصيرة ومحدّدة، وتقود إلى السؤال التالي.
في الدرس التالي ستضيف أكثر عبارة استخدامًا في التحليل، WHERE، وتتعلّم أين يتعثّر الناس في منطقها.
أهم النقاط
- يبدأ الـ query عند المحلّل بسؤال دقيق، يشمل ما يمثّله الصف الواحد في الإجابة.
- استكشف أي قاعدة بيانات جديدة عليك من خلال جداولها وأعمدتها قبل أن تكتب الـ query الحقيقي.
- الأعمدة المحسوبة التي تحمل أسماء بـ AS تجعل النتيجة مقروءة دون أن تغيّر البيانات المخزّنة.
- ORDER BY هو ما يحدّد الصفوف التي يُبقيها LIMIT، لذا فإن LIMIT بلا ORDER BY يعيد عيّنة اعتباطية لا يمكن الاعتماد عليها.