تعلم SQL من الصفر
تُستخدم لغة SQL (Structured Query Language) للتحكم بقواعد البيانات العلائقية. سواء استخدمت SQLite أو PostgreSQL أو MySQL أو SQL Server، فمعظم الأوامر الأساسية متشابهة. تستخدم هذه المقالة SQLite الذي لا يحتاج إلى خادم، لإنشاء الجداول وإضافة البيانات والبحث والربط بين الجداول والتجميع وتعديل البيانات.
تم تشغيل جميع الأوامر في هذه المقالة باستخدام SQLite 3.50، والمخرجات المعروضة حقيقية.
ما الذي تحتاجه
- SQLite (تحقق بالأمر `sqlite3 --version`) أو برنامج DB Browser for SQLite المجاني
كيف ترتبط الجداول
إنشاء الجداول وإضافة البيانات
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
class_id INTEGER
);
CREATE TABLE classes (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
);
CREATE TABLE scores (
student_id INTEGER REFERENCES students(id),
subject TEXT,
score INTEGER
);
INSERT INTO classes VALUES (1, 'ม.4/1'), (2, 'ม.4/2');
INSERT INTO students VALUES (1, 'สมชาย', 1), (2, 'สมหญิง', 1), (3, 'สมศักดิ์', 2);
INSERT INTO scores VALUES (1, 'คณิต', 85), (1, 'อังกฤษ', 70), (2, 'คณิต', 72), (3, 'คณิต', 45), (3, 'อังกฤษ', 60);
- يمنح `PRIMARY KEY` كل صف مفتاحًا فريدًا.
- يعني `NOT NULL` أن القيمة مطلوبة.
- تربط `REFERENCES` الجداول، فيجب أن يوجد `scores.student_id` في `students`.
البحث باستخدام SELECT وWHERE
SELECT name FROM students WHERE class_id = 1;
الربط بين الجداول باستخدام JOIN
SELECT s.name, c.title FROM students s JOIN classes c ON c.id = s.class_id ORDER BY s.name;
تجمع `JOIN` الصفوف من جدولين عندما تتطابق المفاتيح. الحرفان `s` و`c` اختصارات لاسمي الجدولين.
التجميع باستخدام GROUP BY
SELECT subject, AVG(score) AS avg_score, COUNT(*) AS n FROM scores GROUP BY subject ORDER BY subject;
تعمل دوال التجميع مثل `AVG` و`COUNT` و`SUM` على كل مجموعة. استخدم `HAVING` للتصفية بعد التجميع:
SELECT student_id, SUM(score) AS total FROM scores GROUP BY student_id HAVING SUM(score) >= 100;
تعديل البيانات وحذفها
UPDATE scores SET score = score + 5 WHERE student_id = 3 AND subject = 'คณิต';
DELETE FROM scores WHERE score < 50;
SELECT student_id, subject, score FROM scores ORDER BY student_id, subject;
يرفع `UPDATE` الدرجة 45 إلى 50، لذلك لا يحذف `DELETE` أي صف. لاحظ أن الأوامر تُنفَّذ بالترتيب الذي كُتبت به.
النتائج الفعلية
name
------
สมชาย
สมหญิง
name title
-------- -----
สมชาย ม.4/1
สมศักดิ์ ม.4/2
สมหญิง ม.4/1
subject avg_score n
------- ---------------- -
คณิต 67.3333333333333 3
อังกฤษ 65.0 2
student_id total
---------- -----
1 155
3 105
student_id subject score
---------- ------- -----
1 คณิต 85
1 อังกฤษ 70
2 คณิต 72
3 คณิต 50
3 อังกฤษ 60
أخطاء شائعة
- **نسيان `WHERE` في `UPDATE` أو `DELETE`:** سيُعدَّل كل صف أو يُحذف. نفّذ `SELECT` بالشرط نفسه أولًا.
- **وضع شرط على نتيجة التجميع داخل `WHERE`:** استخدم `HAVING` للشروط على المجاميع.
- **استخدام علامات الاقتباس المزدوجة للنصوص:** تستخدم SQL القياسية علامات الاقتباس المفردة `'...'` للنصوص.
- **افتراض أن `ORDER BY` يعمل تلقائيًا:** إذا لم تحدده فلا يُضمن ترتيب الصفوف.
الخطوات التالية
صمّم جداولك الخاصة، مثل المنتجات والطلبات، واكتب `JOIN` يحسب إجمالي المبيعات لكل منتج. ثم تعلّم الفهارس (Index) والمعاملات (Transactions)، فهي مهمة عندما تكبر البيانات.
الخلاصة
تحدد SQL البنية باستخدام `CREATE`، وتدير البيانات باستخدام `INSERT` و`UPDATE` و`DELETE`، وتبحث باستخدام `SELECT` مع `WHERE` و`JOIN` و`GROUP BY` و`HAVING`. التجربة على بيانات نموذجية صغيرة توضح أثر كل أمر بوضوح.