การใช้ JOIN ใน SQL


การทำ JOIN ใน SQL คือการนำตาราง 2 ตารางมารวมกัน โดยเงื่อนไขการรวมจะมีดังนี้

  • INNER JOIN เลือกเฉพาะข้อมูลที่มี key ตรงกันเท่านั้นมาแสดง
  • OUTER JOIN นำข้อมูลทั้งหมดมาแสดงแม้ว่า key ไม่ตรงกัน
  • LEFT JOIN ทำการ JOIN ข้อมูลกับตารางที่อยู่ทางซ้าย
  • RIGHT JOIN ทำการ JOIN ข้อมูลกับตารางที่อยู่ทางขวา

ไวยากรณ์ของการ JOIN มีดังนี้

SELECT columns_list 
FROM left_table  { INNER | OUTER | LEFT | RIGHT } JOIN right_table 
     ON  join_condition
WHERE select_condition

ตัวอย่าง กำหนดให้ตาราง A และ B มีข้อมูลดังนี้

TABLE_A
------------------------
id    Name
------------------------
1     John
2     Susan
3     Tony
TABLE_B
------------------------
id    Salary
------------------------
1     23,000
2     12,000
5     32,100

ตัวอย่าง SQL Statement:

SELECT * 
FROM  TABLE_A INNER JOIN TABLE_B 
   ON  TABLE_A.id = TABLE_B.id

ผลการการ JOIN แต่ละแบบจะได้ผลดังนี้:

INNER JOIN: ผลที่ได้จะเห็นว่าข้อมูลที่ไม่ตรงทั้งใน TABLE_A และ TABLE_B จะไม่แสดง

------------------------
id   Name    Salary
------------------------
1    John     23,000
2    Susan   12,000

OUTER JOIN: จะได้ข้อมูลทั้งหมด เท่าที่จะแสดงได้ เช่น ใน TABLE_A มีข้อมูลของ Tony แต่ TABLE_B ไม่มีข้อมูลของ Tony (id 3) ดังนั้นข้อมูลที่ได้ จะมีข้อมูลของ Tony แสดงแต่ไม่มีข้อมูลเงินเดือนของ Tony

------------------------
id   Name    Salary
------------------------
1    John     23,000
2    Susan   12,000
3    Tony
5               32,100

LEFT JOIN: ข้อมูลที่ได้จะยึดข้อมูลในตารางทางซ้ายเป็นหลัก ในที่นี้ให้ TABLE_A เป็น TABLE ด้านซ้าย จะเห็นได้จากข้อมูลใน TABLE_A ซึ่งมีรายชื่อของ John, Susan และ Tony ผลที่ได้ก็จะแสดงข้อมูลของพนักงานทั้ง 3 คน แต่ข้อมูลของ Tony จะไม่มีเงินเดือนแสดง เนื่องจากไม่มีข้อมูลของ Tony อยู่ในตาราง TABLE_B

------------------------
id   Name    Salary
------------------------
1    John     23,000
2    Susan   12,000
3    Tony

RIGHT JOIN: หลักการจะเหมือนกับ LEFT JOIN แต่จะต่างกันตรงที่ข้อมูลที่ได้จะยึดเอาข้อมูลในตารางด้ายขวาเป็นหลัก

------------------------
id   Name    Salary
------------------------
1    John     23,000
2    Susan   12,000
5               32,100

เพิ่มเติม

- ในกรณีที่ต้องการ Join ข้อมูลตั้งแต่ 3 table ขึ้นไป ให้เลือก Table ขึ้นมาสองอันแล้ว Join กันก่อน จากนั้นจึงค่อย Join กับ Table ที่เหลือ เช่น

SELECT Table1.id, Table2.salary, Table3.position
FROM (Table1 INNER JOIN Table2 ON Table1.id = Table2.id) 
    INNER JOIN Table3 ON Table1.id = Table3.id;

- กรณีที่ตารางมี key สำหรับ Join ตารางมีมากกว่าหนึ่ง key สามารถใส่เงื่อนไขการ Join เพิ่มเติมลงไปได้ เช่น ตาราง Employee และ Salary มี Key ที่ใช้ Join กัน คือ Branch_ID (รหัสสาขา) และ Staff_ID (รหัสพนักงานของแต่ละสาขา) ตามตัวอย่างข้างล่าง

Employee
----------------------------------------
Branch_ID    Staff_ID     Name
----------------------------------------
1                 1            John    
1                 2            Susan
1                 3            Tony
2                 1            Harry
2                 2            Tom
Salary
----------------------------------------
Branch_ID    Staff_ID     Staff_Salary
----------------------------------------
1                1            10000
1                2            20000
1                3            30000
2                1            15000
2                2            17000

ถ้าเราต้องการรายชื่อและเงินเดือนของพนักงานในสาขา 2 สามารถเขียน SQL ได้ดังนี้

SELECT Employee.Name, Salary.Staff_Salary
FROM Employee INNER JOIN Salary ON 
        Employee.Branch_id = Salary.Branch_id AND Employee.Staff_ID = Salary.Staff_ID
