INNER JOIN คืออะไร? รวมข้อมูลเฉพาะที่มีค่าตรงกัน
จากบทที่แล้ว เราได้รู้จักกับการ JOIN ตารางใน MySQL ไปแล้ว ซึ่งเป็นวิธีการรวมข้อมูลจากหลายตารางที่เกี่ยวข้องกัน ในบทนี้ เราจะเจาะลึกไปที่ INNER JOIN ซึ่งเป็นประเภทการ JOIN ที่ใช้บ่อยที่สุด และเป็นพื้นฐานสำคัญในการทำความเข้าใจการ JOIN ประเภทอื่นๆ
INNER JOIN คือการรวมข้อมูลจากสองตารางขึ้นไป โดยจะเลือกเฉพาะแถวที่มีค่าในคอลัมน์ที่ใช้เชื่อมโยง (JOIN condition) ตรงกันเท่านั้น ถ้าไม่มีค่าที่ตรงกันในตารางใดตารางหนึ่ง แถวนั้นจะไม่ถูกรวมอยู่ในผลลัพธ์
เชื่อมโยงข้อมูลที่มีค่าตรงกัน: หลักการทำงานของ INNER JOIN
ลองนึกภาพว่าเรามีสองตาราง:
customers: เก็บข้อมูลลูกค้า (customer_id,customer_name,email)orders: เก็บข้อมูลการสั่งซื้อ (order_id,customer_id,order_date)
ทั้งสองตารางมีความสัมพันธ์กันผ่าน customer_id ในตาราง customers เป็น Primary Key และในตาราง orders เป็น Foreign Key
ถ้าเราต้องการทราบว่าลูกค้าแต่ละคนสั่งซื้ออะไรบ้าง เราสามารถใช้ INNER JOIN เพื่อรวมข้อมูลจากทั้งสองตาราง โดยมีเงื่อนไขว่า customer_id ในทั้งสองตารางต้องตรงกัน
รูปแบบคำสั่ง INNER JOIN
รูปแบบคำสั่ง SQL สำหรับ INNER JOIN คือ:
SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
SELECT column1, column2, ...: ระบุคอลัมน์ที่เราต้องการดึงข้อมูลFROM table1: ระบุตารางแรกINNER JOIN table2: ระบุตารางที่สองที่เราต้องการJOINด้วยON table1.column_name = table2.column_name: ระบุเงื่อนไขการJOINโดยcolumn_nameคือคอลัมน์ที่ใช้เชื่อมโยงระหว่างสองตาราง
ตัวอย่างการใช้งาน INNER JOIN
สมมติว่าเรามีข้อมูลในตาราง customers ดังนี้:
INSERT INTO customers (customer_id, customer_name, email) VALUES
(1, 'Alice Smith', 'alice.smith@example.com'),
(2, 'Bob Johnson', 'bob.johnson@example.com'),
(3, 'Charlie Brown', 'charlie.brown@example.com');
และข้อมูลในตาราง orders ดังนี้:
INSERT INTO orders (order_id, customer_id, order_date) VALUES
(101, 1, '2023-10-26'),
(102, 2, '2023-10-27'),
(103, 1, '2023-10-28');
เราสามารถใช้คำสั่ง INNER JOIN เพื่อดึงข้อมูลชื่อลูกค้าและวันที่สั่งซื้อของลูกค้าแต่ละคนได้ดังนี้:
SELECT customers.customer_name, orders.order_date
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
ผลลัพธ์ที่ได้คือ:
+---------------+------------+
| customer_name | order_date |
+---------------+------------+
| Alice Smith | 2023-10-26 |
| Bob Johnson | 2023-10-27 |
| Alice Smith | 2023-10-28 |
+---------------+------------+
จะเห็นว่าเราได้ข้อมูลชื่อลูกค้าและวันที่สั่งซื้อ เฉพาะลูกค้าที่มีข้อมูลการสั่งซื้อในตาราง orders เท่านั้น ลูกค้า Charlie Brown ถึงแม้จะมีอยู่ในตาราง customers แต่ไม่มีข้อมูลการสั่งซื้อในตาราง orders จึงไม่ปรากฏในผลลัพธ์
ความสัมพันธ์ของ Primary Key และ Foreign Key
INNER JOIN มักจะใช้ร่วมกับความสัมพันธ์ระหว่าง Primary Key และ Foreign Key เพื่อเชื่อมโยงข้อมูลจากตารางที่เกี่ยวข้องกัน
- Primary Key: เป็นคอลัมน์หรือกลุ่มของคอลัมน์ที่ใช้ระบุแต่ละแถวในตารางได้อย่างไม่ซ้ำกัน (Unique)
- Foreign Key: เป็นคอลัมน์ในตารางหนึ่งที่อ้างอิงไปยัง Primary Key ในอีกตารางหนึ่ง สร้างความสัมพันธ์ระหว่างสองตาราง
ในตัวอย่างข้างต้น customer_id ในตาราง customers เป็น Primary Key และ customer_id ในตาราง orders เป็น Foreign Key ที่อ้างอิงไปยัง customer_id ในตาราง customers
การใช้ INNER JOIN ร่วมกับ Primary Key และ Foreign Key ช่วยให้เราสามารถดึงข้อมูลที่เกี่ยวข้องจากหลายตารางได้อย่างมีประสิทธิภาพและถูกต้อง
การ Alias ตารางเพื่อความสะดวก
เมื่อเรา JOIN หลายตาราง อาจทำให้คำสั่ง SQL ยาวและอ่านยาก เราสามารถใช้ Alias เพื่อกำหนดชื่อย่อให้กับตารางได้
ตัวอย่าง:
SELECT c.customer_name, o.order_date
FROM customers AS c
INNER JOIN orders AS o
ON c.customer_id = o.customer_id;
ในตัวอย่างนี้ เรากำหนด Alias c ให้กับตาราง customers และ Alias o ให้กับตาราง orders ทำให้เราสามารถอ้างอิงถึงคอลัมน์ในแต่ละตารางได้ง่ายขึ้น เช่น c.customer_name แทนที่จะต้องเขียน customers.customer_name
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
กรณีใช้งานจริง:
สมมติว่าเรามีตาราง products เก็บข้อมูลสินค้า (product_id, product_name, price) และตาราง order_items เก็บข้อมูลรายการสินค้าในแต่ละการสั่งซื้อ (order_id, product_id, quantity)
เราสามารถใช้ INNER JOIN เพื่อดึงข้อมูลรายการสินค้าในแต่ละการสั่งซื้อ พร้อมทั้งชื่อสินค้าและราคาได้ดังนี้:
SELECT o.order_id, p.product_name, p.price, oi.quantity
FROM order_items AS oi
INNER JOIN products AS p
ON oi.product_id = p.product_id
INNER JOIN orders AS o
ON oi.order_id = o.order_id;
ในตัวอย่างนี้ เรา JOIN สามตารางเข้าด้วยกัน (order_items, products, และ orders) เพื่อดึงข้อมูลที่เกี่ยวข้องทั้งหมด
ข้อผิดพลาดที่พบบ่อย:
- ลืมระบุเงื่อนไขการ JOIN (ON clause): การลืมระบุเงื่อนไขการ
JOINจะทำให้เกิด Cartesian Product ซึ่งเป็นการรวมทุกแถวจากตารางแรกเข้ากับทุกแถวจากตารางที่สอง ทำให้ได้ผลลัพธ์จำนวนมากเกินความจำเป็นและอาจทำให้ระบบทำงานช้า - ใช้ชื่อคอลัมน์ซ้ำกัน: หากสองตารางมีคอลัมน์ชื่อเดียวกัน ควรระบุชื่อตารางก่อนชื่อคอลัมน์เสมอ เพื่อหลีกเลี่ยงความสับสน เช่น
customers.customer_idและorders.customer_id - เงื่อนไขการ JOIN ไม่ถูกต้อง: การใช้เงื่อนไขการ
JOINที่ไม่ถูกต้อง จะทำให้ได้ผลลัพธ์ที่ไม่ถูกต้องหรือไม่ตรงตามที่ต้องการ
สรุป
INNER JOIN เป็นเครื่องมือที่มีประสิทธิภาพในการรวมข้อมูลจากหลายตารางที่เกี่ยวข้องกัน โดยจะเลือกเฉพาะแถวที่มีค่าในคอลัมน์ที่ใช้เชื่อมโยงตรงกันเท่านั้น การเข้าใจหลักการทำงานของ INNER JOIN และการใช้งานร่วมกับ Primary Key และ Foreign Key จะช่วยให้เราสามารถดึงข้อมูลที่ต้องการได้อย่างถูกต้องและมีประสิทธิภาพ
ในบทต่อไป เราจะเรียนรู้เกี่ยวกับ LEFT JOIN ซึ่งเป็นอีกประเภทการ JOIN ที่สำคัญและมีประโยชน์ในการดึงข้อมูลจากตารางหนึ่ง แม้ว่าจะไม่มีข้อมูลที่ตรงกันในอีกตารางหนึ่งก็ตาม