มาทำความเข้าใจและวิธีเชื่อมตาราง กับ สร้างเงื่อนไขใน SQL กันคับ
โดยแอดใช้แพลตฟอร์ม SQL LITE : https://sqliteonline.com/ สำหรับการเขียนโค้ดขึ้นมาและสอนวันนี้นะครับ อธิบายเกริ่นๆ ก่อนว่า
การ Join นั้นคือการเชื่อมตารางอีกตารางนึงเข้าหากัน เราสามารถ Join ได้เรื่อยๆ ครับไม่จำกัด
ส่วนการสร้างเงื่อนไข IF / Else เราใช้ Function Case When ซึ่งเหมือนในภาษา Programming ต่างๆเลยครับ เช่น Google Sheet , R , Python
เราจะมาเรียนหัวข้อหลักๆ 2 หัวข้อวันนี้ครับ
- การ Join (INNER , LEFT , RIGHT, FULL)
- การสร้างเงื่อนไข Case When (IF/Else)
การ JOIN (INNER , LEFT , RIGHT, FULL)
การ Join ใน SQL (INNER, LEFT, RIGHT, FULL)
การ Join ใน SQL เป็นกระบวนการที่ใช้รวมข้อมูลจากหลายตารางเข้าด้วยกัน โดยมีเงื่อนไขการเชื่อมโยงที่กำหนดไว้ ซึ่งแต่ละประเภทของการ Join มีจุดประสงค์และการใช้งานที่แตกต่างกัน ในบทความนี้ เราจะอธิบายประเภทของ Join พร้อมตัวอย่างที่เข้าใจง่าย ซึ่งเราใช้ 2 ตารางนี้เป็นข้อมูลหลักในการอธิบายนะครับ
เตรียมข้อมูล
- Table A (ข้อมูลสินค้า):
| product_id | product_name |
|---|---|
| 1 | โทรศัพท์ |
| 2 | คอมพิวเตอร์ |
| 3 | หูฟัง |
- Table B (ข้อมูลราคา):
| product_id | price |
| 1 | 10000 |
| 3 | 1500 |
1. INNER JOIN
INNER JOIN คือ ดึงข้อมูลที่เหมือนกันมา Join ถ้าไม่เหมือนจะไม่แสดง
Query:
SELECT A.product_name, B.price -- เลือกข้อมูลที่ต้องการแสดง
FROM TableA A -- เลือกตาราแรก
INNER JOIN TableB B --ตาราที่จะ Join
ON A.product_id = B.product_id; -- Join Column ที่เหมือกัน
ผลลัพธ์:
| product_name | price |
| โทรศัพท์ | 10000 |
| หูฟัง | 1500 |
อธิบาย: ข้อมูลจะดึงเฉพาะ product_id ที่เหมือนกันคือ 1 กับ 3
2. LEFT JOIN
LEFT JOIN คือการดึงข้อมูลทั้งหมดจากตารางซ้าย (TableA) และข้อมูลที่ตรงกันจากตารางขวา (TableB) หากไม่มีข้อมูลในตารางขวา จะเติมค่า NULL
Query:
SELECT A.product_name, B.price
FROM TableA A -- ตารางแรกจะเป็นฐาน ที่ใช้ ตารางสองเข้ามา
LEFT JOIN TableB B
ON A.product_id = B.product_id;
ผลลัพธ์:
| product_name | price |
| โทรศัพท์ | 10000 |
| คอมพิวเตอร์ | NULL |
| หูฟัง | 1500 |
อธิบาย: ตารางซ้าย (TableA) จะถูกแสดงทั้งหมด ถ้าเชื่อมแล้วมีข้อมูลไม่เหมือนกัน (TableB) จะถูกแทนที่ด้วยค่า Null
3. RIGHT JOIN
RIGHT JOIN คือการดึงข้อมูลทั้งหมดจากตารางขวา (TableB) และข้อมูลที่ตรงกันจากตารางซ้าย (TableA) หากไม่มีข้อมูลในตารางซ้าย จะเติมค่า NULL (เหมือน Left Join ครับ เปลี่ยนจาก ซ้ายเป็นขวา )
Query:
SELECT A.product_name, B.price
FROM TableA A
RIGHT JOIN TableB B -- ตารางที่สองจะเป็นฐาน ให้ตารางแรกเข้ามา
ON A.product_id = B.product_id;
ผลลัพธ์:
| product_name | price |
| โทรศัพท์ | 10000 |
| หูฟัง | 1500 |
อธิบาย: ตารางขวา (TableB) จะถูกแสดงทั้งหมด แม้ว่าข้อมูลบางแถวจะไม่มีคู่ในตารางซ้าย (TableA)
4. FULL JOIN
FULL JOIN คือการดึงข้อมูลทั้งหมดจากทั้งสองตาราง หากไม่มีข้อมูลที่ตรงกัน จะเติมค่า NULL
Query:
SELECT A.product_name, B.price
FROM TableA A
FULL JOIN TableB B
ON A.product_id = B.product_id;
ผลลัพธ์:
| product_name | price |
| โทรศัพท์ | 10000 |
| คอมพิวเตอร์ | NULL |
| หูฟัง | 1500 |
อธิบาย: ทุกแถวจากทั้งสองตารางจะถูกแสดง โดยข้อมูลที่ไม่มีคู่จะถูกเติมด้วยค่า NULL
สรุปความแตกต่างของการ Join แต่ละประเภท
| ประเภท | ตารางซ้าย (Left) | ตารางขวา (Right) | เงื่อนไขที่ตรงกัน | ค่า NULL |
| INNER JOIN | เฉพาะแถวที่ตรงกัน | เฉพาะแถวที่ตรงกัน | ✅ | ไม่มี |
| LEFT JOIN | ✅ | เฉพาะแถวที่ตรงกัน | ✅ | เติม NULL ที่ขวา |
| RIGHT JOIN | เฉพาะแถวที่ตรงกัน | ✅ | ✅ | เติม NULL ที่ซ้าย |
| FULL JOIN | ✅ | ✅ | ✅ | เติม NULL ทั้งสองฝั่ง |
เคล็ดลับในการใช้งาน Join :
- ตรวจสอบความสัมพันธ์ระหว่างตาราง: ตรวจสอบว่าคอลัมน์ที่ใช้ในเงื่อนไข
ONมีความสัมพันธ์กัน เช่น Primary Key กับ Foreign Key (ชื่อ Column เหมือนกัน) - ระบุประเภท Join ให้เหมาะสม: ใช้ INNER JOIN สำหรับข้อมูลที่ต้องการเฉพาะส่วนที่ตรงกัน และใช้ LEFT หรือ FULL JOIN เมื่อข้อมูลทั้งหมดมีความสำคัญ
- จัดการประสิทธิภาพ: หากตารางมีข้อมูลจำนวนมาก ใช้ Index เพื่อเพิ่มความเร็วในการ Join
หากเรา Join เฉยๆ Default จะเป็น INNER JOIN นะครับ
CASE WHEN
CASE WHEN เป็นคำสั่งที่ใช้ในการสร้างเงื่อนไขใน SQL เพื่อกำหนดผลลัพธ์ที่แตกต่างกันในแต่ละสถานการณ์ คล้ายกับการใช้ if-else ในภาษาโปรแกรมมิ่งอื่น ๆ โดยสามารถใช้ในคำสั่ง SELECT, UPDATE, หรือแม้แต่ ORDER BY ได้ครับ
รูปแบบคำสั่ง CASE WHEN
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
- CASE : เปิดเงื่อนไข
- WHEN: สร้างเงื่อน ( IF , ถ้า )
- THEN: ระบุผลลัพธ์ที่จะคืนค่าเมื่อเงื่อนไขเป็นจริง (ถ้า When เป็นจริง)
- ELSE: หากไม่มีเงื่อนไขใดเป็นจริงให้ ระบุบว่า ” default_result ” (ไม่จำเป็นต้องระบุ แต่แนะนำให้ใช้เพื่อความครบถ้วน)
- END: ใช้ปิดคำสั่ง CASE
ตัวอย่างการใช้งาน CASE WHEN
1. การคำนวณคะแนนและกำหนดเกรด
สมมติว่ามีตารางชื่อ Students ที่มีคอลัมน์ score ต้องการคำนวณเกรดตามคะแนน:
| student_id | name | score |
|---|---|---|
| 1 | สมชาย | 85 |
| 2 | สมศรี | 70 |
| 3 | สมปอง | 50 |
Query: สร้างเงื่อนไขเพื่อคำนวณเกรด
SELECT
student_id,
name,
score,
CASE
WHEN score >= 80 THEN 'A' -- ถ้า score มากกว่าหรือเท่ากับให้ขึ้น A
WHEN score >= 70 THEN 'B'
WHEN score >= 60 THEN 'C'
WHEN score >= 50 THEN 'D'
ELSE 'F' -- คะแนนต่ำกว่า 50 ขึ้น F
END AS grade
FROM Students;
ผลลัพธ์:
| student_id | name | score | grade |
| 1 | สมชาย | 85 | A |
| 2 | สมศรี | 70 | B |
| 3 | สมปอง | 50 | D |
ผลลัพธ์ได้แบบนี้เลยครับ ง่ายมากก
2. การจัดกลุ่มข้อมูลตามเงื่อนไข
สมมติว่ามีตาราง Orders ที่มีคอลัมน์ order_amount และต้องการจัดกลุ่มคำสั่งซื้อว่าเป็น “เล็ก”, “กลาง”, หรือ “ใหญ่”:
| order_id | customer_name | order_amount |
| 101 | คุณหนึ่ง | 500 |
| 102 | คุณสอง | 1200 |
| 103 | คุณสาม | 3000 |
Query: สร้างเงื่อนไขจัดกลุ่ม
SELECT
order_id,
customer_name,
order_amount,
CASE
WHEN order_amount < 1000 THEN 'เล็ก' --น้อยกว่า 1000 เล็ก
WHEN order_amount BETWEEN 1000 AND 2000 THEN 'กลาง'
ELSE 'ใหญ่'
END AS order_size
FROM Orders;
เราสามารถใช้ BETWEEN , AND สำหรับระบุช่วงค่าระหว่างกลางได้
ผลลัพธ์:
| order_id | customer_name | order_amount | order_size |
| 101 | คุณหนึ่ง | 500 | เล็ก |
| 102 | คุณสอง | 1200 | กลาง |
| 103 | คุณสาม | 3000 | ใหญ่ |
3. การใช้ใน ORDER BY เพื่อจัดลำดับตามเงื่อนไข
สมมติว่าต้องการจัดลำดับข้อมูลในตาราง Employees ตามตำแหน่ง (Position) โดยให้ผู้จัดการ (Manager) ขึ้นก่อน ตามด้วยพนักงาน (Staff):
| employee_id | name | position |
| 1 | นาย A | Staff |
| 2 | นางสาว B | Manager |
| 3 | นาย C | Staff |
Query:
SELECT
employee_id,
name,
position
FROM Employees
ORDER BY
CASE
WHEN position = 'Manager' THEN 1
ELSE 2
END;
ผลลัพธ์:
| employee_id | name | position |
| 2 | นางสาว B | Manager |
| 1 | นาย A | Staff |
| 3 | นาย C | Staff |
เคล็ดลับในการใช้งาน CASE WHEN
- ระวังลำดับของ WHEN: เงื่อนไขจะถูกตรวจสอบจากบนลงล่าง ดังนั้นควรเรียงลำดับให้เหมาะสมเพื่อหลีกเลี่ยงข้อผิดพลาด
- ใช้ ELSE เพื่อความปลอดภัย: การเพิ่ม ELSE ช่วยให้มั่นใจได้ว่าจะครอบคลุมทุกกรณีที่อาจเกิดขึ้น
- สามารถซ้อน CASE ได้: ในบางสถานการณ์ สามารถซ้อนคำสั่ง CASE เพื่อจัดการเงื่อนไขที่ซับซ้อนได้
เป็นอย่างไรกันบ้างครับ หวังว่าบทความนี้จะช่วยให้คุณเข้าใจการ Join และ การสร้างเงื่อนไขใน SQL ได้นะครับบ ภูมิใจทุกคนมากที่อ่านมาถึงตรงนี้ ขอบคุณและเก่งๆมากค้าบทุกคน 👏😊

Leave a comment