บทความนี้สอนจอยตาราง SQL ทั้งหมด 3 วิธีคือ JOIN หรือ INNER JOIN และ LEFT JOIN และสุดท้าย RIGHT JOIN โดยการจอยตารางทั้ง 3 วิธีนั้นจะมีความแตกต่างด้านผลลัพธ์ คำสั่ง และวัตถุประสงค์ในการจอยตาราง SQL โดยมีรายละเอียดดังนี้
ตัวอย่าง คำสั่งการจอยตาราง SQL
1. JOIN หรือ INNER JOIN คือการจอยตารางด้วยคำสั่ง SQL โดยจะแสดงข้อมูลที่เหมือนกันจาก field primary key และ foreign key ของทั้ง 2 ตาราง
2. LEFT JOIN หรือ LEFT OUTER JOIN คือการจอยตารางด้วยคำสั่ง SQL โดยจะแสดงข้อมูลทั้งหมดของตารางฝั่งซ้าย (ตารางแรกที่ถูกกล่าวถึง) เป็นหลัก พร้อมกับข้อมูลของตารางฝั่งขวา (ตารางที่สอง) หากไม่มีข้อมูลจะแสดงเป็น NULL
3. RIGHT JOIN หรือ RIGHT OUTER JOIN คือการจอยตารางด้วยคำสั่ง SQL โดยจะแสดงข้อมูลทั้งหมดของตารางฝั่งขวา (ตารางที่สองที่ถูกกล่าวถึง) เป็นหลัก พร้อมกับข้อมูลของตารางฝั่งซ้าย (ตารางที่หนึ่ง) หากไม่มีข้อมูลจะแสดงเป็น NULL
ตัวอย่าง ตารางข้อมูลทั้ง 2 ที่จะนำมาจอย
1. ตาราง orders โดย primary key คือ field id
id | created | paid_status |
---|---|---|
1 | 2024-01-29 08:03:17 | paid |
2 | 2024-01-29 11:03:17 | paid |
3 | 2024-01-29 12:03:17 | paid |
4 | 2024-01-30 08:03:17 | unpaid |
5 | 2024-01-30 14:03:17 | unpaid |
2. ตาราง orders_details โดย primary key คือ field id และ foreign key คือ order_id
ตัวอย่าง วิธีการจอยตาราง SQL แบบ JOIN หรือ INNER JOIN
SELECT *
FROM
orders o
JOIN order_details od ON ( o.id = od.order_id )
ผลลัพธ์
id | created | paid_status | id | product_id | amount | order_id |
---|---|---|---|---|---|---|
1 | 2024-01-29 08:03:17 | paid | 1 | 1 | 2 | 1 |
1 | 2024-01-29 08:03:17 | paid | 2 | 6 | 2 | 1 |
2 | 2024-01-29 11:03:17 | paid | 3 | 2 | 1 | 2 |
3 | 2024-01-29 12:03:17 | paid | 4 | 3 | 1 | 3 |
3 | 2024-01-29 12:03:17 | paid | 5 | 7 | 3 | 3 |
4 | 2024-01-30 08:03:17 | unpaid | 6 | 4 | 10 | 4 |
4 | 2024-01-30 08:03:17 | unpaid | 7 | 5 | 10 | 4 |
จากผลลัพธ์เป็นการจอยตารางโดยแสดงข้อมูลที่เหมือนกันของ field id (primary key) จากตาราง orders และ field order_id (foreign key) จากตาราง order_details
ตัวอย่าง วิธีการจอยตาราง SQL แบบ LEFT JOIN หรือ LEFT OUTER JOIN
SELECT *
FROM
orders o
LEFT JOIN order_details od ON ( o.id = od.order_id )
ผลลัพธ์
id | created | paid_status | id | product_id | amount | order_id |
---|---|---|---|---|---|---|
1 | 2024-01-29 08:03:17 | paid | 1 | 1 | 2 | 1 |
1 | 2024-01-29 08:03:17 | paid | 2 | 6 | 2 | 1 |
2 | 2024-01-29 11:03:17 | paid | 3 | 2 | 1 | 2 |
3 | 2024-01-29 12:03:17 | paid | 4 | 3 | 1 | 3 |
3 | 2024-01-29 12:03:17 | paid | 5 | 7 | 3 | 3 |
4 | 2024-01-30 08:03:17 | unpaid | 6 | 4 | 10 | 4 |
4 | 2024-01-30 08:03:17 | unpaid | 7 | 5 | 10 | 4 |
5 | 2024-01-30 14:03:17 | unpaid | NULL | NULL | NULL | NULL |
จากผลลัพธ์การใช้ LEFT JOIN จะเห็นว่าแถว id 5 ของ orders นั้นข้อมูลจากตาราง order_details จะมีค่าเป็น NULL ทั้งหมด เนื่องจาก field order_id (foreign key) ของตาราง order_details ไม่มีข้อมูลหมายเลข 5 ที่ตรงกับ field id (primary key) ของตาราง orders แต่ด้วยการใช้ LEFT JOIN จึงทำให้ต้องแสดงข้อมูลทั้งหมดจากตารางฝั่งซ้าย (ตารางแรกที่ถูกกล่าวถึง) คือตาราง orders
ตัวอย่าง วิธีการจอยตาราง SQL แบบ RIGHT JOIN หรือ RIGHT OUTER JOIN
SELECT *
FROM
orders o
RIGHT JOIN order_details od ON ( o.id = od.order_id )
ผลลัพธ์
id | created | paid_status | id | product_id | amount | order_id |
---|---|---|---|---|---|---|
1 | 2024-01-29 08:03:17 | paid | 1 | 1 | 2 | 1 |
1 | 2024-01-29 08:03:17 | paid | 2 | 6 | 2 | 1 |
2 | 2024-01-29 11:03:17 | paid | 3 | 2 | 1 | 2 |
3 | 2024-01-29 12:03:17 | paid | 4 | 3 | 1 | 3 |
3 | 2024-01-29 12:03:17 | paid | 5 | 7 | 3 | 3 |
4 | 2024-01-30 08:03:17 | unpaid | 6 | 4 | 10 | 4 |
4 | 2024-01-30 08:03:17 | unpaid | 7 | 5 | 10 | 4 |
จากผลลัพธ์การใช้ RIGHT JOIN ซึ่งจะแสดงข้อมูลทั้งหมดจากตารางฝั่งขวา (ตารางที่สองที่ถูกกล่าวถึง) คือตาราง order_details จึงทำให้ข้อมูล id (primary key) ของตาราง orders ไม่แสดง เนื่องจากตาราง field order_id (foreign key) ของตาราง order_details ไม่มีค่าเลข 5