ฉันมี 2 ตารางเช่นนี้
> SELECT * FROM table_a;
+------+------+
| id | name |
+------+------+
| 1 | row1 |
| 2 | row2 |
+------+------+
> SELECT * FROM table_b;
+------+------+------+
| id | name | aid |
+------+------+------+
| 3 | row3 | 1 |
| 4 | row4 | 1 |
| 5 | row5 | NULL |
+------+------+------+
INNER JOIN ใส่ใจทั้งสองตาราง
เข้าร่วมภายในใส่ใจเกี่ยวกับทั้งสองตารางดังนั้นคุณจะได้รับแถวหากทั้งสองตารางมีหนึ่ง หากมีคู่ที่ตรงกันมากกว่าหนึ่งคู่คุณจะได้รับหลายแถว
> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
+------+------+------+------+------+
มันไม่ได้ทำให้ความแตกต่างกับ INNER JOIN ถ้าคุณกลับคำสั่งซื้อเพราะมันใส่ใจทั้งสองตาราง:
> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
+------+------+------+------+------+
คุณได้รับแถวเดียวกัน แต่คอลัมน์อยู่ในลำดับที่แตกต่างกันเพราะเราพูดถึงตารางในลำดับที่แตกต่างกัน
ซ้ายเข้าร่วมเพียงใส่ใจเกี่ยวกับตารางแรก
ซ้ายเข้าร่วมใส่ใจเกี่ยวกับตารางแรกที่คุณให้และไม่สนใจมากเกี่ยวกับตารางที่สองดังนั้นคุณจึงได้รับแถวจากตารางแรกเสมอแม้ว่าจะไม่มีแถวที่เกี่ยวข้องในสอง:
> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| 2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+
ด้านบนคุณสามารถเห็นทุกแถวของ table_a แม้ว่าบางคนไม่ตรงกับสิ่งใดในตาราง b แต่ไม่ใช่ทุกแถวของ table_b - เฉพาะแถวที่ตรงกับบางอย่างใน table_a
หากเรากลับลำดับของตาราง LEFT JOIN จะทำงานแตกต่างกัน:
> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| 5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+
ตอนนี้เราได้รับ table_b ทุกแถว แต่จะจับคู่เฉพาะแถวของ table_a เท่านั้น
RIGHT JOIN สนใจเฉพาะโต๊ะที่สองเท่านั้น
a RIGHT JOIN b
ทำให้คุณเหมือนกันb LEFT JOIN a
ทุกประการ ความแตกต่างเพียงอย่างเดียวคือลำดับเริ่มต้นของคอลัมน์
> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| NULL | NULL | 5 | row5 | NULL |
+------+------+------+------+------+
นี่คือแถวเดียวกับtable_b LEFT JOIN table_a
ที่เราเห็นในส่วนซ้ายเข้าร่วม
ในทำนองเดียวกัน:
> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| NULL | NULL | NULL | 2 | row2 |
+------+------+------+------+------+
table_a LEFT JOIN table_b
เป็นแถวเดียวกับ
ไม่มีการเข้าร่วมเลยให้สำเนาของทุกอย่าง
No Join clause: หากคุณเขียนตารางโดยไม่มี JOIN clause เลยเพียงแค่คั่นด้วยเครื่องหมายจุลภาคคุณจะได้รับทุกแถวของตารางแรกที่เขียนถัดจากทุกแถวของตารางที่สองในชุดค่าผสมที่เป็นไปได้ทั้งหมด:
> SELECT * FROM table_b, table_a;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 3 | row3 | 1 | 2 | row2 |
| 4 | row4 | 1 | 1 | row1 |
| 4 | row4 | 1 | 2 | row2 |
| 5 | row5 | NULL | 1 | row1 |
| 5 | row5 | NULL | 2 | row2 |
+------+------+------+------+------+
(นี่คือจากโพสต์บล็อกของฉันตัวอย่างของประเภทการเข้าร่วม SQL )