Professional Documents
Culture Documents
پایگاه داده 3
پایگاه داده 3
P2 70
AFTER
S# P# Qty
S1 P1 100
s1 P2 200
اين يک رابطه نرمال (طبيعي) است .
s1 p3 60 يک تاپل
S2 P1 80
S2 P2 70
S3 P1 90
دليل اينکه چرا رابطه ها بايد نرمال باشند (چرا مقادير خاصه بايد اتوميک باشند ) .
DATEب666ا ت666اک6يد گ666فته 6ا6ستک666ه: 6
دليل اصلي نرمال بودن رابطه ها در مدل رابطه اي ،تامين سادگي است Simplicity .
– 1سادگي ظاهري
– 2سادگي انجام عمليات در . Database
– 3ساده تر شدن احکام DSLمخصوصا . DML
مثال :
Q1درج کن >S4 , P1 , 60< :
: Q2درج ک666ن <>S2 ,P3 , 50
انجام I1در هر دو پايگاه BEFOREو AFTERبه سادگي قابل انجام است .
INSERT INTO BEFORE
>TUPLE<S4,P1,60
INSERT INTO AFTER
>TUPLE<S4,P1,60
اما اجراي درخواست I2در AFTERبه سادگي انجام پذير است .اما در BEFOREنه .
INSERT INTO AFTER
>TUPLE<S2,P3,50
اما نمي توان نوشت
INSERT INTO BEFORE
>TUPLE<S2,P3,50
زيرا قبال تاپلي با S# = S2در اين جدول وجود دارد
اين Tupleاي از جدول BEFOREنيست .
بايد اپراتور ديگري بجز INSERTدر زبان وجود داشته باشد که مقداري را به يک مجموعه اضافه کند
.
مثال :
ADD TO PQTYSET
>VALUE <P3,50
;’WHERE S# = ‘S2
يعني يک اپراتوري براي INSERTهنگامي که Tupleمقدار عادي دارد الزم داریم و يک اپراتوري
به نام ADDيا APPENDبراي حال6تي که Tupleمقدار عادي ندارد .
اين براي سيستم Overheadايجاد مي کند و سادگي زبانی را از بين مي برد.
کليد در مدل رابطه اي :
با اصطالح عام کليد کانديد ( )Candidate Keyمطرح است .
تعريف :هر زير مجموعه از مجموعه عنوان رابطه به صورت Ai Aj … Ak
که داراي دوخاصيت زير باشد کليد کانديد است :
– 1يکتايي مقدا6ر داشته باشد در طول حيات رابطه ( )Uniquenessيعني در هيچ دو Tupleاي از
رابطه اين ترکيب مقدار يکسان نداشته باشد .
– 2کاهش ناپذيري Irreducibilityيا ( Minimalityايجاز يا کهينگي) داشته باشد .يعني اگر هر
يک از اجزاي تشکيل دهنده اين ترکيب را ازش بگيريم خاصيت يکتايي مقدار آن از بين برود .
نام رابطه کليد کاندید
#S S
#P p
SP )(S#,P#
نکته :اگر خاصيت دوم برقرار نباشد ،يعني زير مجموعه اي از مجموعه Headingوجود داشته
باشد که يکتايي مقدار داشته باشد ولي کاهش ناپذيري نداشته باشد ،به آن Supper Keyمي گويند
(يعني درون خود حد اقل يک کليد کانديد دارد ) اما Codd ، Supper Keyرا به عنوان يک مفهوم
اساسي در مدل رابطه اي مطرح نمي کند .
آيا وجود حد اقل يک کليد کانديد در رابطه محرز است ؟
بله .هر رابطه کليد کانديد دارد .زيرا در بدترين حالت خود مجموعه عنوان مي تواند کليد کانديد باشد ،
زيرا مجموعه Body ، Tupleتکراري نمي تواند داشته باشد
()S#,P#, DATE
)SPd (S# , P# , Qty , Date مثال :
پس اضافه کردن ستون نمي تواند
همينطوري انجام شود .يک S1 p1 100 d1
ستون اضافه گرديد و کليد کانديد S2 p1 100 d2
کامال تغيير کرد . ……
به رابطه ای که مجموعه عنوانش کلید کاندیدش باشد رابطه تمام کليد All-Keyمي گويند ( .سيستم
مطلوبي نيست زيرا حداقل Overheadايجاد Indexزياد مي شود ) .
کليد Identifierتشخيص Tupleها است و هرچه کليد طوالني تر باشد براي يافتن Tupleبايد مسير
پيچيده تري را رفت
: Primary Key
کليد کانديدي است که طراح انتخاب مي کند بنابر مالحظات محيطي (يعني يکي از کليد هاي
کانديد )
مثال :رابطه Sداراي کليدهاي کانديد #Sو SNAMEاست ،اما طراح ممکن است #Sرا به
عنوان کليد اصلي در نظر بگيرد .
آن کليد کانديدي که توسط آن Accessبيشتري به Dataانجام مي شود به عنوان کليد اصلي مطرح
مي شود که بستگی به نظر طراح دارد .
کليد اصلي :شناسه تاپل است در رابطه ،امکان آدرس دهي به تاپل در رابطه است در محيط
انتزاعي ( الزاما صرف معرفي کليد اصلي ايجاب نمي کند حتما سيستم روي کليد اصلي Indexبزند
بلکه بايد درخواست کنيد ).اگر Tuple Level Operationبخواهيد داشته باشيد حتما بايد کليد
اصلي داشته باشيد .
*کليد اصلي حتما در تعريف رابطه بايد قيد شود .يعني جزئي ا6ز شماي اصلي پايگاه است .
CREATE RELATION S
(S# DOMAIN SNUM
.
)CITY DOMAIN CITY
;#PRIMARY KEY S
در سيستمهاي رابطه اي فعلي :
CREATES TABLE S
(). . S# CHAR (6
. . . . SNAME
) . . . CITY
(کليد خارجي) :
تعريف Ai :در R2کليد خارجي است اگر در رابطه اي مثال R1کليد ا6صلي باشد .
مي توان گفت Aiدر R2کليد خارجي ا6ست اگر از يک ميدان اصلي مقدار بگيرد R1( .و R2
لزوما مجزا نيستند ) يعني کل6يد اصلي کليد خارجي هم است .
مثال :صفت خاصه #Sدر SPکليد خارجي است زیرا #Sدر Sکليد اصلی است.
مثال #P :در SPکليد خارجي است زيرا #Pدر Pکليد اصلي است .
در مدلينگ ارتباط ( N:1يک به )nدوسويه از کليد خارجي استفاده مي شود و رابطه اي براي بيان
ارتباط آن دو موجوديت طراحي مي شود که کليد اصلي اش تشکيل شده از کليدهاي اصلي دو رابطه است
.
نکته :فايده کليد خارجي چيست ؟
امکاني است براي نشان دادن ارتباط بين موجوديتها .مثل اينکه در رابطه SPاز طريق کليد خارجي #Sو
#Pارتباط دو موجوديت Sو Pرا نشان مي دهيم .و نيز امکان ارجاع به موجوديتهاست .
به عنوان مثال وجود S1در رابطه SPارجاعي است به نمونه موجوديت S1در رابطه . S
آيا تنها امکان نشان دادن ارتباط بين موجوديتها کليد خارجي است ؟
خير .در حالت کلي وجود هر صفت خاصه مشترک در مجموعه عنوان دو رابطه نشاندهنده نوعي ارتباط بين
دو نوع موجوديتي است که آن دو رابطه نمايشگر آنها هستند .
مثال :
)S(S# , SNAME , STATUS , CITY
)P(P# ,………………….., CITY
CITYدر دو را6بطه 6ن66وعيارتباط را ن66شانميدهد مثال "در ي66کش 6ه6ر ب666ودن" "در ي66کش 6ه6ر ن66بودن" و CITYدر
6يست
6يست زيرا هيچ ج6ا ک666ليد ا6صلين. 6
هيچيکاز دو را6بطه 6ک666ليد خ6ارجين. 6
براي نمايش ارتباط بين دو موجوديت :دو راه داريم :
– 1استفاده از مفهوم کليد خارجي
-2استفاده از يک صفت خاصه مشترک
کليد خارجي بيانگر يک ارتباط محوري و اساسي مي باشد اما صفت خاصه مشترک چنين نيست .
مثال :
)S(S#,SNAME, . . . ,CITY
)P(P#,……………..,CITY
)J(J#,JNAME,CITY
)SPJ(S#,P#,J#, . . . ,CITY
CITYب666يانگر ن66وعيارتباط ا6ستولي #Jو #Pو #Sب666يانگر ي66کارتباط محوريو ا6ساسيميب666اشد .
قواعد جامع6یت INTEGRITY RULES
مجموعه قواعدی که به کمک آ6نها سیستم صحت و دقت داده های ذخیره شده در پایگاه و نیز
ارتباطات بین انواع موجودیتها را کنترل می کند Tuple (.هم موجودیتها را نشان می دهد و
هم ارتباطات بین آنها را (دید جدولی) )
-1کاربری (خاص) :تعریف شده توسط کاربر (منظور شخص )DBAاست .کاربران قواعد جامعیت
خارجی باید درخواست خود را به DBAبدهند)UDR=User Defined Rules(.
-2عام (متا قاعده : )Meta-Ruleمستقل از Dataهای خاص مطرحند ،
Independentاز Dataهای محیط خاص
میدانی :قاعده ای است ناظر به مقادیر یک میدان قواعد جامعیت کاربری (خاص)
ستونی :عالوه بر قواعد میدانی که بر روی مجموعه مقادیر
است ، میدان است ،قواعد جامعیت ستونی اخص از محدودیت میدانی
محدودیتی قایل یعنی برای صفات خاصه بخصوصی در رابطه بخصوصی
بشویم
مثال میدانی :شماره تهیه کنندگان حتما به این صورت است :
R1 = sdddd
R2 = 1111<dddd<8888
}R3 = City In { C1,C2,C3,C4,C5
ستونی :عالوه بر قواعد میدانی که بر روی مجموعه مقادیر میدان ناظر است ،قواعد جامعیت ستونی اخص از
محدودیت میدانی است ،یعنی برای صفات خاصه بخصوصی در رابطه بخصوصی محدودیتی قایل بشویم .
مثال :
R4 = 0< QTY < 100
تهیه=کنندگان ساکن C1و C2که قطعات P1و P2را تهیه می کنند نمی تواند بیشتر از 50باشد
QTYبرایR5
(*) یک DBMSواقعی باید امکان بدهد تا DBAانواع قواعد جامعیت را بیان و ایجاد کند و سیستم باید این
قواعد را پیاده و عمل کند .
(*) شمای ادراکی فقط از تعریف رابطه تشکیل نمی شود بلکه قواعد جامعیت مربوط به آن رابطه جزیی از شمای
ادراکی است .
(*) بخش عمده Overheadعملیات DBMSمربوط به این قواعد جامعیت است .
قواعد جامعیت عام : C1قاعده جامعیت موجودیتی Entity Integrity Ruleناظر به کلید اصلی است .
:قاعده جامعیت ارجاعی Refrential Integrity Ruleناظر به کلید C2
خارجی است
نکته :کلید خارجی هم مثل کل6ید اصلی باید در تعریف رابطه آورده شود
( هیچ مقدار قاعده : C1می گوید :هیچ جز تشکیل دهنده کلید اصلی نمی تواند Nullباشد
Null Valueداشته باشد)
-Null Value :مقدار ن66اشناخته : Unknown : 6مثال STATUSت666هیه 6ک666ننده 6ا6یمشخص 1
ن66باشد .
-2مقدار غیر قابل اعمال Inapplicable :مثال شماره شناسنامه همسر
برای شخص مجرد غیر قابل اعمال است
Null Valueب666ا ص66فر یا Blankف666رقمیک666ند زیرا آ6نه6ا مقدارند .هر چند س66یستم 6ب666اید ا6مکانیب666را6ی
ب666ازنمایی Null-Valueدا6شته 6ب666اشد ( .درک6تابه6ا Null-Valueرا ب666ا ؟ ن66مایشمیدهند )
* باید به عنوان یک مقدار ،یک مجموعه عملیاتی مشخص ناظر بر آن وجود داشته باشد ( محاسباتی منطقی
مقایسه ای )
<
>
≤
≥
منطق دو ارزشی برای عملیات منطقی Nullپذیر کفایت نمی کند Codd .منطق سه ارزشی را
بیان می کند
نظر : Dateمفهوم Nullمخرب مدل رابطه است .بلکه مفهوم دیگری به نام
Missing Informationباید مطرح شود که ساده تر است .
پس Null ، Overheadو گرفتاریها ی خود را دارد.
دلیل قاعده : C1زیرا کلید اصلی شناسه Tupleاست .شناسه یک نمونه مشخص از یک نمونه موجودیت به
معنای عام و متمایز از هر نمونه دیگر ،و کلید اصلی عامل تمیز یک نمونه با نمونه دیگر است و عامل تمیز
خود نمی تواند ناشناخته باشد.
باید در تعریف رابطه Null-Value ،پذیری یا ناپذیری صفت خاصه را بیان کرد ( DBMSباید این امکان
را بدهد)
Create Table s
(), S# char(6
, Sname char(20) NOT NULL
…. یعنی در طول حیات این رابطه Snameنمی تواند
; #City Char (12) ) PRIMARY KEY S Nullباشد و Snameباید مقدار مشخصی داشته
باشد.
قواعد جامعیت :
قواعد خاص :تعریف شده توسط کاربر
:قاعده جامعیت موجودیتی قواعد عام C1 :
:ق66اعده 6ج6امعیتارجاعی :ن66اظر ب666ه 6ک666لید خ6ارجی C2
:c2ا6گر Aiدر R2ک666لید خ6ارجیب666اشد (یعنی Aiدر را6بطه R1 6ک666لید ا6صلیا6ست)
-R2.Ai :میت666وا6ند nullب666اشد ا6گر ج6زء ت666شکیلدهنده 6ک666لید ا6صلیدر R2ن66باشد 1
در غیر اینصورت ( یعنی در صورتیکه nullنباشد )
-2باید حتما مقداری داشته باشد که در R1وجود دارد.
)R1 S(S#............ , City R2 Sp S# P# QTY
S1 P1 مثال :
S1 S1 P1
S2
S3 S1 P2
S2 P1
R2 R1
رابطه مرجع Referenced
نمودار ارجاع یا گراف ارجاع (از طریق مقدار کلید رابطه رجوع کننده Referencing
خارجی)
این رابطه بر طبق بحث قبل6ی چون !R1و R2برابرند .بنابراین آنرا Self Referencing
گوییم.
EMP
R1 R2 ....... Rn-1 شکل کلی یک مسیر ا6رجاع Rn :
کلید خارجی
) DEPT( DEPT#, DEPT PHONE,……. , DEPTMGR# , …….
#Dept
EMP DEPT
تمرین :دو مثال قید کنید که در آن حلقه ارجاع با n=2و دو مثال دیگر n=3وجود داشته
باشد.
سئوال :دو قاعده c1و c2چگونه باید به DBMSداده شود و چگونه رعایت شوند؟
نکته :قواعد C1و C2باید به نحوی به DBMSداده شوند.
نکته :باید توسط DBMSرعایت شوند.
قاعده C1از طریق معرفی کلید اصلی در تعریف را6بطه و نیز استفاده از گزینه NOT
Null
CREATE RELATION S
( ,S# ……………… NOT NULL
… بدین طریق C1تعریف و رعایت می گردد
…..
…….
)) City CHAR (12
; #PRIMARY KEY S
برای معرفی قاعده :c2در تعریف رابطه کلید خارجی( در صورت وجود ) باید مشخص شود.
CREATE TABLE SP
, S# …………. NOT NULL (
,P# …………. NOT NULL
) QTY …………. Integer
PRIMARY KEY (S# , p#)
FOREIGEN KEY S# reference S ( referenced Table : S )(s#)
DELETE CASCADE
FOREIGN KEY P# REFERENCE P(p#)
;DELETE CASCADE
Oracle : درsp د جدول6ايجا
CREATE TABLE SP
, snum character(3)(
, pnum character(3)
, qty integer
,CONSTRAINT pk_snumpnum PRIMARY KEY (snum,pnum)
CONSTRAINT fk_snum
FOREIGN KEY (snum)
REFERENCES s(snum)
, ON DELETE CASCADE
CONSTRAINT fk_pnum
FOREIGN KEY (pnum)
REFERENCES p(pnum)
درج یک تاپل
مثال :فرض می کنیم در رابطه Sموجودیت S3را داریم :
DELETE FROM S
; ’WHERE S#=‘S3
آیا باید اجرا شود ؟ اگر بله با تاپلهای Referencingچه باید کرد ؟؟ و اگر نه ...
سه مکانیسم برای رعایت قاعده : C2
در عمل ( Deleteبه عنوان مثال) :
-1روش : Cascadeانتشار عملیات به رابطه Referencingوقتی که عمل در رابطه
Referenced
انجام شود .مثال :با حذف تاپلهای S3از ، Sتمام تاپلهای رجوع کننده به S3
در رابطه های دیگر نیز باید حذف گردد.
; ’DELETE FROM S WHERE S#=‘S3 -1
;’DELETE FROM SP WHERE S#=‘S3 -2
این روش نوعی Propagating Updateاست .این روش در بعضی از سیستمهای
موجود وجود دارد.
انجام عمل بطور مشروط -2روش : Restricted
در این روش تاپل مرجع ( )Referencedحذف نمی شود و بعبارتی دیگر تا
زمانیکه تاپل مرجع تاپل رجوع کننده ای دارد ،عمل حذف انجام نمی شود .
-3روش هیچمقدارگذاری ( )Nullifying :
در این روش با حذف تاپل مرجع مقدار کلید خارجی در تاپل رجوع کننده Nullمی شود و زمانی
امکانپذیر است که کلید خارجی جزء کلید اصلی نباشد .
متداولترین روش :روش اول است .
نکته :در سیستمهای پیش رابطه ای قواعد جایمعیت نظیر C1و C2وجود دا6رد و بویژه قاعده C2در
DSذاتی این سیستها وجود دارد .یعنی ایده روش Cascadeدر سیستمهای پیش رابطه ا6ی (مثال در
سلسله مراتبی با حذف نمونه پدر ،نمونه فرزند نیز حذف می شود یا مثال شبکه ای با حذف نمونه مالک
و ) ...چیز جدیدی نیست و نیاز به تصریح ندارد
ولی در سیستمهای رابطه ای باید تصریح شود زیرا رابطه ها حسب ظاهر منفک از یکدیگرند و ارتباط
بین رابطه ها علیرغم مجزا بودن دو رابطه به یکی از روشهای زیر انجام می گیرد.
از طریق مکانیسم ارجاع
یا
از طریق صفت خاصه مشترک که در Headingدو رابطه در سیستم رابطه ای باید تصریح
شود
امکانات جبر رابطه ای و محاسبات رابطه ای تقریبا بطور کامل در حکم SELECTاستفاده می
شود
SELECT [DISTINCT] items
)FROM table(s شکل کلی SELECT
[)]WHERE condition(s
[]ORDER BY برای خروجیهای Sortedاست.
[]GROUP BY Optionا6یجاد ن66ظم 6در خ6روجیه6ا می
[] HAVING ب666اشد
مثال :مشخصات تهیه کنندگان ساکن شهر C2را 6بدهید ؟
وقتی تمام ستونهای جدول را 6بخواهید نیازی به ذکر نام صفات خاصه نیست ،بلکه یک * بجای آنها
کافی است .
* SELECTت666مامیمشخصاترا میآورد و مخصوصا در مواردیک666ه 6ت666ع6داد ص 6ف6اتخ6اصه 6زیاد
6ست
ا6ستمفید ا .
SELECT SQLوقتیس66طر ک666املا6ستخرا6ج میک666نیم 6ش66بیه 6س66ازی SELECTجبریا6ستک666ه6
ت666اپله6اییاز ج6دوله6ا ب666ه 6ما میدهد * SELECT .را ا6گر ش66رط ب666دهیم 6و یا ت666دهیم6
ب666ازهم SELECT6جبریخ6وا6هد ب666ود.
SELECT S#, City
: مثال
; FROM S
S# CITY
S1 C2
S2 C3
S3 C3
S4 C2
S5 C1
ادامه ٍSELECT
• بازیابی با جدول جواب منظم
ت6نه6ا را ب666دهید .ج6دولج6وا6بب666ه 6ن66ظم 6ص66ع6ودی
: Qش66ماره 6ت666هیه 6ک666نندگانو وضعی آ
مق6ادیر statusمرتبش66ده 6ب666اشد.
SELECT S# ,Status
FROM S
ORDER BY Status
ORDER BY 2 DESC
6یست
ASCENDINGص66ع6ودی defaultا6ستو ا6حتیاج ب666ه 6ذکر ن. 6
ASCENDINGن66یاز ب666ه 6ت666صریح ن66دارد.
•بازیابی مقدار محاسبه شده *
ً :Qشماره هر قطعه و وزن آنرا به گرم بدهید .فرض کنید DBAوزن را به واحد
کیلو گرم ذخیره نموده .
#P
جدول جواب صورتی چنین دارد:
WEIGHT IN GRAMS 12000 P1
این دو ستون بی نامند.
WEIGHT IN GRAMS 17000P2
برای اینکه جدولی با ستونهای نامدار
WEIGHT IN GRAMS 17000 P3
داشت
WEIGHT IN GRAMS 14000 P4
این جدول جواب را می توان با حکم
p5 WEIGHT IN GRAMS 12000 INSERTدر جدولی مناسب با
p6 WEIGHT IN GRAMS 19000 ستونهای نامدار وارد کرد.
پیاده سازی اپراتور :joinبازیابی از چند جدول
6ست
Join Syntaxص66را6حتا در DB2/SQLوجود ن66دارد .ا6ما در SQL92پ666یشب666ینیش66ده 6ا .
:Queryمشخصاتق66طع6اتو ت666هیه 6ک666نندگاناز یکش 6ه6ررا ب666دهید ( .ب666حثک666لید خ6ارجیب666حثیدا6شتیم6
6ست
ک666ه 6آ6یا ارتباط ت666نه6ا ت666وسط ک666لید خ6ارجیا ؟
گفتیم که نه هر عضو مشترک می تواند بیانگر ارتباط باشد ( .مثال CITY :در (P , S
S1 C2 P6 C2
S2 C3 P1 C2
S2 C3 P2 C3
S2 C3 P6 C2
S5 C1 P1 C2
S5 C1 P2 C3
توجه DISTINCT OPTION , SQL :به شما داده یعنی من به تو جواب Queryرا می دهم
اگر تو می خواهی تاپلها یکتایی داشته باشد از کلمه DISTINCTاستفاده کن
نکته :حاصل اجرای جبر رابطه ای و یا محاسبات رابطه ای همیشه رابطند .اما حاصل Select SQL
لزوما همیشه یک جدول نیست .
•می توان یک جدول را با خودش Joinکرد
• مثال : Query :شماره جفت تهیه کنندگان همشهر را بدهید
S S# Sname Status City
#S# S
S1 . . C2
S2 . . C3 S1 S4 جدول جواب
S3 . . C3 S2 S3
برای پاسخگویی به این قبیل Queryها باید Sرا 6با خود در SQL ، Joinکرد
#SELECT FIRST.S# , SECOND.S
FROM S FIRST , S SECOND
WHERE FIRST.CITY = SECOND.CITY
از یک تکنیک دگر نامی استفاده شده است Sرا به نام Firstو به نام Secondنامیده ایم .
بعد از FROMهرگاه نام یک رابطه بیابید و بعد ا6ز حدا6قل یک ، Blankیک نام بیاید ،سیستم آن
نام را ،نام دیگر برای آن رابطه در نظر می گیرد.
حاصل : SELECT
#S# S
S1 S1
S1 S4 سیستم چه می کند ؟
S2 S2 2تا CURSORمی گیرد و دومی را MOVEمی دهد
بدیهات
S2 S3 برای حذف بدیهات و تکرا6ریها شرط زیر را اضافه کنید :
تکرار
ی S3 S2 #AND FIRST.S# < SECOND.S
S3 S3
S4 S1
S4 S4
در نتیجه خواهیم داشت
در حاشیه :قدرت : Selectاپراتورهای Projectو Joinو Selectجبر رابطه ای را تواما ارایه
می دهد.
برای پاسخگویی به سواالتی از قبیل چه تعداد قطعه داریم ؟ ماکزیمم Quantityچقدر است ؟
خود Selectقادر به پلسخگویی نیست .توابعی پیش بینی شده است که در متن Selectبکار می روند .
(مستقال نمی توانید آنها را به کار ببرید)
این توابع عبارتند از :
:Queryشماره قطعاتی را 6بدهید که توسط بیش از یک تهیه کننده تهیه شده باشد.
مثال :شماره تهيه کنندگاني را بدهيد که دو نوع قطعه تهيه کرده اند
#select s
from sp
#group by s
having count(*)=2
شماره هر تهيه کننده و تعداد انواع قطعاتي که تهيه کرده را در مورد تهيه کنندگاني که بيش از يک
قطعه تهيه کرده اند ،بدهيد
در مورد قطعاتي که توسط سه تهيه کننده تهيه شده اند شماره قطعه و تعداد کل تهیه شده از قطعه
را بدهید
با فرض داشتن جدول COMPUTERSکه ستونهای آن عبارتند از نام دفتر ،شماره اتاق ،شماره
کامپیوتر ،نوع ، CPUمقدار ، RAMحجم HARD DISKو ، ...گزارشی تهیه کنید که
ستونهای آن نام دفتر ،شماره اتاق و تعداد کامپیوترهای موجود در اتاق باشد .
نکته ای که به این راه حل وارد است این ا6ست که فرمالیسم طبیعی در نوشتن … Sname
FROM SPاز بین رفته است .چون Snameدر SPنیست .یعنی طبیعی این است که
بنویسیم :
SELECT Sname
FROM S
شرایط WHERE
. بوجود آمده استSUBQUERY از این رو امکانی به نام
ین6ا ا666 را دارد بSELECT – FROM – WHERE اختار66 همانسSUBQUERY
.ود66 میش6وشته66 دیگر نSELECT در درونیک6ه666فاوتک666ت
SELECT Sname
FROM S
#WHERE S# IN ( SELECT S
سیستم از درونی ترین SELECTشروع میکند.
FROM SP
#WHERE P# IN ( SELECT P
FROM P
‘ WHERE P.COLOR = ‘BLUE
) (;
تمرین :با JOINهمین را بنویسید
JOIN با استفاده از
SELECT S.SNAME
FROM S , SP , P
WHERE S.S# = SP.S# AND
SP.P# = P.P# AND
’P.COLOR = ‘BLUE
نکته :می توان بجای اپراتور INیا = ANYدر شرایط خاصی از همان اپراتورهای متعارف مقایسه ای
استفاده کرد.
SELECT COL1
FROM table
..… WHERE COL2 = ( SELECT
>
<
مثال :شماره تهیه کنندگان هم شهر با ‘ ’S1را بنویسید .
#SELECT S
تمرین :همین Qرا با JOINبنویسید .
FROM S
WHERE CITY = ( SELECT CITY
FROM S
) ‘WHERE S# = ‘ S1
* شرط :وقتی که پاسخ SELECTدرونی یک مقدا6ر باشد یا بعبارت دیگر مجموعه جواب SELECT
درونی تک عضوی باشد .بنابراین
SELECT S# FROM S
‘ WHERE CITY = ‘ C2
مثال :شماره تهیه کنندگانی را بدهید که وضعیت آنها ماکزیمم نباشد.
#SELECT S
FROM S
) WHERE STATUS < ( SELECT MAX ( STATUS
; ) FROM S
نکات :
-1نکته اول همان نکته قبل است.
-2استفاده از توا6بع جمعی در SUBQUERYها مجاز است.
راه حل دیگر در بعضی نسخه ها ی ( SQLکه Anyدارند)
#SELECT S
FROM S
)WHERE STATUS < ANY (SELECT STATUS FROM S
جواب این قسمت خود یک ستون STATUSاست .
پس :
#SELECT S
FROM S
}WHERE STATUS < ANY {20,10,30
اگر وضعیت از یکی از اینها کمتر باشد جواب است ( زیرا دیگر ماکزیمیم نیست )
تمرین :این دو راه حل را با هم مقایسه کنید ( از نظر کارایی)(تعداد مقایسه ها)
در راه اول الزاما Maxباید یافت شود ولی در دومی خیر .
(یک عبارت بر حسب تاپلهای ستون Sبدست می آید ).
امکانات دیگر :
اپراتور Like
بازیابی از جدول دارای هیچ مقدار
اپراتور UNION
: Qش66ماره 6ق66طع6اتیرا ب666دهید ک666ه 6ا6سم 6آ6نه6ا ب666ا ک666ارا6ک6تر Cش66روع ش66ده 6ب666اشد .
’%WHERE PNAME LIKE ‘%CABیعنی این Stringوجود داشته باشد مهم نیست کجا
‘ ’--CABیعنی 5حرف باشد و 3حرف اولش CABباشد .
)RIGHT((LEFT(ST#, 4), 1 توابع SUBSTR , INSTR
: Qف666رض :وضعیت S5 ، NULLمیب666اشد .
#SELECT S
S# Snam Status CITY
FROM S
e
; WHERE STATUS > 13
S1 10
S# جدول 6جواب S2 15
S2 S3 13
SQL ، NULLرا ب666ه 6عنوا6نیکعملوند S4 نشان دهنده 8 NULL
مقایسه 6در عملمربوط دخا66لتن66میدهد .مانند ا6ین
6ست ا6ما ا6گر
ا6ستک666ه 6مقایسه 6ص66ورتن66گرفته 6ا . S5 ?
ب666نویسیم: 6
#SELECT S S#
FROM S
WHERE STATUS IS NULL جدول 6جواب S2
پس می تواند NULLرا بازشناسد و بنابراین تا حدی به NULLتوجه شده است . S5
اپراتور UNIONبا همین Syntaxوجود دارد و همچنین UNION ALL
مثال : Q :شماره قطعاتی را بدهید که یا توسط S3تهیه شده باشد و یا وزن آنها کمتر از 15گرم باشد .
#SELECT P
UNIONف666قط رویرا6بطه 6هاییمیت666وا6ند عملک666ند ک666هType- 6
FROM SP
Compatibleب666اشند .
’WHERE S# = ‘S3
: Type-Compatibleدو را6بطه 6را گ666ویند هرگاه heading 6هایشانیکسان
UNION
ب666اشد .
#SELECT P
مجموعه جواب فاقد تکراری است .زیرا UNIONاپراتور جبر رابطه ای
ممکن است Userنخواهد تکراری ها حذف شود .در این صورت از FROM P
است .
WHEREکنیم .
WEIGHTاستفاده می
UNION ALL <15
* SQLتمام اپراتورهای جبر رابطه ای را یا بصورت صریح دارد یا می تواند شبیه سازی کند .
R1 INTERSECT R2
را در SQLبنویسید . R1 MINUS R2 تمرین :
R1 PRODUCT R2
SQLا6مکاناتمحاسباترا6بطه 6ا6یرا هم 6دارد .مشخصا ا6پرا6تور EXISTSو NOTEXISTSرا.
حل مثال قبل با استفاده از :SUBQUERYشماره قطعاتی را بدهید که یا توسط S3تهیه شده باشد و یا وزن آنها کمتر
از 15گرم باشد
SELECT PNUM
FROM P
WHERE P.WEIGHT < 15
OR P.PNUM IN ( SELECT PNUM
FROM SP
)’WHERE SNUM = ‘S3
بازیابی به کمک : EXISTS : Qاسامی تهیه کنندگان قطعه P2را بدهید ( .تاکنون به سه روش این Qرا
زدیم ) از ا6ین جا نتیجه می گیریم که یک Queryدر SQLبه گونه های مختلف (چندین گونه) تنظیم
( )formulateمی شود که منطقا نوعی افزونگی در روش می باشد Date .این را یک ایراد مطرح کرده
است (اما از دید برنامه نویسان یک نکته مثبت است ).
SELECT SNAME FROM S
WHERE EXISTS (SELECT * FROM SP
()’WHERE SP.S#=S.S# AND SP.P#=‘P2 )1
نکته :وقتی در یک Queryدرونی به صفت خاصه ای بیرون از آن پرس و جو ارجاع می دهیم ،
Qualifierباید قید شود .اما اگر صفت خاصه مربوط به همان Qدرونی باشد ،ا6لزامی نیست .
نکته Clause :شماره ( )1ظاهرا شبیه به Clauseای است که در joinمی نویسیم .سیستم در EXISTS
عمل پیوند انجام نمی دهد .شاید بتوان گفت که از این لحاظ EXISTSاز joinکاراتر ا6ست زیرا ضرب
کارتزین انجام نمی دهد .
نحوه اجرا :به ا6زای هر سطر از رابطه Sسیستم بررسی می کند آیا وجود دارد سطری در SPکه #Sآن
همان سطر از Sو #Pآن برابر P2؟ پس وجود را چک می کند (( )EXISTANCIALاگر وجود داشته
باشد یعنی عبارت محاسباتی Trueباشد ) SNAMEآن #Sجواب است .
. را تهیه نکرده اندP2 اسامی تهیه کنندگانی را بدهید که قطعه: مثال
SELECT SNAME
FROM S
WHERE SNUM NOT IN ( SELECT SNUM
FROM SP
)’WHERE PNUM = ‘P2
توجه کنید که queryذیل پاسخ صحیح نمی باشد .
SELECT SNAME
FROM S,SP
WHERE S.SNUM = SP.SNUM
’AND SP.PNUM != ‘P2
در واقع اسامی تهیه کنندگانی را می دهد که حد اقل یک قطعه بجز P2تهیه کرده اند .
لذا ممکن است تهیه کنندگان P2را نیز شامل باشد و پاسخ سوال مورد نظر نمی باشد.
SELECT SNAME
FROM S
WHERE NOT EXISTS
* SELECT(
FROM P
WHERE NOT EXISTS
* SELECT(
FROM SP
))#WHERE SP.P#=P.P# AND S.S#=SP.S
SELECT SNAME
FROM S
WHERE FORALL PX € P
#EXISTS SPX € SP ( S.S# = SPX.S
) #AND SPX.P# = PX.P
SELECT SNAME
FROM S
WHERE NOT EXISTS PX € P
#NOT EXISTS SPX € SP ( S.S# = SPX.S
) #AND SPX.P# = PX.P
( نام تهیه کنندگانی که همه قطعات را تهیه کرده اندSUBQUERY ) ز6روش دوم با استفاده ا
select sname
from s
#where s# in ( select s
from sp
#group by s
)*(having count(*) = (select count
))from p
. نام تهيه كنندگاني را بدهيد كه حداقل يك قطعه را تهيه كرده اند
SELECT SNAME
FROM S
WHERE EXISTS
* SELECT(
FROM SP
)#WHERE S.S#=SP.S
نام تهیه کنندگانی را بدهید که حداقل یک قطعه را تهیه نکرده اند
SELECT SNAME
FROM S
WHERE EXISTS
* SELECT(
FROM P
WHERE NOT EXISTS
* SELECT(
FROM SP
))#WHERE SP.P#=P.P# AND S.S#=SP.S
. نام تهیه کنندگانی را بدهید که هیچ قطعه ای را تهیه نکرده اند
SELECT SNAME
FROM S
WHERE NOT EXISTS
* SELECT (
FROM SP
)#WHERE S.S#=SP.S
SELECT SNAME
FROM S
#WHERE S# NOT IN (SELECT S
)FROM SP
: INSERT اپراتور
INSERT
INTO tablename [cal1 , cal2 , . . .]
>اقص66املیا ن666طر ک66 <سVALUES
: مثال
INSERT INTO P
VALUES(‘P7’,’Pn7’,’RED’,10,’C2’)
INSERT INTO P
VALUES( ‘P7’ , , ,10 , ’C2’ )
مقدارP درColor وPname سطر ناقص به شرطی قابل قبول است که برای
. ذکر نکرده باشیدNotNULL
INSERT INTO P(PNUM,WEIGHT,CITY) : وارد کردن سطر ناقص
VALUES('P7', 10 , 'C1')
INSERT
INTO TEMP
SELECT P#,SUM(QTY)
FROM SP
;#GROUP BY P
: روش دوم
SELECT P#,SUM(QTY)
را ایجاد می کندtemp این دستور خودش جدول
INTO TEMP
FROM SP
;#GROUP BY P
AS SELECT P#,SUM(QTY)
FROM SP
;#GROUP BY P
: UPDATE دستور
UPDATE tablename
”Literal“ ” یاSET calname = “expression
. . . WHERE
: مثال
UPDATE SP
SET QTY = 0
)Tuple( به هنگام سازی تک سطر
’WHERE S# = S2 AND P# = ‘P2
UPDATE S
به هنگام سازی چند تاپل
SET STATUS = STATUS *2
’WHERE CITY = ‘C3
به هنگام سازی بیش از یک جدول :شماره تهیه کننده S1را به S11تغییر دهید .
UPDATE S
’SET S#=‘S11
;’WHERE S#=‘S1
این UPDATEباید PROPAGATEشود توسط Cascadeبخاطر رعایت قاعده . C2
UPDATE SP
’SET S#=‘S11
این عمل ،توسط Cascadeبخاطر رعایت قاعده
; ’WHERE S#=‘S1
C2انجام شده است
). داریدsub query (احتیاج به. اضافه کنیدC3 تهیه کنندگان ساکنQTY واحد به10 : مثال
UPDATE SP
SET QTY= QTY + 10
WHERE SNUM IN ( SELECT SNUM
FROM S
)'WHERE CITY = 'C3
UPDATE SP
SET QTY = QTY + 10
WHERE ‘C3’ = (SELECT CITY
FROM S
; )#WHERE S.S# = SP.S
UPDATE P
,’SET COLOR = ‘YELLOW
,WEIGHT = WEIGHT +5
CITY = NULL
; ’WHERE P# = ‘P2
دستور DELETE
حذف چند سطر :محموله های با QTYکوچکتر از 20را حذف کنید .
DELETE FROM SP
WHERE QTY < 300
مثال :تهیه کننده S2را حذف کنید .
DELETE FROM S
;’WHERE S#=‘S2
بخاطر رعایت قاعده C2باید این حکم نیز اجرا شود :
بطور اتوماتیک سیستم اعمال می کند .
DELETE FROM SP
;’WHERE S#=‘S2
DELETE FROM SP
WHERE SNUM IN (SELECT SNUM
FROM S
)’WHERE CITY= ‘C3
DELETE FROM SP
WHERE ‘C3’ =( SELECT CITY
FROM S
) WHERE SP.SNUM= S.SNUM
Oracle : درsp د جدول6ايجا
create table sp
, snum character(3)(
, pnum character(3)
, qty integer
,CONSTRAINT pk_snumpnum PRIMARY KEY (snum,pnum)
CONSTRAINT fk_snum
FOREIGN KEY (snum)
REFERENCES s(snum)
, ON DELETE CASCADE
CONSTRAINT fk_pnum
FOREIGN KEY (pnum)
REFERENCES p(pnum)