You are on page 1of 52

‫‪DataBase 1/Lab part‬‬

‫‪Data Base Management‬‬ ‫• ماهو نظام إدارة قواعد البيانات )‪(DBMS‬‬


‫‪System‬؟‬
‫هو ذلك النظام المسؤول عن تعريف وإدارة قواعد البيانات وتطبيقاتها‪ .‬وهناك العديد‬
‫من منتجات أنظمة قواعد البيانات العالئقية‪ ,‬منها‪:‬‬
‫‪1- MS access. 2- MS SQL server. 3- Oracle. 4- DB2. 5- My SQL.‬‬
‫وتعتمد جميع هذه األنظمة على لغة ‪ SQL‬في أداء مهامها‪.‬‬
‫• ماهي لغة )‪Structured Query Language (SQL‬؟‬
‫هي لغة تستعمل في إنشاء وإدارة قواعد البيانات العالئقية‪ ,‬فهي ليست لغة برمجة‬
‫كاملة مثل ‪ C++‬أو ‪ ,Java‬بل هي لغة متخصصة في معالجة البيانات ‪data‬‬
‫‪ Sublanguage‬وال تضم إال التعليمات الضرورية لمعالجة البيانات ‪ data‬وماقبل‬
‫البيانات ‪.metadata‬‬
‫وتستعمل نظم إدارة قواعد البيانات المختلفة "لهجات" ‪ dialects‬مختلفة من لغة‬
‫‪ ,SQL‬حيث يستعمل نظام ‪ MS SQL server‬ما يسمى )‪Transact-SQL (T-SQL‬‬
‫بينما يستعمل نظام ‪ Oracle‬ما يسمى ‪Programming Language for SQL‬‬
‫)‪ .(PL/SQL‬وتعرف ‪ T-SQL‬على أنها تلك اللغة المقدمة من مايكروسوفت بغية‬
‫تزويد لغة ‪ SQL‬بمجموعة من الهياكل البرمجية المفيدة مثل ‪ while-loops‬و ‪if-‬‬
‫‪ then-else‬وهي تستعمل من أجل تكوين ‪ triggers‬و ‪.stored procedures‬‬
‫وتصنف أوامر لغة ‪ SQL‬حسب طبيعتها إلى ‪ 3‬مجموعات‪:‬‬
‫‪ -1‬لغة تعريف البيانات )‪:Data Definition Language(DDL‬‬
‫وتضم األوامر المسؤولة عن إدارة هيكلية قاعدة البيانات‪ ,‬أي تلك األوامر التي‬
‫نستعملها لتكوين أو تعديل أو حذف الجداول ‪ ,tables‬الحقول ‪ ,fields‬العالقات‬
‫‪ ,relations‬الفهارس ‪ ,indexes‬المستخدمين ‪ ,users‬المناظر ‪... ,views‬‬
‫إلخ‪ .‬وهذه األوامر هي‪. Create- Drop- alter:‬‬
‫‪ -2‬لغة معالجة البيانات )‪:Data Manipulation Language(DML‬‬
‫وتضم األوامر الخاصة بإضافة وتعديل وحذف واستعراض البيانات‪ .‬وهذه‬
‫األوامر هي‪.insert-update-delete-select :‬‬
‫‪ -3‬لغة التحكم في البيانات )‪:Data Control Language(DCL‬‬
‫وهي اللغة المسؤولة عن إدارة الصالحيات والتصاريح الممنوحة لمستخدمي‬
‫القاعدة‪ ,‬من أجل التحكم في الوصول للبيانات بقصد حمايتها‪ .‬وهي تشمل‬
‫األوامر‪.grant-revoke:‬‬
‫• ماهو نظام إدارة قواعد البيانات‪MS SQL Server‬؟‬

‫‪1‬‬
‫‪DataBase 1/Lab part‬‬

‫هو نظام إدارة قواعد البيانات الذي تم تطويره من قبل شركة ‪ ,Microsoft‬بغرض‬
‫تخزين واسترجاع البيانات التي تطلبها التطبيقات البرمجية المختلفة‪ ,‬سواء أكان‬
‫التطبيق البرمجي على نفس الحاسوب الذي يشتغل عليه الخادم‪ ,‬أو كان على جهاز‬
‫آخر(زبون ‪ )Client‬يتصل بالجهاز الخادم عبر شبكة‪ .‬وهناك العديد من‬
‫اإلصدارات من هذا النظام أحدها ‪.MS SQL Server 2014‬‬
‫• كيف يخزن نظام ‪ MS SQL Server‬البيانات؟‬
‫يتعامل نظام الخادم مع نوعين من الملفات‪ ,‬ملفات البيانات ‪ Data files‬التي‬
‫تستعمل لتخزين بيانات المستخدم وأي كائنات يقوم بتعريفها باإلضافة إلى بيانات‬
‫أخرى ضرورية لعمل القاعدة‪ ,‬وملفات سجل اإلجراءات ‪Transaction Log files‬‬
‫التي تخزن بها كل اإلجراءات التي تنفذ على القاعدة تلقائيا من قبل الخادم‪ ,‬ويستفاد‬
‫منها في الحفاظ على تماسك بيانات القاعدة وإجراء عمليات اإلسترداد ‪.Recovery‬‬
‫وال يمكن خلط البيانات واإلجراءات في ملف واحد‪.‬‬
‫مالحظة‪ :‬يقصد باإلجراء ‪ Transaction‬هنا مجموعة جمل ‪( T-SQL‬سواء أكانت جملة واحدة أو‬
‫أكثر) التي تعامل كوحدة واحدة عند التنفيذ واإلسترداد‪ ,‬بمعنى أنها إما تنفذ بالكامل أو ال‪.‬‬
‫‪ -‬أنواع الملفات‪:‬‬
‫‪ .1‬ملفات البيانات ‪ :Data files‬وتشمل‪:‬‬
‫▪ ملف البيانات الرئيسي ‪ :Primary Data file‬وهو يمثل نقطة‬
‫البداية للقاعدة‪ ,‬حيث يشير إلى الملفات األخرى بها‪ ,‬فبمجرد‬
‫تكوين القاعدة يتم إدراج نسخة من جداول النظام ‪System‬‬
‫‪ tables‬إلى هذا الملف‪ ,‬وباإلضافة إلى ذلك يمكن تخزين بيانات‬
‫المستخدم في هذا الملف‪ .‬يوجد في كل قاعدة بيانات ملف رئيسي‬
‫واحد فقط‪ ,‬ويكون له اإلمتداد (‪.).mdf‬‬
‫مالحظة‪ :‬جداول النظام هي جداول تضم بيانات عن امللفات والكائنات‬
‫والتصاريح والشروط وغير ذلك من الكائنات املوجودة في قاعدة البيانات‪.‬‬
‫الحظ أنه في كل مرة تعرف فيها كائن جديد (جدول مثال) يضاف سطر‬
‫جديد إلى جدول أو أكثر من جداول النظام‪ ,‬وبالتالي فإن حجم هذه‬
‫الجداول ليس ثابت‪.‬‬
‫▪ ملفات البيانات الثانوية ‪ :Secondary Data files‬وهي‬
‫الملفات التي قد يقوم المستخدم بإنشائها لتخزين بياناته ويكون لها‬
‫اإلمتداد (‪.).ndf‬‬

‫‪2‬‬
‫‪DataBase 1/Lab part‬‬

‫‪ .2‬ملفات اإلجراءات ‪ :Log files‬ويكون لكل قاعدة ملف إجراءات واحد‬


‫على األقل‪ ,‬وبوسعك أن تعرف أكثر من ملف إجراءات‪ .‬وإذا لم تعرف‬
‫ملف إ جراءات عند تكوينك للقاعدة فإن الخادم يفعل ذلك تلقائيا‪ ,‬ويكون‬
‫لهذا النوع من الملفات اإلمتداد (‪ .).ldf‬وتضم هذه الملفات تفاصيل‬
‫التعديالت التي تم إجرائها على القاعدة‪ ,‬السترداد القاعدة عند حدوث إي‬
‫فشل في النظام‪.‬‬
‫مالحظات‪:‬‬
‫▪ يحق لك تحديد مسار امللف عند إنشائه مع العلم أن املسار اإلفتراض ي‬
‫الذي يستعمله الخادم هو‪:‬‬
‫‪C:\Program Files\Microsoft SQL Server\MSSQL.n\MSSQL \Data‬‬
‫▪ لكل ملف اسمين األول ‪ Logical_file_name‬ويستعمل في جمل ‪T-SQL‬‬
‫لإلشارة للملف‪ ,‬ويجب أن يكون فريدا خالل قاعدة البيانات‪ ,‬ومطابقا‬
‫لشروط تسمية املعرفات ‪ Identifiers‬حسب لغة ‪ ,SQL‬واآلخر هو‬
‫‪ ,OS_file_name‬وهو اسم امللف الفيزيائي بما في ذلك املسار‪ ,‬ويجب أن‬
‫يخضع لشروط تسمية امللفات التابعة لنظام التشغيل‪.‬‬
‫• تنسيب الملفات ‪:File Placement‬‬
‫يقصد بتنسيب الملفات توزيعها على أقراص متعددة من أجل تحسين األداء ودعم‬
‫عمليات اإلسترداد وتحمل الفشل‪.‬‬
‫ونعني باألداء ‪ performance‬سرعة عمليات القراءة والكتابة وهي تتوقف على‬
‫النظام الفرعي لإلدخال واإلخراج ‪ I/O subsystem‬التابع لنظام التشغيل‪ ,‬وعلى‬
‫وجه الدقة تتوقف سرعة هذه العمليات على األقراص ‪ .disks‬بينما نعني بتحمل‬
‫الفشل ‪ fault tolerance‬القدرة على استمرار النظام في العمل بدون فقدان‬
‫البيانات عند حصول فشل في جزء من النظام‪.‬‬
‫ولتحقيق أفضل النتائج ينصح بوضع كل ملف على قرص‪ ,‬كما ينصح بوضع ملف‬
‫اإلجراءات على قرص مستقل بعيدا عن ملفات البيانات‪.‬‬
‫• ‪:Filegroups‬‬
‫هي عبارة عن مجاميع من الملفات‪ ,‬تعطى لها أسماء معينة لتساعدنا على التحكم في‬
‫عملية تنسيب الملفات‪ ,‬من أجل تحسين األداء وإدارة القاعدة بشكل أفضل‪.‬‬
‫فعلى سبيل المثال‪ ,‬يمكن أن نعرف ‪ filegroup‬بحيث تضم مجموعة من الملفات‬
‫الموزعة على عدة أقراص‪ ,‬ثم نخصص الجداول التي تحوي البيانات المطلوبة‬

‫‪3‬‬
‫‪DataBase 1/Lab part‬‬

‫بشكل متكرر لهذه الـ ‪ filegroup‬من أجل تحسين األداء‪ .‬أو نقوم بوضع البيانات‬
‫التي يتم تحديثها بشكل مستمر في ‪ filegroup‬ونضع البيانات الثابتة نسبيا في‬
‫‪ filegroup‬أخرى‪ ,‬حتى نتمكن من تنفيذ سياسة نسخ إحتياطي خاصة بكل واحدة‬
‫منهما بناء على مدى ثبوتية البيانات‪.‬‬
‫‪ -‬أنواع الـ ‪:filegroups‬‬
‫‪ :Primary filegroup .1‬وتنشأ تلقائيا من قبل الخادم عند إنشائك لقاعدة‬
‫البيانات‪ ,‬وتضم ملف البيانات الرئيسي ‪ ,primary data file‬كما يمكن‬
‫أن تضيف إليها أي ملفات ثانوية ‪ secondary data files‬قد تقوم‬
‫بإنشائها‪ .‬وتحتوي كل قاعدة بيانات على ‪ primary filegroup‬واحدة‬
‫بالضبط‪.‬‬
‫‪ :User-defined filegroups .2‬وهي أي ‪ filegroup‬قد يقوم المستخدم‬
‫بتعريفها‪ ,‬ويضيف إليها أي ملف ثانوي يقوم بتعريفه‪.‬‬
‫• مالحظات‪:‬‬
‫‪ .1‬ملفات اإلجراءات ‪ Log files‬ال تتبع ألي ‪.filegroup‬‬
‫‪ .2‬كل ملف بيانات يتبع ‪ filegroup‬معينة‪ ,‬يتم تحديدها عند إنشاء امللف‪,‬‬
‫وفي حالة عدم ذكر الـ ‪ filegroup‬التي يتبعها امللف‪ ,‬فإنه يضاف مباشرة‬
‫إلى الـ ‪.default filegroup‬‬
‫‪ .3‬كل قاعدة بيانات يوجد بها ‪ ,default filegroup‬وتعتبر الـ ‪primary‬‬
‫‪ filegroup‬هي الـ ‪ default filegroup‬للقاعدة عند إنشائها‪ ,‬ولكن‬
‫بوسعك أن تغير ذلك وتضبط أي ‪ user-defined filegroup‬قمت‬
‫بتعريفها لتكون هي الـ‪.default filegroup‬‬
‫‪ .4‬عندما نقول عن ‪ filegroup‬أنها للقراءة فقط ‪ ,read only‬فإننا نعني أنه‬
‫ال يمكن تعديل البيانات التي بها‪ .‬الحظ أن الـ ‪ primary filegroup‬ال‬
‫يمكن أن تكون ‪.read only‬‬
‫• أوامر لغة ‪:SQL‬‬
‫أوال‪ :‬أوامر لغة ‪DDL‬‬
‫• تكوين قاعدة بيانات ‪:Create DataBase‬‬
‫‪CREATE DATABASE database_name‬‬
‫‪[ ON‬‬

‫‪4‬‬
DataBase 1/Lab part

[ PRIMARY ]
[
<filespec> [ ,...n ]
[ , <filegroup> [ ,...n ] ]
[ LOG ON { <filespec> [ ,...n ] } ]
]
[ COLLATE collation_name ]
[ WITH <external_access_option> ]
]
:‫حيث أن‬
<filespec>::=
{
(
NAME =logical_file_name,
FILENAME = { 'os_file_name' | 'filestream_path' }
[ , SIZE =size [ KB | MB | GB | TB ] ]
[ , MAXSIZE = { max_size [ KB | MB | GB | TB ] |
UNLIMITED }
]
[ , FILEGROWTH =growth_increment [ KB | MB | GB |
TB | % ] ]
) [ ,...n ]
}
‫و‬
<filegroup> ::=
{
FILEGROUP filegroup_name
[ CONTAINS FILESTREAM ] [ DEFAULT ]
<filespec> [ ,...n ]
}

:‫• مالحظات‬
,‫ تمثل الكلمات املحجوزة‬uppercase ‫ الكلمات املكتوبة بالحروف الكبيرة‬.1
‫واألقواس املربعة ] [ تعني أن املقاطع املحصورة بينهما اختيارية ويمكن‬
‫ بينهما تمثل أقواس املجموعة } { األجزاء الضرورية من‬,‫االستغناء عنها‬
‫ والعالمة | تستعمل للفصل ما بين املكونات املحصورة ما بين‬,‫الصيغة‬
.‫ وتعني أنه عليك أن تختار واحدة فقط من هذه املكونات‬,‫األقواس‬

5
‫‪DataBase 1/Lab part‬‬

‫ونقصد بالرمز ]‪ [, …n‬أن العنصر السابق لهذه الرمز يمكن أن يكرر ‪ n‬من‬
‫املرات مع الفصل بين هذه التكرارات بالفاصلة‪.‬‬
‫ونستعمل الرمز=‪ < > ::‬لتعريف مقطع من الكود ‪ ,block of syntax‬بينما‬
‫نستعمل الرمز > < لإلشارة لهذا املقطع عندما نحتاج إليه‪ ,‬والغرض من‬
‫ذلك هو جعل الصيغة العامة مختصرة وواضحة‪.‬‬
‫‪ .2‬اسم القاعدة ويجب أن يكون فريدا بالنسبة لكل حالة ‪ Instance‬من‬
‫الخادم‪ ,‬كما يجب أن يخضع لشروط تسمية املعرفات حسب لغة ‪.SQL‬‬
‫‪ ON .3‬وتستعمل لتعريف ملفات البيانات وال ـ ‪ filegroups‬التي تستعمل‬
‫من أجل تخزين البيانات على القرص‪ ,‬ويجب أن تتبعها قائمة من‬
‫عناصر> ‪ <filespec‬لتعريف ملفات البيانات التابعة للـ ‪primary‬‬
‫‪ ,filegroup‬كما يمكن أن تتبعها قائمة من عناصر > ‪ < filegroup‬لتعريف‬
‫أي ‪ filegroups‬قد يرغب املستخدم بتكوينها‪.‬‬
‫‪ .4‬الكلمة املحجوزة ‪ Primary‬تعني أن قائمة عناصر > ‪ <filespec‬التي تليها‬
‫مباشرة تخص ملفات البيانات التابعة للـ ‪ ,primary filegroup‬ويمثل‬
‫أول عنصر من هذه القائمة ملف البيانات الرئيس ي ‪.primary data file‬‬
‫وحتى وإن لم نستعمل هذه الكلمة املحجوزة‪ ,‬فإن أول عنصر في القائمة‬
‫يمثل ملف البيانات الرئيس ي‪.‬‬
‫‪ < filespec > .5‬وتعني مواصفات امللف كما سيتم شرحه الحقا‪.‬‬
‫‪ < filegroup > .6‬وتستعمل لتعريف أي ‪ user-defined filegroups‬قد‬
‫يرغب املستخدم في تعريفها‪ ,‬كما سيتم شرحه الحقا‪.‬‬
‫‪ Log on .7‬تستعمل لتعريف ملفات اإلجراءات‪ ,‬وتليها قائمة من‬
‫عناصر> ‪ <filespec‬لتحديد مواصفات هذه امللفات‪.‬إذا لم تعرف ملف‬
‫إجراءات واحد على األقل عند إنشائك للقاعدة‪ ,‬فإن الخادم ينشأ ملف‬
‫إجراءات حجمه ‪ %25‬من مجموع حجم ملفات البيانات أو ‪ 512KB‬على‬
‫حسب أيهما يكون األكبر‪.‬‬
‫‪ Collate .8‬خارج نطاق دراستنا‪.‬‬
‫‪ With .9‬خارج نطاق دراستنا‪.‬‬

‫‪6‬‬
‫‪DataBase 1/Lab part‬‬

‫‪ Name .10‬وتستخدم لتحديد االسم املنطقي للملف‪ .‬وهذا االسم يجب أن‬
‫يكون فريدا خالل القاعدة‪ ,‬ومطابقا لشروط تسمية املعرفات حسب لغة‬
‫‪.SQL‬‬
‫‪ FILENAME .11‬وتستخدم لتحديد االسم الفيزيائي للملف ‪,os_file_name‬‬
‫ومسار امللف يجب أن يكون موجودا قبل تنفيذ جملة تكوين القاعدة‪.‬‬
‫القيمة '‪ 'filestream_path‬خارج نطاق دراستنا‪.‬‬
‫‪ SIZE .12‬وتستخدم لتحديد الحجم األولي للملف‪ ,‬ويجب أن يكون عددا‬
‫صحيحا‪ .‬أقل حجم مسموح به هو ‪ 1MB‬مللف البيانات و‪ 512KB‬مللف‬
‫اإلجراءات‪ ,‬والقيمة اإلفتراضية مللفات البيانات الثانوية ومللفات‬
‫اإلجراءات هي ‪ .1MB‬والوحدة األفتراضية للحجم هي ‪.MB‬‬
‫‪ MAXSIZE .13‬وتستخدم لتحديد أقص ى حجم يمكن أن يصل إليه امللف‪,‬‬
‫ويجب أن يكون عددا صحيحا‪ .‬الوحدة األفتراضية للحجم هي ‪,MB‬‬
‫وعندما ال نحدد الحد األقص ى املسموح به لنمو امللف‪ ,‬فإن امللف يستمر‬
‫في النمو حتى يغطى كامل القرص‪ .‬القيمة ‪ Unlimited‬تعني السماح‬
‫للملف بمواصلة نموه حتى يغطى كامل القرص‪.‬‬
‫‪ FILEGROWTH .14‬وتستخدم لتحديد املقدار الذي ينبغي أن يزداد به حجم‬
‫امللف تلقائيا عند الحاجة‪ ,‬ويجب أن يكون أقل من أقص ى حجم للملف‬
‫‪ .Maxsize‬يمكن أن يعطى مقدار الزيادة في شكل قيمة ثابتة‪ ,‬وفي هذه‬
‫الحالة تكون الوحدة املستعملة افتراضيا هي ‪ ,MB‬أو قد يعطى في شكل‬
‫نسبة مئوية‪ ,‬وتحسب هذه النسبة املئوية بناءا على الحجم الذي وصل‬
‫إليه امللف‪ .‬عندما تكون قيمة الزيادة ‪ 0‬فهذا يعني أنه ال يسمح للملف‬
‫بالنمو وتجاوز حجمه األولي‪ .‬أقل قيمة للنمو التلقائي هي ‪ ,64KB‬والقيمة‬
‫األفتراضية هي ‪ 1MB‬مللفات البيانات و ‪ 10%‬مللفات اإلجراءات‪.‬‬
‫‪ FILEGROUP .15‬كلمة محجوزة تستخدم لتحديد خصائص الـ ‪.filegroup‬‬
‫‪ filegroup_name .16‬اسم الـ ‪ filegroup‬ويجب أن يكون فريدا بالنسبة‬
‫لقاعدة البيانات‪ ,‬وأن يكون مطابقا لشروط تسمية املعرفات‪,‬مع تجنب‬
‫استعمال الكلمات املحجوزة ‪ Primary‬و ‪.primary_log‬‬

‫‪7‬‬
DataBase 1/Lab part

.‫ خارج نطاق دراستنا‬CONTAINS FILESTREAM .17


.Default filegroup ‫ وتستخدم لتخصيص الـ‬DEFAULT .18
:‫• أمثـــــــــــــــــلة‬
.mytest ‫ كون قاعدة بيانات باسم‬.1
CREATE DATABASE mytest;

‫ما هو حجم الملف الرئيسي و ملف اإلجراءات لهذه القاعدة؟ وماهو‬


‫أقصى حجم يمكن أن يصل إليه كال منهما؟‬

:‫ وبالمواصفات التالية‬sales ‫ كون قاعدة بيانات باسم‬.2

‫ملف البيانات الرئيسي‬


NAME Sales_dat
FILENAME Saledat
SIZE 10
MAXSIZE 50
FILEGROWTH 5
‫ملف اإلجراءات‬
NAME Sales_log
FILENAME Salelog
SIZE 5MB
MAXSIZE 25MB
FILEGROWTH 5MB

CREATE DATABASE Sales


ON
( NAME = Sales_dat,
FILENAME = 'C:\Program Files(x86)\Microsoft
SQL Server\MSSQL.1\MSSQL\Data\saledat.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,

8
DataBase 1/Lab part

FILENAME = 'C:\Program Files(x86)\Microsoft


SQL Server\MSSQL.1\MSSQL\Data\salelog.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB ) ;

,‘D:\SalesData’ ‫ على المسار‬Archive ‫ كون قاعدة بيانات باسم‬.3


‫ وملفي‬100MB ‫ ملفات بيانات كال منها بحجم‬3 ‫هذه القاعدة تحوي‬
.100MB ‫إجراءات كال منهما بحجم‬
CREATE DATABASE Archive
ON
PRIMARY
(NAME = Arch1,
FILENAME = 'D:\SalesData\archdat1.mdf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20),
( NAME = Arch2,
FILENAME = 'D:\SalesData\archdat2.ndf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20),
( NAME = Arch3,
FILENAME = 'D:\SalesData\archdat3.ndf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20)
LOG ON
(NAME = Archlog1,
FILENAME = 'D:\SalesData\archlog1.ldf',
SIZE = 100MB,
MAXSIZE = 200,
FILEGROWTH = 20),
(NAME = Archlog2,
FILENAME = 'D:\SalesData\archlog2.ldf',
SIZE = 100MB,

9
DataBase 1/Lab part

MAXSIZE = 200,
FILEGROWTH = 20)

:‫ وهي‬3 filegroups ‫ بحيث يكون بها‬Sales ‫ كون قاعدة بيانات باسم‬.4


‫ و‬Spri1_dat ‫ والتي تضم كال من الملفين‬Primary filegroup .1
.%15 ‫ بحيث يكون مقدار النمو التلقائي لكال منهما‬Spri2_dat
.SGrp1Fi2 ‫ و‬SGrp1Fi1 ‫ وتضم ملفين هما‬SalesGroupA .2
.SGrp2Fi2 ‫ و‬SGrp2Fi1 ‫ وتضم ملفين هما‬SalesGroupB .3
.C ‫ و ملف الحركة على القرص‬D ‫ضع ملفات البيانات على القرص‬

CREATE DATABASE Sales


ON PRIMARY
( NAME = SPri1_dat,
FILENAME = 'D:\SalesData\SPri1dat.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 15% ),
( NAME = SPri2_dat,
FILENAME = 'D:\SalesData\SPri2dt.ndf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 15% ),

10
DataBase 1/Lab part

FILEGROUP SalesGroup1
( NAME = SGrp1Fi1_dat,
FILENAME = 'D:\SalesData\SG1Fi1dt.ndf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 ),
( NAME = SGrp1Fi2_dat,
FILENAME = 'D:\SalesData\SG1Fi2dt.ndf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 ),
FILEGROUP SalesGroup2
( NAME = SGrp2Fi1_dat,
FILENAME = 'D:\SalesData\SG2Fi1dt.ndf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 ),
( NAME = SGrp2Fi2_dat,
FILENAME = 'D:\SalesData\SG2Fi2dt.ndf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
FILENAME = 'E:\SalesLog\salelog.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB ) ;

11
‫‪DataBase 1/Lab part‬‬

‫• تكوين جدول ‪:Create Table‬‬


‫‪CREATE TABLE‬‬
‫‪[ database_name ..] table_name‬‬
‫>‪( <column_definition‬‬
‫) ] ‪[<table_constraint> ] [ ,...n‬‬
‫] } "‪[ ON { filegroup | "default‬‬
‫مالحظات‪:‬‬
‫‪ Database_name .1‬هو اسم القاعدة التي يتبعها الجدول املراد إنشائه‪ ,‬ويجب أن‬
‫تكون هذه القاعدة موجودة قبل إصدار هذا األمر‪ ,‬كما يجب تحديد اسم القاعدة‬
‫وإال فإن الجدول سوف ينشأ في القاعدة الحالية‪.‬‬
‫‪ table_name .2‬اسم الجدول املراد إنشائه ويجب أن يتبع شروط تسمية املعرفات‪.‬‬
‫‪ <column_definition> .3‬مواصفات الحقل وسيتم شرحها الحقا‪.‬‬
‫‪ <table_constraint> .4‬وهي الشروط املفروضة على الجدول كما سيتم بيانه الحقا‪.‬‬
‫‪ ON .5‬كلمة محجوزة نستعملها من أجل تحديد الـ ‪ filegroup‬التي يتبعها الجدول‪.‬‬
‫لنفرض أننا نريد تكوين جدول في ‪ filegroup‬اسمها ‪ mygroup‬عندها نكتب‪:‬‬
‫‪ON mygroup‬‬
‫أما إذا أردنا أن نخزن الجدول في الـ ‪ default filegroup‬فإننا نكتب "‪."default‬‬
‫الحظ أنه ال بد من إحاطة ‪ default‬بعالمتي تنصيص مزدوجة‪ .‬وإذا لم تقم بتحديد‬
‫الـ ‪ filegroup‬التي سيتبعها الجدول( أي إذا لم تستعمل ‪ ON‬في أمر تكوين‬
‫الجدول)‪ ,‬فإن هذا الجدول سيتبع الـ ‪ default filegroup‬تلقائيا‪.‬‬
‫‪ <column_definition> .6‬يقصد به الكود الذي يحدد مواصفات الحقل‪ ,‬وهو‬
‫كالتالي‪:‬‬
‫=‪<column_definition> ::‬‬
‫| ] ‪column_name type_name [ (precision [ ,scale‬‬
‫]) ‪max‬‬
‫] ‪[ NULL | NOT NULL‬‬
‫] ‪[ DEFAULT constant_expression‬‬
‫]]) ‪[ IDENTITY [ ( seed ,increment‬‬
‫]) ‪[ CHECK (logical_expression‬‬

‫الحظ أن‪:‬‬
‫‪ column_name .1‬اسم العمود أو الحقل‪ ,‬ويجب أن يتبع شروط تسمية‬
‫املعرفات‪ ,‬كما يجب أن يكون فريدا خالل الجدول‪.‬‬
‫‪Type_name .2‬يقصد به نوع البيانات ‪ .... int, char, nvarchar‬إلخ‪.‬‬
‫‪ Precision .3‬يقصد به عدد الخانات التي يمكن أن يحويها الحقل‪ ,‬أما ‪scale‬‬
‫فيمثل عدد الخانات التي على يمين العالمة العشرية‪ .‬مثال بالنسبة للعدد‬
‫‪ 132.45‬تكون الـ ‪ precision=5‬و الـ ‪. scale=2‬‬

‫‪12‬‬
‫‪DataBase 1/Lab part‬‬

‫‪nvarchar,‬‬ ‫‪ max‬وتستعمل فقط مع األنواع البيانية‪:‬‬ ‫‪.4‬‬


‫‪ .varchar,varbinary‬وتعني ‪ max‬أن سعة الحقل هي ‪ 2*2^30‬بايت‬
‫بالنسبة للنوع األول‪ ,‬و‪ 2*2^31‬بايت للنوعين الثاني والثالث‪:‬‬
‫)‪Stud_ID varchar (max‬‬
‫الشرط ‪ NULL/NOT NULL‬يوضح ما إذا كان الحقل يقبل قيما خالية أم‬ ‫‪.5‬‬
‫ال‪ .‬والقيمة األفتراضية هي ‪:NULL‬‬
‫‪StuID char(4) NOT NULL‬‬
‫‪ default‬ونستعمل هذه الكلمة املحجوزة عندما نرغب في أن نحدد قيمة‬ ‫‪.6‬‬
‫افتراضية ليتم تعيينها للحقل عندما ال تسند له أي قيمة عند إدخال‬
‫البيانات‪:‬‬
‫'‪StuID char(9) NOT NULL default '000000000‬‬
‫املعامل ‪ constant_expression‬يعني أن القيمة األفتراضية يجب أن‬
‫تكون ثابتا‪ ,‬ويمكن أن نستخدم ‪ NULL‬كقيمة افتراضية‪ .‬واليجوز أن‬
‫نستخدم ‪ default‬مع الشرط ‪ IDENTITY‬بالنسبة لحقل واحد‪.‬‬
‫‪ IDENTITY‬وتعني أن العمود أو الحقل يمثل معرف فريد لكل سجل‬ ‫▪‬
‫بالجدول‪ ,‬وهذا يعني أنه عند إضافة سجل جديد للجدول‪ ,‬يخصص‬
‫محرك القاعدة لهذا الحقل قيمة فريدة تزايدية‪ ,‬وفي العادة يتم استعمال‬
‫هذا الشرط مع الشرط ‪ .Primary key‬الحظ أنه ال يمكن تعريف أكثر من‬
‫حقل معرف ‪ IDENTITY‬واحد لكل جدول‪,‬ويجب أن يكون نوع هذا الحقل‬
‫إما )‪,tinyint, smallint, int, bigint, decimal(p,0), numeric(p,0‬‬
‫الحظ أيضا أنه ال يمكن استعمال الشرط ‪ default‬على هذا النوع من‬
‫الحقول‪.‬املعامل ‪ seed‬يمثل قيمة الحقل بالنسبة ألول سجل في‬
‫الجدول‪,‬أما ‪ Increment‬فتعني مقدار الزيادة( أي الفرق في قيمة الحقل‬
‫من سجل إلى السجل الذي يليه)‪,‬ويجب عليك أن توضح قيمة كال من‬
‫هذين املعاملين معا عند إنشاء الجدول‪ ,‬أو تجاهلهما معا‪ ,‬وفي هذه الحالة‬
‫يستعمل محرك القاعدة القيمة األفتراضية ‪ 1‬لكال من املعاملين‪:‬‬
‫)‪EmployeeID int(5) NOT NULL IDENTITY (100,1‬‬
‫وهذا يعني أن رقم أول موظف هو ‪ ,100‬ورقم املوظف الذي يليه هو ‪101‬‬
‫وهكذا‪.‬‬
‫الشرط ‪ check‬ويستخدم لتحديد نطاق القيم املسموح بها للحقل‪,‬‬ ‫▪‬
‫واملعامل ‪ logical_expression‬يستخدم لتعريف حدود هذا النطاق‪:‬‬
‫‪Salary decimal(5,2) default 300.00‬‬
‫)‪check (salary >=300.00 and salary <= 1200.00‬‬
‫هذا األمر يعني أن القيمة األفتراضية للحقل ‪ salary‬هي ‪ ,300.00‬ويجب أن‬
‫تتراوح مدخالت هذا الحقل مابين ‪ 300.00‬و ‪.1200.00‬‬

‫‪13‬‬
‫‪DataBase 1/Lab part‬‬

‫‪ <table_constraint> .7‬أي الشروط املفروضة على الجدول‪ .‬وتكتب بناءا على‬


‫الصيغة العامة التالية‪:‬‬
‫=‪< table_constraint > ::‬‬
‫] ‪[ CONSTRAINT constraint_name‬‬
‫{‬
‫) ] ‪{PRIMARY KEY | UNIQUE } (column [ ,...n‬‬
‫|‬
‫‪FOREIGN KEY ( column [ ,...n ] ) REFERENCES‬‬
‫] ) ] ‪referenced_table_name [ (ref_column [ ,...n‬‬
‫] } ‪[ ON DELETE { NO ACTION | CASCADE‬‬
‫] } ‪[ ON UPDATE { NO ACTION | CASCADE‬‬
‫}‬
‫الحظ أن‪-:‬‬
‫▪ ‪ CONSTRAINT‬كلمة محجوزة تستخدم لتعريف شرط على الجدول‪.‬‬
‫▪ ‪ constraint_name‬اسم الشرط‪ .‬إن تحديد اسم للشرط يساعدك على‬
‫إجراء تعديالت الحقة على الجدول‪.‬‬
‫▪ الشرط ‪ PRIMARY KEY‬يعين املفتاح الرئيس ي للجدول‪ ,‬ويمكن تعيين‬
‫مفتاح رئيس ي واحد فقط لكل جدول‪ ,‬وهذا املفتاح يمكن أن يكون حقل‬
‫واحد‪ ,‬هكذا‪:‬‬
‫)‪constraint StuPk primary key (ID‬‬
‫أو عدة حقول‪ ,‬هكذا‪:‬‬
‫)‪constraint SubPK primary key (SubID,Part‬‬
‫ويقال عن املفتاح الرئيس ي في هذه الحالة أنه مفتاحا مركبا‪ .‬واملفتاح‬
‫الرئيس ي ال يقبل قيما مكررة أو خالية‪.‬‬
‫▪ الشرط ‪ UNIQUE‬يعني أن قيمة الحقل يجب أن تكون فريدة وال تتكرر عبر‬
‫كل السجالت‪ ,‬ويمكن أن يقبل هذا الحقل قيما خالية ‪:NULL‬‬
‫)‪constraint SubNameUNIQUE unique (SubName‬‬
‫يعني أن الحقل ‪ SubName‬يجب أن يكون فريدا وال يقبل أي قيم مكررة‪:‬‬
‫‪SubName‬‬
‫‪OOP‬‬
‫‪DataBase‬‬
‫‪OOP‬‬

‫بينما الشرط‪:‬‬
‫)‪constraint SubNameUNIQUE unique (SubName,SubID‬‬
‫يعني أن التوليفة املكونة من الحقل ‪ manager‬و الحقل ‪ Department‬ال‬
‫يمكن أن تكون مكررة‪:‬‬
‫‪manager‬‬ ‫‪Department‬‬
‫‪Ali‬‬ ‫‪IT‬‬

‫‪14‬‬
‫‪DataBase 1/Lab part‬‬

‫‪Ali‬‬ ‫‪Networks‬‬
‫‪Omar‬‬ ‫‪IT‬‬
‫‪Omar‬‬ ‫‪IT‬‬

‫▪ الشرط ‪ FOREIGN KEY‬يستخدم لتعريف عالقة ما بين جدولين‪ ,‬األول هو‬


‫الجدول الحالي الذي نحن بصدد تكوينه ويسمى الجدول اإلبن‪ ,‬واآلخر هو‬
‫الجدول ‪ referenced_table_name‬ويسمى الجدول األب‪ ,‬وذلك من خالل‬
‫الحقل‪/‬الحقول ) ] ‪ ( column [ ,...n‬املوجودة في الجدول الحالي‪,‬‬
‫والحقل‪/‬الحقول ] ) ] ‪ [ (ref_column [ ,...n‬املوجودة في الجدول اآلخر‪.‬‬
‫لنفرض أننا نريد تمثيل العالقة‪:‬‬
‫‪Departments‬‬
‫‪Dep_ID‬‬ ‫‪Dep_Name‬‬ ‫‪Manager_ID‬‬
‫‪1‬‬ ‫‪Internet‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪Networks‬‬ ‫‪2‬‬

‫‪Managers‬‬
‫‪Man_ID‬‬ ‫‪Man_Name‬‬
‫‪1‬‬ ‫‪Ali‬‬
‫‪2‬‬ ‫‪Osama‬‬
‫لتمثيل هذه العالقة وعند إنشاء الجدول ‪ ,Departments‬نعرف الشرط‬
‫‪ DepFK‬الذي يحدد العمود ‪ Manager_ID‬كمفتاح أجنبي ‪ Foreign key‬في‬
‫الجدول ‪ ,Departments‬لنربطه بالجدول ‪ managers‬من خالل الحقل‬
‫‪ Man_ID‬هكذا‪:‬‬
‫)‪constraint DepFK Foreign key (Manager_ID‬‬
‫)‪refrences managers (Man_ID‬‬
‫الشرط ‪ DepFK‬يعني أن القيم التي تظهر في الحقل ‪ Manager_ID‬في الجدول‬
‫‪( Departments‬الجدول األبن) يجب أن تكون موجودة سلفا في الحقل‬
‫‪ Man_ID‬في الجدول ‪ (managers‬الجدول األب)‪ ,‬ولو حاولت أن تدخل القيمة‬
‫‪ 3‬مثال في الحقل ‪ Manager_ID‬عند إدخال البيانات للجدول ‪Departments‬‬
‫فإنك ستحصل على رسالة خطأ من النظام‪.‬‬
‫الحظ أنه ليس من الضروري أن تتطابق أسماء الحقول التي نريد أن نربط من‬
‫خاللها الجداول‪ ,‬ولكن البد لهذه الحقول من أن تكون من نفس النوع والحجم‬
‫حتى تتم عملية الربط‪.‬‬
‫وأخيرا فإنه الحقل‪/‬الحقول املناظرة في الجدول األب يجب أن تمثل ‪PRIMARY‬‬
‫‪ KEY‬أو أن تكون فريدة ‪.UNIQUE‬‬

‫‪15‬‬
‫‪DataBase 1/Lab part‬‬

‫▪ الخيار ‪ ON DELETE‬التابع للشرط ‪ Foreign key‬يحدد طبيعة األجراء‬


‫الذي يتم اتخاذه عند حذف سجل في الجدول األب‪ ,‬إذا كان هذا السجل‬
‫مرتبط بسجل أو أكثر في الجدول األبن‪ .‬القيمة ‪ NO ACTION‬وهي القيمة‬
‫األفتراضية‪ ,‬تعني عدم السماح بحذف أي سجل في الجدول األب عند‬
‫وجود سجالت تابعة له في الجدول اإلبن‪ ,‬أما القيمة ‪ CASCADE‬تعني‬
‫السماح بعملية الحذف مع حذف جميع السجالت في الجدول األبن عند‬
‫حذف السجل املناظر لها في الجدول األب‪.‬‬
‫▪ الخيار ‪ ON UPDATE‬التابع للشرط ‪ Foreign key‬يساعدنا في التحكم‬
‫في التعديالت التي تجرى على سجالت الجدول األب التي توجد سجالت‬
‫مرتبطة بها في الجدول اإلبن‪ .‬القيمة اإلفتراضية ‪ NO ACTION‬تعني أن‬
‫عمليات التعديل هذه ترفض‪ ,‬أما القيمة ‪ CASCAD;loE‬فتعني أن‬
‫عمليات التعديل على الجدول األب تنعكس على السجالت التابعة لها في‬
‫الجدول األبن‪.‬‬
‫• أنواع البيانات‪:Data types‬‬
‫‪Exact Numeric‬‬
‫‪Tinyint‬‬ ‫‪0 to 255‬‬
‫‪Smallint‬‬ ‫‪-2^15 to 2^15-1‬‬
‫‪Int‬‬ ‫‪-2^31 to 2^31-1‬‬
‫‪Bigint‬‬ ‫‪-2^63 to -2^63-1‬‬
‫]) ]‪numeric [ (p[ ,s‬‬ ‫‪p is between 1 to 38, default is 18‬‬
‫‪s is between 0 and p( 0<=s<= p). default is 0‬‬
‫‪decimal [ (p[ ,s] )] p is between 1 to 38, default is 18‬‬
‫‪s is between o and p (0<=s<= p). default is 0‬‬
‫‪Bit‬‬ ‫‪0,1 or NULL‬‬
‫‪Smallmoney‬‬ ‫‪- 214,748.3648 to 214,748.3647‬‬
‫‪Approximate Numeric‬‬
‫] )‪float[ (n‬‬ ‫‪n is between 1 and 53 . default is 53.‬‬
‫‪Real‬‬ ‫)‪ISO synonym of float (24‬‬
‫‪Date and Time‬‬
‫‪Date‬‬ ‫‪0001-01-01 to 9999-12-31‬‬
‫‪datetime‬‬ ‫‪Date range : 1735/01/01 to 9999/12/31‬‬
‫‪Time range: 00:00:00 to 23:59:59.997‬‬

‫‪16‬‬
DataBase 1/Lab part

character strings: use the non-unicode characters


char[ ( n ) ] fixed length,1<= n<=8000, default is 1.
varchar[( n | max) ] variable length, 1<=n<=8000, default is 1.
Unicode character strings: use UNICODE UCS-2 character set.
nchar[ ( n ) ] fixed length, 1<= n<= 4000,default is 1.
nvarchar[(n|max) ] Variable length, 1<=n<=4000,default is 1.
: SQL Server 2008 ‫ملزيد من املعلومات حول األنواع البيانية التي يدعمها‬
http://msdn.microsoft.com/en-us/library/ms187752%28v=sql.100%29.aspx
:Constraints ‫• الشروط‬
: ‫ أنواع من الشروط وهي‬5 ‫يوجد‬
• NOT NULL constraint.
• CHECK constraint.
• UNIQUE constraint.
• PRIMARY KEY constraint.
• FOREIGN KEY constraint.
:Operators ‫• أنواع املؤثرات‬
% ,– ,/ ,* ,+ ‫املؤثرات الحسابية‬
,<> ,<= ,>= ,< ,> ,= ‫مؤثرات املقارنة‬
+ ‫مؤثردمج السالسل الحرفية‬
LIKE ,IN ,EXISTS ,BETWEEN ,NOT ,OR ,AND ‫املؤثرات املنطقية‬

: ‫• أمثلة‬
:‫ باملواصفات التالية‬Students ‫ قم بتكوين جدول باسم‬-1
Students
‫مالحظات‬ ‫النوع‬ ‫الحقل‬
.‫ وهكذا‬2 ‫ وللذي يليه‬1 ‫ قيمة الحقل ألول سجل‬Tinyint StuID
.‫ ال يقبل أي قيم خالية أو مكررة‬nvarchar(50) StuName
.0 ‫القيمة األفتراضيه هي‬, ‫ ال يقبل أي قيم خالية‬Bit StuGender
.‫ يقبل قيما خالية‬Date BirthDate
"‫ يقبل القيم الخالية وقيمته األفتراضية "مصراته‬nvarchar(50) StuAddress
17
DataBase 1/Lab part

‫ القيمة‬,100.00 ‫ و‬00.00 ‫ يقبل قيما مابين‬decimal(5,2) StuGrade


.00.00 ‫األفتراضية‬
.‫ يمثل مفتاحا رئيسيا للجدول‬StuID ‫الحقل‬
create table Students
(
StuID tinyint Identity (1,1) ,
StuName nvarchar(50) Not Null Unique ,
StuGender bit Not Null default 0 ,
BirthDate date Null ,
StuAddress nvarchar(50) Null default '‫ 'مصراته‬,
StuGrade decimal(5,2) Not Null default 00.00
check (StuGrade >= 00.00 AND StuGrade <= 100.00)
-- constraints:
constraint StuPK primary key (stuID)
);
‫ بينما‬,‫ في البرنامج‬Remarks ‫ تستخدم لتسجيل مالحظات‬-- ‫الحظ أن العالمة‬
.‫نستخدم عالمة التنصيص املفردة لحصرالثوابت والسالسل الحرفية‬
:‫ الذي مواصفاته كالتالي‬Artists ‫ قم بتكوين الجدول‬-2
Artists
‫مالحظات‬ ‫النوع‬ ‫الحقل‬
‫ الخ‬..15 ‫ وللذي يليه‬10 ‫ قيمة الحقل ألول سجل‬Tinyint ArtID
.‫ ال يقبل أي قيم خالية أو مكررة‬nvarchar(50) ArtName
.‫ يقبل القيم الخالية‬decimal(4,0) BirthYear
.‫ يقبل القيم الخالية‬decimal(4,0) DeathYear
Italian ‫ أو‬French‫أو‬Spain ‫ قيمه يجب أن تكون إما‬char(10) Nationality
French ‫ والقيمة األفتراضية‬,American ‫أو‬
.‫ يمثل املفتاح الرئيس ي للجدول‬ArtID ‫والحقل‬

18
DataBase 1/Lab part

create table Artists


(
ArtID tinyint Identity (10,5) ,
ArtName nvarchar(50) Not Null Unique ,
BirthYear decimal(4,0) Null ,
DeathYear decimal(4,0) Null ,
Nationality char(10) Not Null default 'French'
check (Nationality in ('French','Italian','Spain','American') )
constraint ArtPK primary key (ArtID)
)
‫ يجب أن تكون واحدة من السالسل الحرفية‬Nationality ‫ تعني أن قيمة الحقل‬in
:‫ هي‬in‫ والصيغة العامة للمؤثر‬,‫ إلخ‬....Italian, French
column_name in ( value1,value2, …..)
:‫ويمكن أن نكتب الشرط السابق على النحو التالي‬
check ( Nationality =’French’ OR Nationality =’Italian’ OR
Nationality =’Spain’ OR Nationality =’American’)
:‫ الذي مواصفاته كالتالي‬Paints ‫ قم بتكوين الجدول‬-3
Paints
‫مالحظات‬ ‫النوع‬ ‫الحقل‬
--------------------------------------- Tinyint PaintID
.‫ ال يقبل أي قيم خالية‬Tinyint ArtistID
. ‫ ال يقبل أي قيم خالية‬nvarchar(15) PaintName
.‫ يقبل القيم الخالية‬nvarchar(20) Genre
‫القيمة األفتراضية هي‬, ‫ يقبل القيم الخالية‬nvarchar(50) Describtion
.‘unknown’
.50000 .00‫ و‬50.00 ‫ السعريتراوح ما بين‬Float Price
ArtistID ‫ بينما يمثل الحقل‬,‫ يمثل املفتاح الرئيس ي للجدول‬PaintID ‫الحقل‬
. Artists ‫ بالجدول‬Paints ‫مفتاحا أجنبيا يربط الجدول‬
create table Paints

(
19
DataBase 1/Lab part

PaintID tinyint ,
ArtistID tinyint Not Null ,
PaintName nvarchar(15) Not Null ,
Genre nvarchar (20) Null ,
Describtion nvarchar (50) Null default 'unknown' ,
price float check (price between 50.00 and 50000.00)
constraint PaintsPK primary key (PaintID) ,
constraint PaintsFK foreign key (ArtistID) references Artists (ArtID)
);
:‫ بحيث تكون مواصفاته كما يلي‬Departments ‫ كون جدول باسم‬-4
Paints
‫مالحظات‬ ‫النوع‬ ‫الحقل‬
--------------------------------------- char (2) CompID
--------------------------------------- char(2) DepID
‫ ويجب أن ال تحتوي قيمه على‬,‫ ال يقبل قيما خالية‬char(10) DepName
‫ يجب أن تكون قيم هذا‬.Department ‫السلسلة‬
.CompID ‫الحقل فريدة بالنسبة لكل‬
‫ على الترتيب مفتاحا رئيسيا مركبا‬DepID ‫ و‬CompID ‫يمثل كال من الحقلين‬
.‫للجدول‬
create table Sales..Departments
(
CompID char (2),
DepID char(2) ,
DepName char(10) Not Null check( DepName Not Like '%Department')
constraint DepartmentsPK primary key (CompID,DepID),
constraint DepartmentsUQ Unique (CompID,DepName)
);
Not ‫ نستخدم املؤثر‬Department ‫من أجل أقصاء السالسل التي تحتوي على السلسة‬
‫ "ال يشبه" القيمة‬DepName ‫ ومعنى الشرط هنا أن محتوى الحقل‬,Like ‫واملؤثر‬
‫ وهذا‬,‫ أو أكثر‬0 ‫ إلى أي مجموعة من الحروف طولها‬% ‫ تشير العالمة‬,‘%Department’
.‫ قد يسبقه حرف أو أكثرأو ال ش يء‬Departments ‫يعني أن املقطع‬
20
DataBase 1/Lab part

:‫ باملواصفات التالية‬employees ‫ كون جدول باسم‬-5


Employees
‫مالحظات‬ ‫النوع‬ ‫الحقل‬
--------------------------------------- char(2) CmpID
--------------------------------------- char(2) DepID
--------------------------------------- char(4) empID
‫ وال يقبل القيم الخالية‬,2500 ‫ و‬200 ‫ قيمه تتراوح ما بين‬Float Salary
‫ ال‬,4 ‫ والقيمة األفتراضية هي‬,9 ‫ و‬4 ‫ قيمه تتراوح ما بين‬Tinyint Degree
.‫يقبل القيم الخالية‬
‫ و‬CmpID ‫ بينما يمثل كال من الحقلين‬,empID ‫املفتاح الرئيس ي للجدول هو الحقل‬
‫ في الجدول‬DepID‫ و‬CompID ‫ مفتاحين أجنبيين يشيران للحقلين‬DepID
.Default filegroup ‫ قم بإنشاء الجدول في الـ‬.Departments

create table sales..employees

CmpID char(2) ,

DepID char(2) ,

empID char(4) ,

salary float Not Null check (salary >= 200 and salary <= 2500) ,

degree tinyint check (degree between 4 and 9 ) default 4 Not Null

constraint employeesPK primary key (empID),

constraint employeesFK foreign key (CmpID,DepID) references Departments

(CompID,DepID)

) on "default" ;

:ALTER DATABASE ‫• أمر تعديل قاعدة بيانات‬


ALTER DATABASE database_name

21
‫‪DataBase 1/Lab part‬‬

‫{‬
‫‪| MODIFY NAME =new_database_name‬‬
‫>‪| <add_or_modify_files‬‬
‫>‪| <add_or_modify_filegroups‬‬
‫}‬
‫];[‬
‫الخيار‪ MODIFY‬يسمح لنا بتعديل اسم القاعدة وتغييره من االسم الحالي‬
‫‪ database_name‬إلى االسم الجديد ‪ ,new_database_name‬بواسطة‬
‫الخاصية ‪.NAME‬‬
‫مثال ‪ :1‬كون قاعدة بيانات باسم ‪ Sales‬ثم عدل اسمها ليصبح‬
‫‪.CompanySales‬‬
‫;‪CREATE DATABASE Sales‬‬
‫‪GO‬‬
‫;‪ALTER DATABASE Sales MODIFY NAME=CompanySales‬‬
‫‪GO‬‬
‫مالحظة‪ :‬مك يوجد ملف يف هذه القاعدة؟ ومك ‪filegroup‬؟ ومايه الـ ‪default filegroup‬؟‬

‫إلضافة أو تعديل أو حذف أي من ملفات القاعدة‪ ,‬استعمل الصيغة العامة‬


‫>‪ <add_or_modify_files‬هكذا‪:‬‬
‫=‪<add_or_modify_files>::‬‬
‫{‬
‫] ‪ADD FILE <filespec> [ ,...n‬‬
‫] } ‪[ TO FILEGROUP { filegroup_name‬‬
‫] ‪| ADD LOG FILE <filespec> [ ,...n‬‬
‫‪| REMOVE FILE logical_file_name‬‬
‫>‪| MODIFY FILE <filespec‬‬
‫}‬
‫الخيار ‪ ADD FILE‬يستعمل إلضافة ملف بيانات واحد أو أكثر إلى القاعدة‪,‬‬
‫مع تحديد المواصفات المطلوبة >‪ <filespec‬لكل ملف‪ ,‬باإلضافة إلى‬
‫إمكانية تحديد الـ ‪ filegroup‬التي تنتمى لها هذه الملفات بواسطة الخيار ‪TO‬‬
‫‪ ,FILEGROUP‬ويستعمل الخيار ‪ ADD LOG FILE‬إلضافة مجموعة من‬
‫ملفات الحركة للقاعدة‪ ,‬ولحذف أي ملف نستعمل الخيار ‪REMOVE FILE‬‬
‫مع تحديد االسم المنطقي ‪ logical_file_name‬للملف‪ ,‬الحظ أنه يجب‬
‫أن يكون الملف خاليا حتى نتمكن من حذفه‪,‬ويجب أن ال يكون الملف الوحيد‬
‫ضمن الـ ‪ ,default filegroup‬أما الخيار الرابع ‪MODIFY FILE‬‬
‫فيستعمل لتعديل مواصفات أي ملف‪ .‬يمكنك استعمال خيار واحد فقط من هذه‬
‫الخيارات األربعة في كل مرة‪.‬‬
‫وتحدد مواصفات الملف >‪ <filespec‬على النحو التالي‪:‬‬
‫‪22‬‬
‫‪DataBase 1/Lab part‬‬

‫=‪<filespec>::‬‬
‫(‬ ‫‪NAME =logical_file_name‬‬
‫]‪[,NEWNAME =new_logical_name‬‬
‫]'‪[,FILENAME = 'os_file_name‬‬
‫]]‪[,SIZE =size [KB |MB |GB |TB‬‬
‫|]‪[,MAXSIZE={max_size[KB|MB|GB|TB‬‬
‫}‪UNLIMITED‬‬
‫]‬
‫]]‪[,FILEGROWTH=growth_increment[KB|MB|GB|TB|%‬‬

‫)‬

‫الخاصية ‪ NAME‬تمثل اسم الملف المراد إنشائه أو تعديله‪ ,‬والبد من إدراج‬


‫هذه الخاصية ضمن قائمة مواصفات الملف‪ ,‬بينما تمثل الخاصية ‪NEWNAME‬‬
‫االسم الجديد للملف‪ ,‬وتستعمل فقط مع الخيار ‪ MODIFY FILE‬من أجل‬
‫تعديل اسم الملف ‪ logical_file_name‬واستبداله بآخر هو‬
‫‪ ,new_logical_name‬الخاصية ‪ SIZE‬تستخدم مع الخيار ‪ADD‬‬
‫‪ FILE‬من أجل تحديد الحجم األولي للملف‪ ,‬بينما تستعمل مع الخيار‬
‫‪ MODIFY FILE‬من أجل تحديد الحجم الجديد للملف المراد تعديله‪ .‬ويجب‬
‫أن يكون الحجم الجديد أكبر من الحجم الحالي للملف‪.‬‬
‫وإلضافة أو تعديل او حذف أي ‪:filegroup‬‬
‫=‪<add_or_modify_filegroups>::‬‬
‫{‬
‫‪| ADD FILEGROUP filegroup_name‬‬
‫‪| REMOVE FILEGROUP filegroup_name‬‬
‫‪| MODIFY FILEGROUP filegroup_name‬‬
‫} ‪{ { READ_ONLY | READ_WRITE‬‬
‫‪| DEFAULT‬‬
‫‪| NAME =new_filegroup_name‬‬
‫}‬
‫}‬

‫حيث يستعمل الخيار ‪ ADD FILEGROUP‬إلضافة ‪ filegroup‬جديدة‬


‫للقاعدة‪ ,‬بينما يستعمل الخيار ‪ REMOVE FILEGROUP‬لحذف ‪filegroup‬‬
‫موجودة‪ ,‬مع ضرورة أن تكون خالية حتى نتمكن من حذفها‪ ,‬والخيار‬
‫‪ MODIFY FILEGROUP‬يساعدنا على التحكم في ‪ 3‬سمات للـ ‪filegroup‬‬
‫وهي‪:‬‬

‫‪23‬‬
‫‪DataBase 1/Lab part‬‬

‫‪ Filegroup updatability -1‬أي قابلية محتويات الـ ‪ filegroup‬للتعديل‪,‬‬


‫فقد تكون الـ ‪:filegroup‬‬
‫‪ -‬غير قابلة للتعديل ‪.READ_ONLY‬‬
‫‪ -‬قابلة للتعديل ‪. READ_WRITE‬‬
‫الحظ أنه يجب أن تحتوي الـ ‪ filegroup‬على ملف بيانات واحد أو أكثر‬
‫حتى نستطيع جعلها غير قابلة للتعديل ‪.READ_ONLY‬‬
‫‪ Name -2‬لتعديل اسم الـ ‪ filegroup‬من ‪ filegroup_name‬إلى‬
‫‪. new_filegroup_name‬‬
‫‪ Default -3‬وتعني ضبط ‪ filegroup_name‬لتكون هي الـ ‪default‬‬
‫‪.filegroup‬‬

‫مثال ‪ :2‬عدل القاعدة ‪ CompanySales‬بناءا على مايلي‪:‬‬


‫‪ .1‬أضف ‪ filegroup‬باسم ‪.defilegroup‬‬
‫‪ .2‬أضف ‪ filegroup‬أخرى باسم ‪.othergroup‬‬
‫‪ .3‬أضف ملف بيانات اسمه ‪ fdatafile‬وضعه في ‪.defilegroup‬‬
‫‪ .4‬اجعل ‪ defilegroup‬هي الـ ‪.default filegroup‬‬
‫‪ .5‬اضف ملف بيانات باسم ‪.sdatafile‬‬
‫‪ .6‬أضف ملف بيانات باسم ‪ tdatafile‬إلى ‪.otherfilegroup‬‬
‫‪ .7‬عدل ‪ othergroup‬لتصبح ‪.read only‬‬
‫‪.8‬عدل اسم ‪ othergroup‬لتصبح ‪.readonlygroup‬‬
‫‪ .9‬عدل الملف ‪ fdatafile‬لتصبح مواصفاته هكذا‪:‬‬
‫‪Fdf‬‬ ‫االسم المنطقي‬
‫‪D:\fdf.ndf‬‬ ‫االسم الفيزيائي‬
‫‪2MB‬‬ ‫الحجم‬
‫‪5MB‬‬ ‫أقصى حجم‬
‫‪500KB‬‬ ‫النمو التلقائي‬

‫‪ .10‬أضف ملف حركة بالمواصفات التالية‪:‬‬


‫‪Mylog‬‬ ‫االسم المنطقي‬

‫‪24‬‬
DataBase 1/Lab part

C:\mylog.ldf ‫االسم الفيزيائي‬


3MB ‫الحجم‬
UNLIMITED ‫أقصى حجم‬
10% ‫النمو التلقائي‬

.sdatafile ‫ و الملف‬fdf ‫ احذف الملف‬.9


.defilegroup ‫ احذف‬.10
ALTER DATABASE CompanySales
ADD Filegroup defilegroup;
GO
ALTER DATABASE CompanySales
ADD Filegroup othergroup;
GO
ALTER DATABASE CompanySales
ADD File
(NAME=fdatafile,FILENAME='C:\fdatafile.ndf')
To FILEGROUP defilegroup;
GO
ALTER DATABASE CompanySales
MODIFY FILEGROUP defilegroup DEFAULT;
GO
ALTER DATABASE CompanySales
ADD File
(NAME=sdatafile,FILENAME='C:\sdatafile.ndf');
GO
ALTER DATABASE CompanySales
ADD File

25
DataBase 1/Lab part

(NAME=tdatafile,FILENAME='C:\tdatafile.ndf')
TO FILEGROUP othergroup;
GO
ALTER DATABASE CompanySales
MODIFY FILEGROUP othergroup READ_ONLY;
GO
ALTER DATABASE CompanySales
MODIFY FILEGROUP othergroup NAME=readonlygroup;
GO
ALTER DATABASE CompanySales
MODIFY FILE
(NAME=fdatafile,NEWNAME=fdf,FILENAME='D:\fdf.ndf',
SIZE=2MB,MAXSIZE=5MB,FILEGROWTH=500KB);
GO
ALTER DATABASE CompanySales
ADD FILE
(NAME=mylog,FILENAME='C:\mylog.ldf',SIZE=3MB,
MAXSIZE=UNLIMITED, FILEGROWTH=10%);
GO
ALTER DATABASE CompanySales
REMOVE FILE fdf;
GO

AlTER DATABASE CompanySales


MODIFY FILEGROUP readonlygroup DEFAULT;
GO
ALTER DATABASE CompanySales

26
DataBase 1/Lab part

REMOVE FILE sdatafile;


GO
ALTER DATABASE CompanySales
REMOVE FILEGROUP defilegroup;
GO

‫ إال‬fdf ‫ بعد أن قمنا بحذف الملف‬sdatafile ‫الحظ أنه ال يمكننا حذف الملف‬
‫ بدال‬default filegroup ‫ لتصبح هي الـ‬readonlygroup ‫بعد أن نضبط‬
‫ ألنه ال يمكن حذف أي ملف في حالة كونه هو الملف‬,defilegroup ‫من‬
.default filegroup ‫الوحيد في الـ‬
:ALTER TABLE ‫• أمر تعديل جدول‬
:‫الصيغة العامة‬
ALTER TABLE [ database_name .. ] table_name
{
ALTER COLUMN column_name
{
type_name [( { precision [ ,scale ]| max } )]
[NULL | NOT NULL ]
}
| ADD
{<column_definition>|<table_constraint>}[,...n ]

| DROP

{ [CONSTRAINT] constraint_name |
COLUMN column_name
} [ ,...n ]
| { CHECK | NOCHECK }
CONSTRAINT { ALL | constraint_name [ ,...n ]}
} [ ; ]
‫ عمليات تعديل مختلفة على الجدول‬4 ‫بواسطة هذه الصيغة بإمكاننا أن نجري‬
:‫وهي‬
:‫ تعديل حقل‬-1
‫ نستطيع أن نعدل في مواصفات الحقل‬ALTER COLUMN ‫بواسطة الخيار‬
,type_name ‫ وهذا يشمل تعديل نوعه‬,column_name ‫الذي اسمه‬
.‫ إلى جانب كونه يقبل قيما خالية أم ال‬,‫سعته‬
27
‫‪DataBase 1/Lab part‬‬

‫وهناك بعض التنبيهات حول استعمال هذا األمر‪:‬‬


‫• يجب أن ال يكون الحقل المراد تعديله خاضعا ألي من الشروط‬
‫التالية‪Check- Unique-Foreign key- Primary key:‬‬
‫وأن ال يكون مزودا بقيمة افتراضية ‪.default‬‬
‫• إذا أردت تعديل نوع الحقل‪ ,‬يجب أن يكون النوع القديم قابال‬
‫للتحويل ‪ convert‬للنوع الجديد‪ ,‬فمثال ال يسمح بتغيير نوع الحقل‬
‫من ‪ char‬إلى ‪ decimal‬والعكس صحيح‪ .‬ومن ناحية أخرى إذا‬
‫كان الحقل الذي ترغب في تغيير نوعه حقال معرفا ‪Identity‬‬
‫‪ column‬عندها يجب أن يكون النوع الجديد أحد األنواع التالية‪:‬‬
‫‪tinyint, smallint, int, bigint, decimal(p,0),‬‬
‫)‪.numeric(p,0‬‬
‫• لتعديل حقل ليصبح ‪ Not Null‬بعد أن كان ‪ ,Null‬عليك أن تتأكد‬
‫من أن محتوى هذا الحقل بالنسبة لكل السجالت ال يشمل أي قيمة‬
‫خالية‪ ,‬أو أن يكون الجدول خاليا‪.‬‬
‫‪type_name‬‬ ‫• عليك أن تحدد نوع الحقل وسعته‬
‫])] ‪ [(precision [ ,scale‬إذا كنت ترغب في تعديل‬
‫حالة الحقل ‪ Null‬أو ‪ ,Not Null‬وإن لم تكن ترغب في تغيير‬
‫النوع والسعة‪ ,‬استعمل التفاصيل القديمة‪.‬‬
‫• لتعديل حجم الحقل يجب أن يكون الحجم الجديد أكبر من الحجم‬
‫القديم‪ ,‬حتى ال يحصل بتر ‪ truncate‬للبيانات الموجودة في‬
‫الجدول‪ ,‬أو أن يكون الجدول فارغا‪.‬‬
‫وكذلك الحال عند تحويل نوع الحقل من ‪ nchar‬إلى ‪nvarchar‬‬
‫أو من ‪ char‬إلى ‪.varchar‬‬

‫مثال ‪ :3‬كون الجدول ‪ machines‬في القاعدة ‪ companySales‬في‬


‫‪ readonlygroup‬حيث‪:‬‬
‫‪Machines‬‬
‫‪machineID‬‬ ‫)‪char(2‬‬ ‫‪Primary key‬‬
‫‪Price‬‬ ‫)‪decimal(6,2‬‬ ‫‪Not Null‬‬
‫‪MadeIn‬‬ ‫)‪varchar(30‬‬ ‫‪Null‬‬

‫ثم عدل الحقل ‪ price‬ليصبح ‪.Null‬‬


‫قبل أن نقوم بتكوين الجدول ‪ machines‬نقوم بتعديل‬
‫‪ readonlygroup‬لتصبح ‪ read-write‬بدال من ‪ ,read-only‬وذلك‬
‫حتى نتمكن من إنشاء الجدول ضمن هذه الـ ‪:filegroup‬‬
‫‪ALTER DATABASE CompanySales‬‬
‫;‪MODIFY FILEGROUP readonlygroup read_write‬‬
‫‪28‬‬
‫‪DataBase 1/Lab part‬‬

‫‪GO‬‬
‫‪CREATE TABLE companySales..machines‬‬
‫(‬
‫‪machineID char(2) ,‬‬
‫‪Price‬‬ ‫‪decimal(6,2) Not NULL ,‬‬
‫‪MadeIn‬‬ ‫)‪varchar(30‬‬ ‫‪Null‬‬
‫)‪constraint machinesPK primary key (machineID‬‬
‫)‬
‫;‪on readonlygroup‬‬
‫‪GO‬‬
‫‪ALTER TABLE companySales..machines‬‬
‫;‪ALTER COLUMN Price decimal(6,2) Null‬‬
‫‪GO‬‬
‫مثال ‪ :4‬قم بتعديل الجدول ‪ machines‬بناءا على مايلي‪:‬‬
‫التعديل المطلوب‬ ‫الحقل‬
‫‪ machineID‬تعديل النوع إلى )‪char(4‬‬
‫‪ Price‬تعديل النوع إلى )‪decimal(5,3‬‬
‫‪ MadeIn‬اجعل النوع )‪ nvarchar(30‬واجعله ال يقبل القيم الخالية‬

‫ال يمكن تعديل نوع الحقل ‪ machineID‬ألنه حقل مفتاحي‪ ,‬وإلجراء‬


‫باقي التعديالت يفضل أن يكون الجدول خاليا‪ ,‬ألن تقليص سعة الحقل‬
‫‪ Price‬من )‪ (6,2‬إلى )‪ (5,2‬قد يؤدي إلى فقدان البيانات‪ ,‬ونفس الشئ‬
‫ينطبق على عمليه تحويل نوع الحقل ‪ MadeIn‬من ‪ nvarchar‬إلى‬
‫‪ ,varchar‬إذ أن ذلك قد يؤدى إلى فقد البيانات‪ ,‬كما أن عملية تحويل هذا‬
‫الحقل من ‪ Null‬إلى ‪ Not Null‬قد ترفض إذا كانت قيمة هذا الحقل ألي‬
‫سجل من السجالت ‪.Null‬‬
‫‪ALTER TABLE CompanySales..machines‬‬
‫;)‪ALTER COLUMN Price decimal (5,3‬‬
‫‪GO‬‬
‫‪ALTER TABLE CompanySales..machines‬‬
‫;‪ALTER COLUMN MadeIn nvarchar (30)Not Null‬‬
‫‪GO‬‬

‫‪ -2‬إضافة حقل أو شرط‪:‬‬


‫بواسطة الخيار ‪ ADD‬في الصيغة العامة نستطيع إضافة حقل و‪/‬أو شروط‬
‫جديدة‪.‬‬
‫مالحظة‪ :‬لقد سبق شرح كال من >‪ <column_definition‬و‬
‫>‪ . <table_constraint‬انظر الصفحات ‪ 12‬و ‪ 14‬على الترتيب‪.‬‬
‫عليك أن تنتبه إلى أنه إذا كان الحقل المضاف ‪ Not Null‬أي ال يقبل قيما‬
‫خالية‪ ,‬عندها يجب أن يكون الجدول فارغا‪ ,‬أو أن تعين له قيمة افتراضية‪,‬‬
‫‪29‬‬
‫‪DataBase 1/Lab part‬‬

‫حتى تخصص لكل سجل بالجدول عند إضافة الحقل‪ ,‬وإال فإن عملية‬
‫اإلضافة ستمنع!‬
‫مثال ‪ :5‬أضف إلى الجدول ‪ machines‬مايلي‪:‬‬
‫‪ .2‬حقل باسم ‪ types‬نوعه )‪ varchar(20‬بحيث يكون‬
‫‪ Not Null‬وله قيمة افتراضية "‪."Unknown‬‬
‫‪ .3‬شرط يحصر قيمة الحقل ‪ Price‬لتكون أعلى من أو‬
‫تساوي ‪ 50.000‬مع إعطائه قيمة افتراضية ‪.50.000‬‬
‫‪ .4‬حقل باسم ‪ Mname‬نوعه )‪ char(30‬ويقبل القيم‬
‫الخالية‪.‬‬
‫الحل‪:‬‬
‫‪ALTER TABLE CompanySales..machines‬‬
‫‪ADD‬‬
‫‪types varchar(20) Not Null default 'Unknown',‬‬
‫)‪CONSTRAINT PriceCK check (Price>=50.000‬‬ ‫‪,‬‬
‫‪CONSTRAINT PriceDF default 50.000 for price ,‬‬
‫;‪Mname char(30) Null‬‬

‫مثال ‪ :6‬اجعل الحقل ‪ Mname‬في الجدول ‪ machines‬حقال فريدا‪,‬‬


‫وال يقبل قيما خالية‪ ,‬وافرض شرطا على الحقل ‪ types‬لرفض أي سلسة‬
‫تنتهي بالمقطع ‪.machine‬‬
‫‪ALTER TABLE CompanySales..machines‬‬
‫;‪ALTER COLUMN Mname char (30) Not Null‬‬
‫‪GO‬‬
‫‪ALTER TABLE CompanySales..machines‬‬
‫‪ADD CONSTRAINT MnameUN UNIQUE(Mname),‬‬
‫‪CONSTRAINT typesCK CHECK‬‬
‫;)'‪(types NOT LIKE '%machine‬‬
‫‪GO‬‬
‫‪ -3‬حذف حقل أو شرط‪:‬‬
‫الخيار ‪ DROP‬يمكنك من حذف أي حقل‪ ,‬بشرط أن ال يكون مستخدما في‬
‫أي شرط ‪ constraint‬سواء أكان ‪ check‬أو ‪ primary key‬أو‬
‫‪ foreign key‬أو ‪ ,unique‬وأن ال يكون مزودا بقيمة افتراضية‪ .‬أيضا‬
‫يمكنك حذف أي شرط بواسطة هذا الخيار‪.‬‬
‫مثال ‪ :7‬من الجدول ‪ machines‬قم بحذف التالي‪:‬‬
‫‪ .5‬حذف الشرط ‪.MnameUN‬‬
‫‪ .6‬حذف الحقل ‪.Mname‬‬
‫‪ .7‬حذف الشرط ‪ PriceCK‬والشرط ‪.PriceDF‬‬
‫‪ .8‬حذف الحقل ‪.Price‬‬
‫‪30‬‬
DataBase 1/Lab part

ALTER TABLE CompanySales..machines


Drop CONSTRAINT MnameUN ,
COLUMN Mname,
CONSTRAINT PriceCK,
CONSTRAINT PriceDF,
COLUMN Price;
GO

:‫ تفعيل أو إبطال شرط‬-4


‫ أو‬Check ‫ يمكننا من إبطال أي شرط من النوع‬NOCHECK ‫الخيار‬
‫ وهذا يعني أنه ال يتم اختبار أي قيمة تدخل للحقل‬,Foreign key ‫النوع‬
‫سواء في عمليات اإلضافة أو التحديث بواسطة الشرط المفروض على هذا‬
‫ فهو‬CHECK ‫ أما الخيار‬,NOCHECK ‫الحقل بعد إبطال مفعوله بواسطة‬
‫ أي أنه يقوم بتفعيل الشرط ليتم اختبار‬,NOCHECK ‫يعمل عكس عمل‬
‫ تعني كل‬ALL ‫ القيمة‬.‫مدخالت الحقل بواسطته عند اإلضافة أو التحديث‬
Foreign ‫ و‬check ‫الشروط المفروضة على الجدول من النوعين‬
.key
:machines ‫ في الجدول‬typesck ‫ أبطل الشرط‬:8 ‫مثال‬
ALTER TABLE CompanySales..machines
Nocheck Constraint typesck;
.typesck ‫ فعل الشرط‬:9 ‫مثال‬
ALTER TABLE CompanySales..machines
check Constraint typesck;
:‫أمثلة‬
:companySales ‫ في القاعدة‬vendors ‫ كون الجدول‬.1
vendorID tinyint Not Null, Unique

CREATE TABLE CompanySales..vendors


(
vendorID tinyint Not Null
CONSTRAINT vendorIDUN UNIQUE (vendorID)
);
‫ ويقبل قيما خالية للجدول‬char(6) ‫ ونوعه‬vaccount ‫ أضف الحقل‬.2
.vendors
ALTER TABLE CompanySales..vendors
ADD vaccount char(6) Null;
GO

:‫ أضف الحقول التالي‬.3

31
DataBase 1/Lab part

vname varchar(40) Null


vaddress varchar(40) Null
loan decimal(8,2) more than 000000.00

ALTER TABLE CompanySales..vendors


ADD vname varchar(40) Null,
vaddress varchar(40) Null,
loan decimal(8,2)
constraint loanck check (loan>=00000.00);
.Not null ‫ ليصبح‬vname ‫ عدل الحقل‬.4
ALTER TABLE CompanySales..vendors
ALTER COLUMN vname varchar(40) NOT Null;

:‫ أضف الشروط‬.5
.‫ فريدا‬vname ‫لجعل الحقل‬ vnameUN
’USA,FL’‫ قيمة افتراضية هي‬vaddress ‫ ألعطاء الحقل‬vaddressDF
ALTER TABLE CompanySales..vendors
ADD CONSTRAINT vnameUN UNIQUE (vname),
CONSTRAINT vaddressDF default 'USA,FL'for vaddress;

.loanck ‫ أوقف مفعول الشرط‬.6


ALTER TABLE CompanySales..vendors
Nocheck constraint loanCK;

‫ إلى الجدول‬tinyint ‫ الذي نوعه‬vendorID ‫ أضف الحقل‬.7


.machines
ALTER TABLE CompanySales..machines
ADD vendorID tinyint ;

‫ لربطه مع‬machines ‫ للجدول‬vendorIDFK ‫ أضف الشرط‬.8


.vendors ‫الجدول‬
ALTER TABLE CompanySales..machines
ADD
CONSTRAINT vendorIDFK Foreign key (vendorID)
references vendors (vendorID);

:DROP DATABASE ‫• أمر حذف قاعدة بيانات‬


:‫الصيغة العامة‬

32
‫‪DataBase 1/Lab part‬‬

‫] ‪DROP DATABASE database_name [ ,...n‬‬


‫];[‬
‫عليك التأكد من أن القاعدة المراد حذفها ليست هي القاعدة الحالية‪ .‬إن حذف‬
‫القاعدة يؤدي إلى حذف جميع البيانات والملفات التابعة لها على القرص‪.‬‬
‫مثال ‪:10‬‬
‫;‪CREATE DATABASE test1‬‬
‫‪GO‬‬
‫;‪CREATE DATABASE test2‬‬
‫‪GO‬‬
‫;‪DROP DATABASE test1,test2‬‬
‫‪GO‬‬
‫• أمر حذف جدول ‪:DROP TABLE‬‬
‫هذا األمر يحذف الجدول وكل متعلقاته من فهارس ‪ ,indexes‬بيانات ‪,Data‬‬
‫وشروط ‪ ,constraints‬تصاريح ‪ permissions‬وأي ‪.triggers‬‬
‫الصيغة العامة‪:‬‬
‫]‪DROP TABLE[database_name ..]table_name [,...n‬‬
‫];[‬
‫مثال ‪:11‬‬
‫;‪DROP TABLE companySales..machines‬‬

‫إذا أردت حذف جدول ‪ table1‬وكان هذا الجدول مرتبطا بجدول آخر‬
‫‪ ,table2‬بحيث كان الجدول األب هو ‪ table1‬والجدول األبن ‪, table2‬‬
‫فإنك ال تستطيع حذف الجدول ‪ table1‬إال بعد أن‪:‬‬
‫‪ .1‬تحذف الشرط ‪ Foreign key‬الذي يكون العالقة مابين‬
‫الجدولين‪.‬‬
‫أو‬
‫‪ .2‬تحذف الجدول األبن ‪ table2‬أوال ثم تحذف الجدول‬
‫األب ‪ .table1‬بإمكانك أن تحذفهما في نفس األمر‪ ,‬هكذا‪:‬‬
‫;‪DROP TABLE table2,table1‬‬
‫وعليك في هذه الحالة أن تراعي ذكر الجدول األبن أوال‬
‫وقبل الجدول األب‪.‬‬

‫‪33‬‬
‫‪DataBase 1/Lab part‬‬

‫ثانيا‪:‬أوامر لغة ‪:DML‬‬


‫• أمر إضافة سجل جديد ‪:Insert‬‬
‫الصيغة العامة لهذا األمر هي كالتالي‪:‬‬
‫‪INSERT‬‬
‫]‪[INTO‬‬
‫‪[database_name ..] table _name‬‬
‫]‪VALUES ({DEFAULT |NULL |constant}[,...n])[,...n‬‬
‫] ;[‬
‫األمر ‪ INSERT‬يستخدم إلضافة سجل أو أكثر للجدول ‪,table _name‬‬
‫وتستخدم الكلمة المحجوزة ‪ VALUES‬لتقديم السجل( أو السجالت) التي ستدرج‬
‫بالجدول‪ ,‬حيث يتم حصر محتوى السجل مابين قوسين( )‪ ,‬ويفصل بين كل حقل‬
‫وآخر بفاصلة مع مراعاة الترتيب‪ ,‬ذلك أن القيمة األولى ستضاف للحقل األول‬
‫بالجدول‪ ,‬والقيمة الثانية للحقل الذي يليه وهكذا‪ .‬أيضا يجب تزويد كل حقل بالقيمة‬
‫المناسبة‪ ,‬باستثناء الحقل المعرف ‪ identity column‬الذي يتولى النظام‬
‫تخصيص القيمة المالئمة له تلقائيا‪ .‬وإلضافة أكثر من سجل يفصل بين كل سجل‬
‫وآخر بفاصلة‪ .‬نستعمل ‪ DEFAULT‬عندما نريد توجيه النظام إلى استعمال القيمة‬
‫األفتراضية التي سبق تعيينها للحقل‪ ,‬وإذا لم يكن هناك أي قيمة افتراضية مخصصة‬
‫للحقل‪ ,‬وكان هذا الحقل يقبل قيما خالية عندها تتم إضافة القيمة ‪ .Null‬ال يمكن‬
‫استعمال ‪ DEFAULT‬للحقل المعرف ‪ constant .identity column‬تمثل‬
‫القيمة الثابتة التي نريد إضافتها للحقل سواء أكانت رقم أو حرف أو غير ذلك‪ .‬إذا‬
‫كان الحقل الذي ستضاف له هذه القيمة الثابتة من النوع ‪ char‬أو ‪ varchar‬أو‬
‫‪ nvarchar‬أو ‪ nchar‬أو ‪ datetime‬أو ‪ date‬عندها تتم إحاطة هذه القيمة‬
‫بعالمتي تنصيص مفرد‪ ,‬وإذا كان الحقل من النوع ‪ bit‬فهناك طريقتين إلضافة قيمة‬
‫له‪ ,‬األولى هي أن نستخدم األرقام فنسند له إما القيمة ‪ 0‬لنعني بها ‪ ,false‬أو غير‬
‫ذلك( مثال ‪ )1‬لنعني بها ‪ ,true‬وفي الطريقة الثانية نستخدم إما السلسة ‪ false‬أو‬
‫‪ true‬مع إحاطتهما بعالمتي تنصيص مفرد‪ .‬وإذا أردت تخصيص قيمة لحقل من‬
‫النوع ‪ nchar‬أو ‪ nvarchar‬فعليك بكتابة الحرف ‪ N‬قبل هذه القيمة‪ ,‬حتى يتم‬
‫تخزين هذه القيمة في الصيغة الصحيحة‪.‬‬
‫مثال‪ :1‬افرض الجدول ‪ tb1‬والذي مواصفاته‪:‬‬
‫‪tb1‬‬
‫مالحظات‬ ‫النوع‬ ‫الحقل‬
‫‪Null‬‬ ‫)‪char(4‬‬ ‫‪col1‬‬
‫‪default is 2.5‬‬ ‫‪float‬‬ ‫‪col2‬‬
‫‪Identity‬‬ ‫‪tinyint‬‬ ‫‪col3‬‬

‫‪34‬‬
‫‪DataBase 1/Lab part‬‬

‫‪Null‬‬ ‫‪nvarchar(20) col4‬‬

‫قم بإدخال السجالت التالية لهذا الجدول‪:‬‬


‫‪ -1‬السجل األول‪:‬‬
‫‪col1‬‬ ‫‪col2‬‬ ‫‪col3‬‬ ‫‪col4‬‬
‫‪1001‬‬ ‫‪3.5‬‬ ‫‪1‬‬ ‫‪Orange‬‬

‫;)'‪insert into tb1 values('1001',3.5,N'orange‬‬

‫عند اسناد القيم للحقول بواسطة الجملة ‪ insert‬يجب مراعاة الترتيب‪ ,‬حيث‬
‫تكتب القيمة التي ستستند للحقل األول أوال‪ ,‬تليها القيمة التي ستخصص‬
‫للحقل الثاني‪ ,‬وهكذا‪ .‬مع الحرص على تزويد كل الحقول بالقيمة المناسبة‪,‬‬
‫ويستثنى من ذلك الحقل المعرف ‪ identity column‬الذي يقوم النظام‬
‫بتخصيص القيمة المناسبة له تلقائيا‪ .‬في المثال السابق تخصص القيمة‬
‫‪ 1001‬للحقل ‪ ,col1‬وقمنا بإحاطة هذه القيمة بعالمتي تنصيص مفرد‪,‬‬
‫وذلك ألن الحقل ‪ col1‬من النوع ‪ ,char‬وتخصص القيمة ‪ 3.5‬للحقل‬
‫‪ ,col2‬بينما تخصص القيمة ‪ orange‬للحقل ‪ ,col4‬ونستخدم الحرف ‪N‬‬
‫قبل هذه القيمة نظرا ألن الحقل ‪ col4‬من النوع ‪.nvarchar‬الحظ أننا لم‬
‫نسند قيمة صريحة للحقل ‪ ,col3‬وذلك ألن هذا الحقل يمثل حقال معرفا‬
‫‪ ,Identity column‬وبالتالي يقوم النظام باسناد القيمة المناسبة له تلقائيا‪.‬‬
‫في الواقع لو أنك قمت باسناد قيمة للحقل ‪ ,col3‬فإنك ستحصل على رسالة‬
‫خطأ‪ ,‬ولن يتم تنفيذ األمر‪.‬‬
‫‪ -2‬السجل الثاني‪:‬‬
‫‪col1‬‬ ‫‪col2‬‬ ‫‪col3‬‬ ‫‪col4‬‬
‫‪1003‬‬ ‫‪4.5‬‬ ‫‪2‬‬ ‫‪Null‬‬

‫;)‪insert into tb1 values('1003',4.5,Null‬‬


‫حيث تخصص القيمة ‪ Null‬للحقل ‪.col4‬‬
‫‪ -3‬السجل الثالث‪:‬‬
‫‪col1‬‬ ‫‪col2‬‬ ‫‪col3‬‬ ‫‪col4‬‬
‫‪Null‬‬ ‫‪1.0‬‬ ‫‪3‬‬ ‫‪Pink‬‬

‫;)'‪insert into tb1 values(Null,1.0,N'pink‬‬

‫‪35‬‬
DataBase 1/Lab part

:‫ السجل الرابع‬-4
col1 col2 col3 col4
Null 2.5 4 Red

‫ بإمكاننا إضافة هذا‬.col2 ‫في هذا السجل نستخدم القيمة األفتراضية للحقل‬
:‫السجل على النحو التالي‬
insert into tb1 values(Null,default,N'red');
:‫أو‬
insert into tb1 values(Null,2.5,N'red');
:‫ السجل الخامس‬-5
col1 col2 col3 col4
Null 2.5 5 Null

insert into tb1 values(Null,default,Null);


:‫ السجلين‬-6
col1 col2 col3 col4
Null 4.0 6 Null
Null 2.5 7 Blue
insert into tb1 values(Null,4.0,Null),
(Null,2.5,N'Blue');

:Update ‫• أمر تعديل سجل‬


:‫الصيغة العامة‬
UPDATE [database_name ..]table_name
SET
column_name = { constant | DEFAULT | NULL }
[,...n ]
[ WHERE search_condition ]
[ ; ]

36
‫‪DataBase 1/Lab part‬‬

‫األمر ‪ UPDATE‬يستخدم لتحديث سجل واحد أو أكثر في الجدول‬


‫‪ .table_name‬الكلمة المحجوزة ‪ SET‬تحدد قائمة بأسماء األعمدة التي‬
‫سوف تعدل أو تحدث في الجدول ‪ ,table_name‬ويمثل‬
‫‪ column_name‬اسم العمود الذي سوف يتم تعديل محتواه‪.‬الحظ أن‬
‫الحقل المعرف ‪ identity column‬ال يمكن تحديثه‪ .‬تعني ‪constant‬‬
‫القيمة التي سوف تخصص للحقل في السجل‪ /‬السجالت التي سوف يتم‬
‫تحديثها‪ .‬إذا كان الحقل من النوع ‪ nchar‬أو النوع ‪ nvarchar‬عليك أن‬
‫تضيف الحرف ‪ N‬قبل القيمة المراد استعمالها‪.‬‬
‫‪ DEFAULT‬تستعمل الستبدال المحتوى الحالي للحقل بالقيمة األفتراضية‬
‫المخصصة له‪ ,‬وإذا لم يكن هناك قيمة افتراضية مخصصة للحقل‪ ,‬وكان هذا‬
‫الحقل يقبل قيما خالية‪ ,‬عندها يستبدل محتواه بالقيمة ‪ .Null‬بينما تستعمل‬
‫‪ WHERE‬إلضافة شرط لتحديد السجالت المراد تعديلها و يمثل‬
‫‪ search_condition‬الشرط الذي يحدد المواصفات المطلوب‬
‫توفرها في السجالت حتى يتم تعديلها‪ .‬إذا لم تحصر السجالت المطلوب‬
‫تعديلها بواسطة ‪ WHERE‬عندها يتم تحديث كل السجالت بالجدول‪.‬‬
‫مثال‪ :‬قم بتحديث سجالت الجدول السابق ‪ tb1‬كما يلي‪:‬‬
‫‪ -1‬قم بتعديل قيمة الحقل ‪ col2‬واستبدالها بالقيمة األفتراضية المخصصة لهذا‬
‫الحقل‪ ,‬وتعديل الحقل ‪ col1‬لتصبح قيمته ‪ ,Null‬وذلك بالنسبة لجميع‬
‫السجالت‪:‬‬
‫;‪update tb1 set col2=default,col1=null‬‬
‫‪ -2‬عدل الحقل ‪ col4‬لتصبح قيمته ‪ purple‬للسجالت التي قيمة الحقل ‪col3‬‬
‫فيها تتراوح مابين ‪ 4‬و‪:6‬‬
‫‪update tb1‬‬
‫;‪set col4=N'purble' where col3 between 4 and 6‬‬

‫‪ -3‬عدل الحقل ‪ col4‬لتصبح قيمته ‪ yellow‬في جميع السجالت التي قيمته‬


‫الحالية فيها هي ‪:Null‬‬
‫‪update tb1‬‬
‫;‪set col4=N'yellow' where col4 is Null‬‬

‫• أمر حذف سجل ‪:Delete‬‬


‫‪DELETE‬‬
‫‪[ FROM ] [database_name. .]table_name‬‬
‫] ;[ ] ‪[ WHERE search_condition‬‬

‫‪37‬‬
‫‪DataBase 1/Lab part‬‬

‫يستعمل األمر ‪ DELETE‬لحذف سجل أو أكثر من الجدول ‪.table_name‬‬


‫وتستخدم ‪ WHERE‬لتقليص عدد السجالت التي سوف تحذف وحصرها‬
‫بواسطة الشرط ‪ .search_condition‬وإذا لم تستعمل ‪ WHERE‬يتم‬
‫حذف كافة السجالت بالجدول‪.‬‬
‫مثال‪ :‬من الجدول ‪: tb1‬‬
‫‪ -1‬احذف جميع السجالت التي قيمة ‪ col4‬بها هي ‪:red‬‬
‫'‪delete from tb1 where col4=N'red‬‬
‫‪ -2‬احذف جميع السجالت التي قيمة ‪ col3‬بها هي ‪:5‬‬
‫‪delete‬‬ ‫;‪tb1 where col3=4‬‬
‫‪ -3‬احذف جميع السجالت‪:‬‬
‫;‪delete tb1‬‬
‫• أمر االستعالم ‪:Select‬‬
‫ويستخدم السترجاع البيانات المخزنة في جداول القاعدة‪ ,‬ويعتبر هذا األمر‬
‫من أكثر أوامر لغة ‪ SQL‬تعقيدا‪ ,‬حيث أن هناك الكثير من الكلمات‬
‫المفتاحية ‪ key words‬التي تستعمل مع هذا األمر من أبرزها ‪ from‬و‬
‫‪ ,where‬وتؤدي كل واحدة من هذا الكلمات المفتاحية وظيفة خاصة‬
‫وتساعدنا على التحكم في مخرجات االستعالم على نحو معين‪.‬‬
‫والهيكلية العامة لجملة ‪ select‬هي‪:‬‬
‫‪select column-list‬‬
‫‪from table-name‬‬
‫‪where search-condition‬‬
‫‪group by‬‬
‫‪having search-condition‬‬
‫‪order by‬‬
‫حيث نستخدم ‪ select‬لتحديد قائمة األعمدة ‪ column list‬المطلوب‬
‫عرضها في اإلستعالم‪ ,‬و ‪ from‬لتحديد الجدول‪ /‬الجداول المطلوب جلب‬
‫البيانات منها‪ ,‬ويمثل كال من ‪ select‬و ‪ from‬الجزء الرئيسي الذي ال غنى‬
‫عنه في هيكلية جملة االستعالم‪ ,‬بينما تكون األجزاء األخرى اختيارية‪ ,‬وهي‬
‫‪ where‬التي تستخدم لحصر السجالت المطلوب استرجاعها ضمن نطاق‬
‫محدد بواسطة الشرط ‪ ,search-condition‬وتستعمل ‪group by‬‬
‫لتصنيف مخرجات االستعالم ضمن مجاميع معينة‪ ,‬ويمكن وضع شرط لتحديد‬
‫المجاميع المراد عرضها بواسطة ‪ ,having‬أما ‪ order by‬فالغرض منها‬
‫ترتيب المخرجات‪.‬‬
‫وللحصول على الناتج النهائي يقوم النظام بتنفيذ جملة االستعالم في خطوات‬
‫متسلسلة‪ ,‬وفي كل خطوة ينفذ جزء معين من جملة االستعالم‪ ,‬وينتج جدول‬
‫مؤقتا ليستخدمه في الخطوة التي تليها‪ .‬والترتيب المتبع في تنفيذ جملة‬
‫االستعالم هو‪:‬‬

‫‪38‬‬
‫‪DataBase 1/Lab part‬‬

‫ولكن عليك أن تعلم جيدا أن الجداول المؤقتة التي يتم إنتاجها خالل تنفيذ‬
‫جملة االستعالم ال يتم االحتفاظ بها أو تخزينها ( على عكس الجداول الدائمة‬
‫التي تكون بواسطة األمر ‪ ,)create‬وال يتم عرضها على المستخدم الذي ال‬
‫يرى إال الناتج النهائي‪ ,‬أيضا من المهم اإلشارة إلى أن الترتيب الذي تنفذ به‬
‫جملة االستعالم والموضح في المخطط السابق‪ ,‬يختلف عن الترتيب الذي‬
‫تكتب به هذه الجملة وهو‪:‬‬
‫‪1) select 2) from 3) where 4) group by 5) having 6)order by‬‬
‫وعلى الرغم من أن بعض هذه األجزاء اختيارية ويمكن االستغناء عنه‪ ,‬لكن‬
‫عند استعمالها جميعا أو استعمال بعضها يجب التقيد بالترتيب المذكور‪.‬‬
‫والجدير بالذكر أن الجدول النهائي الذي ينتج عن أمر االستعالم هو جدول‬
‫مؤقت‪ ,‬يتم تكوينه عن تنفيذ االستعالم وال يخزن في القاعدة‪.‬‬
‫ويمكن تصنيف االستعالمات إلى نوعين‪:‬‬
‫‪ -1‬استعالمات على جدول واحد‪ :‬وهي استعالمات تنفذ على جدول‬
‫واحد فقط‪.‬‬
‫‪ -2‬استعالمات على أكثر من جدول‪ :‬وهي استعالمات تنفذ على‬
‫أكثر من جدول‪.‬‬
‫أوال‪ :‬استعالمات من جدول واحد‪:‬‬
‫مالحظة‪ :‬جميع األمثلة التالية مبنية على الجدول ‪ emp‬في القاعدة ‪ S‬والذي‬
‫يمثل بيانات مجموعة من املوظفين‪ ,‬كما يلي‪:‬‬

