0% found this document useful (0 votes)
264 views52 pages

SQL PDF

Uploaded by

EM EL-sanosi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
264 views52 pages

SQL PDF

Uploaded by

EM EL-sanosi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 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