محمد الميداوي

تستعرض هذه المقالة مجموعة من المواضيع الإضافية في SQL، مثل العروض (Views)، وكيفية كتابة التعليقات، وكيفية التعامل مع المفاتيح الخارجية (Foreign Keys) وإنشاء السلاسل.

العروض Views

العروض البسيطة

تُستخدم العروض (View) لترشيح الصفوف من الجدول الأساسي، أو الاكتفاء بعرض بعض الأعمدة منه فقط:

CREATE VIEW new_employees_details AS
SELECT E.id, Fname, Salary, Hire_date
FROM Employees E
WHERE hire_date > date '2015-01-01';

يختار (select) المثالُ التالي من النتائج المعروضة في العرض (view):

select * from new_employees_details

الخرج الناتج:

Id FName Salary Hire_date
4 Johnathon 500 24-07-2016

العروض المركبة Complex views

يمكن أن تكون العروض معقدة ومركّبة (تجميعات aggregations، عمليات ضمّ، استعلامات فرعية، إلخ). المهم أن تتأكّد دائمًا من إضافة أسماء الأعمدة لكل شيء تختاره:

Create VIEW dept_income AS
SELECT d.Name as DepartmentName, sum(e.salary) as TotalSalary
FROM Employees e
JOIN Departments d on e.DepartmentId = d.id
GROUP BY d.Name;

يمكنك الآن الاختيار (SELECT) كما تختار من أيّ جدول عادي:

SELECT *
FROM dept_income;

الخرج الناتج:

DepartmentName TotalSalary
HR 1900
Sales 600

العروض المادية Materialized Views

العروض المادية هي العروض التي تكون نتائجها مُخزّنة في ذاكرة مادية، وتُحدّث دوريًا حتى تظل متزامنة مع القيم الحالية.

العروض المادّية مفيدة في تخزين نتائج الاستعلامات المعقّدة طويلة الأمد التي لا تعتمد على نتائج الوقت الحقيقي (realtime results).

يمكن إنشاء العروض المادية في Oracle و PostgreSQL. كما توفّر أنظمة قواعد البيانات الأخرى وظائف مماثلة، مثل العروض المُفهرسة (indexed views) في SQL Server، أو جداول الاستعلام المادية (materialized query tables) في DB2.

هذا مثال على العروض المادية في PostgreSQL:

CREATE TABLE mytable (number INT);
INSERT INTO mytable VALUES (1);
CREATE MATERIALIZED VIEW myview AS SELECT * FROM mytable;
SELECT * FROM myview;
number
--------
1
(1 row)
INSERT INTO mytable VALUES(2);
SELECT * FROM myview;
number
--------
1
(1 row)
REFRESH MATERIALIZED VIEW myview;
SELECT * FROM myview;
number
--------
1
2
(2 rows)

التعليقات

هناك نوعان من التعليقات في SQL، التعليقات السطرية، والتعليقات متعددة الأسطر.

التعليقات السطرية Single-line comments

التعليقات السطرية هي تعليقات تستمر حتى نهاية السطر، وتُسبَق بالرمز ‎--‎:

SELECT *
FROM Employees -- هذا تعليق
WHERE FName = 'John'

التعليقات متعددة الأسطر Multi-line comments

تُوضع التعليقات متعددة الأسطر داخل الغلاف ‎/* ... */‎:

/* يعيد هذا الاستعلام
 جميع الموظفين */
SELECT *
FROM Employees

يجوز أيضًا إدراج مثل هذا التعليق في منتصف السطر:

SELECT /* جميع الأعمدة: */ *
FROM Employees

المفاتيح الخارجية Foreign Keys

تضمن قيود المفاتيح الخارجية (Foreign Keys constraints) تكامل البيانات، إذ تفرض أن تتطابق القيم الموجودة في جدول معيّن، مع القيم المقابلة في جدول آخر.

مثلا، في الجامعة، تنتمي كل دورة دراسية إلى قسم معيّن. يمكننا التعبير عن هذا القيد (constraint) على النحو التالي:

CREATE TABLE Department (
    Dept_Code        CHAR (5) PRIMARY KEY,
    Dept_Name        VARCHAR (20) UNIQUE
);

المثال التالي يدرج قيمًا جديدة في قسم علوم الحاسوب:

