Skip to content

3. مقدمة إلى لغة SQL

في هذا القسم من الفصل، نقدم أوامر SQL الأولى لإنشاء جدول واحد والعمل عليه. نقدم عمومًا نسخة مبسطة من هذه الأوامر. تتوفر صيغتها الكاملة في أدلة مرجعية Firebird (انظر القسم 2.2).

يتم استخدام قاعدة البيانات من قبل أشخاص ذوي مهارات متنوعة:

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

في القسم 2.6، قدمنا محرر SQL الخاص بأداة [IB-Expert]. هذه هي الأداة التي سنستخدمها. دعونا نستعرض بعض النقاط:

  • يمكن الوصول إلى محرر SQL عبر خيار القائمة [أدوات/محرر SQL] أو بالضغط على مفتاح [F12]

Image

يؤدي هذا إلى فتح نافذة [محرر SQL] حيث يمكننا كتابة أمر SQL:

Image

غالبًا ما يتم تمثيل لقطة الشاشة أعلاه بالنص التالي:

SQL> select * from BIBLIO

3.1. أنواع بيانات Firebird

عند إنشاء جدول، يجب تحديد نوع البيانات الذي يمكن أن يحتوي عليه عمود الجدول. هنا، نقدم أنواع البيانات الأكثر شيوعًا في Firebird. لاحظ أن أنواع البيانات هذه قد تختلف من نظام إدارة قواعد البيانات (DBMS) إلى آخر.

SMALLINT
عدد صحيح في النطاق [-32768، 32767]: 4
INTEGER
عدد صحيح في النطاق [–2,147,483,648, 2,147,483,647]: -100
NUMERIC(n,m)
DECIMAL(n,m)
عدد حقيقي مكون من n أرقام، منها m أرقام عشرية
NUMERIC(5,2): -100.23, +027.30
FLOAT
عدد حقيقي مقرب إلى 7 أرقام معنوية: 10.4
دقة مزدوجة
عدد حقيقي مقرب إلى 15 خانة معنوية: -100.89
CHAR(N)
CHARACTER(N)
سلسلة مكونة من N حرفًا بالضبط. إذا كانت السلسلة المخزنة تحتوي على أقل من N حرفًا، يتم ملؤها بمسافات.
CHAR(10): 'ANGERS ' (4 مسافات في النهاية)
VARCHAR(N)
CHARACTER VARYING(N)
سلسلة تصل إلى N حرفًا
VARCHAR(10): 'ANGERS'
DATE
تاريخ: '2006-01-09' (تنسيق YYYY-MM-DD)
TIME
الوقت: '16:43:00' (تنسيق HH:MM:SS)
الطابع الزمني
التاريخ والوقت معًا: '2006-01-09 16:43:00' (التنسيق YYYY-MM-DD HH:MM:SS)

تسمح لك الدالة CAST() بالتحويل من نوع إلى آخر عند الضرورة. لتحويل قيمة V المعلنة على أنها من النوع T1 إلى النوع T2، تكتب: CAST(V,T2). يمكنك إجراء تحويلات الأنواع التالية:

  • رقم إلى سلسلة. هذا التحويل بين الأنواع ضمني ولا يتطلب استخدام دالة CAST. وبالتالي، فإن العملية 1 + '3' لا تتطلب تحويل الحرف '3'. والنتيجة هي الرقم 4.
  • DATE و TIME و TIMESTAMP إلى سلاسل والعكس. وبالتالي
  • TIMESTAMP إلى TIME أو DATE والعكس

في الجدول، قد يحتوي الصف على أعمدة بدون قيمة. نقول إن قيمة العمود هي الثابت NULL. يمكنك التحقق من وجود هذه القيمة باستخدام العوامل

IS NULL / IS NOT NULL

3.2. إنشاء جدول

لتعلم كيفية إنشاء جدول، سنبدأ بإنشاء واحد في وضع [التصميم] باستخدام IBExpert. للقيام بذلك، سنتبع الطريقة الموضحة في القسم 2.3. سيؤدي ذلك إلى إنشاء الجدول التالي:

Image

سيُستخدم هذا الجدول لتسجيل الكتب التي اشترتها المكتبة. ومعنى الحقول هو كما يلي:

الاسم
النوع
القيد
المعنى
المعرف
عدد صحيح
المفتاح الأساسي
معرف الكتاب
 العنوان
VARCHAR(30)
غير فارغ فريد
عنوان الكتاب
 المؤلف
VARCHAR(20)
غير فارغ
المؤلف
 النوع
VARCHAR(30)
غير فارغ
النوع (رواية، شعر، غموض، قصص مصورة، إلخ)
 شراء
التاريخ
غير فارغ
تاريخ شراء الكتاب
 السعر
رقمي(6,2)
غير فارغ
السعر
 متوفر
CHAR(1)
غير فارغ
هل هو متاح؟ Y (نعم)، N (لا)

كان من الممكن إنشاء هذا الجدول، الذي تم إنشاؤه باستخدام معالج IBEXPERT، مباشرةً باستخدام عبارات SQL. لعرض هذه العبارات، ما عليك سوى التحقق من علامة التبويب [DDL] الخاصة بالجدول:

Image

فيما يلي كود SQL المستخدم لإنشاء الجدول [BIBLIO]:

SET SQL DIALECT 3;

SET NAMES ISO8859_1;


CREATE TABLE BIBLIO (
    ID INTEGER NOT NULL,
    TITRE VARCHAR(30) NOT NULL,
    AUTEUR VARCHAR(20) NOT NULL,
   GENRE VARCHAR(30) NOT NULL,
   ACHAT DATE NOT NULL,
   PRIX NUMERIC(6,2) NOT NULL,
   DISPONIBLE  CHAR(1) NOT NULL
);

ALTER TABLE BIBLIO ADD CONSTRAINT UNQ1_BIBLIO UNIQUE (TITRE);
ALTER TABLE BIBLIO ADD CONSTRAINT PK_BIBLIO PRIMARY KEY (ID);
  • السطر 1: المالك Firebird - يشير إلى مستوى لهجة SQL المستخدم
  • السطر 2: خاص بـ Firebird - يحدد مجموعة الأحرف المستخدمة
  • الأسطر 6–14: معيار SQL: ينشئ جدول BIBLIO عن طريق تحديد اسم ونوع بيانات كل عمود من أعمدة الجدول.
  • السطر 16: معيار SQL: ينشئ قيدًا يحدد أن عمود TITLE لا يسمح بالتكرار
  • السطر 17: معيار SQL: يحدد أن عمود [ID] هو المفتاح الأساسي للجدول. وهذا يعني أنه لا يمكن أن يكون هناك صفان في الجدول لهما نفس المعرف. وهذا مشابه لقيد [UNIQUE NOT NULL] على عمود [TITLE]، وفي الواقع كان من الممكن أن يكون عمود TITLE هو المفتاح الأساسي. الاتجاه الحالي هو استخدام مفاتيح أساسية ليس لها معنى محدد ويتم إنشاؤها بواسطة نظام إدارة قواعد البيانات (DBMS).

صيغة الأمر [CREATE TABLE] هي كما يلي:

صيغة
CREATE TABLE table (column_name1 column_type1 column_constraint1, column_name2 column_type2 column_constraint2, ..., column_nameN column_typeN column_constraintN, other constraints)
الإجراء
ينشئ الجدول table بالأعمدة المحددة
اسم_العمود_i
اسم العمود i المراد إنشاؤه
نوع_العمود_i
نوع بيانات العمود i:
char(30) numeric(6,2) date timestamp ...
قيد العمود i
القيد الذي يجب أن تفي به البيانات الموجودة في العمود i. فيما يلي بعض الأمثلة:
PRIMARY KEY: العمود هو مفتاح أساسي. وهذا يعني أنه لا يمكن أن يكون هناك صفان في الجدول لهما نفس القيمة في هذا العمود، علاوة على ذلك، فإن وجود قيمة في هذا العمود أمر إلزامي. يستخدم المفتاح الأساسي في المقام الأول لتعريف صف ما بشكل فريد.
NOT NULL : لا يُسمح بوجود قيم فارغة في العمود.
فريد : لا يمكن أن تظهر أي قيمة أكثر من مرة واحدة في العمود.
CHECK (الشرط): يجب أن تستوفي القيمة الموجودة في العمود الشرط.
قيود أخرى
يمكنك هنا تحديد
- قيود على أعمدة متعددة: check(col1>col2)
- قيود المفتاح الخارجي

كان من الممكن أيضًا إنشاء الجدول [BIBLIO] باستخدام عبارة SQL التالية:

1
2
3
4
5
6
7
8
9
CREATE TABLE BIBLIO (
    ID INTEGER NOT NULL PRIMARY KEY,
    TITRE VARCHAR(30) NOT NULL UNIQUE,
    AUTEUR VARCHAR(20) NOT NULL,
   GENRE VARCHAR(30) NOT NULL,
   ACHAT DATE NOT NULL,
   PRIX NUMERIC(6,2) NOT NULL,
   DISPONIBLE  CHAR(1) NOT NULL
);

دعونا نوضح ذلك. لنفتح هذا الاستعلام في محرر SQL (F12) لإنشاء جدول سنسميه [BIBLIO2]:

Image

بعد التنفيذ، يجب عليك تثبيت المعاملة لرؤية النتيجة في قاعدة البيانات:

Image

بمجرد الانتهاء من ذلك، يظهر الجدول في قاعدة البيانات:

Image

بالنقر المزدوج على اسمه، يمكننا عرض هيكله:

Image

يمكننا رؤية التعريف الذي أنشأناه للجدول [BIBLIO2]

3.3. حذف جدول

فيما يلي عبارة SQL لحذف جدول:

الصيغة
DROP TABLE table
الإجراء
يحذف [الجدول]

لحذف الجدول [BIBLIO2] الذي أنشأناه للتو، نقوم الآن بتنفيذ الأمر SQL التالي:

Image

ونؤكد ذلك بـ [Commit]. يتم حذف الجدول [BIBLIO2]:

Image

3.4. ملء جدول

دعونا ندرج صفًا في الجدول [BIBLIO] الذي أنشأناه للتو:

Image

قم بتأكيد إضافة الصف باستخدام [Commit]، ثم انقر بزر الماوس الأيمن على الصف المضاف:

Image

وكما هو موضح أعلاه، انسخ الصف الذي تم إدراجه إلى الحافظة كعبارة SQL INSERT. بعد ذلك، افتح أي محرر نصوص والصق ما قمنا بنسخه للتو. نحصل على كود SQL التالي:

INSERT INTO BIBLIO (ID,TITRE,AUTEUR,GENRE,ACHAT,PRIX,DISPONIBLE) VALUES (1,'Candide','Voltaire','Essai','18-OCT-1985',140,'o');

صيغة جملة SQL INSERT هي كما يلي:

صيغة
insert into table [(column1, column2, ..)] values (value1, value2, ....)
الإجراء
تضيف صفًا (القيمة 1، القيمة 2، ...) إلى الجدول. تُخصص هذه القيم للعمود 1، العمود 2، ... إن وجدت؛ وإلا، تُخصص لأعمدة الجدول بالترتيب الذي تم تعريفها به.

لإدراج صفوف جديدة في جدول [BIBLIO]، سنكتب عبارات INSERT التالية في محرر SQL. سنقوم بتنفيذ هذه العبارات وتثبيتها واحدة تلو الأخرى. سنستخدم زر [New Query] للانتقال إلى عبارة INSERT التالية.

1
2
3
4
5
6
7
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (2,'Les fleurs du mal','Baudelaire','Poème','01-jan-78',120,'n');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (3,'Tintin au Tibet','Hergé','BD','10-nov-90',70,'o');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (4,'Du côté de chez Swann','Proust','Roman','08-dec-78',200,'o');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (5,'La terre','Zola','roman','12-jun-90',50,'n');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (6,'Madame Bovary','Flaubert','Roman','12-mar-88',130,'o');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (7,'Manhattan transfer','Dos Passos','Roman','30-aug-87',320,'o');
insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (8,'Tintin en Amérique','Hergé','BD','15-may-91',70,'o');

بعد تنفيذ [Commit] عبارات SQL المختلفة، نحصل على الجدول التالي:

3.5. الاستعلام عن جدول

3.5.1. مقدمة

في محرر SQL، اكتب الأمر التالي:

Image

وقم بتنفيذه. نحصل على النتيجة التالية:

Image

يُستخدم الأمر SELECT لاسترداد البيانات من جداول قاعدة البيانات. يتميز هذا الأمر ببنية لغوية غنية جدًا. سنركز هنا على البنية اللغوية للاستعلام عن جدول واحد. وسنتناول الاستعلام عن جداول متعددة في وقت لاحق. فيما يلي البنية اللغوية لأمر SQL [SELECT]:

البناء النحوي
SELECT [ALL|DISTINCT] [*|expression1 alias1, expression2 alias2, ...]
FROM table
الإجراء
يعرض قيم التعبير1 لجميع الصفوف في الجدول. يمكن أن يكون التعبير1 عمودًا أو تعبيرًا أكثر تعقيدًا. يشير الرمز * إلى جميع الأعمدة. بشكل افتراضي، يتم عرض جميع الصفوف في الجدول (ALL). في حالة وجود DISTINCT، يتم عرض الصفوف المحددة المتطابقة مرة واحدة فقط. يتم عرض قيم التعبير1 في عمود بعنوان التعبير1 أو الاسم المستعار1 إذا تم استخدام هذا الأخير.

أمثلة:

SQL > select titre, auteur from biblio

Image

SQL> select titre,prix from biblio

Image

SQL> select titre TITRE_DU_LIVRE, prix PRIX_ACHAT from biblio

Image

في الأمثلة أعلاه، قمنا بتعيين أسماء مستعارة (BOOK_TITLE، PURCHASE_PRICE) للأعمدة المطلوبة.

3.5.2. عرض الصفوف التي تستوفي شرطًا

الصيغة
SELECT ....
WHERE الشرط
الإجراء
يتم عرض الصفوف التي تستوفي الشرط فقط

أمثلة

SQL> select titre,prix from biblio where prix>100

Image

SQL> select titre,prix,genre from biblio where genre='Roman'

Image

أحد الكتب ينتمي إلى النوع "novel" وليس "Novel". نستخدم الدالة UPPER، التي تحول السلسلة إلى أحرف كبيرة، للحصول على جميع الروايات.

SQL> select titre,prix,genre from biblio where upper(genre)='ROMAN'

Image

يمكننا الجمع بين الشروط باستخدام العوامل المنطقية

AND
المنطقي AND
OR
المنطقية OR
NOT
النفي المنطقي
SQL> select titre,prix,genre from biblio where upper(genre)='ROMAN' and prix<100

Image

SQL> select titre,genre from biblio

Image

SQL> select titre,genre from biblio where upper(genre)='ROMAN' or upper(genre)='BD'

Image

SQL> select titre,genre from biblio where not( upper(genre)='ROMAN' or upper(genre)='BD')

Image

SQL> select titre,achat from biblio

Image

SQL>select titre,achat from biblio where achat>'31-dec-1987'
SQL> select titre,prix from biblio where prix between 100 and 150

