تخطَّ إلى المحتوى

جلب البيانات في SQL: SELECT

الدرس 3 من 12 · SQL

SELECT هو أكثر أمر ستكتبه في SQL على الإطلاق. كل مرة تفتح فيها صفحة منتج، أو قائمة رسائل، أو نتائج بحث، هناك استعلام SELECT يعمل في الخلفية. في هذا الدرس ستتعلم كيف تطلب من قاعدة البيانات بالضبط ما تحتاجه، لا أكثر ولا أقل.

البيانات التي سنعمل عليها

Section titled “البيانات التي سنعمل عليها”

في هذا الدرس والدروس القادمة، سنستخدم جدول طلاب فيه هذه البيانات:

CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER,
city TEXT,
score INTEGER
);
INSERT INTO students (id, name, age, city, score) VALUES
(1, 'سارة', 14, 'القاهرة', 92),
(2, 'عمر', 15, 'الإسكندرية', 78),
(3, 'منى', 13, 'طنطا', 85),
(4, 'يوسف', 15, 'القاهرة', 64),
(5, 'ليلى', 14, 'أسيوط', NULL),
(6, 'أحمد', 13, 'الإسكندرية', 71);

لاحظ أن ليلى درجتها NULL، أي لم تُسجَّل بعد. سنرى لاحقاً كيف تتعامل SQL مع القيم الفارغة. انسخ هذا الكود في أي محرر SQL لتجرب معنا.

SELECT * FROM students;

الناتج:

id name age city score
1 سارة 14 القاهرة 92
2 عمر 15 الإسكندرية 78
3 منى 13 طنطا 85
4 يوسف 15 القاهرة 64
5 ليلى 14 أسيوط NULL
6 أحمد 13 الإسكندرية 71

* تعني «كل الأعمدة». مفيدة للتجربة والاستكشاف السريع.

SELECT name, city FROM students;

الناتج:

name city
سارة القاهرة
عمر الإسكندرية
منى طنطا
يوسف القاهرة
ليلى أسيوط
أحمد الإسكندرية

اكتب أسماء الأعمدة التي تحتاجها مفصولة بفواصل، وبالترتيب الذي تريده في النتيجة.

أعمدة محسوبة وأسماء مستعارة

Section titled “أعمدة محسوبة وأسماء مستعارة”

يمكنك إجراء عمليات حسابية داخل SELECT، وتسمية النتيجة بـ AS:

SELECT name, score, score + 5 AS new_score FROM students;

الناتج:

name score new_score
سارة 92 97
عمر 78 83
منى 85 90
يوسف 64 69
ليلى NULL NULL
أحمد 71 76
  • score + 5: عمود جديد محسوب في النتيجة فقط. البيانات الأصلية في الجدول لم تتغير.
  • AS new_score: اسم مستعار (Alias) للعمود في النتيجة.
  • لاحظ أن NULL + 5 تعطي NULL: أي عملية على قيمة مجهولة تعطي نتيجة مجهولة.

ويمكنك دمج النصوص. في SQLite و PostgreSQL يكون الدمج بالعامل ||:

SELECT name || ' من ' || city AS info FROM students LIMIT 2;

الناتج:

info
سارة من القاهرة
عمر من الإسكندرية

(في MySQL تستخدم الدالة CONCAT(name, ' من ', city) لنفس الغرض.)

ما المدن التي يأتي منها الطلاب؟

SELECT DISTINCT city FROM students;

الناتج:

city
القاهرة
الإسكندرية
طنطا
أسيوط

القاهرة والإسكندرية ظهرت كل منهما مرة واحدة، رغم وجود طالبين من كل منهما. DISTINCT تحذف الصفوف المكررة من النتيجة.

SELECT name FROM students LIMIT 3;

الناتج:

name
سارة
عمر
منى

LIMIT تحدد أقصى عدد من الصفوف في النتيجة. ستراها كثيراً مع الترتيب في درس ORDER BY، مثل «أعلى 3 درجات». وانتبه: بدون ترتيب صريح، لا تضمن SQL أي صفوف ستأتي أولاً.

على جدول الطلاب السابق، اكتب استعلامات تعرض:

  1. أسماء الطلاب وأعمارهم فقط.
  2. الاسم، والعمر بعد 5 سنوات باسم مستعار age_in_5_years.
  3. الأعمار المختلفة الموجودة في الجدول بدون تكرار.
  4. أول طالبين فقط بكل بياناتهم.
  • نسيان الفاصلة بين الأعمدة: SELECT name city FROM students لن تعطي خطأ في بعض الأنظمة، بل تفهم city كاسم مستعار لـ name! نتيجة غريبة وصامتة.
  • اسم عمود خاطئ: خطأ مثل no such column: nam. راجع الأسماء حرفاً بحرف.
  • الظن أن العمود المحسوب يغيّر الجدول: SELECT score + 5 تعرض فقط، ولا تحفظ. للتعديل الفعلي ستتعلم UPDATE.

سؤال

ما وظيفة DISTINCT في SELECT DISTINCT city FROM students؟

سؤال

ماذا تعني AS في SELECT score * 2 AS double_score؟

  • SELECT * لكل الأعمدة، و SELECT a, b لأعمدة محددة، واطلب ما تحتاجه فقط.
  • يمكن حساب أعمدة جديدة في النتيجة، وتسميتها بـ AS.
  • أي عملية على NULL تعطي NULL.
  • DISTINCT تزيل التكرار من النتيجة.
  • LIMIT تحدد أقصى عدد للصفوف.