Table of Content
ในโลกของฐานข้อมูล ถ้าเราดู ER Diagram จะเห็นว่าตารางต่างๆ อยู่กระจัดกระจาย และเชื่อมกันด้วย Primary Key และ Foreigner Key เพื่อให้สามารถเชื่อมโยงข้อมูลแต่ละจุดกันได้ โดยไม่ต้องรวมข้อมูลทุกอย่างในตารางเดียว
https://stackoverflow.com/questions/37159201/which-one-is-er-diagram
ซึ่งในฐานะ Data Analyst ที่ต้องการใช้ข้อมูลเพื่อนำมาวิเคราะห์ จะต้องใช้คำสั่ง JOIN เพื่อเชื่อมข้อมูลระหว่างตารางมาแสดงผลตามโจทย์ที่ต้องการคำตอบ
<aside> 📝
Create Table
-- Create Employees table
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
EmployeeName VARCHAR(100),
DepartmentID INT
);
-- Create Departments table
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(100)
);
Create Records
-- Insert sample data into Departments
INSERT INTO Departments (DepartmentID, DepartmentName)
VALUES
(1, 'Sales'),
(2, 'Engineering'),
(3, 'HR');
-- Insert sample data into Employees
-- Note: Employee with DepartmentID 4 has no matching department record.
INSERT INTO Employees (EmployeeID, EmployeeName, DepartmentID)
VALUES
(1, 'Alice', 1),
(2, 'Bob', 2),
(3, 'Charlie', 4);
</aside>
<aside> 📝
TABLE: Employee
EmployeeID | EmployeeName | DepartmentID |
---|---|---|
1 | Alice | 1 |
2 | Bob | 2 |
3 | Charlie | 4 |
TABLE: Departments
DepartmentID | DepartmentName |
---|---|
1 | Sales |
2 | Engineering |
3 | HR |
</aside> |
<aside> 📝
คำสั่ง JOIN
สามารถเรียกใช้ได้ทั้งหมด 4 แบบคือ
มีตรงกัน
ตารางฝั่งซ้าย
และแสดงค่าที่แมทซ์กับตารางฝั่งขวาตารางฝั่งขวา
และแสดงค่าที่แมทซ์กับตารางฝั่งซ้ายทั้งสองตาราง
โดยไม่สนว่ามีข้อมูลไหนตรงหรือไม่ตรงกัน
</aside><aside> 📝
แสดงค่าที่ทั้งสองตารางมีตรงกัน
คล้ายๆ กับคอนเซปของ Intersect ในคณิตศาสตร์
คำสั่งใน SQL
SELECT e.EmployeeName, d.DepartmentName -- ต้องการแสดงข้อมูล Employee Name และ Departure Name
FROM Employees e -- จากตาราง Employee โดยกำหนดให้เป็น 'e'
INNER JOIN Departments d -- Inner Join กับตาราง Department โดยกำหนดให้เป็น 'd'
ON e.DepartmentID = d.DepartmentID; --เงื่อนไขคือ DepartmentID ใน Employee ตรงกับ DepartmentID ใน Department เท่านั้น
Result ที่ได้
Employee Name | Department Name |
---|---|
Alice | Sales |
Bob | Engineering |
</aside> |
<aside> 📝
แสดงค่าทั้งหมดของตารางฝั่งซ้าย
และแสดงค่าที่แมทซ์กับตารางฝั่งขวา
คำสั่ง SQL
SELECT e.EmployeeName, d.DepartmentName -- ต้องการแสดงข้อมูล Employee Name และ Departure Name
FROM Employees e -- จากตาราง Employee โดยกำหนดให้เป็น 'e'
LEFT JOIN Departments d -- Left Join กับตาราง Department โดยกำหนดให้เป็น 'd'
ON e.DepartmentID = d.DepartmentID; --เงื่อนไขคือ DepartmentID ใน Employee ตรงกับ DepartmentID ใน Department เท่านั้น
Result ที่ได้
Employee Name | Department Name |
---|---|
Alice | Sales |
Bob | Engineering |
Charlie | NULL |
</aside> |
<aside> 📝
แสดงค่าทั้งหมดของตารางฝั่งขวา
และแสดงค่าที่แมทซ์กับตารางฝั่งซ้าย
คำสั่ง SQL
SELECT e.EmployeeName, d.DepartmentName -- ต้องการแสดงข้อมูล Employee Name และ Departure Name
FROM Employees e -- จากตาราง Employee โดยกำหนดให้เป็น 'e'
LEFT JOIN Departments d -- Right Join กับตาราง Department โดยกำหนดให้เป็น 'd'
ON e.DepartmentID = d.DepartmentID; --เงื่อนไขคือ DepartmentID ใน Employee ตรงกับ DepartmentID ใน Department เท่านั้น
Result ที่ได้
Employee Name | Department Name |
---|---|
Alice | Sales |
Bob | Engineering |
NULL | HR |
</aside> |
<aside> 📝
แสดงค่าทั้งหมดของทั้งสองตาราง
โดยไม่สนว่ามีข้อมูลไหนตรงหรือไม่ตรงกัน
คำสั่ง SQL
SELECT e.EmployeeName, d.DepartmentName -- ต้องการแสดงข้อมูล Employee Name และ Departure Name
FROM Employees e -- จากตาราง Employee โดยกำหนดให้เป็น 'e'
LEFT JOIN Departments d -- Full Join กับตาราง Department โดยกำหนดให้เป็น 'd'
ON e.DepartmentID = d.DepartmentID; --เงื่อนไขคือ DepartmentID ใน Employee ตรงกับ DepartmentID ใน Department เท่านั้น
Result ที่ได้
Employee Name | Department Name |
---|---|
Alice | Sales |
Bob | Engineering |
Charlie | NULL |
NULL | HR |
</aside> |