الوحدة 12: SQL – لغة الاستعلامات الهيكلية

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

الهدف من الوحدة

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

12.1 إنشاء قاعدة بيانات (Create Database)

تُعد عملية إنشاء قاعدة البيانات الخطوة الأولى في بناء أي نظام يعتمد على قواعد البيانات. يتم ذلك باستخدام أمر بسيط في SQL.

  • التعريف:

    CREATE DATABASE هو أمر في لغة تعريف البيانات (DDL) ضمن SQL، يُستخدم لإنشاء قاعدة بيانات جديدة في نظام إدارة قواعد البيانات (DBMS). تُشكل قاعدة البيانات الجديدة حاوية منطقية للجداول، وجهات العرض، والإجراءات، وغيرها من كائنات قاعدة البيانات.

  • الصياغة الأساسية:
    
    CREATE DATABASE database_name;
                                

    استبدل database_name بالاسم الذي ترغب في إطلاقه على قاعدة البيانات.

مثال عملي:

CREATE DATABASE UniversityDB;
                        

يُنشئ هذا الأمر قاعدة بيانات جديدة باسم UniversityDB. بعد إنشائها، يمكنك البدء بإنشاء الجداول والكائنات الأخرى داخلها.

خيارات إضافية:

يمكنك تحديد خصائص إضافية لقاعدة البيانات مثل مجموعة الأحرف (Character Set) وطريقة الفرز (Collation) لضمان التعامل الصحيح مع البيانات بلغات مختلفة (خاصة العربية).


CREATE DATABASE UniversityDB
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
                        

تحدد هذه الخيارات أن قاعدة البيانات ستدعم ترميز UTF-8 (بما في ذلك الأحرف العربية والرموز التعبيرية) وأن الفرز سيتم بطريقة عامة وغير حساسة لحالة الأحرف.

لمزيد من المعلومات حول CREATE DATABASE، يمكنك زيارة: SQL CREATE DATABASE – W3Schools

12.2 قيود الجدول (Table Constraints)

قيود الجدول (Table Constraints) هي قواعد جوهرية تُطبق على أعمدة الجداول لفرض سلامة البيانات (Data Integrity) وضمان دقتها واتساقها. إنها تمنع إدخال بيانات غير صالحة أو غير متناسقة.

  • التعريف:

    هي قواعد تُفرض على أعمدة الجداول أو على الجدول بأكمله (قيود على مستوى الجدول) لضمان صحة البيانات، فرادتها، وتناسق العلاقات بين الجداول.

  • أهم أنواع القيود:
    • PRIMARY KEY – المفتاح الرئيسي:

      يُحدد عمودًا (أو مجموعة أعمدة) يُميز كل سجل بشكل فريد داخل الجدول. لا يمكن أن يحتوي على قيم مكررة أو قيم NULL. كل جدول يجب أن يحتوي على مفتاح رئيسي واحد فقط.

      
      CREATE TABLE Students (
          StudentID INT PRIMARY KEY, -- StudentID هو المفتاح الرئيسي
          Name VARCHAR(100)
      );
                                          
      
      -- مثال على مفتاح رئيسي مركب
      CREATE TABLE Enrollment (
          StudentID INT,
          CourseID INT,
          EnrollmentDate DATE,
          PRIMARY KEY (StudentID, CourseID) -- المفتاح الرئيسي هو تركيبة من StudentID و CourseID
      );
                                          
    • FOREIGN KEY – المفتاح الخارجي:

      يُستخدم لربط جدول بآخر، ويُنشئ علاقة بينهما. يُشير المفتاح الخارجي في جدول (الجدول الفرعي/الابن) إلى المفتاح الرئيسي (أو مفتاح فريد) في جدول آخر (الجدول الرئيسي/الأب). يضمن التكامل المرجعي.

      
      CREATE TABLE Enrollments (
          EnrollmentID INT PRIMARY KEY,
          StudentID INT,
          CourseID INT,
          Grade CHAR(1),
          FOREIGN KEY (StudentID) REFERENCES Students(StudentID), -- StudentID هنا هو مفتاح خارجي يشير إلى جدول Students
          FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)     -- CourseID هنا هو مفتاح خارجي يشير إلى جدول Courses
      );
                                          
    • UNIQUE – فريد:

      يضمن أن جميع القيم في عمود معين (أو مجموعة أعمدة) فريدة، أي لا تتكرر. يمكن أن يحتوي على قيمة NULL واحدة. يمكن أن يكون للجدول عدة قيود UNIQUE.

      
      CREATE TABLE Employees (
          EmployeeID INT PRIMARY KEY,
          Email VARCHAR(100) UNIQUE, -- لا يمكن تكرار عنوان البريد الإلكتروني
          PhoneNumber VARCHAR(20) UNIQUE
      );
                                          
    • NOT NULL – غير فارغ:

      يُجبر العمود على احتواء قيمة. لا يمكن ترك هذا الحقل فارغًا (NULL).

      
      CREATE TABLE Courses (
          CourseID INT PRIMARY KEY,
          CourseName VARCHAR(100) NOT NULL, -- اسم المقرر يجب ألا يكون فارغاً
          Credits INT
      );
                                          
    • CHECK – شرطي:

      يُستخدم لفرض شرط معين على قيم البيانات في عمود واحد أو أكثر. إذا لم يتحقق الشرط، يتم رفض إدخال البيانات.

      
      CREATE TABLE Products (
          ProductID INT PRIMARY KEY,
          ProductName VARCHAR(100),
          Price DECIMAL(10,2) CHECK (Price > 0), -- السعر يجب أن يكون أكبر من صفر
          StockQuantity INT CHECK (StockQuantity >= 0) -- الكمية يجب أن تكون موجبة أو صفر
      );
                                          
    • DEFAULT – افتراضي:

      يُحدد قيمة افتراضية لعمود إذا لم تُقدم قيمة صراحةً عند إدراج صف جديد.

      
      CREATE TABLE Orders (
          OrderID INT PRIMARY KEY AUTO_INCREMENT,
          OrderDate DATE DEFAULT CURRENT_DATE, -- القيمة الافتراضية هي تاريخ اليوم
          OrderStatus VARCHAR(50) DEFAULT 'Pending' -- القيمة الافتراضية للحالة هي 'معلق'
      );
                                          

لمزيد من التفاصيل حول قيود SQL، يمكنك زيارة: SQL Constraints – Tutorialspoint

12.3 الأنواع التي يُعرفها المستخدم (User Defined Types – UDT)

بالإضافة إلى أنواع البيانات المدمجة في SQL (مثل INT, VARCHAR, DATE)، تسمح بعض أنظمة إدارة قواعد البيانات بإنشاء أنواع بيانات مُعرفة من قبل المستخدم (User Defined Types - UDTs).

  • التعريف:

    نوع بيانات خاص تُنشئه لتحديد شكل بيانات معين يمكن استخدامه في أعمدة متعددة عبر جداول مختلفة. يتيح لك فرض قواعد عمل محددة على البيانات وتوحيد تعريفها.

    ملاحظة: دعم UDT يختلف بين أنظمة DBMS. بعضها يوفر دعماً كاملاً (مثل SQL Server، Oracle مع أنواع معقدة)، بينما البعض الآخر (مثل MySQL) قد يقتصر على تعريف "Domains" أو "Aliases" لأنواع بيانات موجودة. المثال أدناه يُوضح المفهوم وقد تختلف صياغته الدقيقة بناءً على الـ DBMS.

مثال عملي (مفهومي، قد تختلف الصياغة الدقيقة حسب DBMS):

تخيل أنك تريد تعريف نوع بيانات خاص لأرقام الهواتف، يتكون من نص لا يتجاوز 15 حرفًا. يمكنك إنشاء UDT لذلك:


-- هذه الصياغة قد تختلف حسب DBMS (مثال لـ SQL Server / Oracle)
CREATE TYPE PhoneNumber FROM VARCHAR(15); 

-- استخدام النوع المعرّف من قبل المستخدم في جدول
CREATE TABLE Contacts (
    ContactID INT PRIMARY KEY,
    Name VARCHAR(100) NOT NULL,
    Phone PhoneNumber -- استخدام نوع البيانات المخصص
);

-- مثال آخر: تعريف نوع لرمز بريدي مع تحقق
CREATE TYPE ZipCode_UDT FROM CHAR(5) NOT NULL CHECK (LEN(Value) = 5);

CREATE TABLE Addresses (
    AddressID INT PRIMARY KEY,
    Street VARCHAR(255),
    City VARCHAR(100),
    ZipCode ZipCode_UDT -- استخدام نوع الرمز البريدي المخصص
);
                        

يتيح UDT توحيد نوع البيانات في أكثر من جدول مع إمكانية تضمين قيود التحقق (CHECK) أو غيرها من الخصائص مباشرة ضمن تعريف النوع نفسه، مما يضمن اتساق البيانات عبر قاعدة البيانات.

لمزيد من المعلومات حول UDTs (قد تختلف الأمثلة حسب DBMS)، يمكنك زيارة: User Defined Types in SQL – GeeksforGeeks

12.4 مصطلحات أساسية (Key Terms)

