Table of Content

Start with WHY

ในโลกของฐานข้อมูล ถ้าเราดู ER Diagram จะเห็นว่าตารางต่างๆ อยู่กระจัดกระจาย และเชื่อมกันด้วย Primary Key และ Foreigner Key เพื่อให้สามารถเชื่อมโยงข้อมูลแต่ละจุดกันได้ โดยไม่ต้องรวมข้อมูลทุกอย่างในตารางเดียว

https://stackoverflow.com/questions/37159201/which-one-is-er-diagram

https://stackoverflow.com/questions/37159201/which-one-is-er-diagram

ซึ่งในฐานะ Data Analyst ที่ต้องการใช้ข้อมูลเพื่อนำมาวิเคราะห์ จะต้องใช้คำสั่ง JOIN เพื่อเชื่อมข้อมูลระหว่างตารางมาแสดงผลตามโจทย์ที่ต้องการคำตอบ


<aside> 📝

Query for create example table and record

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> 📝

Example Table and Record

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 clause

คำสั่ง JOIN สามารถเรียกใช้ได้ทั้งหมด 4 แบบคือ

  1. INNER JOIN - แสดงค่าที่ทั้งสองตารางมีตรงกัน
  2. LEFT JOIN - แสดงค่าทั้งหมดของตารางฝั่งซ้าย และแสดงค่าที่แมทซ์กับตารางฝั่งขวา
  3. RIGHT JOIN - แสดงค่าทั้งหมดของตารางฝั่งขวา และแสดงค่าที่แมทซ์กับตารางฝั่งซ้าย
  4. FULL JOIN - แสดงค่าทั้งหมดของทั้งสองตาราง โดยไม่สนว่ามีข้อมูลไหนตรงหรือไม่ตรงกัน </aside>

<aside> 📝

INNER JOIN

แสดงค่าที่ทั้งสองตารางมีตรงกัน คล้ายๆ กับคอนเซปของ Intersect ในคณิตศาสตร์

Screenshot 2568-02-01 at 11.17.56.png

คำสั่งใน 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> 📝

LEFT JOIN

แสดงค่าทั้งหมดของตารางฝั่งซ้าย และแสดงค่าที่แมทซ์กับตารางฝั่งขวา

Screenshot 2568-02-01 at 11.25.00.png

คำสั่ง 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> 📝

RIGHT JOIN

แสดงค่าทั้งหมดของตารางฝั่งขวา และแสดงค่าที่แมทซ์กับตารางฝั่งซ้าย

Screenshot 2568-02-01 at 11.27.25.png

คำสั่ง 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> 📝

FULL JOIN

แสดงค่าทั้งหมดของทั้งสองตาราง โดยไม่สนว่ามีข้อมูลไหนตรงหรือไม่ตรงกัน

Screenshot 2568-02-01 at 11.27.43.png

คำสั่ง 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>