💻 SQL الأساسية

استرجاع البيانات، التعديل، وأساسيات الاستعلامات

📚 الفصل السادس
🎯 CS 340
👩‍🎓 شوق العمران
⏱️ دليل شامل

📑 فهرس المحتويات

🎯

نظرة عامة عن SQL

📘 وش هي 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

📋

الإسقاط (SELECT)

📘 وش هو الإسقاط؟

الإسقاط (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;

يظهر الراتب بعد زيادة ١٠٪

🔍

الاختيار (WHERE)

📘 وش هو الاختيار؟

الاختيار (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
  • % (نسبة مئوية): تطابق صفر أو أكثر من الأحرف
  • _ (شرطة سفلية): تطابق حرف واحد بالضبط
💡 أمثلة مطابقة الأنماط
-- أسماء تبدأ بحرف 'A' SELECT * FROM STUDENT WHERE Name LIKE 'A%'; -- عناوين تحتوي على 'Houston,TX' 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');

يدور الأحداث قبل ١ يناير ١٩٤٣

🔗

الربط (Joins)

📘 وش هو الربط؟

الربط (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 (ربط الجدول مع نفسه)

DISTINCT - إزالة المكرر

📘 المكرر في 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; -- النتيجة ممكن يكون فيها مكرر: -- dustin -- dustin -- dustin -- lubber
💡 مع DISTINCT
SELECT DISTINCT sname FROM Sailors s, Reserves r WHERE s.sid = r.sid; -- النتيجة بدون مكرر: -- dustin -- lubber -- rusty
📊

ORDER BY - ترتيب النتائج

📘 ترتيب النتائج

جملة 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, UPDATE, DELETE

INSERT - إضافة البيانات

📘 جملة INSERT

أمر INSERT يضيف صفوف جديدة للجدول.

💡 INSERT أساسي
-- إدراج كل الأعمدة INSERT INTO Sailors VALUES(22, 'dustin', 7, 45.0); -- إدراج أعمدة محددة INSERT INTO Sailors(sid, sname, rating) VALUES(22, 'dustin', 7); -- العمر (age) راح يكون NULL
💡 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: الشروط المخصصة تنطبق

ملخص الفصل

🎯 النقاط الرئيسية
  • SQL لغة تصريحية: تحدد إيش تبي، مو كيف تجيبه.
  • هيكل الاستعلام الأساسي: SELECT-FROM-WHERE-ORDER BY
  • الإسقاط (SELECT): تختار الأعمدة اللي تبي تطلعها.
  • الاختيار (WHERE): تفلتر الصفوف اللي تبيها.
  • الربط (Joins): تدمج بيانات من جداول متعددة.
  • DISTINCT: تشيل المكرر من النتائج.
  • ORDER BY: ترتب النتائج تصاعدي أو تنازلي.
  • عمليات المجموعات: UNION, INTERSECT, EXCEPT تدمج الاستعلامات.
  • عمليات DML: INSERT, UPDATE, DELETE تعدل البيانات.
🎓 الخطوات الجاية

بعد ما تتعلم SQL الأساسية، أنت جاهز لـ:

  • استعلامات معقدة مع استعلامات فرعية (Subqueries).
  • دوال التجميع (COUNT, SUM, AVG, MIN, MAX).
  • جمل GROUP BY و HAVING.
  • طرق العرض (Views), المحفزات (Triggers), التأكيدات (Assertions).
  • أنواع الربط المتقدمة (OUTER JOIN, SELF JOIN).