1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

پيوند جدول ها

شروع موضوع توسط hector2141 ‏26/7/13 در انجمن SQL

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,318
    تشکر شده:
    2,702
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    پيوند جدول ها :

    تا اين قسمت تمام مثال ها و مسئله هايی که در SQL به آنها پاسخ داديم ، مسئله هايی بودند که اطلاعات ما فقط از يک جدول استخراج می شد . اما در برنامه نويسی واقعی پايگاه داده ها ، ما مجبور هستيم که اطلاعات خود را از بيش از يک جدول استخراج کنيم . در اين حالت ما ابتدا بايد جدول هايی که می خواهيم اطلاعات را از آنها استخراج کنيم ، با هم پيوند دهيم . هدف از ايجاد اين ارتباط تلفيق اطلاعات در جدول ها و چاپ اطلاعات مورد نظر در خروجی است .
    [HR][/HR] مفاهيم اوليه :
    برای پيوند دادن جدول ها ابتدا بايد چند مفهوم زير را بشناسيم :

    • کليد اصلی : فيلد کليد اصلی در يک جدول ، فيلدی است که شرايط زير را داشته باشد :
      1. مقدار آن برای هر نمونه رکورد ( سطر ) منحصر به فرد و غير تکراری باشد . به عبارت ديگر هيچ 2 رکوردی در يک جدول در اين فيلد مقدار يکسان نداشته باشد . کليد اصلی وجه تمايز 2 نمونه رکورد مختلف در يک جدول است .
      2. طول مقادير آن حدامکان کوتاه باشد .
      نکته : يک جدول می تواند بيش از يک کليد اصلی داشته باشد .
      مثال : فيلد شماره دانشجويی در جدول Student کليد اصلی است . هيچ دو دانشجويی نمی توانند دارای شماره دانشجويی يکسان باشند .
    • کليد خارجی : کليد خارجی ، فيلدی است که در يک جدول کليد اصلی و در جدول ديگر به تنهايی کليد اصلی نباشد . از کليد خارجی برای ارتباط يک به چند 2 جدول با هم استفاده می شود .
    [HR][/HR] شرط ارتباط 2 جدول :
    برای ارتباط بين جدول ها بايد شرط های زير برقرار باشد . بايد قبل از طراحی پايگاه داده و جدول های آن موارد زير را جهت ارتباط جدول های مورد نظر رعايت کرد .

    1. وجود فيلد مشترک دقيقا از يک نوع و يک سايز .
    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 دليل اصلی دارد :

    1. باعث تمايز ستون های مشترک در جدول ها از هم می شود و مشخص می کند که هر ستون مربوط به کدام جدول است .
    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]
    * با دقت در اطلاعات جدول های اصلی متوجه درست بودن نتايج خروجی خواهيد شد .