Image

3.5.3. عرض الصفوف بترتيب معين

إلى الصيغ السابقة، يمكنك إضافة جملة ORDER BY لتحديد ترتيب العرض المطلوب:

الصيغة
SELECT ....
ORDER BY التعبير1 [asc|descالتعبير2 [asc|desc]، ...
الإجراء
يتم عرض صفوف نتائج الاختيار بالترتيب
1: ترتيب تصاعدي (asc / تصاعدي، وهو الإعداد الافتراضي) أو تنازلي (desc / تنازلي) للتعبير 1
2: إذا كان التعبير 1 متساويًا، تعتمد العرض على قيم التعبير 2
إلخ.

أمثلة:

SQL>select titre, genre,prix,achat from biblio order by achat desc

Image

SQL>select titre, genre,prix,achat from biblio order by prix

Image

SQL>select titre, genre,prix,achat from biblio order by genre desc

Image

SQL >select titre, genre,prix,achat from biblio order by genre desc, prix

Image

SQL>select titre, genre,prix,achat from biblio order by genre desc, prix desc

Image

3.6. حذف صفوف من جدول

صيغة
DELETE FROM table [WHERE condition]
الإجراء
يحذف صفوف الجدول التي تستوفي الشرط. إذا لم يتم تحديد أي شرط، يتم حذف جميع الصفوف.

أمثلة:

SQL> select titre from biblio

Image

يتم تنفيذ الأمرين التاليين واحدًا تلو الآخر:

SQL> delete from biblio where titre='Candide'
SQL> select titre from biblio

Image

3.7. تعديل محتويات الجدول

الصيغة
update table set column1 = expression1, column2 = expression2, ...
[حيث الشرط]
الإجراء
بالنسبة لصفوف الجدول التي تستوفي الشرط (جميع الصفوف في حالة عدم وجود شرط)، يتم تعيين العمود1 إلى قيمة التعبير1.

أمثلة:

SQL> select genre from biblio

نكتب جميع الأنواع بأحرف كبيرة:

Image

SQL> update biblio set genre=upper(genre)

نقوم بالتحقق:

SQL> select genre from biblio

Image

عرض الأسعار:

SQL> select genre,prix from biblio;

Image

يرتفع سعر الروايات بنسبة 5%:

SQL> update biblio set prix=prix*1.05 where genre='ROMAN';

دعونا نتحقق:

SQL> select genre,prix from biblio

Image

3.8. تحديث الجدول بشكل دائم

عند إجراء تغييرات على جدول، يقوم Firebird فعليًا بتطبيقها على نسخة من الجدول. يمكن بعد ذلك جعل هذه التغييرات دائمة أو التراجع عنها باستخدام الأوامر COMMIT و ROLLBACK.

الصيغة
COMMIT
الإجراء
يجعل التحديثات التي تم إجراؤها على الجداول منذ آخر COMMIT دائمة.
الصيغة
التراجع
إجراء
يعيد جميع التغييرات التي تم إجراؤها على الجداول منذ آخر COMMIT.
ملاحظة
يتم تنفيذ COMMIT ضمناً في الأوقات التالية:
أ) عند تسجيل الخروج من Firebird
ب) بعد كل أمر يؤثر على بنية الجداول: CREATE، ALTER، DROP.

أمثلة

في محرر SQL، يمكنك استعادة قاعدة البيانات إلى حالة معروفة عن طريق تثبيت جميع العمليات التي تم تنفيذها منذ آخر COMMIT أو ROLLBACK:

SQL> commit

نسترد قائمة العناوين:

SQL> select titre from biblio

Image

حذف عنوان:

SQL> delete from biblio where titre='La terre'

التحقق:

SQL> select titre from biblio

Image

تم حذف العنوان بنجاح. الآن سنقوم بإلغاء جميع التغييرات التي تم إجراؤها منذ آخر COMMIT / ROLLBACK:

SQL> rollback

التحقق:

SQL> select titre from biblio

Image

لقد عاد العنوان المحذوف للظهور. والآن دعونا نسترجع قائمة الأسعار:

SQL> select prix from biblio

Image

دعونا نضبط جميع الأسعار على صفر.

SQL> update biblio set prix=0

دعونا نتحقق من الأسعار:

SQL> select prix from biblio

Image

دعونا نلغي التغييرات التي تم إجراؤها على قاعدة البيانات:

SQL> rollback

ونتحقق من الأسعار مرة أخرى:

SQL> select prix from biblio

Image

لقد استعدنا الأسعار الأصلية.

3.9. إضافة صفوف من جدول إلى آخر

من الممكن إضافة صفوف من جدول إلى آخر عندما تكون هياكلها متوافقة. لتوضيح ذلك، لنبدأ بإنشاء جدول [BIBLIO2] بنفس هيكل [BIBLIO].

في مستكشف قاعدة البيانات IBExpert، انقر نقرًا مزدوجًا على الجدول [BIBLIO] للوصول إلى علامة التبويب [DDL]:

Image

