ในการเรียกดูข้อมูลย่อมหลีกเลี่ยงไม่ได้ว่า เราจะต้องมีการเชื่อมตารางข้อมูลตั้งแต่ 2 ตารางขึ้นไปเพื่อดูความสัมพันธ์ของข้อมูล เพราะฉะนั้นการเรียกดูข้อมูลระหว่าง 2 ตารางใดๆเราจะเรียกใช้ sql statment “JOIN” ซึ่งมีทั้ง “LEFT JOIN”, “RIGHT JOIN” หรือ “JOIN” ปกติ โดยแต่ละระบบฐานข้อมูล การเรียกใช้ JOIN ทั้ง 3 แบบอาจแตกต่างกันได้ เช่น บนระบบฐานข้อมูล Oracle การใช้ LEFT JOIN จะใช้สัญลักษณ์ (+) แทน เป็นต้น
คราวนี้เรามาดูตัวอย่างการเรียกข้อมูลระหว่าง 2 ตาราง ด้วยการ JOIN ทั้ง 3 แบบว่า จะได้ผลลัพธ์ที่แตกต่างกันอย่าง เพื่อให้เราเลือกใช้ได้ตรงกับความต้องการครับ
ตัวอย่างข้อมูล
สมมติว่ามีตารางเก็บข้อมูล 2 ตารางคือ
1. login_log เก็บข้อมูลการ login เข้าระบบ โดยมีตัวอย่างข้อมูลดังนี้
login_id |
login_date |
login_ip |
login_usr |
1 |
1/17/2014 3:44 |
171.7.149.122 |
mola |
2 |
1/17/2014 3:46 |
171.7.149.122 |
mola |
3 |
1/17/2014 3:54 |
209.85.238.131 |
alan |
4 |
1/17/2014 3:54 |
209.85.238.131 |
alan |
5 |
1/17/2014 4:58 |
119.56.116.44 |
johny |
6 |
1/17/2014 6:10 |
79.152.139.49 |
susan |
7 |
1/17/2014 6:12 |
79.147.186.15 |
crysty |
8 |
1/17/2014 6:13 |
89.7.134.18 |
mola |
9 |
1/17/2014 6:17 |
46.222.224.56 |
mola |
10 |
1/17/2014 9:37 |
171.7.149.122 |
mola |
|
2. search_log เก็บข้อมูลการเข้ามา search ข้อมูลจากตารางต่างๆ มีตัวอย่างข้อมูลดังนี้
search_id |
search_date |
search_ip |
search_tab |
1 |
1/17/2014 3:54 |
209.85.238.131 |
customer_info |
2 |
1/17/2014 3:54 |
209.85.238.131 |
customer_info |
3 |
1/17/2014 4:58 |
119.56.116.44 |
asset_info |
4 |
1/17/2014 6:10 |
79.152.139.49 |
company_info |
5 |
1/17/2014 6:12 |
79.147.186.15 |
company_info |
6 |
1/17/2014 6:13 |
89.7.134.18 |
finance_info |
7 |
1/17/2014 6:17 |
46.222.224.56 |
finance_info |
8 |
1/17/2014 9:47 |
209.85.238.131 |
customer_info |
9 |
1/17/2014 9:47 |
209.85.238.131 |
customer_info |
10 |
1/17/2014 12:11 |
199.116.169.254 |
asset_info |
|
จากตัวอย่างข้อมูล สมมติว่าเราต้องการเชื่อม 2 ตาราง เพื่อดูว่าคนที่ Login เข้ามานั้นได้เข้าไปค้นหาข้อมูลในตารางอะไรบ้าง โดยในตัวอย่างกำหนดให้ key ที่ใช้เชื่อมต่อกัน คือ “date”, “ip” นั่นคือตาราง login_log ใช้ (login_date, login_ip) ส่วนตาราง search_log ใช้ (search_date, search_ip) ในการเชื่อมต่อกัน
ตัวอย่างที่ 1 การเชื่อมต่อระหว่าง 2 ตาราง ด้วย “JOIN”
ความหมายของการใช้ “JOIN” ธรรมดา คือ การแสดงข้อมูลระหว่าง 2 ตารางที่มี key ตรงกันเท่านั้น |
ตัวอย่าง sql statment
SELECT a. * , b. *
FROM login_log a JOIN search_log b
ON ( a.login_ip = b.search_ip AND a.login_date = b.search_date )
ORDER BY login_id; |
ผลลัพธ์ที่ได้คือ
login_id |
login_date |
login_ip |
login_usr |
search_id |
search_date |
search_ip |
search_tab |
3 |
2014-01-17 03:54:21 |
209.85.238.131 |
alan |
1 |
2014-01-17 03:54:21 |
209.85.238.131 |
customer_info |
4 |
2014-01-17 03:54:25 |
209.85.238.131 |
alan |
2 |
2014-01-17 03:54:25 |
209.85.238.131 |
customer_info |
5 |
2014-01-17 04:58:48 |
119.56.116.44 |
johny |
3 |
2014-01-17 04:58:48 |
119.56.116.44 |
asset_info |
6 |
2014-01-17 06:10:57 |
79.152.139.49 |
susan |
4 |
2014-01-17 06:10:57 |
79.152.139.49 |
company_info |
7 |
2014-01-17 06:12:34 |
79.147.186.15 |
crysty |
5 |
2014-01-17 06:12:34 |
79.147.186.15 |
company_info |
8 |
2014-01-17 06:13:10 |
89.7.134.18 |
mola |
6 |
2014-01-17 06:13:10 |
89.7.134.18 |
finance_info |
9 |
2014-01-17 06:17:15 |
46.222.224.56 |
mola |
7 |
2014-01-17 06:17:15 |
46.222.224.56 |
finance_info |
|
จากผลลัพธ์จะเห็นว่าข้อมูลที่แสดงกลับออกมามีจำนวนไม่เท่ากับข้อมูลที่มี ตาราง login_log มี 10 records และ ตาราง search_log มี 10 records แต่แสดงผลเฉพาะที่ key ตรงกันเท่านั้น
ตัวอย่างที่ 2 การเชื่อมต่อระหว่าง 2 ตาราง ด้วย “LEFT JOIN”
ความหมายของการใช้ “LEFT JOIN” คือ การแสดงข้อมูลระหว่าง 2 ตารางที่มี key ตรงกันหรือไม่ก็ได้ โดยยึดข้อมูลจากตารางด้านซ้ายมือ(Left Table) เป็นหลัก |
ตัวอย่าง sql statment
SELECT a. * , b. *
FROM login_log a LEFT JOIN search_log b
ON ( a.login_ip = b.search_ip AND a.login_date = b.search_date )
ORDER BY login_id; |
ผลลัพธ์ที่ได้คือ
login_id |
login_date |
login_ip |
login_usr |
search_id |
search_date |
search_ip |
search_tab |
1 |
2014-01-17 03:44:20 |
171.7.149.122 |
mola |
NULL |
NULL |
NULL |
NULL |
2 |
2014-01-17 03:46:22 |
171.7.149.122 |
mola |
NULL |
NULL |
NULL |
NULL |
3 |
2014-01-17 03:54:21 |
209.85.238.131 |
alan |
1 |
2014-01-17 03:54:21 |
209.85.238.131 |
customer_info |
4 |
2014-01-17 03:54:25 |
209.85.238.131 |
alan |
2 |
2014-01-17 03:54:25 |
209.85.238.131 |
customer_info |
5 |
2014-01-17 04:58:48 |
119.56.116.44 |
johny |
3 |
2014-01-17 04:58:48 |
119.56.116.44 |
asset_info |
6 |
2014-01-17 06:10:57 |
79.152.139.49 |
susan |
4 |
2014-01-17 06:10:57 |
79.152.139.49 |
company_info |
7 |
2014-01-17 06:12:34 |
79.147.186.15 |
crysty |
5 |
2014-01-17 06:12:34 |
79.147.186.15 |
company_info |
8 |
2014-01-17 06:13:10 |
89.7.134.18 |
mola |
6 |
2014-01-17 06:13:10 |
89.7.134.18 |
finance_info |
9 |
2014-01-17 06:17:15 |
46.222.224.56 |
mola |
7 |
2014-01-17 06:17:15 |
46.222.224.56 |
finance_info |
10 |
2014-01-17 09:37:58 |
171.7.149.122 |
mola |
NULL |
NULL |
NULL |
NULL |
|
จากผลลัพธ์เราจะเห็นว่าข้อมูลที่แสดงกลับมาจะมีจำนวนเท่ากับตารางด้านซ้าย นั่นคือ login_log โดยผลการเชื่อมกับตาราง search_log จะมีบาง records ที่มีค่าเป็น “NULL” นั่นเพราะว่าในตาราง search_log ไม่มีข้อมูลที่มี key ตรงกันนั่นเอง
ตัวอย่างที่ 3 การเชื่อมต่อระหว่าง 2 ตาราง ด้วย “RIGHT JOIN”
ความหมายของการใช้ “RIGHT JOIN” คือ การแสดงข้อมูลระหว่าง 2 ตารางที่มี key ตรงกันหรือไม่ก็ได้ โดยยึดข้อมูลจากตารางด้านขวามือ(Right Table) เป็นหลัก |
ตัวอย่าง sql statment
SELECT a. * , b. *
FROM login_log a RIGHT JOIN search_log b
ON ( a.login_ip = b.search_ip AND a.login_date = b.search_date )
ORDER BY login_id; |
ผลลัพธ์ที่ได้คือ
login_id |
login_date |
login_ip |
login_usr |
search_id |
search_date |
search_ip |
search_tab |
NULL |
NULL |
NULL |
NULL |
10 |
2014-01-17 12:11:36 |
199.116.169.254 |
asset_info |
NULL |
NULL |
NULL |
NULL |
8 |
2014-01-17 09:47:48 |
209.85.238.131 |
customer_info |
NULL |
NULL |
NULL |
NULL |
9 |
2014-01-17 09:47:51 |
209.85.238.131 |
customer_info |
3 |
2014-01-17 03:54:21 |
209.85.238.131 |
alan |
1 |
2014-01-17 03:54:21 |
209.85.238.131 |
customer_info |
4 |
2014-01-17 03:54:25 |
209.85.238.131 |
alan |
2 |
2014-01-17 03:54:25 |
209.85.238.131 |
customer_info |
5 |
2014-01-17 04:58:48 |
119.56.116.44 |
johny |
3 |
2014-01-17 04:58:48 |
119.56.116.44 |
asset_info |
6 |
2014-01-17 06:10:57 |
79.152.139.49 |
susan |
4 |
2014-01-17 06:10:57 |
79.152.139.49 |
company_info |
7 |
2014-01-17 06:12:34 |
79.147.186.15 |
crysty |
5 |
2014-01-17 06:12:34 |
79.147.186.15 |
company_info |
8 |
2014-01-17 06:13:10 |
89.7.134.18 |
mola |
6 |
2014-01-17 06:13:10 |
89.7.134.18 |
finance_info |
9 |
2014-01-17 06:17:15 |
46.222.224.56 |
mola |
7 |
2014-01-17 06:17:15 |
46.222.224.56 |
finance_info |
|
ผลลัพธ์ที่ได้จะมีจำนวนข้อมูลตามตารางทางขวา คือ search_log โดยตารางที่เชื่อมต่อจะมีข้อมูลหรือไม่ก็ได้ ถ้าไม่มีก็จะแสดงค่าเป็น “NULL” นั่นเอง
เพราะฉะนั้นการเรียกใช้ statment JOIN, LEFT JOIN, RIGHT JOIN ก็จะอยู่ที่ว่าเราต้องการข้อมูลแบบไหนนั่นเองครับ
จำง่ายๆคือ
- JOIN แสดงข้อมูลเฉพาะที่ตรงกัน
- LEFT JOIN แสดงข้อมูลจากตารางด้านซ้ายมือเป็นหลัก
- RIGHT JOIN แสดงข้อมูลจากตารางด้านขวามือเป็นหลัก
|