‫‪39‬‬
‫‪DataBase 1/Lab part‬‬

‫‪ -‬استرجاع كافة الحقول التابعة لجدول معين‪:‬‬


‫‪ .1‬اعرض جميع البيانات المتوفرة عن الموظفين ( أي جميع‬
‫الحقول) من الجدول ‪:emp‬‬
‫لعرض كافة الحقول من الجدول ‪ emp‬نستعمل الرمز * (والذي يعني‬
‫كافة الحقول) بعد ‪ select‬ونحدد اسم الجدول المطلوب بعد ‪from‬‬
‫هكذا‪:‬‬
‫* ‪select‬‬
‫‪from S..emp‬‬
‫ومخرجات هذا االستعالم هي كما يلي‪:‬‬

‫‪ -‬استرجاع حقول معينة تابعة لجدول معين‪:‬‬


‫‪ .1‬استعرض أسماء األقسام المختلفة التي يعمل بها الموظفون في‬
‫الجدول ‪ , emp‬والمؤهالت المختلفة المتوفرة بكل قسم‪.‬‬
‫السترجاع حقول معينة‪ ,‬نكتب أسماء هذه الحقول ونفصل ما بينها‬
‫بفاصلة‪ .‬هكذا‪:‬‬
‫‪select department, qualification‬‬
‫‪from S..emp‬‬

‫‪40‬‬
‫‪DataBase 1/Lab part‬‬

‫من أجل التخلص من التكرار في مخرجات جملة االستعالم‪ ,‬نستعمل‬


‫الكلمة المحجوزة ‪ distinct‬مباشرة بعد ‪ ,select‬والتي تجعل‬
‫السجالت الناتجة عن االستعالم غير متماثلة‪:‬‬
‫‪select distinct department,qualification‬‬
‫‪from S..emp‬‬

‫‪ -‬استرجاع حقل محسوب باالعتماد على حقل‪ /‬حقول مخزنة في جدول‬


‫معين‪:‬‬
‫إذا أردنا حساب قيمة معينة لكل سجل بالجدول بناء على قيمة حقل‬
‫أو أكثر من الحقول المخزنة في الجدول‪ ,‬فإننا نستعمل المؤثرات‬
‫الحسابية‪ .‬لنفرض أننا نريد إيجاد راتب كل موظف بالجدول ‪emp‬‬
‫بعد خصم ضريبة قدرها ‪ %5‬من الراتب عندها نكتب‪:‬‬
‫))‪select empName,(salary-(salary*0.05‬‬
‫‪from S..emp‬‬

‫‪41‬‬
‫‪DataBase 1/Lab part‬‬

‫الحظ أن الحقل المحسوب ال يخزن بالجدول ‪ ,emp‬ولكن يتم حسابه‬


‫ليعرض ضمن مخرجات جملة االستعالم فقط‪ ,‬أيضا الحظ أن األسم‬
‫الذي يعطيه النظام لهذا الحقل وهو ‪ No column name‬غير‬
‫مناسب‪ ,‬وال يحمل أي داللة‪ ,‬وإذا أردت أن تستعمل اسما من عندك‪,‬‬
‫استعمل الكلمة المحجوزة ‪ as‬هكذا‪:‬‬
‫‪select empName,(salary-(salary*0.05))as new_salary‬‬
‫‪from S..emp‬‬

‫ويقال عن ‪ new_salary‬أنه اسم بديل ‪ .alias‬األسماء البديلة‬


‫يمكن أن تعطى للحقول المخزنة‪ ,‬وليس فقط الحقول المحسوبة‪:‬‬
‫‪select empName as employee_name‬‬
‫‪from S..emp‬‬

‫‪42‬‬
‫‪DataBase 1/Lab part‬‬

‫الحظ أن األسم البديل ‪ employee_name‬يستعمل فقط عند عرض‬


‫نتائج االستعالم‪ ,‬وال يحل محل اسم العمود األصلي‪ .‬أيضا يمكن أن يعطى‬
‫الجدول اسما بديال باستعمال ‪ ,as‬ولذلك استعماالت مفيدة سنتطرق لها الحقا‬
‫إن شاء هللا‪.‬‬
‫‪:scalar functions -‬‬
‫هي دوال جاهزة تؤدي مهمة معينة وترجع قيمة واحدة فقط‪ .‬ومنها‪:‬‬

‫حساب مجموع قيم الحقل ‪.column‬‬ ‫)‪sum(column‬‬


‫حساب متوسط قيم الحقل ‪.column‬‬ ‫)‪avg(column‬‬
‫حساب أصغر قيمة للحقل ‪.column‬‬ ‫)‪min(column‬‬
‫حساب أكبر قيمة للحقل ‪.column‬‬ ‫)‪max(column‬‬
‫حساب عدد السجالت في الجدول‪.‬‬ ‫)*(‪count‬‬
‫حساب عدد السجالت في الجدول التي ال تكون‬ ‫)‪count(column‬‬
‫فيها قيمة الحقل ‪ column‬تساوي ‪.null‬‬

‫اعرض مجموع مرتبات كل الموظفين في الجدول ‪,emp‬‬ ‫‪.1‬‬


‫و متوسط رواتبهم‪ ,‬وأقل راتب و أكبر راتب‪:‬‬
‫)‪select sum(salary‬‬ ‫‪as‬‬ ‫‪total ,‬‬
‫)‪avg(salary‬‬ ‫‪as‬‬ ‫‪average,‬‬
‫)‪min(salary‬‬ ‫‪as‬‬ ‫‪Minimum,‬‬
‫)‪max(salary‬‬ ‫‪as‬‬ ‫‪Minimum‬‬
‫‪from S..emp‬‬

‫اعرض إجمالي عدد الموظفين في الجدول ‪ ,emp‬وعدد‬ ‫‪.2‬‬


‫الموظفين المعروفة عناوينهم‪:‬‬
‫)‪select count(*),count(empaddress‬‬

‫‪43‬‬
‫‪DataBase 1/Lab part‬‬

‫‪from S..emp‬‬

‫‪ -‬استرجاع سجالت معينة بواسطة ‪:where‬‬


‫بواسطة ‪ where‬نستطيع وضع شرط لتحديد السجالت المطلوب‬
‫استرجاعها من الجدول‪.‬‬
‫‪ .1‬اعرض كافة بيانات الموظفين في الجدول ‪ emp‬والذين يتجاوز‬
‫راتبهم ‪ 1200‬ويقل عن ‪:1400‬‬
‫* ‪select‬‬
‫‪from S..emp‬‬
‫))‪where ((salary>1200) and (salary<1400‬‬

‫‪ .2‬اعرض بيانات الموظفين من الجدول ‪ emp‬بحيث يكون تاريخ‬


‫ميالدهم واقع مابين ‪ 1986/12/31‬و ‪ 1990/01/01‬ومؤهلهم‬
‫ليس ‪:PhD‬‬
‫* ‪select‬‬
‫‪from S..emp‬‬
‫)'‪where ((empBD>'12/31/1986‬‬
‫))'‪and (empBD<'01/01/1990‬‬
‫)'‪and (qualification<>'phd‬‬