في هذه العلامة التبويبية، ستجد قائمة بعبارات SQL المستخدمة لإنشاء الجدول [BIBLIO]. انسخ كل هذا الرمز إلى الحافظة (CTRL-A، CTRL-C). ثم افتح أداة تسمى [Script Executive] تتيح لك تنفيذ قائمة بعبارات SQL:

Image

سيتم فتح محرر نصوص، حيث يمكننا لصق (CTRL-V) النص الذي تم نسخه مسبقًا إلى الحافظة:

Image

غالبًا ما يُطلق على قائمة أوامر SQL اسم نص SQL. سيسمح لنا [Script Executive] بتنفيذ مثل هذا النص، في حين أن محرر SQL لا يسمح إلا بتنفيذ أمر واحد في كل مرة. ينشئ نص SQL الحالي الجدول [BIBLIO]. دعونا نجعله ينشئ جدولًا باسم [BIBLIO2]. للقيام بذلك، ما عليك سوى تغيير [BIBLIO] إلى [BIBLIO2]:

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE TABLE BIBLIO2 (
    ID          INTEGER NOT NULL,
    TITRE       VARCHAR(30) NOT NULL,
    AUTEUR      VARCHAR(20) NOT NULL,
    GENRE       VARCHAR(20) NOT NULL,
    ACHAT       DATE NOT NULL,
    PRIX        NUMERIC(6,2) DEFAULT 10 NOT NULL,
    DISPONIBLE  CHAR(1) NOT NULL
);

ALTER TABLE BIBLIO2 ADD CONSTRAINT UNQ1_BIBLIIO2 UNIQUE (TITRE);

ALTER TABLE BIBLIO2 ADD CONSTRAINT PK_BIBLIIO2 PRIMARY KEY (ID);

دعونا نقوم بتشغيل هذا البرنامج النصي باستخدام زر [تشغيل البرنامج النصي] أدناه:

Image

تم تنفيذ البرنامج النصي:

Image

ويمكننا رؤية الجدول الجديد في مستكشف قاعدة البيانات:

Image

إذا نقرنا مرتين على [BIBLIO2] للتحقق من محتوياته، نجد أنه فارغ، وهذا أمر طبيعي:

Image

يتيح لك أحد أشكال جملة SQL INSERT إدراج صفوف من جدول إلى آخر:

الصيغة
INSERT INTO table1 [(column1, column2, ...)]
SELECT العمود1، العمود2، ... FROM الجدول2 WHERE الشرط
الإجراء
تُضاف الصفوف من الجدول 2 التي تستوفي الشرط إلى الجدول 1. يتم تعيين الأعمدة العمود1، العمود2، ... من الجدول 2 بالترتيب إلى العمود1، العمود2، ... في الجدول 1، ولذلك يجب أن تكون من أنواع متوافقة.

لنعد إلى محرر SQL:

Image

وننفذ عبارة SQL التالية:

SQL> insert into BIBLIO2 select * from BIBLIO where upper(genre)='ROMAN'

والذي يقوم بإدراج جميع الصفوف من [BIBLIO] التي تتوافق مع رواية في [BIBLIO2]. بعد تنفيذ عبارة SQL، دعونا نلتزم بها باستخدام [Commit]:

SQL> commit

الآن، دعونا نعرض البيانات الموجودة في جدول [BIBLIO2]:

SQL> select * from BIBLIO2

Image

3.10. حذف جدول

صيغة
DROP TABLE table
الإجراء
حذف الجدول

مثال: حذف الجدول BIBLIO2

SQL> drop table BIBLIO2

تأكيد التغيير:

SQL> commit

في مستكشف قاعدة البيانات، قم بتحديث عرض الجدول:

Image

نلاحظ أن الجدول [BIBLIO2] قد تم حذفه:

Image

3.11. تعديل بنية الجدول

الصيغة
ALTER TABLE table
[ ADD اسم_العمود1 نوع_العمود1 قيد_العمود1]
[ALTER اسم_العمود2 TYPE نوع_العمود2]
[DROP اسم_العمود3]
[ADD القيد]
[DROP CONSTRAINT اسم_القيد]
الإجراء
يسمح لك بإضافة (ADD) وتعديل (ALTER) وحذف (DROP) أعمدة الجدول. صيغة column_name1 column_type1 column_constraint1 هي نفس صيغة CREATE TABLE. يمكنك أيضًا إضافة أو حذف قيود الجدول.

مثال: قم بتنفيذ الأمرين التاليين من SQL بالتتابع في محرر SQL

SQL > alter table biblio add nb_pages numeric(4), alter genre type varchar(30)
SQL> commit

في مستكشف قاعدة البيانات، دعونا نتحقق من بنية جدول [BIBLIO]:

Image

تم تطبيق التغييرات. دعونا نرى كيف تغيرت محتويات الجدول:

SQL> select * from biblio

Image

تم إنشاء العمود الجديد [NB_PAGES] ولكنه لا يحتوي على أي قيم. دعونا نحذف هذا العمود:

SQL> alter table biblio drop nb_pages
SQL> commit

دعونا نتحقق من البنية الجديدة لجدول [BIBLIO]:

Image

لقد اختفى عمود [NB_PAGES] بالفعل.

3.12. طرق العرض

