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

การนับค่าที่ไม่ซ้ำกัน

ใช้งาน COUNT(DISTINCT ...) จริง

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

ทำไมต้องนับค่าที่ไม่ซ้ำกัน

เมื่อคุณใช้ COUNT(*) คุณจะนับทุกแถว — รวมถึงรายการซ้ำด้วย แต่บางครั้งคุณต้องการทราบเพียงว่าในคอลัมน์หนึ่งมีค่าที่ไม่ซ้ำกันจำนวนเท่าใด

ตัวอย่างเช่น ลูกค้าของคุณมาจากประเทศที่แตกต่างกันกี่ประเทศ มีสินค้าที่ไม่ซ้ำกันกี่รายการที่ถูกสั่งซื้อในเดือนที่แล้ว นี่คือจุดที่ COUNT(DISTINCT ...) เข้ามาช่วย

การเตรียมตารางตัวอย่าง

เรามาสร้างตารางคำสั่งซื้อเพื่อฝึกใช้งานกัน แต่ละคำสั่งซื้อมีชื่อลูกค้า สินค้า และประเทศ

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

CREATE TABLE orders (
  id INT,
  customer VARCHAR(50),
  product VARCHAR(50),
  country VARCHAR(50)
);

INSERT INTO orders VALUES
  (1, 'Alice', 'Laptop', 'USA'),
  (2, 'Bob', 'Phone', 'UK'),
  (3, 'Alice', 'Tablet', 'USA'),
  (4, 'Carol', 'Laptop', 'Canada'),
  (5, 'Bob', 'Laptop', 'UK'),
  (6, 'Dave', 'Phone', 'USA'),
  (7, 'Carol', 'Phone', 'Canada'),
  (8, 'Eve', 'Tablet', 'Germany');

COUNT(*) เทียบกับ COUNT(DISTINCT)

ให้เรียกใช้คิวรีทั้งสองรายการแล้วเปรียบเทียบผลลัพธ์ COUNT(*) ส่งคืนค่า 8 — หนึ่งค่าต่อหนึ่งแถว COUNT(DISTINCT ลูกค้า) ส่งคืนค่า 5 — เนื่องจากมีลูกค้าที่ไม่ซ้ำกันเพียง 5 ราย (อลิซ, บ็อบ, แครอล, เดฟ, อีฟ)

นี่คือแนวคิดหลัก: COUNT(DISTINCT column) จะไม่สนใจค่าที่ปรากฏซ้ำ และนับเฉพาะค่าที่ไม่ซ้ำกันเท่านั้น

SELECT COUNT(*) AS total_orders,
       COUNT(DISTINCT customer) AS unique_customers
FROM orders;

การนับประเทศที่ไม่ซ้ำกัน

มาดูกันว่าลูกค้าของเรามาจากประเทศที่แตกต่างกันกี่ประเทศ แม้ว่าตารางคำสั่งซื้อจะมี 8 แถว แต่หลายแถวมีประเทศเดียวกัน

ผลลัพธ์จะเป็น 4 — USA, UK, แคนาดา และเยอรมนี ไม่ว่าประเทศแต่ละแห่งจะปรากฏกี่ครั้งก็ตาม

SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;

การนับสินค้าที่ไม่ซ้ำกัน

เราสามารถใช้รูปแบบเดียวกันกับคอลัมน์ใดก็ได้ ในที่นี้เรานับจำนวนสินค้าที่แตกต่างกันซึ่งมีการสั่งซื้อ

แม้ว่า 'แล็ปท็อป' จะปรากฏสามครั้งและ 'โทรศัพท์' จะปรากฏสามครั้ง แต่สินค้าจะถูกนับเพียงครั้งเดียว คำตอบคือ 3 รายการ ได้แก่ แล็ปท็อป โทรศัพท์ และแท็บเล็ต

SELECT COUNT(DISTINCT product) AS unique_products
FROM orders;

การใช้ COUNT(DISTINCT) ร่วมกับ WHERE

คุณสามารถใช้ COUNT(DISTINCT ...) ร่วมกับส่วนคำสั่ง WHERE เพื่อจำกัดแถวก่อนการนับ ในที่นี้เรานับสินค้าที่ไม่ซ้ำกันซึ่งสั่งซื้อโดยลูกค้าจาก USA เท่านั้น

จะพิจารณาเฉพาะแถวที่คอลัมน์ประเทศ = 'USA' จากนั้นจึงนับสินค้าที่ไม่ซ้ำกันในแถวเหล่านั้น

SELECT COUNT(DISTINCT product) AS usa_unique_products
FROM orders
WHERE country = 'USA';

COUNT(DISTINCT) กับ GROUP BY

เมื่อใช้ร่วมกับ GROUP BY แล้ว COUNT(DISTINCT ...) จะให้จำนวนค่าที่ไม่ซ้ำกันในแต่ละกลุ่ม คิวรีนี้ตอบคำถามว่า: สำหรับแต่ละประเทศ มีลูกค้าที่ไม่ซ้ำกันกี่รายที่สั่งซื้อ

แต่ละกลุ่มจะถูกประมวลผลแยกกัน ดังนั้นรายการซ้ำภายในกลุ่มจะถูกลบออกก่อนการนับ

SELECT country,
       COUNT(DISTINCT customer) AS unique_customers
FROM orders
GROUP BY country
ORDER BY unique_customers DESC;

