DISTINCT ในหลายคอลัมน์
ความไม่ซ้ำกันจากชุดค่าผสม
DISTINCT ในหลายคอลัมน์ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงมีหลายคอลัมน์
คุณทราบอยู่แล้วว่า SELECT DISTINCT ลบแถวที่ซ้ำกันออก แต่คำว่า “ซ้ำ” หมายถึงอะไรเมื่อคิวรีของคุณคืนค่าหลายคอลัมน์
แถวหนึ่งจะถือว่าเป็นรายการซ้ำก็ต่อเมื่อ ทุกคอลัมน์ที่เลือก มีค่าเหมือนกับอีกแถวหนึ่ง หากมีแม้แต่คอลัมน์เดียวที่แตกต่างกัน ระบบจะเก็บทั้งสองแถวไว้
ตารางตัวอย่าง: คำสั่งซื้อ
มาสร้างตาราง คำสั่งซื้อ ขนาดเล็กเพื่อทดลองกัน ตารางนี้จัดเก็บข้อมูลว่าลูกค้ารายใดซื้อสินค้าจากหมวดหมู่ใดและในประเทศใด
CREATE TABLE orders (
id INTEGER,
customer VARCHAR(50),
category VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO orders VALUES
(1, 'Alice', 'Electronics', 'US'),
(2, 'Alice', 'Books', 'US'),
(3, 'Bob', 'Electronics', 'UK'),
(4, 'Alice', 'Electronics', 'US'),
(5, 'Bob', 'Electronics', 'UK'),
(6, 'Carol', 'Clothing', 'CA');DISTINCT กับคอลัมน์เดียว
ขอย้ำสั้น ๆ ว่า การใช้ DISTINCT กับคอลัมน์เดียวจะคืนค่าแต่ละค่าที่ไม่ซ้ำกันของคอลัมน์นั้นเท่านั้น
ในที่นี้เราได้ชื่อลูกค้าที่ไม่ซ้ำกันทั้งหมดเพียงสามแถว แม้ว่าจะมีคำสั่งซื้อหกรายการ
SELECT DISTINCT customer
FROM orders;DISTINCT กับสองคอลัมน์
คราวนี้ให้เพิ่มคอลัมน์ที่สอง คีย์เวิร์ด DISTINCT ยังคงปรากฏเพียงครั้งเดียวหลัง SELECT โดยตรง ฐานข้อมูลจะถือว่า แต่ละคู่ (ลูกค้า, หมวดหมู่) ที่ไม่ซ้ำกัน เป็นหนึ่งแถว
อลิซปรากฏสองครั้ง ครั้งหนึ่งสำหรับอุปกรณ์อิเล็กทรอนิกส์และอีกครั้งสำหรับหนังสือ เพราะเป็นคนละชุดค่าผสมกัน
SELECT DISTINCT customer, category
FROM orders;ตรวจสอบความไม่ซ้ำกันอย่างไร
ฐานข้อมูลจะเปรียบเทียบข้อมูลของแถวทั้งหมด หาก DISTINCT จะลบแถวใดออกได้ คอลัมน์ทั้งหมดในรายการ SELECT ต้องตรงกันกับแถวที่พบไปแล้วทุกประการ
ในตารางคำสั่งซื้อของเรา แถวที่ 3 และ 5 ต่างก็เป็น (บ็อบ, อุปกรณ์อิเล็กทรอนิกส์, UK) ซึ่งตรงกันอย่างสมบูรณ์ทั้งสามคอลัมน์ ดังนั้นหนึ่งในสองแถวนี้จึงถูกลบออก
SELECT DISTINCT customer, category, country
FROM orders;
-- Row (Bob, Electronics, UK) appears only once
-- even though it occurs on rows 3 and 5การตรงกันบางส่วนจะไม่ถูกลบ
อลิซมีสองแถวที่มี หมวดหมู่ = อุปกรณ์อิเล็กทรอนิกส์ แต่ทั้งสองแถวมี ประเทศ = US เมื่อเลือกทั้งสามคอลัมน์ แถวต้นฉบับทั้งสองจึงเหมือนกันทุกประการ และจะเหลือเพียงหนึ่งแถว
เมื่อเปลี่ยนคอลัมน์ที่เลือก การตรวจสอบความไม่ซ้ำกันก็จะเปลี่ยนไปด้วย
-- Select only customer + country
-- (Alice, US) appears twice in the table but DISTINCT keeps it once
SELECT DISTINCT customer, country
FROM orders;
-- Now add category back — uniqueness recalculated
SELECT DISTINCT customer, category, country
FROM orders;กรณีใช้งานจริง: คู่ค่าที่ไม่ซ้ำกัน
รูปแบบที่พบได้บ่อยคือการค้นหาชุดค่าผสมของคุณลักษณะสองรายการที่ไม่ซ้ำกัน — ตัวอย่างเช่น หมวดหมู่สินค้าใดวางจำหน่ายในประเทศใด โดยไม่คำนึงว่าสินค้าแต่ละรายการถูกขายไปกี่ครั้ง
SELECT DISTINCT category, country
FROM orders
ORDER BY category, country;การใช้ DISTINCT ร่วมกับ WHERE
คุณสามารถกรองแถวก่อนด้วย WHERE แล้ว DISTINCT จะลบรายการซ้ำออกจากผลลัพธ์ที่กรองแล้ว ส่วนคำสั่งทั้งสองทำงานแยกจากกัน — WHERE จำกัดข้อมูลให้แคบลง ส่วน DISTINCT จะลบข้อมูลซ้ำออก
SELECT DISTINCT customer, category
FROM orders
WHERE country = 'US';DISTINCT เทียบกับ GROUP BY
อีกวิธีหนึ่งที่ให้ชุดค่าผสมที่ไม่ซ้ำกันคือ GROUP BY ทั้งสองแนวทางให้ผลลัพธ์เหมือนกันเมื่อต้องการลบข้อมูลซ้ำทั่วไป ความแตกต่างจะสำคัญเมื่อคุณต้องการค่ารวม: GROUP BY ทำให้คุณเพิ่ม COUNT(*), SUM() และอื่น ๆ ได้ แต่ DISTINCT ทำไม่ได้
-- Using DISTINCT
SELECT DISTINCT customer, category
FROM orders;
-- Equivalent using GROUP BY
SELECT customer, category
FROM orders
GROUP BY customer, category;การนับชุดค่าผสมที่ไม่ซ้ำกัน
การครอบ DISTINCT หลายคอลัมน์ไว้ภายในคิวรีย่อยช่วยให้คุณนับจำนวนชุดค่าผสมที่ไม่ซ้ำกันได้ วิธีนี้มีประโยชน์สำหรับวัดความหลากหลายในข้อมูลของคุณ
SELECT COUNT(*) AS unique_customer_category_pairs
FROM (
SELECT DISTINCT customer, category
FROM orders
) AS deduped;ข้อผิดพลาดที่พบบ่อย: DISTINCT ใช้กับทุกคอลัมน์
ความเข้าใจผิดที่พบบ่อยคือ DISTINCT ใช้เฉพาะกับคอลัมน์แรกที่ระบุไว้ แต่ไม่ใช่เช่นนั้น DISTINCT จะพิจารณาทั้งแถวที่เกิดจากคอลัมน์ทั้งหมดที่เลือกไว้เสมอ
คุณไม่สามารถใช้ DISTINCT กับคอลัมน์เพียงบางคอลัมน์ในขณะที่คงรายการซ้ำในคอลัมน์อื่นไว้ได้ — สำหรับกรณีนั้น คุณต้องใช้ฟังก์ชันหน้าต่าง เช่น ROW_NUMBER()
-- This does NOT give distinct customers with any category
-- It gives distinct (customer, category) pairs
SELECT DISTINCT customer, category
FROM orders;
-- If you want one row per customer (any category), use:
SELECT customer, MIN(category) AS sample_category
FROM orders
GROUP BY customer;ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับ DISTINCT บนหลายคอลัมน์
สรุปบทเรียน
ทำได้ยอดเยี่ยมมาก! ต่อไปนี้คือสิ่งที่คุณได้เรียนรู้เกี่ยวกับการใช้ DISTINCT กับหลายคอลัมน์:
- DISTINCT ใช้กับทั้งแถว — คอลัมน์ที่เลือกไว้ทั้งหมดจะถูกตรวจสอบร่วมกัน
- แถวจะถูกตัดออกก็ต่อเมื่อทุกคอลัมน์ตรงกับแถวที่เคยพบแล้วทุกประการ
- การเพิ่มหรือลบคอลัมน์จากรายการ SELECT จะเปลี่ยนว่าแถวใดถูกพิจารณาว่าเป็นรายการซ้ำ
- คุณสามารถใช้ DISTINCT ร่วมกับ WHERE และ ORDER BY ได้อย่างอิสระ
- GROUP BY เป็นทางเลือกที่ให้ผลเทียบเท่ากัน และจำเป็นเมื่อคุณต้องการค่ารวมด้วย
เมื่อเชี่ยวชาญ DISTINCT หลายคอลัมน์แล้ว คุณจะสามารถสำรวจชุดค่าผสมที่ไม่ซ้ำกันในชุดข้อมูลใด ๆ ได้อย่างมีประสิทธิภาพ
คำถามที่พบบ่อย
บทเรียน “DISTINCT ในหลายคอลัมน์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “DISTINCT ในหลายคอลัมน์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “DISTINCT ในหลายคอลัมน์”
ความไม่ซ้ำกันจากชุดค่าผสม คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “DISTINCT ในหลายคอลัมน์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน SELECT DISTINCT
- DISTINCT ในหลายคอลัมน์
- DISTINCT ON ของ PostgreSQL
- การนับค่าที่ไม่ซ้ำกัน