پيوند جدول ها : تا اين قسمت تمام مثال ها و مسئله هايی که در SQL به آنها پاسخ داديم ، مسئله هايی بودند که اطلاعات ما فقط از يک جدول استخراج می شد . اما در برنامه نويسی واقعی پايگاه داده ها ، ما مجبور هستيم که اطلاعات خود را از بيش از يک جدول استخراج کنيم . در اين حالت ما ابتدا بايد جدول هايی که می خواهيم اطلاعات را از آنها استخراج کنيم ، با هم پيوند دهيم . هدف از ايجاد اين ارتباط تلفيق اطلاعات در جدول ها و چاپ اطلاعات مورد نظر در خروجی است . [HR][/HR] مفاهيم اوليه : برای پيوند دادن جدول ها ابتدا بايد چند مفهوم زير را بشناسيم : کليد اصلی : فيلد کليد اصلی در يک جدول ، فيلدی است که شرايط زير را داشته باشد : مقدار آن برای هر نمونه رکورد ( سطر ) منحصر به فرد و غير تکراری باشد . به عبارت ديگر هيچ 2 رکوردی در يک جدول در اين فيلد مقدار يکسان نداشته باشد . کليد اصلی وجه تمايز 2 نمونه رکورد مختلف در يک جدول است . طول مقادير آن حدامکان کوتاه باشد . نکته : يک جدول می تواند بيش از يک کليد اصلی داشته باشد . مثال : فيلد شماره دانشجويی در جدول Student کليد اصلی است . هيچ دو دانشجويی نمی توانند دارای شماره دانشجويی يکسان باشند . کليد خارجی : کليد خارجی ، فيلدی است که در يک جدول کليد اصلی و در جدول ديگر به تنهايی کليد اصلی نباشد . از کليد خارجی برای ارتباط يک به چند 2 جدول با هم استفاده می شود . [HR][/HR] شرط ارتباط 2 جدول : برای ارتباط بين جدول ها بايد شرط های زير برقرار باشد . بايد قبل از طراحی پايگاه داده و جدول های آن موارد زير را جهت ارتباط جدول های مورد نظر رعايت کرد . وجود فيلد مشترک دقيقا از يک نوع و يک سايز . فيلد مشترک در يکی از جدول ها کليد اصلی و در جدول ديگر کليد خارجی باشد . [HR][/HR] معرفی 2 جدول ديگر : از اين به بعد ما در مثال های خود از 2 جدول ديگر به غير از جدول Student ، به نام های Courses ( درس ها ) و Selection ( انتخاب واحد ) به شرح زير استفاده می کنيم : [TABLE="class: ex"] [TR] [TD="class: header, colspan: 4"] Courses Table [/TD] [/TR] [TR] [TD="class: header"] Course ID [/TD] [TD="class: header"] Co Title [/TD] [TD="class: header"] Credit [/TD] [TD="class: header"] Co Type [/TD] [/TR] [TR] [TD="class: body, align: center"] کد درس ( کليد اصلی ) [/TD] [TD="class: body, align: center"] عنوان درس [/TD] [TD="class: body, align: center"] تعداد واحد [/TD] [TD="class: body, align: center"] نوع درس [/TD] [/TR] [/TABLE] [TABLE="class: ex"] [TR] [TD="class: header, colspan: 5"] Selection Table [/TD] [/TR] [TR] [TD="class: header"] Student ID [/TD] [TD="class: header"] Course ID [/TD] [TD="class: header"] Term [/TD] [TD="class: header"] Year [/TD] [TD="class: header"] Grade [/TD] [/TR] [TR] [TD="class: body, align: center"] شماره دانشجويی ( کليد اصلی خارجی )[/TD] [TD="class: body, align: center"] کد درس ( کليد اصلی خارجی )[/TD] [TD="class: body, align: center"] ترم تحصيلی [/TD] [TD="class: body, align: center"] سال تحصيلی[/TD] [TD="class: body, align: center"] نمره[/TD] [/TR] [/TABLE] نکته مهم : در تمام مثال های قبلی ، ما در دستور Select فقط نام ستون ها را به تنهايی ذکر می کرديم ، زيرا در آن زمان ، اطلاعات ما فقط از يک جدول استخراج می شد . اما در هنگام پيوند دو جدول و استفاده از چند جدول در دستور Select بايد نام ستون را به همراه نام جدول مربوط به آن ذکر کرد . اين کار 2 دليل اصلی دارد : باعث تمايز ستون های مشترک در جدول ها از هم می شود و مشخص می کند که هر ستون مربوط به کدام جدول است . باعث خوانايی و دقت بيشتر برنامه می شود . شکل کلی اين دستور به صورت زير است : نام ستون . نام جدول مثال : انتخاب ستون StudedntID از جدول Student : Student.StudentID [HR][/HR] مثال های پيوند جدول ها : در اين قسمت با ارائه چندين مثال ، انواع حالت های مختلف پيوند جدول ها را بررسی می کنيم . از داده های موجود در جداول زير برای مثال ها استفاده می کنيم : توجه : جدول انتخاب واحد نشان دهنده اين است که هر دانشجو چه واحدهای درسی را در چه ترم و سال و با چه نمره ای گذارنده است . [TABLE="class: ex"] [TR] [TD="class: header, colspan: 6"] Student Table[/TD] [/TR] [TR] [TD="class: header"] Student ID[/TD] [TD="class: header"] Name[/TD] [TD="class: header"] Family[/TD] [TD="class: header"] Major[/TD] [TD="class: header"] City[/TD] [TD="class: header"] Grade[/TD] [/TR] [TR] [TD="class: body"] 41252214[/TD] [TD="class: body"] Ahmad[/TD] [TD="class: body"] Rezaee[/TD] [TD="class: body"] Hard Ware[/TD] [TD="class: body"] Tehran[/TD] [TD="class: body"] 18[/TD] [/TR] [TR] [TD="class: body"] 10724113[/TD] [TD="class: body"] Ehsan[/TD] [TD="class: body"] Amiri[/TD] [TD="class: body"] Soft Ware[/TD] [TD="class: body"] Karaj[/TD] [TD="class: body"] 14[/TD] [/TR] [TR] [TD="class: body"] 10254861[/TD] [TD="class: body"] Zahra[/TD] [TD="class: body"] Hosini[/TD] [TD="class: body"] Hard Ware[/TD] [TD="class: body"] Tehran[/TD] [TD="class: body"] 17[/TD] [/TR] [TR] [TD="class: body"] 27365187[/TD] [TD="class: body"] Sahar[/TD] [TD="class: body"] Ahmadi[/TD] [TD="class: body"] Soft Ware[/TD] [TD="class: body"] Bam[/TD] [TD="class: body"] 16[/TD] [/TR] [TR] [TD="class: body"] 35654415[/TD] [TD="class: body"] Hesam[/TD] [TD="class: body"] Razavi[/TD] [TD="class: body"] Soft Ware[/TD] [TD="class: body"] Tehran[/TD] [TD="class: body"] 19[/TD] [/TR] [/TABLE] [TABLE="class: ex"] [TR] [TD="class: header, colspan: 4"] Courses Table[/TD] [/TR] [TR] [TD="class: header"] Course ID[/TD] [TD="class: header"] Co Title[/TD] [TD="class: header"] Credit[/TD] [TD="class: header"] Co Type[/TD] [/TR] [TR] [TD="class: body"] 1011[/TD] [TD="class: body"] پايگاه داده[/TD] [TD="class: body"] 3[/TD] [TD="class: body"] عملی[/TD] [/TR] [TR] [TD="class: body"] 1012[/TD] [TD="class: body"] مباحث ويژه[/TD] [TD="class: body"] 3[/TD] [TD="class: body"] عملی[/TD] [/TR] [TR] [TD="class: body"] 1013[/TD] [TD="class: body"] زبان تخصصی[/TD] [TD="class: body"] 2[/TD] [TD="class: body"] نطری[/TD] [/TR] [/TABLE] [TABLE="class: ex"] [TR] [TD="class: header, colspan: 5"] Selection Table[/TD] [/TR] [TR] [TD="class: header"] Student ID[/TD] [TD="class: header"] Course ID[/TD] [TD="class: header"] Term[/TD] [TD="class: header"] Year[/TD] [TD="class: header"] Grade[/TD] [/TR] [TR] [TD="class: body"] 41252214[/TD] [TD="class: body"] 1011[/TD] [TD="class: body"] 2[/TD] [TD="class: body"] 85 - 86[/TD] [TD="class: body"] 16[/TD] [/TR] [TR] [TD="class: body"] 10724113[/TD] [TD="class: body"] 1011[/TD] [TD="class: body"] 2[/TD] [TD="class: body"] 85 - 86[/TD] [TD="class: body"] 14[/TD] [/TR] [TR] [TD="class: body"] 41252214[/TD] [TD="class: body"] 1012[/TD] [TD="class: body"] 1[/TD] [TD="class: body"] 85 - 86[/TD] [TD="class: body"] 17[/TD] [/TR] [TR] [TD="class: body"] 10724113[/TD] [TD="class: body"] 1012[/TD] [TD="class: body"] 1[/TD] [TD="class: body"] 85 - 86[/TD] [TD="class: body"] 11[/TD] [/TR] [TR] [TD="class: body"] 10254861[/TD] [TD="class: body"] 1013[/TD] [TD="class: body"] 2[/TD] [TD="class: body"] 85 - 86[/TD] [TD="class: body"] 13[/TD] [/TR] [TR] [TD="class: body"] 10254861[/TD] [TD="class: body"] 1011[/TD] [TD="class: body"] 2[/TD] [TD="class: body"] 84 - 85[/TD] [TD="class: body"] 8[/TD] [/TR] [TR] [TD="class: body"] 27365187[/TD] [TD="class: body"] 1012[/TD] [TD="class: body"] 1[/TD] [TD="class: body"] 84 - 85[/TD] [TD="class: body"] 19[/TD] [/TR] [TR] [TD="class: body"] 27365187[/TD] [TD="class: body"] 1013[/TD] [TD="class: body"] 1[/TD] [TD="class: body"] 84 - 85[/TD] [TD="class: body"] 16[/TD] [/TR] [TR] [TD="class: body"] 35654415[/TD] [TD="class: body"] 1011[/TD] [TD="class: body"] 2[/TD] [TD="class: body"] 84 - 85[/TD] [TD="class: body"] 9[/TD] [/TR] [TR] [TD="class: body"] 35654415[/TD] [TD="class: body"] 1013[/TD] [TD="class: body"] 2[/TD] [TD="class: body"] 84 - 85[/TD] [TD="class: body"] 17[/TD] [/TR] [/TABLE] شکل کلی پيوند 2 جدول برای استخراج اطلاعات به صورت زير است : Select نام ستون های مورد نظر برای نمايش From نام جدول ها where برابر قرار دادن فيلدهای مشترک 2 جدول And بقيه شرط های مورد نظر ; در اين حالت ابتدا در دستور Select نام ستون هايی که از 2 جدول می خواهيم نمايش دهيم را تعيين می کنيم . سپس نام 2 جدول را در مقابل دستور From نوشته و در اولين شرط دستور Where نام فيلد مشترک را از هر 2 جدول نوشته و آنها را برابر هم قرار می دهيم . اين شرط ، شرط برقراری پيوند و تلفيق اطلاعات 2 جدول است . در ادامه هم می توان شرط های ديگری را برای استخراج اطلاعات تعيين کرد . در مثال های زير اين مسئله را بررسی می کنيم : مثال : نام و نام خانوادگی دانشجويانی را ارائه دهيد که در ترم 1 سال تحصيلی 85 - 86 ، درس با کد 1012 را انتخاب کرده اند : [TABLE="class: ex"] [TR] [TD="class: header, colspan: 2"] مثال[/TD] [/TR] [TR] [TD="class: body"] Select Students.Name , Students.Family , Selection.Term , Selection.Year From Students , Selection where Student.Student ID = Selection.Stuedent ID AND Course ID = 1012 AND Term = 1 AND Year = '85 - 86' Order By Students.Family; [/TD] [TD="class: header"] کد[/TD] [/TR] [TR] [TD="class: body"] [TABLE="class: ex"] [TR] [TD="class: header"] Name[/TD] [TD="class: header"] Family[/TD] [TD="class: header"] Term[/TD] [TD="class: header"] Year[/TD] [/TR] [TR] [TD="class: body"] Ehsan[/TD] [TD="class: body"] Amiri[/TD] [TD="class: body"] 1[/TD] [TD="class: body"] 85 - 86[/TD] [/TR] [TR] [TD="class: body"] Ahmad[/TD] [TD="class: body"] Rezaee[/TD] [TD="class: body"] 1[/TD] [TD="class: body"] 85 - 86[/TD] [/TR] [/TABLE] [/TD] [TD="class: header"] خروجی [/TD] [/TR] [/TABLE] مثال : نام دروسی را ارائه دهيد که دانشجو با شماره دانشجويی 10254861 انتخاب کرده است : [TABLE="class: ex"] [TR] [TD="class: header, colspan: 2"] مثال [/TD] [/TR] [TR] [TD="class: body"] Select Courses.Course ID , Courses.Co Title from Courses , selection Where Courses.Course ID = selection.Course ID AND Selection.Student ID = 102548861 ; [/TD] [TD="class: header"] کد[/TD] [/TR] [TR] [TD="class: body"] [TABLE="class: ex"] [TR] [TD="class: header"] Course ID [/TD] [TD="class: header"] Course Title [/TD] [/TR] [TR] [TD="class: body"] 1011 [/TD] [TD="class: body"] پايگاه داده [/TD] [/TR] [TR] [TD="class: body"] 1013 [/TD] [TD="class: body"] زبان تخصصی [/TD] [/TR] [/TABLE] [/TD] [TD="class: header"] خروجی[/TD] [/TR] [/TABLE] مثال : نام و نام خانوادگی دانشجويانی را ارائه دهيد که درس با کد 1013 در سال تحصيلی 84 - 85 را با نمره بالاتر از 15 گذارنده اند : [TABLE="class: ex"] [TR] [TD="class: header, colspan: 2"] مثال[/TD] [/TR] [TR] [TD="class: body"] SELECT Students.Name , Students.Family From Students , Selection Where Students.Studentid = Selection.Studentid And Selection.Courseid = '1013' And Year = '84 - 85' And Grade > 15 ; [/TD] [TD="class: header"] کد[/TD] [/TR] [TR] [TD="class: body"] [TABLE="class: ex"] [TR] [TD="class: header"] Name [/TD] [TD="class: header"] Family [/TD] [/TR] [TR] [TD="class: body"] Sahar [/TD] [TD="class: body"] Ahamdi [/TD] [/TR] [TR] [TD="class: body"] Hesam [/TD] [TD="class: body"] Razavi [/TD] [/TR] [/TABLE] [/TD] [TD="class: header"] خروجی[/TD] [/TR] [/TABLE] [HR][/HR] پيوند بيش از 2 جدول به هم : گاهی اوقات لازم است که اطلاعات مورد نياز ما از 3 جدول يا بيشتر استخراج شود . در اين حالت بايد کليه جدول ها را به هم پيوند دهيم به اين صورت که معمولا از يک جدول سوم برای پيوند 2 جدول ديگر استفاده می شود و 2 به 2 جدول هايی که با هم فيلد مشترک دارند را با ذکر شرط پيوند در دستور Where به هم پيوند می دهيم . سپس بقيه شروط دلخواه را نيز ذکر می کنيم . شکل کلی اين حالت به صورت زير است : Select نام ستون های مورد نظر از جدول ها From نام تمام جدول ها Where برابر قرار دادن فيلد مشترک جدول های 1 و 2 AND برابر قرار دادن فيلدهای مشترک جدول های 2 و 3 AND ... ; مثال : نام و نام خانوادگی دانشجويانی را بدهيد که حداقل يک درس از نوع نظری را انتخاب کرده باشند : [TABLE="class: ex"] [TR] [TD="class: header, colspan: 2"] مثال [/TD] [/TR] [TR] [TD="class: body"] Select Students.Name , Students.Family , Courses.CoTitle , Courses.CoType From Students , Courses , Selections Where Student.StudentID = Selection.StudentID AND Courses.CourseID = Selection.CourseID AND Courses.CoType = ' نظری ' ; [/TD] [TD="class: header"] کد[/TD] [/TR] [TR] [TD="class: body"] [TABLE="class: ex"] [TR] [TD="class: header"] Name [/TD] [TD="class: header"] Family [/TD] [TD="class: header"] CoTitle [/TD] [TD="class: header"] CoType [/TD] [/TR] [TR] [TD="class: body"] Zahra [/TD] [TD="class: body"] Hosini [/TD] [TD="class: body"] زبان تخصصی [/TD] [TD="class: body"] نظری [/TD] [/TR] [TR] [TD="class: body"] Sahar [/TD] [TD="class: body"] Ahamadi [/TD] [TD="class: body"] زبان تخصصی [/TD] [TD="class: body"] نظری [/TD] [/TR] [TR] [TD="class: body"] Hesam [/TD] [TD="class: body"] Razavi [/TD] [TD="class: body"] زبان تخصصی [/TD] [TD="class: body"] نظری [/TD] [/TR] [/TABLE] [/TD] [TD="class: header"] خروجی[/TD] [/TR] [/TABLE] * با دقت در اطلاعات جدول های اصلی متوجه درست بودن نتايج خروجی خواهيد شد .