من الممكن الحصول على عرض جزئي لجدول أو عدة جداول. تعمل طريقة العرض مثل الجدول ولكنها لا تحتوي على بيانات. يتم استخراج بياناتها من جداول أو طرق عرض أخرى. تتمتع طريقة العرض بعدة مزايا:

  1. قد يهتم المستخدم فقط بأعمدة وصفوف معينة من جدول معين. تسمح له طريقة العرض برؤية تلك الصفوف والأعمدة فقط.
  2. قد يرغب مالك الجدول في منح وصول محدود فقط للمستخدمين الآخرين. تسمح له طريقة العرض بالقيام بذلك. لن يتمكن المستخدمون الذين أذن لهم سوى من الوصول إلى طريقة العرض التي حددها.

3.12.1. إنشاء عرض

الصيغة
CREATE VIEW اسم_العرض
AS SELECT العمود1، العمود2، ... FROM الجدول WHERE الشرط
[ مع خيار الفحص ]
الإجراء
ينشئ العرض view_name. وهو عبارة عن جدول يتكون من الأعمدة column1 و column2 و... المأخوذة من الجدول table، أما الصفوف فهي الصفوف المأخوذة من الجدول table التي تستوفي الشرط (جميع الصفوف في حالة عدم وجود شرط)
WITH CHECK OPTION
تحدد هذه الجملة الاختيارية أنه يجب ألا تؤدي عمليات الإدراج والتحديث في العرض إلى إنشاء صفوف لا يمكن للعرض تحديدها.

ملاحظة إن بناء جملة CREATE VIEW أكثر تعقيدًا في الواقع مما هو موضح أعلاه، وتسمح، على وجه الخصوص، بإنشاء عرض من جداول متعددة. للقيام بذلك، تحتاج عبارة SELECT ببساطة إلى الإشارة إلى جداول متعددة (انظر الفصل التالي).

أمثلة

نقوم بإنشاء عرض من الجدول biblio يتضمن الروايات فقط (اختيار الصفوف) وأعمدة العنوان والمؤلف والسعر فقط (اختيار الأعمدة):

SQL> create view romans as select titre,auteur,prix from biblio where upper(genre)='ROMAN';
SQL> commit

في مستكشف قاعدة البيانات، قم بتحديث العرض (F5). يظهر عرض:

Image

يمكننا عرض عبارة SQL المرتبطة بالعرض. للقيام بذلك، انقر نقرًا مزدوجًا على عرض [ROMANS]:

Image

الطريقة تشبه الجدول. لها بنية:

Image

ومحتوى:

Image

يُستخدم العرض مثل الجدول. يمكنك تشغيل استعلامات SQL عليه. فيما يلي بعض الأمثلة لتجربتها في محرر SQL:

SQL> select * from romans

Image

SQL> insert into biblio values (10,'Le père Goriot','Balzac','Roman','01-sep-91',200,'o')

هل تظهر الرواية الجديدة في عرض [ROMANS

SQL> select * from romans

Image

دعونا نضيف شيئًا آخر غير الرواية إلى جدول [BIBLIO]:

SQL> insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (11,'Poèmes saturniens','Verlaine','Poème','02-sep-92',200,'o');

دعونا نتحقق من جدول [BIBLIO]:

SQL> select titre, auteur from BIBLIO

Image

دعونا نتحقق من عرض [ROMANS]:

SQL> select titre, auteur from ROMANS

Image

الكتاب المضاف غير موجود في عرض [ROMANS] لأنه لم يكن يحتوي على upper(genre)='ROMAN'.

3.12.2. تحديث عرض

يمكنك تحديث عرض تمامًا كما تفعل مع الجدول. تتأثر جميع الجداول التي يتم استخراج بيانات العرض منها بهذا التحديث. فيما يلي بعض الأمثلة:

SQL> insert into biblio(id,titre,auteur,genre,achat,prix,disponible) values (13,'Le Rouge et le Noir','Stendhal','Roman','03-oct-92',110,'o')
SQL> select * from romans

Image

SQL> select titre, auteur from biblio

Image

نحذف صفًا من عرض [ROMANS]:

SQL> delete from ROMANS where titre='Le Rouge et le Noir'
SQL> select * from romans

Image

SQL> select auteur, titre from BIBLIO

Image

تم حذف الصف الذي تم حذفه من عرض [NOVELS] من جدول [BIBLIO] أيضًا. سنقوم الآن بزيادة سعر الكتب في عرض [NOVELS]:

SQL> update romans set prix=prix*1.05

دعونا نتحقق من ذلك في [NOVELS]:

SQL> select * from romans

Image

ما هو التأثير على جدول [BIBLIO

SQL> select titre, auteur, prix from biblio

Image

لقد تم بالفعل رفع أسعار الروايات بنسبة 5% في [BIBLIO] أيضًا.

3.12.3. حذف طريقة عرض

الصيغة
DROP VIEW اسم_العرض
الإجراء
يحذف العرض المسمى

مثال

SQL> drop view romans
SQL> commit

في مستكشف قاعدة البيانات، يمكنك تحديث العرض (F5) لترى أن عرض [ROMANS] قد اختفى:

Image

3.13. استخدام وظائف المجموعات

هناك دوال تعمل على مجموعات من الصفوف بدلاً من العمل على كل صف من الجدول. هذه هي في الأساس دوال إحصائية تسمح لنا بحساب المتوسط والانحراف المعياري وما إلى ذلك للبيانات الموجودة في عمود.

الصيغة 1
SELECT f1, f2, .., fn FROM table
[ WHERE الشرط ]
الإجراء
يحسب الدالة الإحصائية fi على جميع صفوف الجدول التي تستوفي الشرط.
الصيغة 2
SELECT f1, f2, .., fn FROM table
[ WHERE condition ]
[ GROUP BY expr1, expr2, ..]
action
تقسم الكلمة الرئيسية GROUP BY صفوف الجدول إلى مجموعات. تحتوي كل مجموعة على الصفوف التي يكون فيها للتعبيرات expr1، expr2، ... نفس القيمة.
مثال: تقوم GROUP BY genre بتجميع الكتب من نفس النوع. تقوم جملة GROUP BY author,genre بتجميع الكتب التي لها نفس المؤلف ونفس النوع. تقوم شرط WHERE أولاً بإزالة الصفوف من الجدول التي لا تستوفي الشرط. ثم يتم تشكيل المجموعات بواسطة جملة GROUP BY. بعد ذلك يتم حساب الدوال التجميعية لكل مجموعة من الصفوف.
syntax3
SELECT f1, f2, .., fn FROM table
[ WHERE الشرط ]
[ GROUP BY تعبير]
[بشرط group_condition]
الإجراء
تقوم جملة HAVING بتصفية المجموعات التي تشكلها جملة GROUP BY. ولذلك فهي ترتبط دائمًا بوجود جملة GROUP BY. مثال: GROUP BY genre HAVING genre!='NOVEL'

الدوال الإحصائية المتاحة هي كما يلي:

AVG(التعبير)
متوسط التعبير
COUNT(التعبير)
عدد الصفوف التي تحتوي على قيمة للتعبير
COUNT(*)
إجمالي عدد الصفوف في الجدول
MAX(التعبير)
القيمة القصوى للتعبير
MIN(التعبير)
الحد الأدنى للتعبير
SUM(التعبير)
مجموع التعبير

أمثلة

SQL> select prix from biblio

Image

متوسط السعر؟ السعر الأقصى؟ السعر الأدنى؟

SQL> select avg(prix), max(prix), min (prix) from biblio

Image

SQL> select titre, prix,genre from biblio

Image

متوسط سعر الرواية؟ السعر الأقصى؟

SQL> select avg(prix) moyenne, max(prix) prix_maxi from biblio where upper(genre)='ROMAN'

Image

كم عدد الكتب المصورة؟

SQL> select count(*) from biblio where upper(genre)='BD'

Image

كم عدد الروايات التي يقل سعرها عن 100 فرنك؟

SQL> select count(*) from biblio where upper(genre)='ROMAN' and prix<100

Image

SQL> select genre, prix from biblio

Image

عدد الكتب ومتوسط سعر الكتاب الواحد للكتب من نفس النوع؟

SQL> select upper(genre) GENRE,avg(prix) PRIX_MOYEN,count(*) NOMBRE from biblio group by upper(genre)

Image

نفس السؤال، ولكن فقط للكتب التي ليست روايات:

SQL>
select upper(genre) GENRE,avg(prix) PRIX_MOYEN,count(*) NOMBRE
from biblio
group by upper(genre)
having upper(GENRE)!='ROMAN'

Image

نفس الاستعلام، ولكن فقط للكتب التي يقل عدد صفحاتها عن 150 صفحة:

SQL> 
select upper(genre) GENRE,avg(prix) PRIX_MOYEN,count(*) NOMBRE
from biblio
where prix<150
group by upper(genre)
having upper(GENRE)!='ROMAN'

Image

نفس الاستعلام، لكننا نحتفظ فقط بالمجموعات التي يزيد متوسط سعر الكتاب فيها عن 100 فرنك سويسري

SQL> 
select upper(genre) GENRE, avg(prix) PRIX_MOYEN,count(*) NOMBRE
from biblio
group by upper(genre)
having avg(prix)>100

Image

3.14. إنشاء نصوص SQL لجدول

SQL هي لغة قياسية يمكن استخدامها مع العديد من أنظمة إدارة قواعد البيانات (DBMS). للتمكن من التبديل من نظام إدارة قواعد بيانات إلى آخر، من المفيد تصدير قاعدة البيانات أو ببساطة عناصر معينة منها في شكل نصوص SQL التي، عند إعادة تشغيلها في نظام إدارة قواعد بيانات آخر، ستكون قادرة على إعادة إنشاء العناصر التي تم تصديرها في النص.

هنا، سنقوم بتصدير الجدول [BIBLIO]. دعونا نختار خيار [استخراج البيانات الوصفية]:

Image

لاحظ أنه يجب أن تكون داخل قاعدة البيانات التي تريد تصدير عناصر منها. يطلق الخيار معالجًا:

1
مكان إنشاء البرنامج النصي SQL:
  • في ملف (ملف)
  • إلى الحافظة
  • في أداة Script Executive
2
اسم الملف إذا تم تحديد الخيار [ملف]
3
ما الذي سيتم تصديره
4
أزرار لاختيار (->) أو إلغاء اختيار (<-) الكائنات المراد تصديرها

إذا أردنا تصدير قاعدة البيانات بأكملها، فسنحدد خيار [استخراج الكل] أعلاه. نحن نريد ببساطة تصدير جدول BIBLIO. للقيام بذلك، نستخدم [4] لاختيار جدول [BIBLIO]، ونستخدم [2] لتحديد ملف:

Image

إذا توقفنا عند هذا الحد، فسيتم تصدير بنية جدول [BIBLIO] فقط. لتصدير محتوياته، نحتاج إلى استخدام علامة التبويب [Data Tables]:

استخدم [1] لتحديد الجدول [BIBLIO]:

استخدم [2] لإنشاء البرنامج النصي SQL:

Image

لنقبل المطالبة. هذا يسمح لنا بعرض البرنامج النصي الذي تم إنشاؤه في ملف [biblio.sql]:

/******************************************************************************/
/****         Generated by IBExpert 2004.06.17 22/01/2006 15:06:13         ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE DATABASE 'D:\data\serge\travail\2005-2006\polys\sql\DBBIBLIO.GDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET ISO8859_1;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE BIBLIO (
ID          INTEGER NOT NULL,
TITRE       VARCHAR(30) NOT NULL,
AUTEUR      VARCHAR(20) NOT NULL,
GENRE       VARCHAR(30) NOT NULL,
ACHAT       DATE NOT NULL,
PRIX        NUMERIC(6,2) DEFAULT 10 NOT NULL,
DISPONIBLE  CHAR(1) NOT NULL
);

INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (2, 'Les fleurs du mal', 'Baudelaire', 'POèME', '1978-01-01', 120, 'n');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (3, 'Tintin au Tibet', 'Hergé', 'BD', '1990-11-10', 70, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (4, 'Du côté de chez Swann', 'Proust', 'ROMAN', '1978-12-08', 220.5, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (5, 'La terre', 'Zola', 'ROMAN', '1990-06-12', 55.13, 'n');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (6, 'Madame Bovary', 'Flaubert', 'ROMAN', '1988-03-12', 143.33, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (7, 'Manhattan transfer', 'Dos Passos', 'ROMAN', '1987-08-30', 352.8, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (8, 'Tintin en Amérique', 'Hergé', 'BD', '1991-05-15', 70, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (10, 'Le père Goriot', 'Balzac', 'Roman', '1991-09-01', 210, 'o');
INSERT INTO BIBLIO (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (11, 'Poèmes saturniens', 'Verlaine', 'Poème', '1992-09-02', 200, 'o');

COMMIT WORK;



/******************************************************************************/
/****                          Unique Constraints                          ****/
/******************************************************************************/

ALTER TABLE BIBLIO ADD CONSTRAINT UNQ1_BIBLIO UNIQUE (TITRE);


/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE BIBLIO ADD CONSTRAINT PK_BIBLIO PRIMARY KEY (ID);
  • الأسطر من 1 إلى 3 هي تعليقات
  • الأسطر من 5 إلى 12 هي SQL خاص بـ Firebird
  • الأسطر المتبقية هي لغة SQL قياسية يجب أن تكون قابلة للتنفيذ في نظام إدارة قواعد البيانات (DBMS) الذي يدعم أنواع البيانات المعلنة في جدول BIBLIO.

دعونا نُشغّل هذا البرنامج النصي داخل Firebird لإنشاء جدول BIBLIO2 الذي سيكون نسخة مطابقة لجدول BIBLIO. للقيام بذلك، استخدم [Script Executive] (Ctrl-F12):

Image

دعونا نقوم بتحميل البرنامج النصي [biblio.sql] الذي أنشأناه للتو:

Image

قم بتعديله للاحتفاظ فقط بأجزاء إنشاء الجدول وإدراج الصفوف. تم تغيير اسم الجدول إلى [BIBLIO2]:

CREATE TABLE BIBLIO2 (
    ID          INTEGER NOT NULL,
    TITRE       VARCHAR(30) NOT NULL,
    AUTEUR      VARCHAR(20) NOT NULL,
    GENRE       VARCHAR(30) NOT NULL,
    ACHAT       DATE NOT NULL,
    PRIX        NUMERIC(6,2) DEFAULT 10 NOT NULL,
    DISPONIBLE  CHAR(1) NOT NULL
);

INSERT INTO BIBLIO2 (ID, TITRE, AUTEUR, GENRE, ACHAT, PRIX, DISPONIBLE) VALUES (2, 'Les fleurs du mal', 'Baudelaire', 'POèME', '1978-01-01', 120, 'n');
...

COMMIT WORK;

دعونا نقوم بتشغيل هذا البرنامج النصي:

يمكننا التحقق في مستكشف قاعدة البيانات من أن الجدول [BIBLIO2] قد تم إنشاؤه وأنه يحتوي على البنية والمحتوى المتوقعين: