EduFlow
SQL للمحلّلين
⁦0%⁩

الوحدة 1 · الاستعلام بهدف واضح

السؤال قبل الـ query

12 دقراءة 3 دتمرين SQL

الدرس في لمحة

تعرّف على قاعدة بيانات Cartwheel، وحوّل طلبًا غامضًا إلى سؤال دقيق، ثم أجب عنه بـ SELECT والأعمدة المحسوبة وORDER BY وLIMIT.

  1. 1تعرّف على قاعدة البيانات
  2. 2من الطلب إلى الـ query
  3. 3حلقة عمل المحلّل

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

في أسبوعك الأول في Cartwheel تصلك رسالة من رانيا عزيز، المديرة التنفيذية: «أيّ منتجاتنا غالية لكن ربحها ضئيل؟ أريد مراجعة الأسعار قبل كتالوج الربيع». يبدو الأمر بسيطًا، وهو في الوقت نفسه مثال مثالي على طبيعة العمل: شخص أمامه قرار حقيقي يطرح سؤالًا بكلمات عادية، وأنت تحوّله إلى query يجيب عن هذا السؤال بالضبط، لا أكثر ولا أقل.

Cartwheel متجر إلكتروني لمستلزمات المنزل والأنشطة الخارجية، يبيع في ثماني دول. تحتوي قاعدة بيانات SQLite الخاصة به على سنتين من السجلات، من يناير 2024 حتى ديسمبر 2025. كل query في هذه الدورة يعمل عليها، داخل متصفّحك.

تعرّف على قاعدة البيانات

قبل أن تكتب الـ query الحقيقي، ألقِ نظرة حولك. يحتفظ SQLite بفهرس لجداوله في sqlite_schema (الكود القديم يسمّيه sqlite_master، وما زال يعمل):

SQL
SELECT name
FROM sqlite_schema
WHERE type = 'table';

تسعة جداول. لترى أعمدة جدول واحد وأنواعها، اطلب قائمة أعمدته:

SQL
SELECT name, type, "notnull"
FROM pragma_table_info('orders');

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

العملاء يقدّمون الطلبات؛ الطلبات تحتوي على order_items؛ وorder_items ترجع إلى products، والمنتجات تنتمي إلى categories. المرتجعات returns ترجع إلى order_items. تذاكر الدعم support_tickets ترجع إلى customers وorders وemployees. وجلسات الموقع web_sessions ترجع إلى customers. web_sessions support_tickets employees customers orders order_items products categories returns customer_id order_id product_id
مخطط Cartwheel: الطلبات تقع بين العملاء والمنتجات

الجداول الثلاثة المميّزة هي العمود الفقري لمعظم الأسئلة: العميل يقدّم طلبًا، والطلب يضمّ عنصرًا واحدًا أو أكثر. المال موجود في order_items لا في orders: إيراد السطر هو quantity * unit_price * (1 - discount).

من الطلب إلى الـ query

في طلب رانيا كلمتان غامضتان. «غالية» قد تعني سعر القائمة. أما «ربحها ضئيل» فتحتاج إلى رقم: هامش الربح كنسبة مئوية من السعر، أي (unit_price - unit_cost) / unit_price، هو الطريقة المعتادة لمقارنة قمع تقطير قهوة بسعر 22 دولارًا بمكتب بسعر 449 دولارًا. اكتب الصيغة الدقيقة قبل أن تبدأ الكتابة: صف واحد لكل منتج، يعرض السعر ونسبة الهامش، والهوامش الأضعف أولًا.

SQL
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 في النهاية ليقصّ القائمة بعد ترتيبها.

حلقة عمل المحلّل

كل طلب في هذه الدورة يمرّ بالحلقة نفسها، ويستحق أن تجعلها عادة من الآن:

  1. أعِد صياغة السؤال بدقة، بما في ذلك ما يمثّله الصف الواحد في الإجابة.
  2. استكشف الجداول والأعمدة التي تحتاجها.
  3. اكتب الـ query، وابدأ صغيرًا ثم وسّعه.
  4. تحقّق من منطقية النتيجة: عدد الصفوف، مجموع تعرفه مسبقًا، حالة طرفية.
  5. أجب بجملة يستطيع غير المحلّل أن يتصرّف بناءً عليها.

بالنسبة إلى رانيا، قد تكون الخطوة 5 هكذا: «أضعف هوامشنا تقارب 40%، على Burr Coffee Grinder وCompact Writing Desk؛ ولا يوجد منتج معروض بأقل من تكلفته». جملة قصيرة ومحدّدة، وتقود إلى السؤال التالي.

في الدرس التالي ستضيف أكثر عبارة استخدامًا في التحليل، WHERE، وتتعلّم أين يتعثّر الناس في منطقها.

أهم النقاط

  • يبدأ الـ query عند المحلّل بسؤال دقيق، يشمل ما يمثّله الصف الواحد في الإجابة.
  • استكشف أي قاعدة بيانات جديدة عليك من خلال جداولها وأعمدتها قبل أن تكتب الـ query الحقيقي.
  • الأعمدة المحسوبة التي تحمل أسماء بـ AS تجعل النتيجة مقروءة دون أن تغيّر البيانات المخزّنة.
  • ORDER BY هو ما يحدّد الصفوف التي يُبقيها LIMIT، لذا فإن LIMIT بلا ORDER BY يعيد عيّنة اعتباطية لا يمكن الاعتماد عليها.

قراءات إضافية

تحقّق من فهمك

3 أسئلة

السؤال 1 من 3

تطلب رانيا «أفضل منتجاتنا». ماذا تفعل قبل أن تكتب أي SQL؟

السؤال 2 من 3

ماذا يعيد هذا الـ query؟

SQL
SELECT name, unit_price
FROM products
LIMIT 3;
السؤال 3 من 3

تكتب unit_price - unit_cost AS margin في قائمة SELECT. ماذا يحدث لجدول products؟

تدريب

تمرين SQL

اعثر على أعلى هوامش الربح

أعجبت رانيا بقائمة الهوامش الضعيفة، وتريد الآن العكس: أعلى 5 منتجات من حيث نسبة هامش الربح، ليعرضها فريق التسويق.

أعِد أربعة أعمدة بهذا الترتيب: name، وunit_price، وmargin (أي unit_price - unit_cost مقرّبًا إلى منزلتين عشريتين)، وmargin_pct (الهامش كنسبة مئوية من unit_price مقرّبًا إلى منزلة عشرية واحدة). رتّب حسب margin_pct من الأعلى إلى الأدنى. الترتيب مهم.

الكود المبدئي يرتّب حسب الهامش بالدولار، وهذا يحابي المنتجات الغالية. أصلحه.

الجداول
customers
(customer_id, first_name, last_name, email, country, city, signup_date, segment, referred_by)
orders
(order_id, customer_id, order_date, status, channel, coupon_code, shipping_fee)
order_items
(order_item_id, order_id, product_id, quantity, unit_price, discount)
products
(product_id, name, category_id, unit_price, unit_cost, launched_on, is_active)
categories
(category_id, name, parent_id)
returns
(return_id, order_item_id, return_date, reason, refund_amount)
employees
(employee_id, first_name, last_name, title, department, manager_id, hire_date, salary)
support_tickets
(ticket_id, customer_id, order_id, opened_at, closed_at, priority, channel, satisfaction, agent_id)
web_sessions
(session_id, customer_id, started_at, source, device, pages_viewed, added_to_cart, purchased)
-- Highest-margin products, by margin percent
SELECT
  name,
  unit_price,
  ROUND(unit_price - unit_cost, 2) AS margin
FROM products
ORDER BY margin DESC
LIMIT 5;جارٍ تحميل المحرّر…

Ctrl/⌘ + Enter للتشغيل · يعمل في بيئة معزولة داخل متصفّحك. لا شيء يغادر جهازك.