0Pricing
SQL Academy · บทเรียน

พื้นฐาน SELECT DISTINCT

คืนค่าเฉพาะแถวที่ไม่ซ้ำกัน

พื้นฐาน SELECT DISTINCT เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดค่าซ้ำจึงเกิดขึ้น

ตารางมักมีค่าที่ซ้ำกัน ตัวอย่างเช่น ตาราง customers อาจแสดง city เดิมในหลายพันแถว เมื่อคุณสนใจเฉพาะ ชุดค่าที่ไม่ซ้ำกัน SELECT ปกติจะคืนค่าทุกแถว รวมถึงรายการที่ซ้ำกันด้วย

SELECT DISTINCT จะรวมแถวที่เหมือนกันให้เหลือเพียงหนึ่งแถว ในบทเรียนนี้ คุณจะได้เรียนรู้พื้นฐานของการคืนผลลัพธ์ที่ไม่ซ้ำกันเท่านั้น

SELECT city FROM customers;
-- Returns one row per customer, with many repeated cities

คีย์เวิร์ด DISTINCT

DISTINCT อยู่ถัดจาก SELECT โดยตรง และจะลบแถวที่ซ้ำกันออกจากชุดผลลัพธ์ เหลือสำเนาเพียงหนึ่งรายการสำหรับชุดค่าที่ไม่ซ้ำกันของคอลัมน์ที่เลือกแต่ละชุด

SELECT DISTINCT city
FROM customers;
-- One row per unique city

DISTINCT ใช้กับทั้งแถว

ความเข้าใจผิดที่พบบ่อยคือ DISTINCT ใช้กับคอลัมน์เดียวเท่านั้น แต่ในความเป็นจริงแล้ว DISTINCT ใช้กับ แถวที่เลือกทั้งหมด ทุกคอลัมน์ที่คุณระบุจะมีส่วนในการตัดสินว่าแถวสองแถวเป็นรายการซ้ำกันหรือไม่

ด้านล่างนี้ แถวจะถูกลบรายการซ้ำโดยพิจารณาจากค่าของ city เท่านั้น เพราะเป็นคอลัมน์เดียวที่เลือก

SELECT DISTINCT country
FROM customers;
-- Unique countries across all customers

ข้อมูลตัวอย่าง

ลองนึกถึงตาราง orders ขนาดเล็ก สังเกตค่า status และ country ที่ซ้ำกัน เราจะใช้รูปแบบข้อมูลนี้ตลอดทั้งบทเรียน

  • id=1, status='paid', country='US'
  • id=2, status='paid', country='US'
  • id=3, status='shipped', country='DE'
  • id=4, status='paid', country='DE'
CREATE TABLE orders (
  id         int PRIMARY KEY,
  status     text,
  country    text,
  amount     numeric(10,2)
);

DISTINCT กับคอลัมน์เดียว

การเลือก DISTINCT status จากข้อมูลตัวอย่างจะคืนค่าของสถานะที่ไม่ซ้ำกัน ได้แก่ paid และ shipped จากสี่แถวจะเหลือเพียงสองแถว

SELECT DISTINCT status
FROM orders;
-- paid
-- shipped

NULL ถือเป็นค่าเดียว

แม้โดยปกติ NULL จะไม่เท่ากับสิ่งใดเลย แม้แต่ตัวมันเอง แต่ DISTINCT จะถือว่า NULL ทั้งหมดเป็นกลุ่มเดียว หากคอลัมน์มีหลายแถวที่เป็น NULL ผลลัพธ์ที่ไม่ซ้ำกันจะมี NULL เพียงหนึ่งค่า

SELECT DISTINCT shipped_at
FROM orders;
-- All NULL shipped_at rows collapse into a single NULL row

DISTINCT ร่วมกับ ORDER BY

โดยทั่วไปคุณมักต้องการเรียงลำดับค่าที่ไม่ซ้ำกัน DISTINCT จะทำงานก่อนเพื่อสร้างชุดค่าที่ไม่ซ้ำกัน จากนั้น ORDER BY จึงเรียงลำดับชุดค่านั้น คอลัมน์ใดก็ตามใน ORDER BY จะต้องปรากฏอยู่ในรายการ SELECT ด้วยเมื่อใช้ DISTINCT