المصطلح (الإنجليزية) المصطلح (العربية) التعريف
SQL (Structured Query Language) لغة الاستعلامات الهيكلية لغة قياسية تُستخدم لإدارة ومعالجة قواعد البيانات العلائقية.
DDL (Data Definition Language) لغة تعريف البيانات جزء من SQL يُستخدم لتعريف أو تعديل هيكل قاعدة البيانات (مثل CREATE, ALTER, DROP).
CREATE DATABASE إنشاء قاعدة بيانات أمر SQL DDL لإنشاء قاعدة بيانات جديدة.
CHARACTER SET مجموعة الأحرف / الترميز مجموعة من الأحرف والرموز التي يمكن تخزينها في قاعدة البيانات أو العمود.
COLLATE طريقة الفرز / الترتيب قاعدة تُحدد كيفية مقارنة وفرز البيانات النصية (مثل حساسية حالة الأحرف).
TABLE CONSTRAINTS قيود الجدول قواعد تُفرض على أعمدة أو جداول لضمان صحة وسلامة البيانات.
PRIMARY KEY المفتاح الرئيسي قيد يُحدد عمودًا (أو مجموعة أعمدة) يُميز كل سجل بشكل فريد في الجدول.
FOREIGN KEY المفتاح الخارجي قيد يُستخدم لربط جدولين من خلال الإشارة إلى المفتاح الرئيسي في جدول آخر.
UNIQUE فريد قيد يضمن أن جميع القيم في العمود المحدد فريدة ولا تتكرر.
NOT NULL غير فارغ قيد يضمن أن العمود لا يمكن أن يحتوي على قيمة فارغة (NULL).
CHECK شرطي / تحقق قيد يفرض شرطًا محددًا على القيم التي يمكن إدخالها في العمود.
DEFAULT افتراضي قيد يُحدد قيمة افتراضية لعمود في حال عدم تقديم قيمة عند الإدخال.
User Defined Types (UDT) أنواع مُعرفة من قبل المستخدم نوع بيانات خاص يُنشئه المستخدم لتعريف شكل بيانات معين، يمكن استخدامه في أعمدة متعددة.

ملخص الوحدة

  • SQL (لغة الاستعلامات الهيكلية) هي اللغة القياسية لإدارة قواعد البيانات.
  • تُستخدم أوامر DDL (لغة تعريف البيانات) مثل CREATE DATABASE لإنشاء هياكل قواعد البيانات والجداول.
  • قيود الجدول (Table Constraints) مثل PRIMARY KEY، FOREIGN KEY، UNIQUE، NOT NULL، CHECK، وDEFAULT ضرورية لضمان سلامة البيانات.
  • تسمح بعض أنظمة DBMS بإنشاء أنواع بيانات مُعرفة من قبل المستخدم (UDT) لتعزيز توحيد البيانات.

12.5 تمارين مقترحة (Suggested Exercises)

اختبر فهمك لمفاهيم هذه الوحدة بالإجابة على الأسئلة التالية (تذكر أن الصياغة قد تختلف قليلاً حسب نظام إدارة قواعد البيانات الذي تستخدمه):

  1. أنشئ قاعدة بيانات جديدة باسم CompanyDB. تأكد من تحديد CHARACTER SET وCOLLATE مناسبين لدعم اللغة العربية (مثل utf8mb4 و utf8mb4_general_ci).
  2. صمم جدولًا للموظفين باسم Employees يحتوي على الأعمدة التالية، مع تطبيق القيود المناسبة:
    • EmployeeID: رقم صحيح، مفتاح رئيسي.
    • FirstName: نص، لا يمكن أن يكون فارغًا.
    • LastName: نص، لا يمكن أن يكون فارغًا.
    • Email: نص، يجب أن يكون فريدًا.
    • Salary: رقم عشري، لا يمكن أن يكون فارغًا، ويجب أن يكون أكبر من 0.
    • HireDate: تاريخ، القيمة الافتراضية هي تاريخ اليوم.
    اكتب استعلام CREATE TABLE كاملاً لهذا الجدول.
  3. صمم جدولًا للعملاء باسم Customers (بـ CustomerID كمفتاح رئيسي، CustomerName، وPhone). ثم صمم جدولًا للطلبات باسم Orders يحتوي على الأعمدة: OrderID (PK)، OrderDate، وCustomerID.
    تأكد من ربط عمود CustomerID في جدول Orders بالمفتاح الرئيسي لجدول Customers باستخدام قيد المفتاح الخارجي.
  4. في نظام إدارة قواعد البيانات الذي تستخدمه (أو بافتراض دعم)، حاول إنشاء نوع بيانات مُعرفة من قبل المستخدم (UDT) باسم NationalID ليمثل أرقام الهوية الوطنية، بحيث يكون نوعها CHAR(10) (حرفي بطول 10) ولا يمكن أن يكون فارغًا. ثم استخدم هذا النوع في جدول Citizens (المواطنين) يحتوي على CitizenID (PK) وName وNationalID.
  5. باستخدام الجداول التي أنشأتها في التمارين السابقة، جرّب إدخال بيانات مخالفة للقيود التي وضعتها (مثل: محاولة إدخال قيمة NULL في عمود NOT NULL، أو قيمة مكررة في عمود UNIQUE). لاحظ ودوّن رسالة الخطأ التي تظهر من نظام إدارة قواعد البيانات (DBMS).