INSERT INTO Department VALUES ('CS205', 'Computer Science');

يحتوي الجدول التالي على معلومات عن المواضيع التي تشملها شعبة علوم الحاسوب:

CREATE TABLE Programming_Courses (
    Dept_Code       CHAR(5),
    Prg_Code        CHAR(9) PRIMARY KEY,
    Prg_Name        VARCHAR (50) UNIQUE,
    FOREIGN KEY (Dept_Code) References Department(Dept_Code)
);

(يجب أن يتطابق نوع بيانات المفتاح الخارجي مع نوع البيانات الخاص بالمفتاح المشار إليه - referenced key.)

لا يسمح قيد المفتاح الخارجي الخاص بالعمود ‎Dept_Code‎ إلّا بالقيم الموجودة سلفًا في الجدول المشار إليه. هذا يعني أنه إذا حاولت إدراج القيم التالية:

INSERT INTO Programming_Courses Values ('CS300', 'FDB-DB001', 'Database Systems');

فستطرح قاعدة البيانات خطأ انتهاك المفتاح الخارجي (Foreign Key violation error)، لأنّ ‎CS300‎ غير موجودة في جدول الأقسام ‎Department‎. ولكن عند تجربة قيمة مفتاح موجود:

INSERT INTO Programming_Courses VALUES ('CS205', 'FDB-DB001', 'Database Systems');
INSERT INTO Programming_Courses VALUES ('CS205', 'DB2-DB002', 'Database Systems II');

فلن يكون هناك أيّ مشكلة.

هذه بعض النصائح حول كيفية استخدام المفاتيح الخارجية:

  • يجب أن يشير المفتاح الخارجي إلى مفتاح فريد - UNIQUE - (أو أساسي - PRIMARY) من الجدول الأصلي الأب (parent table).
  • لن ينجم أيّ خطأ عن إدخال القيمة المعدومة NULL إلى عمود المفتاح الخارجي.
  • يمكن أن تشير قيود المفاتيح الخارجية إلى الجداول الموجودة في نفس قاعدة البيانات.
  • يمكن أن تشير قيود المفتاح الخارجي إلى عمود آخر في نفس الجدول (مرجع ذاتي).

إنشاء جدول بمفتاح خارجي

في هذا المثال، لدينا جدول البيانات ‎SuperHeros‎. يحتوي هذا الجدول على مفتاح أساسي ‎ID‎.

سنضيف جدولًا جديدًا بُغية تخزين صلاحيات كل بطل خارق:

CREATE TABLE HeroPowers
(
    ID int NOT NULL PRIMARY KEY,
    Name nvarchar(MAX) NOT NULL,
    HeroId int REFERENCES SuperHeros(ID)
)

في هذا المثال، يُعدّ العمود ‎HeroId‎ مفتاحًا خارجيًا للجدول ‎SuperHeros‎.

التسلسلات Sequences

التسلسلات هي سلاسل من الأعداد.

المثال التالي ينشئ تسلسلًا يبدأ من 1000، ويتزايد بمقدار 1.

 CREATE SEQUENCE orders_seq
 START WITH     1000
 INCREMENT BY   1;

في المثال التالي، سنستخدم مرجعًا (seq_name.NEXTVAL) يشير إلى القيمة التالية في التسلسل.

تنبيه: في كلّ عبارة، تكون هناك قيمة واحدة فقط من التسلسل. أي أنّه إذا كانت هناك عدة مراجع إلى القيمة التالية في التسلسل (NEXTVAL) في عبارة معينة، فستشير جميع تلك المراجع إلى نفس الرقم من السلسلة.

يمكن استخدام القيمة التالية NEXTVAL في عبارات الإدراج INSERTS:

INSERT INTO Orders (Order_UID, Customer)
 VALUES (orders_seq.NEXTVAL, 1032);

كما يمكن أن تُستخدم في عمليات التحديث:

UPDATE Orders
SET Order_UID = orders_seq.NEXTVAL
WHERE Customer = 581;

ويمكن أيضًا أن تُستخدم في عبارات الاختيار SELECT:

SELECT Order_seq.NEXTVAL FROM dual;

ترجمة -وبتصرّف- للفصول من 47 إلى 51 من الكتاب SQL Notes for Professionals





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن