9. JOIN
การค้นหาและเลือกข้อมูลตามหัวข้อที่ผ่านมาเป็นการทำงานกับ table เดียว ในขณะที่การทำงานจริงต้องมีการเลือกข้อมูลจากหลาย
table เพื่อแสดงสารสนเทศที่ต้องการได้ เนื่องจากหลักการพื้นฐานของ Relational
Database System ให้ออกแบบการจัดเก็บข้อมูลในแต่ละ table สำหรับ entity เดียว
เพื่อขจัดการเก็บข้อมูลที่ซ้ำซ้อน แล้วใช้ความสัมพันธ์ของ table แสดงผลเป็นสารสนเทศที่ต้องการ
JOIN สามารถรับรู้ในประโยคคำสั่ง SQL ถ้ามี table มากกว่า 1 table หลังคีย์เวิร์ด
FROM
ไวยากรณ์
SELECT list-of-columns
FROM table1,table2,..
WHERE search-condition1 = search-condition2, ..
สมมติว่า ในการเก็บข้อมูลการซื้อสินค้า ประกอบด้วย 3 table คือ
1. customer_info เก็บรายละเอียดของลูกค้า
2. purchase_order เก็บรายละเอียดรายการสั่งซื้อ
customer_info
customer_number |
firstname |
lastname |
address |
city |
province |
zip |
|
|
|
|
|
|
|
purchases
customer_number |
buydate |
item |
quantity |
price |
|
|
|
|
|
Key
ในการเชื่อม table ของ SQL มีส่วนสำคัญที่เกี่ยวข้อง คือ Key ซึ่งมีแนวคิด
ดังนี้
primary key เป็นคอลัมน์หรือชุดของคอลัมน์ที่ระบุแบบไม่ซ้ำ
ตัวอย่างเช่น table customer_info มีคอลัมน์ customer_number เป็นคอลัมน์ที่ระบุแบบไม่ซ้ำของ
ซึ่งมีความหมาย 2 อย่าง คือ ประการแรก ไม่มีข้อมูล 2 แถวสามารถมี customer_number
เดียวกัน ถึงแม้ว่า 2 customer_number มีชื่อแรกและชื่อหลังเหมือนกัน ประการที่
2 คอลัมน์ customer_number ทำให้มั่นใจว่าลูกค้า 2 รายนี้ไม่มีความสับสนต่อกัน
เพราะการค้นหาข้อมูลใช้คอลัมน์ customer_number แทนการใช้ชื่อ
foreign key เป็นคอลัมน์ใน table ที่
primary key อยู่ table อื่น ซึ่งหมายความว่า ข้อมูลในคอลัมน์ foreign key
ต้องตรงกับข้อมูลของ primary key ใน table อื่น ใน RDBMS ข้อมูลที่ตรงกัน
รู้จักในฐานะ Reference Integrity ตัวอย่างเช่น table purchases มีคอลัมน์
customer_number เป็น foreign key โดยมี primary key อยู่ใน table customer_info
JOIN ที่กล่าวถึงนี้ เป็น INNER JOIN ซึ่งเป็นประเภทการเชื่อมปกติ
ตัวอย่าง
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info, purchases
WHERE customer_info.customer_number = purchases.customer_number;
ประโยคคำสั่งนี้ แสดงผลลัพธ์ของคอลัมน์ firstname และ lastname จาก table
customer_info และคอลัมน์ item จาก table purchases โดยเชื่อมระหว่าง
table ด้วยคอลัมน์ customer_number ของ 2 table
Notice: แต่ละคอลัมน์นำหน้าด้วย ชื่อ table และจุด ซึ่งไม่มีความจำเป็นในทุกกรณี
แต่จำเป็นถ้าคอลัมน์ที่เรียกมีอยู่ใน 2 table การเขียนด้วยรูปแบบนี้เป็นแบบแผนการเขียนที่ดีในการป้องกันความสับสนในเรื่องที่มาของคอลัมน์และ
table
การเขียนคำสั่งตามมาตรฐานไวยากรณ์ ANSI SQL-92
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info INNER JOIN purchases
ON customer_info.customer_number = purchases.customer_number;
ตัวอย่าง
SELECT employee.employee_id, employee.lastname, employee_sales.comission
FROM employee, employee_sales
WHERE employee.employeeid = employee_sales.employeeid;
ประโยคคำสั่งนี้เลือก employee_id และ lastname จาก table employee และ
comission จาก table employee_sales สำหรับทุกแถวที่ employee_id ใน table
employee ตรงกับ employee_id ใน table employee_sales
|