การเชื่อมตาราง
ในการปฏิบัติงานจริงข้อมูลที่เก็บในฐานข้อมูลจะประกอบด้วยข้อมูลในหลายตารางซึ่งมีความสัมพันธ์กัน ดังนั้นจึงมีหลายคำถามซึ่งไม่สามารถตอบคำถามได้ ด้วยการดึงหรืออ่านข้อมูลจากตารางเพียงตารางเดียว แต่ต้องทำการสอบถามข้อมูลจากหลายตารางพร้อมๆ กัน โดยอาศัยคอลัมน์ที่ตรงกันของสองตารางมาเชื่อมสัมพันธ์กัน และเรียกความสัมพันธ์นี้ว่า “JOIN”
เตรียมข้อมูล
Customer |
CFirst |
CLast |
CAdress |
City |
Region |
Postal |
Phone |
Payment |
C0001 | พิรพร | หมุนสนิท | 11 ถ.สุขุมวิท คลองตัน | กรุงเทพฯ | กลาง | 10110 | 02952212 | 30 |
C0002 | นวรัตน์ | ธนะรุ่งรัตน์ | 36 ถ.ลาดพร้าว วังทองหลาง | กรุงเทพฯ | กลาง | 10310 | 02952213 | 30 |
C0003 | สุธี | พงศาสกุลชัย | 25 ถ.สุขสวัสดิ์ พระประแดง | สมุทรปราการ | กลาง | 11000 | 02952214 | 15 |
C0004 | สุรเชษฐ์ | วงค์ชัยพรพงษ์ | 72 ถ.วิทยุ ปทุมวัน | กรุงเทพฯ | กลาง | 10330 | 02952215 | 15 |
C0005 | ปิ่นอนงค์ | ศรีงาม | NULL | NULL | NULL | NULL | 02952216 | 15 |
UPDATE Customers
SET CAddress=NULL,City=NULL,Region=NULL,PostalCode=NULL
WHERE CustomerID=’C0005’
SELECT * FROM Customers;
5.1.1 Inner Join
inner join เป็นการจับเอาตาราง 2 ตาราง มารวมกัน โดยยึดหลักว่า ข้อมูลจะต้องมีตรงกัน ในทั้งสองตาราง ถึงจะเอามา
รูปแบบของคำสั่ง INNER JOIN
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
ตัวอย่างการใช้คำสั่ง SQL INNER JOIN
ตาราง Persons
P_Id |
LastName | FirstName | Address | City |
1 | Hensen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Petterson | Kari | Storgt 20 | Stavanger |
ตาราง Oders
O_Id |
OrderNo | P_Id |
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 15 |
ใช้คำสั่ง
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
ได้ผลลัพธ์ดังนี้
LastName |
FirstName | OrderNo |
Hensen | Ola | 22456 |
Hensen | Ola | 24562 |
Petterson | Kari | 77895 |
Petterson | Kari | 44678 |
Equijoin และ Non- Equijoin
Equijoin เป็นรูปแบบการ Join มาตรฐานของ Inner Join จะระบุเงื่อนไขด้วยเครื่องหมายเท่ากับ (=)และในเงื่อนไขต้องระบุชื่อคอลัมน์ของตาราง 1 เท่ากับชื่อคอลัมน์ของตาราง 2 มีรูปแบบคำสั่งดังนี้
ชื่อตาราง1 Inner Join ชื่อตาราง2 ON ชื่อตาราง1.ชื่อคอลัมน์ =ชื่อตาราง2.ชื่อคอลัมน์
Non- Equijoin เป็นการรวมสองตารางขึ้นไปด้วยการเปรียบเทียบค่าในคอลัมน์ของแต่ละตาราง โดยไม่ใช้เครื่องหมายเท่ากับ แต่ใช้เครื่องหมาย <,>,<=,>= ซึ่งมีรูปแบบคำสั่งของ Non- Equijoin จะเหมือนกับ Equijoin
Cross Join
Cross Join หรือเรียกชื่อหนึ่งว่า ผลคูณคาร์ทีเชียน (Cartesian Product) เป็นการ Join โดยที่ไม่ต้องนำประโยค ON มาใช้เป็นเงื่อนไขในการเชื่อมตารางผลคูณของสองตาราง ซึ่งืเป็นการคูณจำนวนแถวทั้งหมดของตาราง 1 กับจำนวนแถวทั้งหมดของตาราง2 มีรูปแบบคำสั่งดังนี้
SELECT ชื่อคอลัมน์1 , ชื่อคอลัมน์2 ,…,ชื่อคอลัมน์n
FROM ตารางที่1
CROSS JOIN ชื่อตารางที่2
Self-Join
เป็นการ Join ที่มีการเปรียบเทียบข้อมูลจากตารางเดียวกัน และต้องกำหนดชื่อรอง (Aliase) ให้กับคอลัมน์ใหม่หรือตารางใหม่ โดยใช้คำสั่ง AS เพื่อใช้อ้างอิงระหว่างคอลัมน์เหมือนกับมี 2 ตาราง
5.1.2 เชื่อมตารางแบบ Outer join
ในการเชื่อมตารางบางครั้งก็อาจอยากจะทราบว่ามีข้อมูลใดในตารางที่ไม่มีในอีกตารางหนึ่ง ซึ่งการสอบถามข้อมูลจะต้องใช้การเชื่อมตารางแบบ Outer join ซึ่งมีรูปแบบการเขียนคือ
SELECT <column_name> FROM <table_name> WHERE table1.column_name (+)= table2.column_name;
หรือ
SELECT <column_name> FROM <table_name> WHERE table1.column_name = table2.column_name (+);
Outer join นี้จะใช้เครื่องหมาย (+) ไว้หลังคอลัมน์ที่ไม่มีข้อมูลที่ตรงกันในอีกตารางหนึ่ง (คือวางหลังตารางที่มีข้อมูลในคอลัมน์นั้นน้อยกว่า จึงสามารถจะอยู่ทางด้านใดด้านหนึ่งของเครื่องหมาย = ใน WHERE ก็ได้ แต่จะใส่ทั้งสองด้านพร้อมกันไม่ได้)
Left Outer Join
การเชื่อมตารางแบบ Left Outer Join จะได้ผลลัพธ์เป็นแถวทั้งหมดในตารางที่อยู่ทางซ้ายของคำสั่ง Left Outer Join ส่วนแถวของตารางทางขวาที่ไม่สามารถจับคู่ได้จะไม่แสดงผลลัพธ์ออกมามีรูปแบบคำสั่งดังนี้
SELECT ชื่อคอลัมน์1 , ชื่อคอลัมน์2 ,…,ชื่อคอลัมน์n
FROM ตารางที่1 LEFT OUTER JOIN ชื่อตารางที่ 2
ON เงื่อนไข
Right Outer Join
Right Outer Join มีรูปแบบการเชื่อมตารางคล้าย Left Outer Join แต่ผลลัพธ์ที่ได้จะมาจากแถวทั้งหมดของตารางที่อยู่ทางขวาของคำสั่ง Right Outer Join ไม่ว่าแถวด้านขวาจะจับคู่กับตารางทางซ้ายหรือไม่ ส่วนแถวที่ไม่สามารถจับคู่ได้ของทางซ้ายจะไม่แสดงผลลัพธ์ออกมา มีรูปแบบคำสั่งดังนี้
SELECT ชื่อคอลัมน์1 , ชื่อคอลัมน์2 ,…,ชื่อคอลัมน์n
FROM ตารางที่1 RIGHT OUTER JOIN ชื่อตารางที่ 2
ON เงื่อนไข