Kodokon kodokon.com

INNER JOIN: การเชื่อมสองตารางเข้าด้วยกัน

เชื่อมโยงข้อมูลจากสองตารางด้วย INNER JOIN โดยใช้นามแฝงที่อ่านง่ายและเงื่อนไขการเชื่อมที่แม่นยำ

7 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

ฐานข้อมูลจริงไม่เคยเก็บทุกอย่างไว้ในตารางเดียว ลูกค้าอยู่ฝั่งหนึ่ง คำสั่งซื้อของพวกเขาอยู่อีกฝั่งหนึ่ง ในการฝึกโมดูลนี้ ให้เปิด sqliteonline.com ในเบราว์เซอร์ของคุณ (ไม่ต้องติดตั้งอะไร) หรือเปิดเครื่องมือ sqlite3 ในเทอร์มินัล ขั้นแรกให้วางสคริปต์ด้านล่างนี้ มันจะสร้างสองตารางที่ใช้ในบทเรียนนี้

SQL
CREATE TABLE customers (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT
);

CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  amount REAL NOT NULL,
  ordered_at TEXT NOT NULL
);

INSERT INTO customers (id, name, city) VALUES
  (1, 'Alice', 'Lyon'),
  (2, 'Karim', 'Paris'),
  (3, 'Mina', 'Nantes');

INSERT INTO orders
  (id, customer_id, amount, ordered_at)
VALUES
  (1, 1, 49.90, '2026-06-01'),
  (2, 1, 15.00, '2026-06-12'),
  (3, 2, 120.50, '2026-06-15');
สคริปต์เริ่มต้น: รันมันก่อนตัวอย่างที่ตามมา

INNER JOIN ประกอบสองตารางเข้าด้วยกันทีละแถวตามเงื่อนไขการจับคู่ที่เขียนไว้หลัง ON ในที่นี้ คำสั่งซื้อแต่ละรายการเชื่อมกับลูกค้าที่มี id เท่ากับ customer_id ของมัน แถวที่ไม่มีคู่ที่ตรงกันจะถูกตัดออกจากผลลัพธ์ Mina ที่ไม่ได้สั่งซื้ออะไรเลยจึงไม่ปรากฏ

SQL
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
  ON customers.id = orders.customer_id;
คำสั่งซื้อแต่ละรายการพร้อมชื่อของลูกค้า

การเขียนชื่อตารางเต็ม ๆ ซ้ำ ๆ จะทำให้อ่านยากอย่างรวดเร็ว นามแฝง (alias) ที่ประกาศด้วย AS จะเปลี่ยนชื่อตารางตลอดช่วงเวลาของคิวรี จงใส่คำนำหน้าให้คอลัมน์ที่กำกวมเสมอ id มีอยู่ในทั้งสองตาราง ดังนั้นให้เขียน c.id หรือ o.id อย่าเขียน id เดี่ยว ๆ เด็ดขาด

SQL
SELECT c.name, o.amount, o.ordered_at
FROM orders AS o
INNER JOIN customers AS c
  ON c.id = o.customer_id
WHERE o.amount > 20
ORDER BY o.amount DESC;
นามแฝงสั้น ๆ ตัวกรอง และการเรียงลำดับ นี่คือคิวรีแบบมืออาชีพทั่วไป

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. ในการเชื่อมตาราง คำสงวนใดเป็นตัวเริ่มเงื่อนไขการจับคู่ระหว่างสองตาราง?
    • WHERE
    • ON
    • HAVING
    • MATCH
  2. เมื่อใช้ INNER JOIN ระหว่าง customers และ orders จะเกิดอะไรขึ้นกับลูกค้าที่ไม่มีคำสั่งซื้อ?
    • พวกเขาปรากฏพร้อมคอลัมน์ที่เป็น NULL
    • พวกเขาหายไปจากผลลัพธ์
    • คิวรีล้มเหลว
  3. ทำไมจึงเขียน c.id แทน id ในคิวรีที่เชื่อม customers กับ orders?
    • เพื่อให้คิวรีทำงานเร็วขึ้น
    • เพราะ id มีอยู่ในทั้งสองตารางและจะกำกวม
    • เพราะ SQLite บังคับให้ทำเช่นนั้นกับทุกคอลัมน์