تعداد بازدید: 4960

ادغام جداول یا JOIN

ارتباط میان جداول پایگاه داده در نرم افزار های دسته RDBMS یا Relational DataBase Managment System از طریق کلید های خارجی یا ماهیت جداول امکان پذیر است.می توان با استفاده از JOIN در MySQL اطلاعات چند جدول را در قالب یک جدول یک پارچه دریافت کرد ، جدول یک پارچه نهایی می تواند بر اساس روابط میان جداول باشد.

انواع JOIN در MySQL

مفاهیم JOIN همان مفاهیم مجموعه ها در ریاضیات می باشد. در mysql پنج نوع JOIN داریم :

  • CROSS JOIN ( ضربدری )
  • INNER JOIN ( داخلی )
  • OUTER JOIN ( خارجی )
    • RIGHT JOIN
    • LEFT JOIN
  • SELF JOIN ( خودی )
  • UNIUON ( اجتماع )

CROSS JOIN

اجتماع ضربدری میان دو جدول که با استفاده از ضرب مجموعه ها امکان پذیر می باشد. بدین ترتیب که تمامی ردیف ها از جدول اول با هر یک از ردیف های جدول دوم ضرب می شود :

+----+----------+    +-------+------------+    +----+----------+-------+------------+ 
| id | car_name |    | color | color_code |    | id | car_name | color | color_code |
+----+----------+    +-------+------------+    +----+----------+-------+------------+
| 1  | Toyota   |    | white | #fff       |    | 1  | toyota   | white | #fff       |
+----+----------+    +-------+------------+    +----+----------+-------+------------+
| 2  |  Benz    |    | red   | #aaa       |    | 1  | toyota   | red   | #aaa       |
+----+----------+    +-------+------------+    +----+----------+-------+------------+
                     | black | #000       |    | 1  | toyota   | black | #000       |
                     +-------+------------+    +----+----------+-------+------------+
                                               | 2  |  Benz    | white | #fff       |
                                               +----+----------+-------+------------+
                                               | 2  |  Benz    | red   | #aaa       |
                                               +----+----------+-------+------------+
                                               | 2  |  Benz    | black | #000       |
                                               +----+----------+-------+------------+

در CROSS JOIN تعداد ستون ها و ردیف ها از حاصل ضرب ستون و ردیف جداول بدست می آید . جداول بالا با استفاده از کد زیر بدست آمده است :

SELECT * FROM cars CROSS JOIN colors

INNER JOIN

از جمله پر کاربردترین JOIN ها می باشد ، نحوه عملکرد به شکل موارد مشترک CROSS JOIN می باشد.معمولا این نوع از ادغام با استفاده از اتصال های جداول انجام می پذیرد (کلیدهای خارجی Foreign Key).

به طور مثال داریم grade و student و می خواهیم نام دانش آموزان و نمرات آن ها را در یک جدول یکتا داشته باشیم.

+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+  
| id | student_name    |    | id | student_id | grade |  | id | student_name    | grade |  
+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+  
| 1  | Abolfazl Sabagh |    | 1  | 1          | 19    |  | 1  | Abolfazl Sabagh | 19    |  
+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+  
| 2  | Ali Aghasizade  |    | 3  | 2          | 20    |  | 3  | Mahdi Ashoori   | 20    |  
+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+   
| 3  | Mahdi Ashoori   |                                
+----+-----------------+

در INNER JOIN ردیف های غیر متناظر در جدول نهایی نمی آیند مثلا در جداول بالا Ali Aghasizade نمره ای در جدول grade ندارد و در جدول نهایی نمی باشد. کد زیر جدول نهایی بالا را می سازد :

SELECT id.s,student_name.s,grade.g FROM students AS s INNER JOIN grade AS g ON g.student_id=s.id

جدولی که قرار است توسط JOIN متصل گردد باید با توجه به شرط نهایی نمایش داده گردد. منطق نوشتن SQL برای INNER JOIN همین است.

جداول شرکت کننده در INNER JOIN می توانند بیش از یک مورد باشد. با استفاده از AND می توان جداول بعدی را نیز مشارکت داد :

SELECT id.s, student_name.s, l.lesson_name, g.grade
    FROM students AS s 
    INNER JOIN grade AS g  
    INNER JOIN lessons AS l 
    ON g.student_id=s.id 
    AND l.lesson_id=g.lesson_id

ارتباط میان ON و WHERE : حضور هر دوی این کلمات کلیدی در یک sql خطا می باشد. دقت داشته باشید می توانید به صورت ترکیبی از join و کلمه کلیدی WHERE استفاده کنید :

SELECT term_taxonomy.term_id 
FROM wp_term_taxonomy AS term_taxonomy INNER JOIN wp_termmeta AS termmeta 
WHERE termmeta.meta_key = 'frotel_directory_id' 
AND termmeta.meta_value = 19 
AND term_taxonomy.term_id = termmeta.term_id

OUTER JOIN

در INNER JOIN هنگامی که در جداول رکورد متناظری وجود نداشته باشد نتیجه آن رکورد در خروجی نمی آید. OUTER JOIN با توجه به اشتراک چپ یا راست می تواند این مشکل را برطرف کند. یعنی به ازای سلول های خالی null قرار می دهد.

+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+  +----+-----------------+-------+ 
| id | student_name    |    | id | student_id | grade |  | id | student_name    | grade |  | id | student_name    | grade | 
+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+  +----+-----------------+-------+ 
| 1  | Abolfazl Sabagh |    | 1  | 1          | 19    |  | 1  | Abolfazl Sabagh | 19    |  | 1  | Abolfazl Sabagh | 19    | 
+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+  +----+-----------------+-------+ 
| 2  | Ali Aghasizade  |    | 3  | 2          | 20    |  | 2  | Mahdi Ashoori   | 20    |  | 2  | Mahdi Ashoori   | 20    | 
+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+  +----+-----------------+-------+  
| 3  | Mahdi Ashoori   |    | 4  | 2          | 20    |  | 3  | Ali Aghasizade  | null  |  |null| null            | null  |  
+----+-----------------+    +----+------------+-------+  +----+-----------------+-------+  +----+-----------------+-------+

OUTER JOIN به دو دسته LEFT JOIN و RIGHT JOIN تقسیم بندی می شود. در جداول بالا دو مورد غیر متناظر وجود دارد . اگر LEFT JOIN انجام دهیم اشتراک از جدول سمت چپ برداشته می شود و اگر RIGHT JOIN انجام دهیم اشتراک از جدول سمت راست پیاده سازی می شود یعنی نمره ۲۰ بدون نام در ردیف سوم جدول نهایی قرار می گیرد.

SELECT id.s,student_name.s,grade.g FROM students AS s LEFT JOIN grade AS g ON g.student_id=s.id
SELECT id.s,student_name.s,grade.g FROM students AS s RIGHT JOIN grade AS g ON g.student_id=s.id

SELF JOIN

SELF JOIN یک حالت خاص از INNER JOIN است که در آن برخی سلول های جدول با سلول های دیگر ارتباط دارد. در این صورت می توان یک جدول را دو جدول در نظر گرفت و روابط را پیاده سازی کرد.

مثلا یک جدول منو داریم که هر آیتم از منو یک parent_id دارد که اگر 0 باشد منوی اصلی و اگر یک عدد از id سایر منوها باشد زیر منو تلقی می شود :

+----+-----------+-----------+   +----+-----------+-----------+
| id | menu_name | parent_id |   | id | menu_name | parent    |
+----+-----------+-----------+   +----+-----------+-----------+
| 1  | Home      | 0         |   | 3  | Tablet    | Product   |
+----+-----------+-----------+   +----+-----------+-----------+
| 2  | Product   | 0         |   | 4  | Computer  | Product   |
+----+-----------+-----------+   +----+-----------+-----------+
| 3  | Tablet    | 2         |   | 5  | Template  | Home      |
+----+-----------+-----------+   +----+-----------+-----------+
| 4  | Computer  | 2         |   
+----+-----------+-----------+    
| 5  | Template  | 1         |   
+----+-----------+-----------+

کد زیر جدول بالا را می سازد ( از جدول دوم نام هایی را نمایش بده که شماره id آن ها برابر با prent_id در جدول اول است ) :

SELECT m1.id,m1.menu_name,m2.menu_name AS parent 
     FROM menus AS m1 
     INNER JOIN menus AS m2 
     ON m1.prent_id = m2.id

چون یک جدول در کار است می توانیم از WHERE استفاده کنیم:

SELECT m1.id,m1.menu_name,m2.menu_name AS parent 
     FROM menus AS m1 menus AS m2 
     WHERE m1.prent_id = m2.id

UNION

UNION یعنی اجتماع دو جدول به شرط این که تعداد ستون های انتخابی از هر دو جدول برابر باشد . نام ستون ها از جدول اول گرفته می شود.

+----+-----------+  +----+-----------+ +----+-----------+  
| id | menu_name |  | id | menu_name | | id | menu_name |  
+----+-----------+  +----+-----------+ +----+-----------+  
| 1  | Rostam    |  | 1  | Ali       | | 1  | Rostam    |  
+----+-----------+  +----+-----------+ +----+-----------+  
| 2  | Farhad    |  | 2  | Kazem     | | 2  | Farhad    |  
+----+-----------+  +----+-----------+ +----+-----------+  
| 3  | Cyrus     |  | 3  | Jafar     | | 3  | Cyrus     |  
+----+-----------+  +----+-----------+ +----+-----------+   
                                       | 1  | Rostam    |                 
                                       +----+-----------+                 
                                       | 2  | Farhad    |                 
                                       +----+-----------+                 
                                       | 3  | Cyrus     |                 
                                       +----+-----------+

کد زیر جدول بالا را می سازد‌:

SELECT * FROM students UNION SELECT * FROM teachers

نکته : برای برقراری ارتباط میان جداول می توان از توابع IN , GROUP_CONTACT نیز به عنوان کمک در برخی کوئری های پیچیده استفاده کرد.

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

یک دیدگاه برای ادغام جداول یا JOIN

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *