MySQL Tips : Query with Join , Left Join , Right Join

ในการเรียกดูข้อมูลย่อมหลีกเลี่ยงไม่ได้ว่า เราจะต้องมีการเชื่อมตารางข้อมูลตั้งแต่ 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 แสดงข้อมูลจากตารางด้านขวามือเป็นหลัก

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *