دليل عملي سهل لكيفية البدء مع SQL

تم التحديث: ٢٧ مارس ٢٠٢٦

Easy Hands on Guide how to get Started With SQL

ملخص

يقوم SQL بالاستعلام عن البيانات من قواعد البيانات باستخدام SELECT، والتصفية باستخدام WHERE، والتجميع باستخدام GROUP BY. يضيف SQL الحديث CTEs (مجموعات نتائج مؤقتة)، ودوال النافذة window functions (الترتيب، والمجاميع التراكمية)، ودوال JSON. منصات التدريب مثل SQLBolt مجانية؛ وقواعد البيانات السحابية مثل Supabase و PlanetScale توفر قواعد بيانات فورية؛ وأدوات الذكاء الاصطناعي تقوم الآن بتحويل اللغة الطبيعية إلى SQL.

SQL هي لغة البيانات. سواء كنت تبني تطبيقات ويب، أو تحلل مقاييس الأعمال، أو تستكشف مجموعات البيانات، فإن SQL لا مفر منها. ولسبب وجيه — فهي قوية، ومعيارية عبر قواعد البيانات المختلفة، وسهلة التعلم نسبيًا.

التحدي ليس في تعلم أساسيات SQL. فكلمات مثل SELECT و WHERE و JOIN تستغرق وقتًا قصيرًا لتعلمها. التحدي الحقيقي هو بناء الحدس؛ معرفة متى تستخدم دالة نافذة بدلاً من استعلام فرعي، وفهم أداء الاستعلام، وإدراك أن المخطط غير الموحد (denormalized schema) يكون منطقيًا في بعض الأحيان.

في عام 2026، تطورت SQL بشكل كبير. يدعم SQL الحديث (PostgreSQL، MySQL 8.0+، SQLite) ميزات متقدمة تجعل المشكلات المعقدة تبدو أنيقة: تبسط تعبيرات الجدول الشائعة (CTEs) الاستعلامات المتداخلة، وتلغي دوال النافذة التجميعات المتكررة، وتعمل دوال JSON كجسر بين النماذج العلائقية والموجهة نحو المستندات.

يأخذك هذا الدليل من "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 في جدول الطلبات مع id في جدول المستخدمين.

أنواع الـ JOINs

  • INNER JOIN: فقط الصفوف التي تتطابق في كلا الجدولين
  • LEFT JOIN: جميع الصفوف من الجدول الأيسر، مع الصفوف المطابقة من الجدول الأيمن
  • RIGHT JOIN: جميع الصفوف من الجدول الأيمن، مع الصفوف المطابقة من الجدول الأيسر
  • FULL OUTER JOIN: جميع الصفوف من كلا الجدولين

مثال على LEFT JOIN:

SELECT users.name, COUNT(orders.id) as num_orders
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id;

هذا يظهر جميع المستخدمين، حتى أولئك الذين ليس لديهم طلبات (سيكون عددهم 0).

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;

بدلاً من تداخل الاستعلامات الفرعية، تقوم بتسمية النتائج الوسيطة. يُقرأ الاستعلام من الأعلى إلى الأسفل، مما يجعل المنطق واضحًا.

دوال النافذة: الترتيب والمجاميع التراكمية

تقوم دوال النافذة بحساب القيم عبر "نافذة" من الصفوف.

SELECT
  name,
  amount,
  ROW_NUMBER() OVER (ORDER BY amount DESC) as rank,
  SUM(amount) OVER (ORDER BY amount DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as running_total
FROM orders;

المخرجات:

name    | amount | rank | running_total
--------|--------|------|---------------
Large   | 150    | 1    | 150
Medium  | 100    | 2    | 250
Small   | 50     | 3    | 300

ROW_NUMBER() OVER (ORDER BY amount DESC) يرتب الصفوف حسب المبلغ بترتيب تنازلي. الـ SUM(...) OVER (...) يحسب المجموع التراكمي أثناء الانتقال عبر الصفوف.

تغني دوال النافذة عن الحاجة إلى الـ self-joins المعقدة والاستعلامات الفرعية.

دوال JSON: الجسر بين النماذج العلائقية والموجهة نحو المستندات

تدعم قواعد بيانات SQL الحديثة JSON. يمكنك تخزين بيانات JSON والاستعلام عنها وتحويلها بشكل أصلي.

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 قابلة للتوسع، مبنية على Vitess (MySQL بمقياس YouTube). إنها محسنة لتطبيقات الويب وتتضمن ميزة التفريع (فروع لقاعدة بياناتك، مثل فروع Git للكود).

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 (leetcode.com/study-plan/sql): تحديات برمجية مع تقييمات للصعوبة. رائعة للتحضير للمقابلات.

SQLZoo (sqlzoo.net): دروس تفاعلية تغطي SQL من الأساسيات إلى المستويات المتقدمة.

اقضِ 30 دقيقة على كل منصة، وستترسخ الأنماط في ذهنك.

SQL المدعوم بالذكاء الاصطناعي: من اللغة الطبيعية إلى الاستعلامات

جعلت نماذج اللغة الكبيرة (LLMs) كتابة SQL أكثر سهولة. يمكنك وصف ما تريده باللغة الإنجليزية، وسيقوم الذكاء الاصطناعي بإنشاء SQL.

أنت: "أظهر لي أفضل 5 عملاء من حيث الإيرادات"

الذكاء الاصطناعي:
SELECT user_id, SUM(amount) as total_revenue
FROM orders
GROUP BY user_id
ORDER BY total_revenue DESC
LIMIT 5;

أدوات مثل GitHub Copilot و ChatGPT والمساعدين الخاصين بقواعد البيانات (مثل BigQuery Copilot ومحرر SQL في Supabase) يمكنها إنشاء استعلامات. ولكن يجب أن تفهم ما تنشئه — لا تثق أبدًا بشكل أعمى في SQL الناتج عن الذكاء الاصطناعي، خاصة عند تعديل البيانات.

أداء الاستعلام: لماذا يهم؟

الاستعلام المكتوب جيدًا يعيد النتائج في أجزاء من الثانية. أما الاستعلام المكتوب بشكل سيئ فقد يتوقف عن العمل بسبب انتهاء الوقت. إليك السبب:

الفهارس (Indexes) تسرع عمليات البحث. بدون فهرس، تقوم قاعدة البيانات بفحص كل صف. مع وجود فهرس على البريد الإلكتروني، يصبح العثور على مستخدم عبر بريده الإلكتروني فوريًا.

-- بطيء بدون فهرس على البريد الإلكتروني
SELECT * FROM users WHERE email = 'alice@example.com';

-- سريع إذا كان هناك فهرس على البريد الإلكتروني
CREATE INDEX idx_users_email ON users(email);

الـ Joins قد تكون مكلفة. يتطلب دمج الجداول الكبيرة من قاعدة البيانات مطابقة ملايين الصفوف. قم بالتحسين من خلال:

  • التصفية مبكرًا (استخدام WHERE قبل JOIN)
  • الدمج (Joining) على أعمدة مفهرسة
  • تجنب الأعمدة غير الضرورية في SELECT

يمكن أن يكون GROUP BY بطيئاً. يتطلب تجميع ملايين الصفوف للعمليات الحسابية (aggregates) إجراء عملية فرز. إذا كان العمود المستخدم في التجميع يحتوي على فهرس (index)، فستكون العملية أسرع.

غالباً ما يكتب المبتدئون استعلامات صحيحة منطقياً ولكنها بطيئة للغاية. مع الممارسة، ستطور حدساً تجاه الأداء.

أنماط SQL السيئة التي يجب تجنبها

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. عدم استخدام الفهارس (Indexes)

-- If you frequently filter by email, add an index
CREATE INDEX idx_users_email ON users(email);

3. الاستعلامات الفرعية (Subqueries) في SELECT (استخدم window functions بدلاً منها)

-- Slow: subquery runs per row
SELECT user_id, (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) as num_orders
FROM users u;

-- Fast: window function
SELECT user_id, COUNT(*) OVER (PARTITION BY user_id) as num_orders
FROM orders;

4. تحويلات الأنواع الضمنية (Implicit type conversions)

-- 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 تراكمية. أسبوع واحد من التدريب المركز يمنحك أساساً يدوم لعقود. اختر قاعدة بيانات، وافتح منصة تدريب، وابدأ في كتابة الاستعلامات.


نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.