جلب البيانات في SQL: SELECT
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 لتجرب معنا.
كل الأعمدة: *
Section titled “كل الأعمدة: *”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 |
* تعني «كل الأعمدة». مفيدة للتجربة والاستكشاف السريع.
أعمدة محددة
Section titled “أعمدة محددة”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) لنفس الغرض.)
إزالة التكرار: DISTINCT
Section titled “إزالة التكرار: DISTINCT”ما المدن التي يأتي منها الطلاب؟
SELECT DISTINCT city FROM students;الناتج:
| city |
|---|
| القاهرة |
| الإسكندرية |
| طنطا |
| أسيوط |
القاهرة والإسكندرية ظهرت كل منهما مرة واحدة، رغم وجود طالبين من كل منهما. DISTINCT تحذف الصفوف المكررة من النتيجة.
تحديد العدد: LIMIT
Section titled “تحديد العدد: LIMIT”SELECT name FROM students LIMIT 3;الناتج:
| name |
|---|
| سارة |
| عمر |
| منى |
LIMIT تحدد أقصى عدد من الصفوف في النتيجة. ستراها كثيراً مع الترتيب في درس ORDER BY، مثل «أعلى 3 درجات». وانتبه: بدون ترتيب صريح، لا تضمن SQL أي صفوف ستأتي أولاً.
جرّب بنفسك
Section titled “جرّب بنفسك”على جدول الطلاب السابق، اكتب استعلامات تعرض:
- أسماء الطلاب وأعمارهم فقط.
- الاسم، والعمر بعد 5 سنوات باسم مستعار
age_in_5_years. - الأعمار المختلفة الموجودة في الجدول بدون تكرار.
- أول طالبين فقط بكل بياناتهم.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان الفاصلة بين الأعمدة:
SELECT name city FROM studentsلن تعطي خطأ في بعض الأنظمة، بل تفهمcityكاسم مستعار لـname! نتيجة غريبة وصامتة. - اسم عمود خاطئ: خطأ مثل
no such column: nam. راجع الأسماء حرفاً بحرف. - الظن أن العمود المحسوب يغيّر الجدول:
SELECT score + 5تعرض فقط، ولا تحفظ. للتعديل الفعلي ستتعلمUPDATE.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما وظيفة DISTINCT في SELECT DISTINCT city FROM students؟
DISTINCT تحذف الصفوف المكررة من النتيجة، فتظهر كل مدينة مرة واحدة.
سؤال
ماذا تعني AS في SELECT score * 2 AS double_score؟
AS تسمي العمود المحسوب في نتيجة الاستعلام فقط، دون أي تغيير في الجدول.
الخلاصة
Section titled “الخلاصة”SELECT *لكل الأعمدة، وSELECT a, bلأعمدة محددة، واطلب ما تحتاجه فقط.- يمكن حساب أعمدة جديدة في النتيجة، وتسميتها بـ
AS. - أي عملية على
NULLتعطيNULL. DISTINCTتزيل التكرار من النتيجة.LIMITتحدد أقصى عدد للصفوف.