تستعرض هذه المقالة مجموعة من المواضيع الإضافية في 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
اقرأ أيضًا:
- المقال التالي: الاستعلامات الفرعية والإجراءات في SQL
- المقال السابق: التعابير الجدولية الشائعة Common Table Expressions في SQL
- النسخة العربية الكاملة من كتاب ملاحظات للعاملين بلغة SQL 1.0.0
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.