📘 وش هي SQL؟
SQL (Structured Query Language) هي لغة قياسية لإدارة والتعامل مع قواعد البيانات العلائقية. هي لغة تصريحية (Declarative) مو إجرائية - تحدد إيش تبي، مو كيف تجيبه.
🔑 مكونات SQL
لغة تعريف البيانات (DDL): CREATE, ALTER, DROP
لغة معالجة البيانات (DML):
- استرجاع البيانات: SELECT (محور هذا الفصل)
- تعديل البيانات: INSERT, UPDATE, DELETE
💡 تصريحي vs إجرائي
تصريحي (SQL): "عطني كل الطلاب اللي معدلهم > 3.5"
إجرائي: "طِف على كل الطلاب، شيك على معدل كل واحد، إذا أكبر من 3.5 ضيفه للنتيجة"
SQL تخلي قاعدة البيانات تقرر بنفسها الطريقة الأكفأ لتنفيذ استعلامك!
📋 الصيغة الأساسية لاستعلام SQL
SELECT <قائمة الخصائص>
FROM <قائمة الجداول>
[WHERE <الشرط>]
[ORDER BY <قائمة الخصائص>];
فقط SELECT و FROM إجبارية!
🎯 أجزاء الاستعلام
- SELECT: يحدد الأعمدة اللي تبي تطلعها (الإسقاط)
- FROM: يحدد الجداول اللي بتستخدمها
- WHERE: يفلتر الصفوف بناءً على شروط (الاختيار)
- ORDER BY: يرتب النتائج
💡 مثال استعلام بسيط
SELECT Name
FROM Student
WHERE GPA > 3.5;
هذا يطلع أسماء كل الطلاب اللي معدلهم أكبر من 3.5
📘 وش هو الإسقاط؟
الإسقاط (Projection) هو اختيار أعمدة معينة من الجدول. جملة SELECT تحدد أي الخصائص تظهر في النتيجة.
اختيار كل الأعمدة
💡 استخدام SELECT *
SELECT *
FROM Sailors;
العلامة (*) تجيب كل الأعمدة من الجدول
اختيار أعمدة محددة
💡 خصائص محددة
SELECT sname, rating
FROM Sailors;
يطلع فقط عمودي sname و rating
إعادة تسمية الأعمدة (AS)
💡 استخدام AS للاسم المستعار
SELECT sname AS sailor_name, rating AS skill_level
FROM Sailors;
يغير أسماء الأعمدة في النتيجة عشان تكون أوضح
العمليات الحسابية
💡 عمليات حسابية في SELECT
SELECT Fname, Lname, 1.1 * Salary AS new_salary
FROM EMPLOYEE;
يظهر الراتب بعد زيادة ١٠٪
📘 وش هو الاختيار؟
الاختيار (Selection) هو فلترة الصفوف بناءً على شروط. جملة WHERE تحدد أي الصفوف تظهر في النتيجة.
عوامل المقارنة
⚙️ العوامل المتاحة
| العامل |
المعنى |
مثال |
| = |
يساوي |
WHERE age = 25 |
| <> أو != |
لا يساوي |
WHERE major <> 'CS' |
| < |
أصغر من |
WHERE salary < 50000 |
| > |
أكبر من |
WHERE rating > 5 |
| <= |
أصغر من أو يساوي |
WHERE age <= 30 |
| >= |
أكبر من أو يساوي |
WHERE GPA >= 3.0 |
العوامل المنطقية (AND, OR)
💡 دمج الشروط
SELECT *
FROM EMPLOYEE
WHERE (Salary BETWEEN 30000 AND 40000) AND Dno = 5;
يدور الموظفين في القسم 5 ورواتبهم بين ٣٠٠٠٠ و ٤٠٠٠٠
مطابقة الأنماط (LIKE)
📋 رموز LIKE
- % (نسبة مئوية): تطابق صفر أو أكثر من الأحرف
- _ (شرطة سفلية): تطابق حرف واحد بالضبط
💡 أمثلة مطابقة الأنماط
SELECT *
FROM STUDENT
WHERE Name LIKE 'A%';
SELECT Fname, Lname
FROM EMPLOYEE
WHERE Address LIKE '%Houston,TX%';
عامل BETWEEN
💡 استعلامات النطاق
SELECT *
FROM Sailors
WHERE rating BETWEEN 5 AND 7;
يساوي: WHERE rating >= 5 AND rating <= 7
مقارنات التواريخ
💡 التعامل مع التواريخ
SELECT *
FROM events
WHERE date < to_date('1-1-1943', 'DD-MON-YYYY');
يدور الأحداث قبل ١ يناير ١٩٤٣
📘 وش هو الربط؟
الربط (Join) يدمج صفوف من جدولين أو أكثر بناءً على عمود مشترك. هذي طريقة الاستعلام من جداول متعددة في نفس الوقت.
الجداء الديكارتي (Cross Product)
⚙️ كيف تشتغل الـ Joins
الخطوة ١: نأخذ الجداء الديكارتي لكل الجداول (كل التركيبات الممكنة)
الخطوة ٢: نطبق شروط WHERE لفلترة الصفوف
الخطوة ٣: نختار الأعمدة المطلوبة
💡 مثال ربط
SELECT S.sname
FROM Sailors S, Reserves R
WHERE S.sid = R.sid AND R.bid = 103;
يطلع أسماء البحارة اللي حجزوا القارب رقم ١٠٣
💡 ربط أكثر من جدولين
SELECT *
FROM Student s, Takes t, Course c
WHERE s.sid = t.sid AND t.cid = c.cid;
يدمج بيانات الطالب، التسجيل، والمقرر
⚠️ مهم: الأسماء المستعارة للجداول
استخدم أسماء مستعارة للجداول (مثل S, R) عشان:
- تخلي الاستعلام أسهل للقراءة
- تفرق بين جداول فيها أسماء أعمدة متشابهة
- تسوي self-join (ربط الجدول مع نفسه)
📘 المكرر في SQL
SQL بشكل افتراضي تتعامل مع الجداول على إنها مجموعات متعددة (Multisets/Bags) مو مجموعات (Sets). هذا يعني أن الصفوف المكررة تقدر تظهر في النتائج.
🔑 SELECT vs SELECT DISTINCT
- SELECT: يرجع كل الصفوف (ضمنيًا SELECT ALL)
- SELECT DISTINCT: يشيل الصفوف المكررة
💡 بدون DISTINCT
SELECT sname
FROM Sailors s, Reserves r
WHERE s.sid = r.sid;
💡 مع DISTINCT
SELECT DISTINCT sname
FROM Sailors s, Reserves r
WHERE s.sid = r.sid;
📘 ترتيب النتائج
جملة ORDER BY ترتب نتائج الاستعلام حسب عمود واحد أو أكثر.
الترتيب الأساسي
🔑 أنواع الترتيب
- ASC: تصاعدي (افتراضي)
- DESC: تنازلي
💡 ترتيب بعمود واحد
SELECT *
FROM Sailors
ORDER BY age;
SELECT *
FROM Sailors
ORDER BY rating DESC;
الترتيب بعدة أعمدة
💡 مفاتيح ترتيب متعددة
SELECT D.Dname, E.Lname, E.Fname, P.Pname
FROM DEPARTMENT D, EMPLOYEE E, WORKS_ON W, PROJECT P
WHERE D.Dnumber = E.Dno
AND E.Ssn = W.Essn
AND W.Pno = P.Pnumber
ORDER BY D.Dname, E.Lname, E.Fname;
يرتب أولًا حسب اسم القسم، بعدين اسم العائلة، بعدين الاسم الأول
📘 وش هي عمليات المجموعات؟
عمليات المجموعات تدمج نتائج استعلامين أو أكثر.
UNION
🔑 عامل UNION
يدمج مجموعات النتائج و يحذف المكرر بشكل افتراضي.
💡 مثال UNION
SELECT Name, Location
FROM facebook
UNION
SELECT Name, Location
FROM linkedin;
يدمج الأسماء والمواقع من المنصتين، ويزيل المكرر
UNION ALL
💡 مثال UNION ALL
SELECT Name, Location
FROM facebook
UNION ALL
SELECT Name, Location
FROM linkedin;
يبقي كل الصفوف بما فيها المكرر
INTERSECT
🔑 عامل INTERSECT
يرجع فقط الصفوف اللي تظهر في كلتا النتيجتين.
💡 مثال INTERSECT
SELECT Name
FROM facebook
INTERSECT
SELECT Name
FROM linkedin;
يدور الناس اللي عندهم حسابات في المنصتين
EXCEPT / MINUS
🔑 عامل EXCEPT
يرجع الصفوف من الاستعلام الأول اللي موجودة في الاستعلام الثاني.
💡 مثال EXCEPT
SELECT Name
FROM facebook
EXCEPT
SELECT Name
FROM linkedin;
يدور الناس اللي في فيسبوك بس مو في لينكد إن
INSERT - إضافة البيانات
📘 جملة INSERT
أمر INSERT يضيف صفوف جديدة للجدول.
💡 INSERT أساسي
INSERT INTO Sailors
VALUES(22, 'dustin', 7, 45.0);
INSERT INTO Sailors(sid, sname, rating)
VALUES(22, 'dustin', 7);
💡 INSERT من استعلام
INSERT INTO WORKS_ON_INFO (Emp_name, Proj_name, Hours_per_week)
SELECT E.Lname, P.Pname, W.Hours
FROM PROJECT P, WORKS_ON W, EMPLOYEE E
WHERE P.Pnumber = W.Pno AND W.Essn = E.Ssn;
يدرج ناتج استعلام في جدول
UPDATE - تعديل البيانات
📘 جملة UPDATE
أمر UPDATE يعدل صفوف موجودة.
💡 مثال UPDATE
UPDATE EMPLOYEE
SET Salary = Salary * 1.1
WHERE Dno = 5;
يزيد رواتب موظفي القسم 5 بـ ١٠٪
⚠️ تأثير CASCADE
تحديث المفتاح الأساسي ممكن ينعكس على المفاتيح الخارجية إذا كان في ON UPDATE CASCADE.
DELETE - حذف البيانات
📘 جملة DELETE
أمر DELETE يحذف صفوف من الجدول.
💡 مثال DELETE
DELETE FROM EMPLOYEE
WHERE Lname = 'Brown';
DELETE FROM Sailors
WHERE age > 50;
⚠️ تأثير CASCADE
حذف الصفوف ممكن ينعكس على جداول ثانية إذا كان في ON DELETE CASCADE في قيود المفتاح الخارجي.
🔑 تطبيق القيود (Constraints)
كل عمليات INSERT, UPDATE, DELETE لازم تحقق:
- تكامل الكيان (Entity Integrity): المفاتيح الأساسية ما تكون NULL
- التكامل المرجعي (Referential Integrity): المفاتيح الخارجية تشير لمفاتيح أساسية موجودة
- قيود النطاق (Domain Constraints): القيم تطابق أنواع البيانات
- قيود CHECK: الشروط المخصصة تنطبق