You are on page 1of 83

Database

‫پ ايگاه داده ها‬


‫قسمت سوم‬

HTTP://WWW.PIRNIA.NET SHAHRIAR PIRNIA


‫مفهوم رابطه نرمال ‪:‬‬
‫رابطه اي است که در آن تمام مقادير تمام صفات خاصه اتوميک باشد ‪.‬‬
‫مثال ‪ :‬رابطه ‪ BEFORE‬يک رابطه از درجه ‪ 2‬است ‪ .‬ميدان ‪ PQTY‬يک ميدان مرکب است که‬
‫از دو ميدان ‪ #P‬و ‪ QTY‬تشکيل شده است ‪.‬‬
‫يکي از ميدانها ‪ ،‬مقاديرش رابطه است ‪.‬‬
‫از لحاظ رياضي اين يک ‪ Nested Relation‬است ‪ .‬گاهي به آن (‪)Not Normal Relation‬‬
‫ميگويند ‪.‬‬
‫‪ Codd‬ميگويد را‪6‬بطه‪ 6‬ها در مدلرا‪6‬بطه‪ 6‬ا‪6‬يت‪666‬ع‪6‬ريفش‪66‬ده‪ 6‬ت‪666‬وسط ا‪6‬يشانب‪666‬ايد ن‪66‬رما‪66‬لب‪666‬اشند ‪.‬‬
‫‪S#‬‬
‫‪PQTY‬‬ ‫‪Qty‬‬
‫‪P#‬‬
‫‪S1‬‬ ‫‪P1‬‬ ‫‪100‬‬
‫‪P2‬‬ ‫‪200‬‬
‫یک تاپل‬ ‫‪p3‬‬ ‫‪60‬‬

‫‪S2‬‬ ‫‪P1‬‬ ‫‪80‬‬

‫‪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‬کليد اصلي است ‪.‬‬

‫نکات ‪ :‬در تعریف کلید خارجی ‪ R1‬و ‪ R2‬لزوما مجزا نیستند‬