การนับค่าที่ไม่ซ้ำกันในหลายคอลัมน์

คุณสามารถใช้นิพจน์ COUNT(DISTINCT ...) หลายรายการใน SELECT เดียวกันได้ วิธีนี้ให้ภาพรวมอย่างรวดเร็วของคาร์ดินัลลิตี — จำนวนค่าที่ไม่ซ้ำกันซึ่งแต่ละคอลัมน์มีอยู่ — ทั้งหมดในคิวรีเดียว

คาร์ดินัลลิตีเป็นตัวชี้วัดที่มีประโยชน์เมื่อสำรวจชุดข้อมูลใหม่

SELECT COUNT(DISTINCT customer) AS unique_customers,
       COUNT(DISTINCT product)  AS unique_products,
       COUNT(DISTINCT country)  AS unique_countries
FROM orders;

การจัดการ NULL

เช่นเดียวกับ COUNT(column) ปกติ COUNT(DISTINCT column) จะไม่สนใจค่า NULL ค่า NULL จะไม่ถูกนับเป็นค่าที่ไม่ซ้ำกัน

ในตัวอย่างนี้ มีสองแถวที่มีประเทศเป็น NULL ผลลัพธ์ยังคงเป็นประเทศที่ไม่เป็น NULL และไม่ซ้ำกัน 4 ประเทศ ไม่ใช่ 5 ประเทศ

INSERT INTO orders VALUES
  (9,  'Frank', 'Phone',  NULL),
  (10, 'Grace', 'Laptop', NULL);

SELECT COUNT(DISTINCT country) AS unique_countries_no_null
FROM orders;

การเปรียบเทียบ COUNT(*), COUNT(col) และ COUNT(DISTINCT col)

การดูรูปแบบของ COUNT ทั้งสามแบบเคียงข้างกันจะช่วยให้เข้าใจได้ง่าย:

  • COUNT(*) — นับทุกแถว รวมถึงค่า NULL
  • COUNT(ประเทศ) — นับแถวที่ประเทศไม่เป็น NULL
  • COUNT(DISTINCT ประเทศ) — นับค่าประเทศที่ไม่เป็น NULL และไม่ซ้ำกัน

ให้เรียกใช้กับตารางที่ปรับปรุงแล้ว (ขณะนี้มี 10 แถว โดย 2 แถวมีประเทศเป็น NULL) เพื่อยืนยันความแตกต่าง

SELECT COUNT(*)                AS total_rows,
       COUNT(country)          AS non_null_countries,
       COUNT(DISTINCT country) AS unique_countries
FROM orders;

กรณีใช้งานจริง: ผู้ใช้งานที่ใช้งานประจำวัน

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

จัดกลุ่มด้วย GROUP BY ตามวันที่ และใช้ COUNT(DISTINCT รหัสผู้ใช้) เพื่อหาจำนวนผู้ใช้ที่ไม่ซ้ำกันในแต่ละวัน — รายการซ้ำจากผู้ใช้คนเดียวกันที่คลิกหลายครั้งจะถูกตัดออกโดยอัตโนมัติ

CREATE TABLE user_events (
  event_date DATE,
  user_id    INT
);

INSERT INTO user_events VALUES
  ('2024-01-01', 1), ('2024-01-01', 2), ('2024-01-01', 1),
  ('2024-01-02', 2), ('2024-01-02', 3), ('2024-01-02', 2),
  ('2024-01-03', 1), ('2024-01-03', 4);

SELECT event_date,
       COUNT(DISTINCT user_id) AS daily_active_users
FROM user_events
GROUP BY event_date
ORDER BY event_date;

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

ทดสอบความเข้าใจของคุณเกี่ยวกับ COUNT(DISTINCT ...) ด้วยคำถามนี้

สรุปบทเรียน

ทำได้ยอดเยี่ยมมาก! ต่อไปนี้คือสรุปสิ่งที่คุณได้เรียนรู้เกี่ยวกับ COUNT(DISTINCT ...):

  • COUNT(DISTINCT column) นับเฉพาะค่าที่ไม่ซ้ำกันและไม่เป็น NULL ในคอลัมน์
  • แตกต่างจาก COUNT(*) (ทุกแถว) และ COUNT(column) (แถวที่ไม่เป็น NULL)
  • ทำงานร่วมกับ WHERE เพื่อกรองแถวก่อนการนับได้
  • ทำงานร่วมกับ GROUP BY เพื่อให้นับค่าที่ไม่ซ้ำกันในแต่ละกลุ่มได้
  • ค่า NULL จะถูกตัดออกจากการนับค่าที่ไม่ซ้ำกันเสมอ
  • สามารถมีนิพจน์ COUNT(DISTINCT ...) หลายรายการใน SELECT เดียวกันได้
  • การใช้งานจริงที่พบบ่อย ได้แก่ การนับผู้ใช้ สินค้า ประเทศ และเซสชันที่ไม่ซ้ำกัน

เมื่อเชี่ยวชาญฟังก์ชันนี้แล้ว คุณจะมีเครื่องมือที่ทรงพลังสำหรับการสำรวจข้อมูลและการวิเคราะห์ข้อมูล

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

บทเรียน “การนับค่าที่ไม่ซ้ำกัน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การนับค่าที่ไม่ซ้ำกัน”

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

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

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

บทเรียน “การนับค่าที่ไม่ซ้ำกัน” ใช้เวลานานแค่ไหน

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

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

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

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

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