WHERE Employee.Branch_id = 2

ผลการ Query

----------------------------------------
Name       Salary_Salary
----------------------------------------
Harry       15000
Tom         17000
คำสำคัญ (Tags): #join#sql
หมายเลขบันทึก: 97459เขียนเมื่อ 21 พฤษภาคม 2007 01:42 น. ()แก้ไขเมื่อ 8 พฤศจิกายน 2015 03:03 น. ()สัญญาอนุญาต: ครีเอทีฟคอมมอนส์แบบ แสดงที่มาจำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (14)

ตอนนี้ทำโปรเจกให้หัวข้อเบิกเงินสดย่อยนะค่ะมีปัญหาที่ว่า"""

อยากได้ข้อมูล ของการJOIN ที่ละเอียดมากกว่านี้นะค่ะ

ตอนนี้ติดที่ว่าจะJOIN Table ยังไงให้ได้ข้อมูลfieldของTableที่เรียกมาตรงกัน

อย่างเช่น

เรียกดูข้อมูลจาก Table member กับTable datacashและTable myadd

ซึ้งmemberสร้างเป็นฐานเก็บข้อมูลสมาชิก ซึ้งแสดงให้เห็นถึงข้อมูลผู้สมัครใช้ระบบ

ซึ้งจะเรียกข้อมูลmember มาJOINกับ datacash

ฐานtable datacashเป็นtableที่แสดงการขอเบิกเงินในแต่ละจำนวนจากผู้เบิกคนไหน ใครเป็นผู้รับเงิน ซึ้งจะJOIN เรียก Table member field 'firstname' ส่วน datacash field'price'ให้ข้อมูลชื่อกับราคา

เรียกค่าออกมาได้ตรงกันนะค่ะต้องทำอย่างไร

ช่วยยกตัวอย่าง field ในแต่ละ table ให้ดูหน่อยครับ มันสัมพันธ์กันยังไง แล้วผลลัพธ์ที่ต้องการคืออะไรครับ ผมอ่านข้อมูลที่ให้มาแล้วงงๆ ครับ

แล้วถ้าจะ join มากกว่า 2 ตารางจะเขียนอย่างไรครับ

SELECT *

FROM TABLE_A OUTER JOIN TABLE_B outer join TABLE_C

ON TABLE_A.id = TABLE_B.id and TABLE_A.name = TABLE_c.name

มั่วสนิทครับ รบกวนแนะนำหน่อย

ตอบให้แล้วครับ ผมตอบใน blog ไปเลยนะครับ

ขอบคุณสำหรับความรู้ >> Join ข้อมูลตั้งแต่ 3 table

ถ้ามีเงื่อนไขการจอยที่ ตารางที่ถูก join ต้องมีค่าสูงสุดอ่ะคัรบ สามารถทำได้ป่าว

หากต้องการ join ข้อมูลที่มีค่าสูงสุด ให้ใช้คำสั่ง MAX() ร่วมด้วยซิครับ รายละเอียดศึกษาคำสั่ง max ใน SQL เพิ่มนะครับ

ถ้าแบบว่า join กันในแต่ละตารางแล้วนำมาแสดงรวมกันละคับ

ใช้รวมกับ ORDER BY TABLE ASC ได้ไหมครับ เช่น

SELECT * FROM TABLE_A OUTER JOIN TABLE_B outer join TABLE_C

ON TABLE_A.id = TABLE_B.id and TABLE_A.name = TABLE_c.name

WHERE ORDER BY TABLE_ID ASC

 

แล้วถ้าใน column ที่มา join กัน มีค่าซ้ำมากกว่า 1 ตัว เช่นมี id = {1,1,2,3} จะต้องเรียกอย่างไร ให้ใช้ค่า 1 ค่าเดียวคะ

อยากทราบค่ะคือจอย 3 ตารางลองคิวลี่ในแอฟเซิฟ และโปรแกรม navicat แล้วข้อมูลออกครบ

แต่พอเอาไปใส่ในเว็ป php ข้อมูลที่ควรออกไม่ได้ เช่น PK ของตารางเป็นต้น

ผมมีปัญหาคำสั่ง join แล้วดึงข้อมูลออกมาไม่หมดครับ ตอนนี้ผมทำรายงานเอกสารโครงการอยู่ครับ

select BarcodePR.ProjectCode,BarcodePR.BarcodeTransTime AS Scan1,BarcodePS.BarcodeTransTime AS Scan2

,DATEDIFF(DAY,BarcodePR.BarcodeTransTime,BarcodePS.CreateDate) AS Worktime

from bc_BarcodeTrans AS BarcodePR

inner join bc_BarcodeTrans AS BarcodePS

on BarcodePR.ProjectCode = BarcodePS.ProjectCode

where BarcodePR.Return_status = 0 and BarcodePR.FunctionsID = 0211

and BarcodePS.FunctionsID = 0411


เขาบอกว่าต้องการ 444 รายการ แต่ผมทำมาได้แค่่ 411 รายการครับ
ผมทำในตัวฐานจาก SQL server ครับ


พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท