دليل عملي سهل لكيفية البدء مع SQL
تم التحديث: ٢٧ مارس ٢٠٢٦
ملخص
يقوم SQL باستعلام البيانات من قواعد البيانات باستخدام SELECT، والتصفية باستخدام WHERE، والتجميع باستخدام GROUP BY. يضيف SQL الحديث CTEs (مجموعات نتائج مؤقتة)، ودوال النافذة (الترتيب، والمجاميع التراكمية)، ودوال JSON. منصات التدريب مثل SQLBolt مجانية؛ توفر قواعد البيانات السحابية مثل Supabase و Neon و Turso قواعد بيانات فورية (تمتلك كل من Supabase و Neon خططًا مجانية سخية)؛ كما تقوم أدوات الذكاء الاصطناعي الآن بتحويل اللغة الطبيعية إلى SQL.
SQL هي لغة البيانات. سواء كنت تبني تطبيقات ويب، أو تحلل مقاييس الأعمال، أو تستكشف مجموعات البيانات، فإن SQL لا مفر منها. ولسبب وجيه — فهي قوية، ومعيارية عبر قواعد البيانات، وسهلة التعلم نسبيًا.
التحدي ليس في تعلم أساسيات SQL. فكلمات SELECT و WHERE و JOIN يمكن تعلمها في ظهيرة يوم واحد. التحدي يكمن في بناء الحدس. معرفة متى تستخدم دالة نافذة بدلاً من استعلام فرعي. فهم أداء الاستعلام. إدراك أن المخطط غير الموحد (denormalized schema) يكون منطقيًا في بعض الأحيان.
في عام 2026، تطورت SQL بشكل كبير. يدعم SQL الحديث (PostgreSQL و MySQL 8.0+ و SQLite 3.39+) ميزات متقدمة تجعل المشكلات المعقدة تبدو أنيقة: تبسط تعبيرات الجدول الشائعة (CTEs) الاستعلامات المتداخلة، وتلغي دوال النافذة التجميعات المتكررة، وتجسّر دوال JSON الفجوة بين النماذج العلائقية والموجهة نحو المستندات. لاحظ أن بناء جملة JSON الدقيق يختلف بين الموردين — يستخدم PostgreSQL ->>، ويضيف MySQL JSON_EXTRACT()، ويستخدم SQLite json_extract() — لكن المفاهيم تظل كما هي.
يأخذك هذا الدليل من "SELECT * FROM users" إلى كتابة استعلامات تستفيد من قوة SQL الحديثة. وسيستغرق ذلك أقل من ساعة.
البداية: SELECT و WHERE و ORDER BY
قاعدة البيانات هي مجموعة من الجداول. يحتوي كل جدول على أعمدة (حقول) وصفوف (سجلات).
users table:
id | name | email | created_at
1 | Alice | alice@example.com | 2026-01-15
2 | Bob | bob@example.com | 2026-02-03
3 | Charlie | charlie@example.com| 2026-02-15
أبسط استعلام يسترجع جميع الصفوف والأعمدة:
SELECT * FROM users;
يعيد هذا جميع الصفوف الثلاثة. الرمز * يعني "جميع الأعمدة".
اختيار أعمدة محددة
SELECT name, email FROM users;
المخرجات:
name | email
--------|--------------------
Alice | alice@example.com
Bob | bob@example.com
Charlie | charlie@example.com
التصفية باستخدام WHERE
SELECT name, email FROM users WHERE created_at > '2026-02-01';
المخرجات:
name | email
--------|--------------------
Bob | bob@example.com
Charlie | charlie@example.com
تقوم WHERE بتصفية الصفوف. يتم إرجاع الصفوف التي تطابق الشرط فقط.
الفرز باستخدام ORDER BY
SELECT name, email FROM users ORDER BY created_at DESC;
تقوم DESC بالفرز بترتيب تنازلي (الأحدث أولاً). بينما تقوم ASC (تصاعدي، وهو الافتراضي) بالفرز من الأقدم إلى الأحدث.
التجميع: COUNT و SUM و AVG
عندما تريد إحصائيات بدلاً من صفوف فردية، استخدم دوال التجميع.
orders table:
id | user_id | amount
1 | 1 | 50.00
2 | 1 | 75.00
3 | 2 | 120.00
4 | 3 | 30.00
SELECT COUNT(*) as total_orders FROM orders;
المخرجات: total_orders: 4
SELECT SUM(amount) as total_revenue FROM orders;
المخرجات: total_revenue: 275.00
GROUP BY: التجميع لكل فئة
SELECT user_id, COUNT(*) as num_orders, SUM(amount) as total_spent
FROM orders
GROUP BY user_id;
المخرجات:
user_id | num_orders | total_spent
--------|------------|------------
1 | 2 | 125.00
2 | 1 | 120.00
3 | 1 | 30.00
تقوم GROUP BY بتقسيم الصفوف إلى مجموعات (حسب user_id) وتطبق التجميعات داخل كل مجموعة.
JOINs: دمج الجداول
تقوم قواعد البيانات الحقيقية بتقسيم المعلومات عبر الجداول لتجنب التكرار. تقوم JOINs بإعادة دمجها.
users:
id | name
1 | Alice
2 | Bob
orders:
id | user_id | amount
1 | 1 | 50
2 | 2 | 120
SELECT users.name, orders.amount
FROM users
JOIN orders ON users.id = orders.user_id;
المخرجات:
name | amount
-------|-------
Alice | 50
Bob | 120
شرط الـ JOIN وهو ON users.id = orders.user_id يطابق الصفوف حيث يساوي user_id في جدول orders الـ id في جدول users.
أنواع الـ JOINs
- INNER JOIN: الصفوف التي تتطابق في كلا الجدولين فقط
- LEFT JOIN: جميع الصفوف من الجدول الأيسر، مع الصفوف المطابقة من الجدول الأيمن
- RIGHT JOIN: جميع الصفوف من الجدول الأيمن، مع الصفوف المطابقة من الجدول الأيسر
- FULL OUTER JOIN: جميع الصفوف من كلا الجدولين
ملاحظة حول الموردين: تدعم PostgreSQL و MySQL جميع أنواع الربط الأربعة منذ سنوات. أضافت SQLite فقط RIGHT JOIN و FULL OUTER JOIN في الإصدار 3.39.0 (الصادر في يونيو 2022) — تأكد من أنك تستخدم إصدارًا حديثًا من SQLite إذا كنت بحاجة إليها.
مثال على LEFT JOIN:
SELECT users.id, users.name, COUNT(orders.id) AS num_orders
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id, users.name;
يعرض هذا جميع المستخدمين، حتى أولئك الذين ليس لديهم طلبات (سيكون عددهم 0). لاحظ أن GROUP BY تتضمن كل عمود غير مجمع — PostgreSQL متساهلة عند التجميع حسب مفتاح أساسي، لكن وضع ONLY_FULL_GROUP_BY في MySQL (الافتراضي في 8.0+) و SQLite يتطلبان القائمة الصريحة.
SQL الحديث: CTEs ودوال النافذة
تعبيرات الجدول الشائعة (CTEs)
تنشئ CTEs مجموعات نتائج مؤقتة مسماة. تجعل الاستعلامات المعقدة قابلة للقراءة.
WITH user_order_stats AS (
SELECT user_id, COUNT(*) as num_orders, SUM(amount) as total_spent
FROM orders
GROUP BY user_id
),
high_value_users AS (
SELECT user_id, total_spent
FROM user_order_stats
WHERE total_spent > 100
)
SELECT users.name, high_value_users.total_spent
FROM high_value_users
JOIN users ON high_value_users.user_id = users.id;
بدلاً من تداخل الاستعلامات الفرعية، تقوم بتسمية النتائج الوسيطة. يُقرأ الاستعلام من الأعلى إلى الأسفل، مما يجعل المنطق واضحًا.
دوال النافذة: الترتيب والمجاميع التراكمية
تحسب دوال النافذة القيم عبر "نافذة" من الصفوف. تخيل جدول orders مع عمود label يميز كل طلب:
orders:
id | label | amount
1 | Large | 150
2 | Medium | 100
3 | Small | 50
SELECT
label,
amount,
ROW_NUMBER() OVER (ORDER BY amount DESC) AS row_num,
SUM(amount) OVER (ORDER BY amount DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_total
FROM orders;
المخرجات:
label | amount | row_num | running_total
--------|--------|---------|---------------
Large | 150 | 1 | 150
Medium | 100 | 2 | 250
Small | 50 | 3 | 300
تقوم ROW_NUMBER() OVER (ORDER BY amount DESC) بترقيم الصفوف حسب المبلغ بترتيب تنازلي. (تجنب استخدام rank كاسم مستعار للعمود — لأنه يحجب دالة النافذة المدمجة RANK() في بعض قواعد البيانات).
تقوم SUM(...) OVER (...) بحساب مجموع تراكمي أثناء النزول عبر الصفوف.
تحل دوال النافذة محل الحاجة إلى عمليات الربط الذاتي (self-joins) والاستعلامات الفرعية المعقدة.
دوال JSON: تجسير الفجوة بين النماذج العلائقية ونماذج المستندات
تدعم قواعد بيانات SQL الحديثة JSON: يمكنك تخزين بيانات JSON والاستعلام عنها وتحويلها بشكل أصلي. بناء جملة المشغل الدقيق خاص بالمورد — يستخدم PostgreSQL -> و ->>، ويدعم MySQL 5.7+ كلاً من JSON_EXTRACT() واختصار ->> (8.0+)، وتوفر SQLite json_extract(). تستخدم الأمثلة أدناه بناء جملة PostgreSQL.
users:
id | name | profile
1 | Alice| {"age": 28, "city": "New York", "interests": ["AI", "music"]}
2 | Bob | {"age": 35, "city": "San Francisco", "interests": ["sports"]}
استخراج حقول JSON:
-- PostgreSQL
SELECT name, profile->>'age' as age, profile->>'city' as city
FROM users;
المخرجات:
name | age | city
------|-----|----------------
Alice | 28 | New York
Bob | 35 | San Francisco
التصفية حسب حقل JSON:
SELECT name FROM users WHERE (profile->>'age')::int > 30;
المخرجات: Bob
تعد دوال JSON قوية للبيانات شبه المنظمة دون التضحية بقوة استعلام SQL.
قواعد البيانات السحابية: البدء فورًا
لا تحتاج إلى تثبيت خادم قاعدة بيانات. توفر المنصات السحابية قواعد بيانات فورية.
Supabase
Supabase هي PostgreSQL في السحاب. قم بالتسجيل، وأنشئ مشروعًا، واحصل على قاعدة بيانات على الفور.
import { createClient } from '@Supabase/Supabase-js';
const Supabase = createClient(URL, KEY);
const { data, error } = await Supabase
.from('users')
.select('*')
.gt('created_at', '2026-02-01');
تقوم Supabase بتجريد طبقة SQL باستخدام عميل JavaScript، ولكن يمكنك أيضًا كتابة SQL خام.
PlanetScale
PlanetScale هي خدمة MySQL (والآن Postgres) مدارة مبنية على Vitess، وهي طبقة تقسيم MySQL التي تم تطويرها في الأصل في YouTube. إنها محسنة لتطبيقات الويب وتتضمن ميزة التفريع (فروع لقاعدة بياناتك، مثل فروع Git للكود). أوقفت PlanetScale خطتها المجانية Hobby في مارس 2024، لذا تتطلب جميع قواعد البيانات الجديدة الآن خطة مدفوعة — تحقق من planetscale.com/pricing لمعرفة فئات الدخول الحالية.
pscale connect mydb main
ثم اكتب SQL مباشرة:
SELECT * FROM users WHERE created_at > '2026-02-01';
Neon و Turso
Neon هي PostgreSQL بدون خادم (serverless) مع توسيع تلقائي. Turso هي SQLite على نطاق واسع، مع نسخ قراءة عالمية لزمن انتقال منخفض للغاية.
كلاهما ممتاز للمشاريع الصغيرة والمتوسطة ويقدمان خططًا مجانية سخية.
منصات التدريب
تعلم SQL يتطلب ممارسة عملية. هذه المنصات مجانية وممتازة.
SQLBolt (sqlbolt.com): دروس تفاعلية مع ممارسة مدمجة. يمكن إكمالها في 15 دقيقة.
Mode Analytics (mode.com/sql-tutorial): برنامج تعليمي متقدم لـ SQL مع مجموعات بيانات حقيقية.
LeetCode SQL 50 (leetcode.com/studyplan/top-sql-50): تحديات برمجية مع تقييمات للصعوبة. رائعة للتحضير للمقابلات.
SQLZoo (sqlzoo.net): دروس تفاعلية تغطي SQL من المستوى الأساسي إلى المتقدم.
اقضِ 30 دقيقة على كل منصة. ستترسخ الأنماط في ذهنك.
SQL المدعوم بالذكاء الاصطناعي: من اللغة الطبيعية إلى الاستعلامات
جعلت نماذج اللغة الكبيرة (LLMs) كتابة SQL أكثر سهولة. يمكنك وصف ما تريده باللغة الإنجليزية، وسيقوم الذكاء الاصطناعي بإنشاء SQL.
You: "Show me the top 5 customers by revenue"
AI:
SELECT user_id, SUM(amount) as total_revenue
FROM orders
GROUP BY user_id
ORDER BY total_revenue DESC
LIMIT 5;
أدوات مثل GitHub Copilot، و ChatGPT، والمساعدات الخاصة بقواعد البيانات (Gemini في BigQuery، ومحرر SQL المدعوم بالذكاء الاصطناعي من Supabase) يمكنها إنشاء استعلامات. لكن يجب أن تفهم ما تنتجه — لا تثق أبداً بشكل أعمى في SQL الناتج عن الذكاء الاصطناعي، خاصة فيما يتعلق بتعديل البيانات.
أداء الاستعلام: لماذا يهم؟
الاستعلام المكتوب جيداً يعيد النتائج في أجزاء من الثانية. أما الاستعلام المكتوب بشكل سيئ فيتوقف بسبب انتهاء الوقت. إليك السبب:
الفهارس (Indexes) تسرع عمليات البحث. بدون فهرس، تقوم قاعدة البيانات بفحص كل صف. مع وجود فهرس على البريد الإلكتروني، يصبح العثور على مستخدم عن طريق بريده الإلكتروني فورياً.
-- Slow without an index on email
SELECT * FROM users WHERE email = 'alice@example.com';
-- Fast if there's an index on email
CREATE INDEX idx_users_email ON users(email);
عمليات الربط (Joins) قد تكون مكلفة. ربط الجداول الكبيرة يتطلب من قاعدة البيانات مطابقة ملايين الصفوف. قم بالتحسين عن طريق:
- التصفية مبكراً (WHERE قبل JOIN)
- الربط على الأعمدة المفهرسة
- تجنب الأعمدة غير الضرورية في SELECT
GROUP BY قد تكون بطيئة. تجميع ملايين الصفوف للعمليات الحسابية يتطلب فرزاً. إذا كان عمود المجموعة يحتوي على فهرس، فسيكون ذلك أسرع.
غالباً ما يكتب المبتدئون استعلامات صحيحة منطقياً ولكنها بطيئة للغاية. مع الممارسة، ستطور حدساً تجاه الأداء.
الأخطاء الشائعة (SQL Antipatterns) التي يجب تجنبها
1. استخدام * SELECT (إلا إذا كنت تحتاج حقاً لجميع الأعمدة)
-- Bad: fetches unused columns, wastes bandwidth
SELECT * FROM users WHERE id = 1;
-- Good: fetch only what you need
SELECT id, name, email FROM users WHERE id = 1;
2. عدم استخدام الفهارس
-- If you frequently filter by email, add an index
CREATE INDEX idx_users_email ON users(email);
3. الاستعلامات الفرعية المرتبطة في SELECT (يفضل استخدام JOIN مع GROUP BY)
-- Slow: correlated subquery runs once per row in users
SELECT u.id, u.name,
(SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) AS num_orders
FROM users u;
-- Fast: single aggregation pass with LEFT JOIN
SELECT u.id, u.name, COUNT(o.id) AS num_orders
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.name;
كلا الاستعلامين يعيدان صفاً واحداً لكل مستخدم. يمكن للمحسنات الحديثة أحياناً إعادة كتابة الشكل المرتبط، لكن JOIN الصريح قابل للنقل ومتوقع النتائج.
4. تحويلات الأنواع الضمنية
-- Bad: comparing string '100' to integer 100 requires conversion
SELECT * FROM products WHERE price = '100';
-- Good: match types
SELECT * FROM products WHERE price = 100;
الخلاصة
لغة SQL سهلة التعلم وقوية. ابدأ بـ SELECT و WHERE و JOINs. بمجرد أن تشعر بالراحة، استكشف CTEs و window functions — فهي ستغير طريقة تفكيرك في استعلامات البيانات.
استخدم قواعد البيانات السحابية مثل Supabase أو PlanetScale لتخطي إعداد البنية التحتية. تدرب على SQLBolt أو LeetCode. واستفد من أدوات الذكاء الاصطناعي لإنشاء استعلامات البداية، ولكن افهم دائماً ما تنتجه.
مهارات SQL تراكمية. أسبوع من الممارسة المركزة يمنحك أساساً يدوم لعقود. اختر قاعدة بيانات، وافتح منصة تدريب، وابدأ في الاستعلام.