พื้นฐาน 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 cityDISTINCT ใช้กับทั้งแถว
ความเข้าใจผิดที่พบบ่อยคือ 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
-- shippedNULL ถือเป็นค่าเดียว
แม้โดยปกติ NULL จะไม่เท่ากับสิ่งใดเลย แม้แต่ตัวมันเอง แต่ DISTINCT จะถือว่า NULL ทั้งหมดเป็นกลุ่มเดียว หากคอลัมน์มีหลายแถวที่เป็น NULL ผลลัพธ์ที่ไม่ซ้ำกันจะมี NULL เพียงหนึ่งค่า
SELECT DISTINCT shipped_at
FROM orders;
-- All NULL shipped_at rows collapse into a single NULL rowDISTINCT ร่วมกับ ORDER BY
โดยทั่วไปคุณมักต้องการเรียงลำดับค่าที่ไม่ซ้ำกัน DISTINCT จะทำงานก่อนเพื่อสร้างชุดค่าที่ไม่ซ้ำกัน จากนั้น ORDER BY จึงเรียงลำดับชุดค่านั้น คอลัมน์ใดก็ตามใน ORDER BY จะต้องปรากฏอยู่ในรายการ SELECT ด้วยเมื่อใช้ DISTINCT
SELECT DISTINCT country
FROM orders
ORDER BY country;
-- DE
-- USDISTINCT เทียบกับ 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 uniqueDISTINCT ในนิพจน์
คุณสามารถใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน SELECT DISTINCT
- DISTINCT ในหลายคอลัมน์
- DISTINCT ON ของ PostgreSQL
- การนับค่าที่ไม่ซ้ำกัน