‫کارمند‬ ‫مثال‪: 6‬‬
‫)‪EMP ( EMP# , EMPNAME ,…. , EMPMGR#‬‬
‫‪E1 ,‬‬ ‫…… ‪En1 ,‬‬ ‫‪, E13‬‬
‫‪E2 ,‬‬ ‫…… ‪En2 ,‬‬ ‫‪, E27‬‬ ‫مدیر است یا تحت‬ ‫کارمند‬
‫مدیریت مدیر است‬
‫‪E3 ,‬‬ ‫‪En3 , …..‬‬ ‫‪, E13‬‬
‫‪6‬ست‬
‫‪ #EMP‬ک‪666‬ليد ا‪6‬صليا‪6‬ست‪ EMGR #.‬در همينرا‪6‬بطه‪ 6‬ک‪666‬ليد خ‪6‬ارجيا ‪.‬‬
‫نکته ‪ :‬يک رابطه ‪ N:1‬يکسويه توسط کليد خارجي پياده سازي مي شود ‪.‬‬
‫نکته ‪ :‬لزومي ندارد کليد خارجي يک رابطه جزئي از کليد اصلي رابطه باشد ‪ .‬هرچند در ‪ SP‬چنين‬
‫است ‪.‬‬
‫)‪SP ( S# , P# , Qty‬‬
‫کليد اصل‪6‬ي‬
‫کلید خارجی‬ ‫کلید خارجی‬

‫در مدلينگ ارتباط ‪( 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‬‬ ‫به عنوان مثال در مقایسه دو ‪ null value‬جه می توان گفت ؟‬


‫‪< = > ) Null‬‬
‫لحظه به لحظه ‪ Database‬باید صحیح باشد ‪.‬‬
‫‪Null = Null‬‬

‫<‬
‫>‬
‫≤‬
‫≥‬
‫منطق دو ارزشی برای عملیات منطقی ‪ 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‬‬

‫در ‪ S‬وجود ندارد ‪( .‬مقدار ‪)Unmatchable‬‬ ‫‪S3‬‬ ‫‪P2‬‬


‫‪S3‬‬ ‫‪P1‬‬
‫‪S4‬‬ ‫‪P1‬‬
‫* ‪ R2‬به ‪ R1‬ارجاع دارد یا رجوع می کند‪.‬‬

‫‪R2‬‬ ‫‪R1‬‬
‫رابطه مرجع ‪Referenced‬‬
‫نمودار ارجاع یا گراف ارجاع (از طریق مقدار کلید‬ ‫رابطه رجوع کننده ‪Referencing‬‬
‫خارجی)‬

‫‪P‬‬ ‫‪Sp‬‬ ‫‪S‬‬ ‫مثال ‪:‬‬

‫مثال دیگر‪EMP( EMP#, EMP name, ….., EMP MGR#.....) :‬‬

‫کلید اصلی‬ ‫کلید خارجی‬

‫این رابطه بر طبق بحث قبل‪6‬ی چون ‪ !R1‬و ‪ R2‬برابرند‪ .‬بنابراین آنرا ‪Self Referencing‬‬
‫گوییم‪.‬‬
‫‪EMP‬‬

‫‪R1‬‬ ‫‪R2 .......‬‬ ‫‪Rn-1‬‬ ‫شکل کلی یک مسیر ا‪6‬رجاع ‪Rn :‬‬

‫‪Rn‬‬ ‫‪Rn-1‬‬ ‫‪Ri‬‬ ‫‪…..‬‬ ‫‪R1‬‬

‫حلقه ارجاع با ‪ n‬رابطه‬


‫مثال دیگر‪:‬‬
‫)‪EMP( E#,Ename, …….. , DEPT# ……….‬‬

‫کلید خارجی‬
‫) ‪DEPT( DEPT#, DEPT PHONE,……. , DEPTMGR# , …….‬‬

‫شماره کارمند کلید خارجی‬


‫‪#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) 

)ON DELETE CASCADE 


‫چگونه قاعده ‪ C2‬را رعایت کنیم ‪:‬‬
‫سه مکانیسم برای رعایت ‪ C2‬متصور است ‪:‬‬
‫نکته ‪ :‬قاعده ‪ C2‬باید در جمیع عملیات روی پایگاه رعایت شود ‪.‬‬
‫مثال ‪ :‬فرض می کنیم در رابطه ‪ S‬تهیه کننده ‘‪ ’S7‬وجود ندارد ‪.‬‬
‫‪INSERT INTO SP‬‬
‫قاعده ‪ C2‬می گوید این عمل باید ‪ Reject‬شود‬
‫)‪; VALUES (S7,P1,60‬‬

‫درج یک تاپل‬
‫مثال ‪ :‬فرض می کنیم در رابطه ‪ 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‬دو رابطه در سیستم رابطه ای باید تصریح‬
‫شود‬

‫وعمل ‪ Cascade‬در سیستم رابطه ای باید تصریح شود‪.‬‬


‫نظر ‪ : Date‬بهتر است ‪ DBMS‬قبل از انجام عمل ‪ Warning‬دهد و بعد از کاربر سوال کند‬
‫تمرین ‪ :‬امکانات ‪ DDL‬را در ‪ SQL92‬مطالعه کنید‬
‫( مخصوصا روی احکام ‪) CREATE DOMIAN , DROP DOMAIN , ALTER DOMAIN‬‬
‫سطح ادراکی ‪ DB2/:SQL:DML‬چهار تا حکم دارد ‪.‬‬

‫حکم واحد ‪SELECT‬‬ ‫بازیابی ‪:‬‬ ‫احکام‬

‫‪Syntax‬‬ ‫ذخیره سازی ‪ :‬احکام با ) ‪(INSERT ,DELETE , UPDATE‬‬

‫امکانات جبر رابطه ای و محاسبات رابطه ای تقریبا بطور کامل در حکم ‪ 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‬بدهید ؟‬

‫‪SELECT S# , Sname , Status , City‬‬


‫‪FROM S‬‬ ‫‪S#‬‬ ‫‪SNAME‬‬ ‫‪STATUS‬‬ ‫‪CITY‬‬

‫‪; ’WHERE City =‘c2‬‬ ‫‪S1‬‬ ‫‪Sn1‬‬ ‫‪20‬‬ ‫‪C2‬‬


‫‪S4‬‬ ‫‪Sn4‬‬ ‫‪20‬‬ ‫‪C2‬‬

‫وقتی تمام ستونهای جدول را‪ 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 Status DESC‬‬

‫ش‪66‬ماره‪ 6‬س‪66‬توندرجدولج‪6‬وا‪6‬ب‬ ‫‪ORDER BY 2‬‬

‫‪ORDER BY 2 DESC‬‬

‫‪6‬یست‬
‫‪ ASCENDING‬ص‪66‬ع‪6‬ودی‪ default‬ا‪6‬ستو ا‪6‬حتیاج ب‪666‬ه‪ 6‬ذکر ن‪. 6‬‬
‫‪ ASCENDING‬ن‪66‬یاز ب‪666‬ه‪ 6‬ت‪666‬صریح ن‪66‬دارد‪.‬‬
‫•بازیابی مقدار محاسبه شده *‬
‫ً‪ :Q‬شماره هر قطعه و وزن آنرا به گرم بدهید‪ .‬فرض کنید ‪ DBA‬وزن را به واحد‬
‫کیلو گرم ذخیره نموده ‪.‬‬

‫‪’SELECT P# , WEIGHT*1000 AS ‘WEIGHT IN GRAMS‬‬


‫‪FROM P‬‬
‫عبارت محاسبه شدنی‬

‫‪P#‬‬ ‫‪WEIGHT IN GRAMS‬‬


‫جدول جواب صورتی چنین دارد‪:‬‬
‫‪12000 P1‬‬
‫این دو ستون بی نامند‪.‬‬
‫‪17000P2‬‬
‫برای اینکه جدولی با ستونهای نامدار‬
‫‪17000 P3‬‬
‫داشت‬
‫‪14000 P4‬‬
‫این جدول جواب را می توان با حکم‬
‫‪p5‬‬ ‫‪12000‬‬ ‫‪ INSERT‬در جدولی مناسب با‬
‫‪p6‬‬ ‫‪19000‬‬ ‫ستونهای نامدار وارد کرد‪.‬‬
‫روش دوم ‪:‬‬
‫‪SELECT P# , ‘WEIGHT IN GRAMS’ , WEIGHT*1000‬‬
‫‪FROM P‬‬

‫عبارت محاسبه شدنی‬

‫‪#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‬‬

‫*‪*.SELECT S.‬‬ ‫‪, P‬‬


‫سیستم ابتدا ضرب کارترین دو رابطه‬
‫‪FROM‬‬ ‫‪S,P‬‬ ‫را ایجاد می کند‪ .‬سپس ‪ tuple‬های‬
‫‪WHERE S.CITY = P.CITY‬‬ ‫حائز شرایط را استخراج می کند‪ .‬می‬
‫توان در عمل ‪ join‬شرایطی را نیز‬
‫مطرح کرد‬
‫عمل )‪join (Natural Join‬‬
‫)‬ ‫‪)Equi Join‬‬
S# SNAME STATUS CITY P# PNAME COLOR WEIGHT CITY
S1 SN1 20 C2 P1 NUT Red 12 C2
S1 SN1 20 C2 P2 Bolt Green 17 C3

S1 C2 P6 C2
S2 C3 P1 C2
S2 C3 P2 C3

S2 C3 P6 C2

S5 C1 P1 C2
S5 C1 P2 C3

S5 SN5 30 C1 P6 Cog Red 19 C2


S# SNAME STATUS CITY P# PNAME COLOR WEIGHT CITY
S1 SN1 20 C2 P1 Nut Red 12 C2
S1 SN1 20 C2 P4 Screw Red 14 C2
S1 SN1 20 C2 P6 Cog Red 19 C2
S2 SN2 10 C3 P2 Bolt Green 17 C3
S2 SN2 10 C3 P5 Cam Blue 12 C3
S3 SN3 30 C3 P2 Bolt Green 17 C3
S3 SN3 30 C3 P5 Cam Blue 12 C3
S4 SN4 20 C2 P1 Nut Red 12 C2
S4 SN4 20 C2 P4 Screw Red 14 C2
S4 SN4 20 C2 P6 Cog Red 19 C2
‫‪ :Q‬مشخصاتق‪66‬طع‪6‬اتو ت‪666‬هیه‪ 6‬ک‪666‬نندگاناز یکش ‪6‬ه‪6‬ر ک‪666‬ه‪ 6‬ق‪66‬طعه‪ 6‬آ‪6‬بیب‪666‬اشد‪.‬‬
‫‪AND‬‬
‫‪’COLOR = ‘ BLUE‬‬

‫•الزم نیست حتما تمام مشخصات را بخواهید می توانید فقط‬


‫برخی صفات خاصه را‪ 6‬بخواهید‪ .‬مثال‪:6‬‬
‫‪ :Q‬ش‪66‬ماره‪ 6‬ق‪66‬طع‪6‬اتو ش‪66‬ماره‪ 6‬ت‪666‬هیه‪ 6‬ک‪666‬نندگانهمشه‪6‬ر را‬
‫‪#SELECT S.S# , P.P‬‬ ‫ب‪666‬دهید‪.‬‬
‫‪FROM‬‬ ‫‪S,P‬‬
‫‪WHERE S.CITY = P.CITY‬‬
‫‪AND‬‬
‫‪; ‘ COLOR = ‘ BLUE‬‬
‫نکته ‪ :‬چندین جدول را می توان ‪ Join‬کرد ولی توجه داشته باشید که عمل ‪ Join‬زمان گیر ا‪6‬ست ‪.‬‬
‫نکته ‪ ، SQL :‬ناروشمند است (‪ . )Nonprocedural‬شما فقط می گویید چه می خواهید از چه‬
‫جدولی اینکه به چه ترتیبی انجام شود را نمی گویید‪ .‬اما بطور ضمنی روشمند است ‪.‬‬
‫‪ : Q‬ا‪6‬سم‪ 6‬جفتش ‪6‬ه‪6‬رهاییرا ب‪666‬دهید ک‪666‬ه‪ 6‬ت‪666‬هیه‪ 6‬ک‪666‬ننده‪ 6‬ش ‪6‬ه‪6‬ر اولق‪66‬طعه‪ 6‬ا‪6‬یا‪6‬نبار ش‪66‬ده‪ 6‬در ش ‪6‬ه‪6‬ر دوم‪6‬‬
‫را ت‪666‬ولید ک‪666‬ند‪.‬‬
‫( الزام به استفاده از ‪ Qualifier‬داریم )‬
‫‪SELECT DISTINCT S.CITY , P.CITY‬‬
‫‪FROM S , SP , P‬‬
‫‪#WHERE S.S#=SP.S‬‬
‫‪AND‬‬
‫‪#P.P#=SP.P‬‬
‫ظاهرا ترتیب نوشتن جدولها در شرط ‪ FROM‬مهم نیست‪ .‬اما در برخی سیستمها از جمله‬
‫توصیه هایی برای نوشتن ترتیب جدولها آورده شده است تا ‪Optimizer‬‬
‫نهایتا بهتر عمل کند‪.‬‬
‫تمرین‪ :‬با ‪data‬ی ‪ SP, P , S‬مراحل اجرایی این ‪ Query‬نشان داده شود‪ join ( .‬سپس حاصل را‬
‫دوباره ‪ join‬سپس این دو ستون را باید استخراج کنید‪) .‬‬

‫توجه ‪ 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‬‬

‫‪S4‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪C2‬‬


‫‪S5‬‬ ‫‪.‬‬ ‫‪.‬‬ ‫‪C1‬‬

‫برای پاسخگویی به این قبیل ‪ 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 FIRST.S# , SECOND.S


FROM S FIRST , S SECOND
WHERE FIRST.CITY = SECOND.CITY

#AND FIRST.S# < SECOND.S


‫ شماره جفت تهیه کنندگانی را بدهید که از یک شهر نباشد‬: ‫تمرین‬

#SELECT FIRST.S# , SECOND.S


FROM S FIRST , S SECOND
WHERE FIRST.CITY != SECOND.CITY
#AND FIRST.S# < SECOND.S
‫توابع جمعی ( گروهی) ‪Aggregate Functions‬‬

‫در حاشیه ‪ :‬قدرت ‪: Select‬اپراتورهای ‪ Project‬و ‪ Join‬و ‪ Select‬جبر رابطه ای را تواما ارایه‬
‫می دهد‪.‬‬
‫برای پاسخگویی به سواالتی از قبیل چه تعداد قطعه داریم ؟ ماکزیمم ‪ Quantity‬چقدر است ؟‬
‫خود ‪ Select‬قادر به پلسخگویی نیست‪ .‬توابعی پیش بینی شده است که در متن ‪ Select‬بکار می روند ‪.‬‬
‫(مستقال نمی توانید آنها را به کار ببرید)‬
‫این توابع عبارتند از ‪:‬‬

‫‪COUNT (DISTINCT ( ...‬‬


‫‪)*(COUNT‬‬
‫‪MAX‬‬
‫‪MIN‬‬
‫‪SUM‬‬
‫‪AVG‬‬

‫حال‪6‬تی از ‪ COUNT‬موسوم به ‪)*(COUNT‬تمام سطرها را – حتی تکراری ‪ -‬می شمارد‪.‬‬


‫مثال ‪ :‬تعداد محموالت را بدهید ‪ (.‬هر سطر ‪ SP‬یک محموله است) (‪)SHIPMENT‬‬
‫‪)*(SELECT COUNT‬‬
‫‪; FROM SP‬‬
‫مثال ‪ :‬چند نوع قطعه تهیه شده است ‪.‬‬
‫)‪SELECT COUNT (DISTINCT P#‬‬
‫‪; FROM SP‬‬
‫مثال ‪ :‬کال چند نوع قطعه وجود دارد‬
‫‪)*(SELECT COUNT‬‬
‫‪; FROM P‬‬
‫مثال ‪:‬‬
‫)‪SELECT MAX(STATUS‬‬
‫‪; FROM S‬‬
‫)‪SELECT P# ,SUM(QTY‬‬ ‫استفاده از ‪: GROUP BY‬‬
‫ق‪66‬طعه‪ 6‬را ب‪666‬دهید ‪.‬‬
‫‪FROM‬‬ ‫‪ SP‬از هر‬
‫‪ : Query‬ش‪66‬ماره‪ 6‬هر ق‪66‬طعه‪ 6‬ت‪666‬هیه‪ 6‬ش‪66‬ده‪ 6‬و ک‪666‬لت‪666‬ع‪6‬داد ت‪666‬هیه‪ 6‬ش‪66‬ده‪6‬‬

‫‪; #GROUP BY P‬‬


‫‪ GROUP BY CLAUSE‬ج‪6‬دولداده‪ 6‬ش‪66‬ده‪ 6‬ب‪666‬ع‪6‬د از ‪ FROM‬را منطقا گ‪666‬روه‪ 6‬ب‪666‬ندیمیک‪666‬ند ب‪666‬ه‪6‬‬
‫‪6‬ست‬
‫ن‪66‬حویک‪666‬ه‪ 6‬در هر گ‪666‬روه‪ 6‬مقدار س‪66‬تونیا س‪66‬تونه‪6‬ایداده‪ 6‬ش‪66‬ده‪ 6‬پ‪666‬ساز ‪ GROUP BY‬یکسانا ‪.‬‬
‫(گ‪666‬روه‪ 6‬ب‪666‬ندیب‪666‬ر ا‪6‬ساسآ‪6‬نچه‪ 6‬ب‪666‬ع‪6‬د از ‪ GROUP BY‬داده‪ 6‬میش‪66‬ود ) آ‪6‬نگاه‪ 6‬ت‪666‬ابع‪ SUM 6‬عملمی‬
‫ش‪66‬ود‪.‬‬
‫‪S#‬‬ ‫‪P#‬‬ ‫‪QTY‬‬
‫)ستونهایی که حاصل اعمال توابع هستند بی نام می باشند(‬
‫‪S1‬‬ ‫‪P1‬‬ ‫‪300‬‬
‫‪S2‬‬ ‫‪P1‬‬ ‫‪300‬‬
‫‪#P‬‬
‫‪S1‬‬ ‫‪P2‬‬ ‫‪200‬‬
‫‪S2‬‬ ‫‪P2‬‬ ‫‪400‬‬ ‫‪P1‬‬ ‫‪600‬‬
‫‪S3‬‬ ‫‪P2‬‬ ‫‪200‬‬
‫‪P2‬‬ ‫‪1000‬‬
‫‪S4‬‬ ‫‪P2‬‬ ‫‪200‬‬
‫‪P3‬‬ ‫‪400‬‬
‫‪S1‬‬ ‫‪P3‬‬ ‫‪400‬‬
‫‪P4‬‬ ‫‪200‬‬
‫‪S1‬‬ ‫‪P4‬‬ ‫‪200‬‬
‫‪S1‬‬ ‫‪P5‬‬ ‫‪100‬‬ ‫‪P5‬‬ ‫‪100‬‬
‫مثالی از به عینیت درآوردن فیلد مجازی حاصل ا‪6‬ز پردازش می باشد‪) Indirect Materialization( .‬‬
‫مثالی از کاربرد ‪ ( :HAVING‬هدف این ا‪6‬ست که مفاهیم برای شما نا آشنا نباشد(‬

‫‪ :Query‬شماره قطعاتی را‪ 6‬بدهید که توسط بیش از یک تهیه کننده تهیه شده باشد‪.‬‬

‫نکته ‪ HAVING : 1‬همیشه با ‪ GROUP BY‬می آید و مستقل معنی ندارد‪.‬‬


‫نکته ‪ :2‬استفاده از ‪ GROUP BY‬ناروشمندی ‪ SQL‬را کمی تضعیف می کند‪ ( .‬زیرا می گویید‬
‫گروهبندی کن ) و آنرا تا حدی روشمند میکند ‪ .‬از نظر کوتاهی بسیار جالب ا‪6‬ست هر چند روشمند است‪.‬‬

‫‪#SELECT‬‬ ‫نقش ‪ : having‬نقش ‪ having‬در ‪P‬‬


‫گروه‬
‫همان ا‪6‬ست که نقش ‪ where‬در ‪FROM SP.tuple‬‬
‫‪ Where‬ب‪666‬را‪6‬یب‪666‬یانش‪66‬رط یا ش‪66‬را‪6‬یط‪#GROUP BY P‬‬
‫‪6‬ست ‪ having‬ب‪666‬را‪6‬ی‬
‫ن‪66‬اظر ب‪666‬ه‪ 6‬س‪66‬طر ا ‪.‬‬
‫ب‪666‬یانش‪66‬رط یا ش‪66‬را‪6‬یط ن‪66‬اظر ب‪666‬ه‪; HAVING COUNT ( * ) > 1 6‬‬
‫گ‪666‬روه‪. 6‬‬
‫شماره هر تهيه کننده و تعداد کل قطعاتي را که تهيه کرده بدهيد مثال ‪:‬‬

‫)‪select s#, sum(QTY‬‬


‫‪from sp‬‬
‫‪#group by s‬‬

‫مثال ‪ :‬شماره تهيه کنندگاني را بدهيد که دو نوع قطعه تهيه کرده اند‬

‫‪#select s‬‬
‫‪from sp‬‬
‫‪#group by s‬‬
‫‪having count(*)=2‬‬
‫شماره هر تهيه کننده و تعداد انواع قطعاتي که تهيه کرده را در مورد تهيه کنندگاني که بيش از يک‬
‫قطعه تهيه کرده اند ‪ ،‬بدهيد‬

‫‪)*(select s#, count‬‬


‫‪from sp‬‬
‫‪#group by s‬‬
‫‪having count(*)>1‬‬

‫در مورد قطعاتي که توسط سه تهيه کننده تهيه شده اند شماره قطعه و تعداد کل تهیه شده از قطعه‬
‫را بدهید‬

‫)‪select p#, sum(qty‬‬


‫‪from sp‬‬
‫‪#group by p‬‬
‫‪having count(*)=3‬‬
‫با مفروض بودن جدول‪ SPd‬شماره هر تهيه کننده ‪ ،‬شماره قطعه تهيه شده و تعداد کل تهيه شده از‬
‫آن قطعه را بدهيد‬

‫)‪select s#, p#, sum(qty‬‬


‫‪from spd‬‬
‫‪#group by s#, p‬‬

‫با فرض داشتن جدول ‪ COMPUTERS‬که ستونهای آن عبارتند از نام دفتر ‪ ،‬شماره اتاق ‪ ،‬شماره‬
‫کامپیوتر ‪ ،‬نوع ‪ ، CPU‬مقدار ‪ ، RAM‬حجم ‪ HARD DISK‬و ‪ ، ...‬گزارشی تهیه کنید که‬
‫ستونهای آن نام دفتر ‪ ،‬شماره اتاق و تعداد کامپیوترهای موجود در اتاق باشد ‪.‬‬

‫‪)*(select officename, roomno, count‬‬


‫‪from computers‬‬
‫‪group by officename, roomno‬‬
‫‪order by officename, roomno‬‬
‫پرس و جو های فرعی ‪: SUBQUERY‬‬
‫مثال ‪ : Q :‬اسامی تهیه کنندگاه قطعه ‪ P2‬را بدهید ‪.‬‬

‫‪SELECT Sname‬‬ ‫روش اول ‪ :‬با استفاده از مکانیزم ‪: Join‬‬


‫‪FROM S , SP‬‬
‫‪WHERE SP.S# = S.S# AND‬‬
‫‪; ’SP.P# = ‘P2‬‬

‫بویژه در ‪ SQL 92‬اپراتور ‪ Join‬صراحتا تامین شده است ‪.‬‬

‫نکته ای که به این راه حل وارد است این ا‪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 OUTTER QUERY


FROM S
WHERE S# IN S1 , S2 , S3 , S4
‫ یا‬S# = ANY
#SELECT S(
FROM SP
‫رعی‬666‫ویف‬6‫رسو ج‬666‫ پ‬INNER QUERY
) ‘ WHERE P# = ‘ P2
‫نکته ‪ :‬در بعضی از نسخه های ‪ SQL‬اپراتوری به نام ‪ ANY‬بصورت کلی ‪ Theta ANY‬پیش بینی شده‬
‫است که ‪ Theta‬یکی از اپراتورهای متعارف مقایسه است‪ ANY .‬به معنای ‪ SOMEONE‬است‪.‬‬
‫‪ -‬عملکرد ‪ = ANY‬با عملکرد ‪ IN‬یکسان است‪.‬‬
‫‪ -‬هر کجا ‪ IN‬بتواند بیاید =‪ ANY‬نیز می تواند ‪.‬‬
‫نکته ‪ :‬عمل تو در تویی می تواند بیش ا‪6‬ز دو سطح باشد ( سطوح می توانند از ل‪6‬حاظ تئوری بیش از دو سطح‬
‫باشد ا‪6‬ما در عمل ‪ Q %98‬ها با یک ‪ SELECT‬و یا حداکثر در دو سطح ‪ SELECT‬پاسخ داده می شوند‪) .‬‬
‫مثال ‪ :‬اسامی تهیه کنندگانی که حداقل یک قطعه آبی رنگ تهیه می کنند‪.‬‬

‫‪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‬‬

‫مقادیر ستون ‪STATUS‬‬

‫اگر وضعیت از یکی از اینها کمتر باشد جواب است ( زیرا دیگر ماکزیمیم نیست )‬
‫تمرین ‪ :‬این دو راه حل را با هم مقایسه کنید ( از نظر کارایی)(تعداد مقایسه ها)‬
‫در راه اول الزاما ‪ 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‬اشد ‪.‬‬

‫‪#SELECT P‬‬ ‫یعنی آغاز شونده با ‪C‬‬


‫‪;’%FROM P WHERE PNAME LIKE ‘C‬‬ ‫‪ ’LIKE ‘%C‬یعنیمختوم‪ 6‬ب‪666‬ه‪ 6‬ح‪6‬رف‪C‬‬

‫‪’%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 ‫ اسامی تهیه کنندگانی را بدهید که قطعه‬: ‫مثال‬

NOT EXISTS : ‫پاسخ با استفاده ا ز‬

SELECT SNAME FROM S


WHERE NOT EXISTS (SELECT * FROM SP
)’WHERE SP.S#=S.S# AND SP.P#=‘P2

:SUBQUERY ‫پاسخ با استفاده از‬

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‬پاسخ صحیح‬
‫توجه کنید که ‪ query‬ذیل‬
‫‪FROM S‬‬
‫‪WHERE SNUM IN ( SELECT SNUM‬‬
‫‪FROM SP‬‬
‫‪)’WHERE PNUM != ‘P2‬‬
‫‪ Q‬ت‪666‬مرین‪( :‬ت‪666‬مرینیک‪666‬ه‪ 6‬در آ‪6‬نت‪666‬مام‪ feature 6‬های‪ SELECT‬را ب‪666‬اید ا‪6‬ستفاده‪ 6‬ک‪666‬نید ) ش‪66‬ماره‪ 6‬ق‪66‬طعه‪ ، 6‬وزن‬
‫رنگ‪6‬نه‪6‬ا آ‪6‬بییا س‪66‬فید ب‪666‬اشد و وزنآ‪6‬نه‪6‬ا ب‪666‬یش‬
‫آ‬ ‫ب‪666‬ه‪ 6‬گ‪666‬رم‪ 6‬و ک‪666‬لت‪666‬ع‪6‬داد ت‪666‬هیه‪ 6‬ش‪66‬ده‪ 6‬از ق‪66‬طع‪6‬اتیرا ب‪666‬دهید ک‪666‬ه‪6‬‬
‫از ‪ 10‬گ‪666‬رم‪ 6‬و ح‪6‬دا‪6‬ک‪6‬ثر ت‪666‬ع‪6‬دا‪6‬د ت‪666‬هیه‪ 6‬ش‪66‬ده‪ 6‬از آ‪6‬نه‪6‬ا ب‪666‬زرگ‪6‬تر از ‪ 500‬ب‪666‬اشد و ض‪66‬منا ق‪66‬طع‪6‬اتیک‪666‬ه‪QTY 6‬‬
‫ک‪666‬متر از ‪ 200‬ا‪6‬ستدر ن‪66‬ظر گ‪666‬رفته‪ 6‬ن‪66‬شود ‪.‬ج‪6‬دولج‪6‬وا‪6‬بب‪666‬ه‪ 6‬ن‪66‬ظم‪ 6‬ن‪66‬زولیمقدار ‪ Max‬مرتبش‪66‬ود ‪ORDER‬‬
‫‪BY MAX‬‬
‫نام تهیه کنندگانی را بدهید که همه قطعات را تهیه کرده اند‬

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

FORALL X P(X) Ξ NOT EXISTS X NOT P(X)

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

: SUBQUERY ‫ز‬6‫ با استفاده ا‬: ‫روش دوم‬

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(COLOR,WEIGHT, P#,CITY,PNAME)


VALUES(’RED’,10,’P7’, ’C2’, ‘PN7’)

INSERT INTO P
VALUES( ‘P7’ , , ,10 , ’C2’ )

‫ مقدار‬P ‫ در‬Color ‫ و‬Pname ‫سطر ناقص به شرطی قابل قبول است که برای‬
. ‫ ذکر نکرده باشید‬NotNULL
INSERT INTO P(PNUM,WEIGHT,CITY) : ‫وارد کردن سطر ناقص‬
VALUES('P7', 10 , 'C1')

INSERT : ‫دوم دستور‬ ‫فرم‬


INSERT
INTO table
SUBQUERY
: ‫مثال‬
CREATE TABLE TEMP
PRIMARY KEY )PNUM CHAR(8) NOT NULL, SUMQTY INTEGER(
;PNUM

INSERT
INTO TEMP
SELECT P#,SUM(QTY)
FROM SP
;#GROUP BY P
: ‫روش دوم‬
SELECT P#,SUM(QTY)
‫ را ایجاد می کند‬temp ‫این دستور خودش جدول‬
INTO TEMP
FROM SP
;#GROUP BY P

: ?‫روشس??وم‬CREATE TABLE TEMP

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

. ‫) نمایید‬0( ‫ را صفر‬C2 ‫ تهیه کنندگان ساکن‬QTY: ‫تمرین‬


UPDATE SP
SET QTY= QTY + 10
* WHERE EXISTS ( SELECT
FROM S
WHERE SP.S# = S.S# AND
)'S.CITY = 'C3
‫ چند ستون از رکورد بطور همزمان‬update : ‫مثال‬

UPDATE P
,’SET COLOR = ‘YELLOW
,WEIGHT = WEIGHT +5
CITY = NULL
; ’WHERE P# = ‘P2
‫دستور ‪DELETE‬‬

‫مثال ‪ :‬حذف تک سطر ‪ >S3,P1,50<:‬را حذف کنید ‪.‬‬


‫‪DELETE FROM SP‬‬
‫‪’WHERE S#=‘S3’ AND P#=‘P1‬‬

‫حذف چند سطر ‪ :‬محموله های با ‪ 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‬‬
‫ را حذف کنید‬c3 ‫ محموالت مربوط به تهیه کنندگان شهر‬: ‫مثال‬

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) 

)ON DELETE CASCADE 

You might also like