‫الحظ أننا نحصر الثوابت التي تمثل تاريخا أو سلسلة حرفية‬


‫بعالمتي تنصيص مفرد‪.‬‬
‫‪ .3‬اعرض أسماء جميع الموظفين بشرط أن ال تبدأ بالمقطع ‪:ali‬‬
‫‪select empName‬‬
‫‪from S..emp‬‬
‫'‪where empName NOT LiKE 'Ali%‬‬

‫‪44‬‬
‫‪DataBase 1/Lab part‬‬

‫تسمى العالمة ‪ %‬بـ ‪ ,wildcard‬وهي ترمز ألي سلسلة حرفية‬


‫سواء أكان طولها ‪ 0‬أو ‪ 1‬أو أكثر‪ ,‬بغض النظر عن محتوى هذه‬
‫السلسلة‪ ,‬وبالتالي فإن ’‪ ‘Ali%‬تعني أي سلسلة تبدأ بالمقطع ‪Ali‬‬
‫سواء أكانت ‪ Ali‬أو ‪ Ali ahmed‬أو غير ذلك‪ .‬الحظ الفرق‬
‫مابين قولنا ’‪‘Ali%‬و قولنا ’‪ ‘Ali‬حيث تشير الثانية إلى سلسلة‬
‫معينة وهي ‪ Ali‬التي طولها ‪ 3‬أحرف بالضبط‪ ,‬وهي بالتأكيد‬
‫التظساوي السلسلة ’‪ ‘Ali omar‬أو ’‪ ,‘Ali karim‬وبالتالي فهي‬
‫ال تنفعنا في الحصول على مانريد وهو استبعاد جميع السالسل‬
‫التي تبدأ بالمقطع ‪.Ali‬‬
‫ويمكن استعمال ‪ %‬في النهاية عندما نريد أن نبحث عن سالسل‬
‫تبدأ بمقطع معين‪ ,‬كما هو الحال في هذا المثال‪ ,‬أو في البداية مثل‬
‫قولنا ’‪ ‘%Ali‬للبحث عن السالسل التي تنتهي بالمقطع ‪ Ali‬مثل‬
‫‪ Hana Ali‬أو ‪ ,Ali‬أو في االبداية والنهاية هكذا ’‪‘%Ali%‬‬
‫للبحث عن السالسل التي تحتوي على المقطع ‪ Ali,‬بغض النظر‬
‫عن موقعه من السلسلة مثل ‪ Hana Ali‬أو ‪ Ali omar‬أو‬
‫‪ Mosa Ali omar‬أو ‪ Ali‬أو حتى ‪.alia‬‬