SELECT DISTINCT country
FROM orders
ORDER BY country;
-- DE
-- US

DISTINCT เทียบกับ GROUP BY

SELECT DISTINCT col และ SELECT col GROUP BY col ให้ผลเป็นแถวที่ไม่ซ้ำกันเหมือนกัน ใช้ DISTINCT เมื่อคุณต้องการเพียงค่าที่ไม่ซ้ำกัน และใช้ GROUP BY เมื่อคุณต้องการฟังก์ชันรวม เช่น COUNT แยกตามแต่ละกลุ่มด้วย

-- These two return the same set of countries:
SELECT DISTINCT country FROM orders;

SELECT country FROM orders
GROUP BY country;

DISTINCT มีต้นทุน

การลบรายการซ้ำไม่ได้เกิดขึ้นโดยไม่มีต้นทุน ฐานข้อมูลต้องเรียงลำดับหรือแฮชแถวที่เป็นไปได้ทั้งหมดเพื่อค้นหาแถวที่ไม่ซ้ำกัน สำหรับตารางขนาดใหญ่ การทำเช่นนี้จะเพิ่มภาระให้ CPU และหน่วยความจำ ดังนั้นควรขอใช้ DISTINCT เฉพาะเมื่อคุณต้องการความไม่ซ้ำกันจริง ๆ

-- Avoid blind DISTINCT on every query.
-- If the column is already unique (e.g. a PRIMARY KEY),
-- DISTINCT does nothing useful but still costs work:
SELECT DISTINCT id FROM orders;  -- id is already unique

DISTINCT ในนิพจน์

คุณสามารถใช้ DISTINCT กับนิพจน์ที่คำนวณแล้ว ไม่ใช่เฉพาะคอลัมน์ดิบเท่านั้น ฐานข้อมูลจะประเมินนิพจน์สำหรับทุกแถวก่อน แล้วจึงลบผลลัพธ์ที่ซ้ำกัน

SELECT DISTINCT upper(country) AS country_code
FROM orders
ORDER BY country_code;
-- DE
-- US

สร้างรายการค้นหา

การใช้งาน DISTINCT ที่พบได้จริงคือการสร้างเมนูแบบเลื่อนลงหรือรายการตัวกรองในแอปพลิเคชัน โดยดึงสถานะที่ไม่ซ้ำกันมาแสดงให้ผู้ใช้เห็นทุกตัวเลือกที่มีอยู่ในข้อมูลขณะนั้น

SELECT DISTINCT status
FROM orders
ORDER BY status;
-- paid
-- shipped

ตรวจสอบความเข้าใจ

คีย์เวิร์ด DISTINCT ต้องอยู่ตรงตำแหน่งใด และใช้ลบรายการซ้ำของสิ่งใด

ทบทวน

คุณได้เรียนรู้พื้นฐานของ SELECT DISTINCT แล้ว:

  • ลบแถวที่ซ้ำกันออกจากชุดผลลัพธ์
  • ใช้กับ แถวที่เลือกทั้งหมด ไม่ใช่คอลัมน์เดียว
  • NULL ทั้งหมดจะถูกรวมเป็นค่าเดียว
  • ORDER BY ทำงานหลังการลบรายการซ้ำ และคอลัมน์ของมันจะต้องถูกเลือกไว้ด้วย
  • มีภาระการประมวลผลเพิ่มเติม จึงควรใช้เฉพาะเมื่อจำเป็น

ถัดไป: การขยายการใช้ DISTINCT ไปยังหลายคอลัมน์

SELECT DISTINCT status
FROM orders
ORDER BY status;

คำถามที่พบบ่อย

บทเรียน “พื้นฐาน SELECT DISTINCT” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐาน SELECT DISTINCT” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน SELECT DISTINCT”

คืนค่าเฉพาะแถวที่ไม่ซ้ำกัน คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “พื้นฐาน SELECT DISTINCT” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน SELECT DISTINCT
  2. DISTINCT ในหลายคอลัมน์
  3. DISTINCT ON ของ PostgreSQL
  4. การนับค่าที่ไม่ซ้ำกัน
← กลับไปที่ SQL Academy