เมื่อทำงานกับฐานข้อมูล คุณอาจต้องการสืบค้น 2 ตารางขึ้นไปพร้อมกันและรวมผลลัพธ์ เช่น ต้องการชื่อพนักงานทุกคนและแผนกที่พวกเขาทำงาน ซึ่งเก็บอยู่ในตารางต่างกัน
นี่คือที่มาของ SQL joins การ join ตารางช่วยให้รันคิวรี่ข้ามหลายตารางและสร้างชุดผลลัพธ์รวม
ในคู่มือนี้ เราจะเน้นที่หนึ่งในประเภทของ join: OUTER JOIN ซึ่งจะคืนค่าแถวแม้จะไม่มีแถวที่เกี่ยวข้องในตารางอีกตาราง เราจะอธิบาย 3 ประเภทของ OUTER JOINs, การทำงาน, และวิธีใช้ในคิวรี่ SQL
บทนำสั้นๆ เกี่ยวกับ SQL Joins
คิวรี่ปกติเริ่มด้วยคำสั่ง SELECT ใช้ดึงข้อมูลจากฐานข้อมูล โดยใช้ clause FROM ระบุตาราง ไวยากรณ์มาตรฐาน:
SELECT column_name FROM table_name WHERE certain_conditions_are_met;
ตัวอย่างคิวรี่ดึงชื่อพนักงานทั้งหมดจากตาราง employees:
SELECT name FROM employees;
ผลลัพธ์:
| name |
| Luke Mike Hannah Geoff Alexis Emma Jonah Adam |
(8 แถว)
เราสามารถใช้ clause WHERE กรองผลลัพธ์ได้ เช่น หาชื่อพนักงานขายหรือผู้บริหาร
แต่ถ้าต้องการข้อมูลจากหลายตารางและรวมเป็นตารางเดียว? นี่คือที่มาของ joins
Joins ช่วยสืบค้นหลายตารางและสร้างชุดผลลัพธ์รวมจากแถวที่จับคู่ได้ มี 3 ประเภทหลัก: INNER JOIN, OUTER JOIN, และ CROSS JOIN
INNER JOIN คืนแถวที่มีคู่ในทั้งสองตาราง ส่วน OUTER JOIN คืนแถวแม้ไม่มีคู่ในตารางที่ join CROSS JOIN เป็น join ที่ไม่มีเงื่อนไข join แต่ละแถวของตารางหนึ่งจะจับคู่กับแถวที่ตรงกันของอีกตาราง
SQL Outer Joins
ตามที่กล่าวไว้ INNER JOIN จะไม่คืนแถวที่ไม่มีคู่ในอีกตาราง แต่ถ้าต้องการข้อมูลเหล่านี้ ให้ใช้ OUTER JOIN
มี 3 ประเภทของ OUTER JOIN:
LEFT OUTER JOINคืนแถวที่ไม่มีคู่จากตารางซ้าย (left table)RIGHT OUTER JOINคืนแถวที่ไม่มีคู่จากตารางขวา (right table)FULL OUTER JOINคืนแถวที่ไม่มีคู่จากทุกตาราง
OUTER JOINs จับคู่เรคอร์ดจากทั้งสองตารางตามความต้องการและคืนเรคอร์ดทั้งหมดที่เกี่ยวข้องกับประเภท join ที่ใช้
SQL Joins: LEFT JOIN
LEFT JOIN คืนทุกแถวจากตารางซ้าย และแถวจากตารางขวาที่ตรงตามเงื่อนไข join
สมมติมี 2 ตาราง: employees และ company_departments ต้องการชื่อทุกพนักงานและชื่อแผนก แม้บางคนจะยังไม่ได้ถูกมอบหมายแผนก ใช้ LEFT JOIN:
SELECT employees.name, company_departments.name FROM employees LEFT JOIN company_departments ON employees.department_id = company_departments.department_id;
ผลลัพธ์:
| name | name |
| Luke | Sales |
| Mike | Sales |
| Hannah | Sales |
| Geoff | Sales |
| Alexis | Sales |
| Emma | Marketing |
| Jonah | Executive |
| Adam |
(8 แถว)
เห็นได้ว่า LEFT JOIN คืนทุกแถวจากตาราง employees แม้ Adam จะไม่มีแผนกใน company_departments ก็ยังแสดง (คอลัมน์ name ของแผนกว่าง)
SQL Joins: RIGHT JOIN
RIGHT JOIN เป็นตรงข้ามของ LEFT JOIN คืนทุกแถวจากตารางขวา และแถวจากตารางซ้ายที่ตรงเงื่อนไข
สมมติต้องการรายชื่อแผนกทั้งหมดและชื่อพนักงานในแต่ละแผนก รวมถึงแผนกที่ยังไม่มีพนักงาน ใช้คิวรี่:
SELECT employees.name, company_departments.name AS "DeptName" FROM employees RIGHT JOIN company_departments ON employees.department_id = company_departments.department_id;
ผลลัพธ์:
| name | “deptname” |
| Luke | Sales |
| Mike | Sales |
| Hannah | Sales |
| Geoff | Sales |
| Alexis | Sales |
| Emma | Marketing |
| Jonah | Executive |
| Payroll | |
| Information Technology |
(9 แถว)
คิวรี่คืนทุกแผนก รวมถึง Payroll และ Information Technology ที่ยังไม่มีพนักงาน ส่วน Adam (จาก LEFT JOIN ที่ไม่มีแผนก) ไม่แสดง เพราะ RIGHT JOIN รวมเฉพาะตารางขวา (company_departments) และ Adam ไม่มีความสัมพันธ์กับตารางขวา
Full SQL Outer Joins
FULL OUTER JOIN เป็น join แบบที่น้อยกว่าที่คืนเรคอร์ดที่ไม่มีคู่จากทั้งสองตาราง มักใช้กับฟังก์ชันรวม (aggregate functions) เพื่อดูการทับซ้อนระหว่าง 2 ตาราง
สมมติต้องการรายชื่อพนักงานทั้งหมดและแผนกทั้งหมด ใช้คิวรี่:
SELECT employees.name, company_departments.name AS "DeptName" FROM employees FULL OUTER JOIN company_departments ON employees.department_id = company_departments.department_id;
ผลลัพธ์:
| name | “deptname” |
| Luke | Sales |
| Mike | Sales |
| Hannah | Sales |
| Geoff | Sales |
| Alexis | Sales |
| Emma | Marketing |
| Jonah | Executive |
| Adam | |
| Payroll | |
| Information Technology |
(10 แถว)
ชุดผลลัพธ์นี้รวมชื่อพนักงานทุกคนและแผนกที่สังกัด แม้จะไม่มีแผนก (Adam) และรวมชื่อแผนกทุกแผนก แม้จะไม่มีพนักงาน (Payroll, IT)
สรุป
Joins เป็นฟังก์ชัน SQL server ที่สืบค้น 2 ตารางขึ้นไปพร้อมกันและสร้างชุดผลลัพธ์รวม เช่น ต้องการรายชื่อพนักงานและวันที่เช็คเงินเดือนล่าสุด สามารถใช้ join ได้
ในบทช่วยสอนนี้ เราเน้นที่ OUTER JOINs ซึ่งคืนแถวใน join แม้ไม่มีแถวที่เกี่ยวข้องในตารางที่ join และอธิบาย 3 ประเภทหลัก: LEFT JOIN, RIGHT JOIN, และ FULL OUTER JOIN พร้อมตัวอย่างการใช้งานจริง
ตอนนี้คุณพร้อมทำ SQL JOIN แบบมืออาชีพแล้ว!