‫‪ .4‬اعرض بيانات الموظفين التي تنتهي بحرف ‪:N‬‬


‫* ‪select‬‬
‫‪from S..emp‬‬
‫‪where empName‬‬ ‫'‪LiKE '%N‬‬

‫‪ .5‬اعرض بيانات الموظفين الذين تتراوح مرتباتهم بين ‪ 1200‬و‬


‫‪:1400‬‬
‫* ‪select‬‬
‫‪from S..emp‬‬
‫‪where salary between 1200 and 1400‬‬
‫‪45‬‬
‫‪DataBase 1/Lab part‬‬

‫نستخدم الهيكل ‪ between value1 and value2‬لإلشارة‬


‫إلى نطاق من القيم يتراوح مابين ‪ value1‬و ‪ value2‬مع العلم‬
‫أن ‪ value1‬و ‪ value2‬تقع داخل هذا النطاق‪.‬‬
‫‪ .6‬اعرض بيانات الموظفين الذين ال تقع رواتبهم ضمن النطاق‬
‫‪ 1200‬و ‪:1400‬‬
‫* ‪select‬‬
‫‪from S..emp‬‬
‫‪where salary Not between 1200 and 1400‬‬

‫‪ .7‬اعرض أسماء الموظفين المعروفة عناوينهم( أي التي ليست‬


‫‪:)null‬‬
‫‪select empName‬‬
‫‪from S..emp‬‬
‫‪where empaddress Is not NULL‬‬

