Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> SQL

SQL OUTER JOIN: คู่มือฉบับสมบูรณ์

เมื่อทำงานกับฐานข้อมูล คุณอาจต้องการสืบค้น 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;

ผลลัพธ์:

namename
LukeSales
MikeSales
HannahSales
GeoffSales
AlexisSales
EmmaMarketing
JonahExecutive
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”
LukeSales
MikeSales
HannahSales
GeoffSales
AlexisSales
EmmaMarketing
JonahExecutive

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”
LukeSales
MikeSales
HannahSales
GeoffSales
AlexisSales
EmmaMarketing
JonahExecutive
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 แบบมืออาชีพแล้ว!