‫‪ .8‬اعرض أسماء الموظفين الذين ال نعرف عناوينهم‪.‬‬


‫‪select empName‬‬

‫‪46‬‬
‫‪DataBase 1/Lab part‬‬

‫‪from S..emp‬‬
‫‪where empaddress Is NULL‬‬

‫‪ .9‬اعرض أسماء الموظفين المعروفة عناوينهم بشرط أن ال يشمل‬


‫العنوان المقطع ‪:Misurata‬‬
‫‪select empName‬‬
‫‪from S..emp‬‬
‫)‪where (empaddress Is not NULL‬‬
‫)'‪and (empaddress not like '%Misurata‬‬

‫‪ .10‬اعرض أسماء الموظفين من حملة الشهادة الثانوية أو‬


‫البكالوريوس‪:‬‬
‫نستخدم الكلمة المحجوزة ‪ in‬عندما نريد أن نقارن حقال معينا‬
‫بمجموعة من القيم‪ ,‬حيث نحصر هذه القيم مابين قوسين ()‪,‬‬
‫ونفصل مابين كل قيمة وأخرى بفاصلة‪ ,‬وإذا كانت هذه القيم تمثل‬
‫سالسل حرفية أو تواريخ فإننا نحيطها بعالمتي تنصيص مفرد‪.‬‬
‫والشرط‪:‬‬
‫) 𝑛𝑒𝑢𝑙𝑎𝑣 ‪field in (𝑣𝑎𝑙𝑢𝑒1 , 𝑣𝑎𝑙𝑢𝑒2 , ….. ,‬‬
‫يعادل الشرط‪:‬‬
‫) 𝑛𝑒𝑢𝑙𝑎𝑣 = ‪(field = 𝑣𝑎𝑙𝑢𝑒1 ) or (field=𝑣𝑎𝑙𝑢𝑒2 ) or… or (field‬‬
‫حيث أن قيمته تكون ‪ true‬إذا كان الحقل ‪ field‬يساوي إحدى‬
‫القيم ‪ 𝑣𝑎𝑙𝑢𝑒1‬أو ‪ 𝑣𝑎𝑙𝑢𝑒2‬أو ‪ ....‬أو 𝑛𝑒𝑢𝑙𝑎𝑣‪.‬‬
‫‪select empName,qualification‬‬
‫‪from S..emp‬‬
‫)'‪where qualification in('high school','bachelor‬‬

‫‪47‬‬
‫‪DataBase 1/Lab part‬‬

‫ويمكن إعادة كتابة شرط االستعالم السابق على النحو التالي‪:‬‬


‫)'‪where (qualification ='high school‬‬
‫)'‪OR (qualification='bachelor‬‬
‫)'‪OR (qualification='Msc‬‬

‫‪ .11‬اعرض أسماء الموظفين الذين رواتبهم إما ‪ 1200‬أو ‪1300‬‬


‫أو ‪:1400‬‬
‫‪select empName,salary‬‬
‫‪from S..emp‬‬
‫)‪where salary in(1200,1300,1400‬‬

‫‪ -‬جملة ‪:group by‬‬


‫تستخدم لعرض بيانات ملخصة عن الجدول الناتج عن جملة ‪,where‬‬
‫وذلك بتصنيف سجالت الجدول بناء على القيم المشتركة في حقل‪/‬‬
‫حقول معينة‪.‬‬
‫‪ .1‬ماهي األقسام التي يعمل بها الموظفين في الجدول ‪:emp‬‬
‫‪select department‬‬
‫‪from S..emp‬‬
‫‪group by department‬‬

‫‪ .2‬قم بعرض المؤهالت المتوافرة ضمن كل قسم من األقسام التي‬


‫يعمل بها الموظفين من الجدول ‪:emp‬‬
‫‪select department,qualification‬‬
‫‪from S..emp‬‬
‫‪group by department,qualification‬‬

‫‪48‬‬
‫‪DataBase 1/Lab part‬‬

‫الحظ أن‪:‬‬
‫‪ .1‬يمكن تصنيف السجالت حسب حقل واحد كما في المثال ‪ 1‬أو‬
‫حقلين كما في المثال ‪ 2‬أو أكثر‪.‬‬
‫‪ .2‬الحقول التي يمكن إدراجها في جملة ‪ select‬في االستعالم‬
‫الذي يحوي ‪ group by‬هي فقط تلك التي تظهر في جملة‬
‫‪ .group by‬في استعالم المثال ‪ 1‬قمنا بعرض الحقل‬
‫‪ department‬الذي استعملناه مع جملة ‪ ,group by‬وفي‬
‫استعالم المثال ‪ 2‬قمنا بعرض الحقلين ‪ department‬و‬
‫‪ ,qualification‬وهما نفس الحقلين الذين استعملناهما في‬
‫‪.group by‬‬
‫‪ .3‬بإمكاننا استعمال الدوال الجاهزة مع جملة ‪ select‬في‬
‫االستعالمات التي بها ‪ ,group by‬كما سيلي‪.‬‬
‫‪ .3‬اعرض مجموع رواتب الموظفين مصنفين حسب األقسام العاملين‬
‫بها‪:‬‬
‫)‪select department,sum(salary‬‬
‫‪from S..emp‬‬
‫‪group by department‬‬

‫‪ .4‬اعرض عدد الموظفين بناءا على مؤهالتهم‪:‬‬


‫)*(‪select qualification,count‬‬
‫‪from S..emp‬‬
‫‪group by qualification‬‬

‫‪49‬‬
DataBase 1/Lab part

‫ و‬PhD ‫ اعرض عدد الموظفين الحاملين لكل من المؤهالت‬.5


:Msc ‫ و‬bachelor
select qualification,count(*)
from S..emp
where qualification in('Msc','phd','bachelor')
group by qualification

:‫ اعرض عدد الموظفين بناءا على مؤهالتهم في كل قسم‬.6


select department,qualification,count(*)
from S..emp
group by department,qualification

:having ‫ جملة‬-
‫ ونستعمل في‬,group by ‫تستخدم لوضع شرط على مخرجات جملة‬
‫ باإلضافة إلى‬group by ‫هذه الجملة الحقول المستعملة في جملة‬
.‫الدوال الجاهزة‬
‫ اعرض األقسام المختلفة التي يعمل بها الموظفون في جدول‬.1
:2 ‫ بشرط أن يكون عدد الموظفين في القسم أكثر من‬emp
select department,count(*)
from S..emp
group by department
having count(*)>2

:order by -

50
‫‪DataBase 1/Lab part‬‬

‫وتستخدم لترتيب مخرجات االستعالم بناء على حقل واحد أو أكثر‪ ,‬إما‬
‫تصاعديا وذلك بوضع الكلمة المحجوزة ‪ asc‬مباشرة بعد اسم الحقل‬
‫الذي نريد أن نرتب السجالت بناء عليه‪ ,‬أو تنازليا وذلك باستعمال‬
‫الكلمة المحجوزة ‪ .desc‬وإذا لم نستعمل أيا منهما يتم الترتيب‬
‫تصاعديا بشكل افتراضي‪.‬‬
‫‪ .1‬اعرض بيانات الموظفين مرتبة تصاعديا على حسب اسم‬
‫الموظف‪:‬‬
‫* ‪select‬‬
‫‪from S..emp‬‬
‫‪order by empName asc‬‬

‫‪ .2‬اعرض بيانات الموظفين الذين تاريخ ميالدهم أكبر من ‪1986‬‬


‫مرتبة تنازليا حسب أسم الموظف‪:‬‬
‫* ‪select‬‬
‫‪from S..emp‬‬
‫'‪where empBD > '01/01/1986‬‬
‫‪order by empName desc‬‬

‫‪ .3‬اعرض بيانات الموظفين مرتبة حسب القسم الذي يعملون به‬


‫ومؤهالتهم تصاعديا‪:‬‬
‫* ‪select‬‬
‫‪51‬‬
‫‪DataBase 1/Lab part‬‬

‫‪from S..emp‬‬
‫‪order by department asc,qualification asc‬‬

‫نظرا ألن عملية الترتيب تتم بشكل تصاعدي افتراضيا‪ ,‬يمكن كتابة‬
‫جملة الترتيب السابقة على النحو التالي‪:‬‬
‫‪order by department,qualification asc‬‬
‫أو‪:‬‬
‫‪order by department,qualification‬‬

‫ونحصل في كل مرة على نفس النتيجة‪.‬‬


‫مالحظة‪ :‬تعامل ‪ null‬في الترتيب على أنها أصغرقيمة‪.‬‬
‫‪ .4‬اعرض بيانات الموظفين مرتبة تصاعديا على حسب القسم‬
‫وتنازليا على حسب المؤهل‪:‬‬
‫* ‪select‬‬
‫‪from S..emp‬‬
‫‪order by department asc,qualification desc‬‬

‫‪52‬‬

You might also like