Persediaan Temu Duga Pengaturcaraan · Pelajaran

DISTINCT berbanding GROUP BY untuk Keunikan

Bila DISTINCT ialah jawapan yang tepat dan bila penemu duga menjangkakan GROUP BY

Pelajaran 3 daripada 413 langkah

DISTINCT berbanding GROUP BY untuk Keunikan ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Fungsi DISTINCT

DISTINCT membuang baris pendua. Perkara utama yang diperiksa oleh penemu duga: ia berfungsi pada keseluruhan baris yang dipilih, bukan satu lajur sahaja — jadi SELECT DISTINCT a, b membuang pendua berdasarkan pasangan (a, b).

SELECT DISTINCT department
FROM employees;

DISTINCT Meliputi Semua Lajur yang Dipilih

Dengan beberapa lajur, DISTINCT mengekalkan setiap gabungan unik — satu baris bagi setiap pasangan (department, job_title) yang berbeza. Tiada cara piawai untuk membuang pendua bagi satu lajur sahaja.

SELECT DISTINCT department, job_title
FROM employees;

Fungsi GROUP BY

GROUP BY menggabungkan baris yang berkongsi kunci yang sama menjadi satu baris bagi setiap kumpulan. Dengan sendirinya, mengumpulkan berdasarkan satu lajur memberikan hasil yang sama seperti DISTINCT pada lajur tersebut.

SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;

Perbezaan Sebenar: Pengagregatan

Jadi, bilakah kedua-duanya berbeza? Apabila Anda memerlukan agregat. GROUP BY boleh melakukan COUNT, SUM atau AVG bagi setiap kumpulan; DISTINCT tidak boleh. Perlukan baris unik? Gunakan DISTINCT. Perlukan metrik bagi setiap kumpulan? Gunakan GROUP BY.

SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

DISTINCT Tidak Boleh Mengira bagi Setiap Kumpulan

Anda tidak boleh menambah pengiraan pada DISTINCT. Untuk soalan "berapa banyak pekerja bagi setiap jabatan", alat yang betul sentiasa ialah GROUP BY dengan COUNT(*) — bukannya SELECT DISTINCT.

-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;

-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

COUNT(DISTINCT) Menggabungkan Kedua-dua Idea

Gabungan yang sering digunakan: COUNT(DISTINCT col) mengira nilai unik dalam setiap kumpulan. Di sini DISTINCT berada di dalam agregat untuk menjawab soalan "berapa banyak jawatan yang berbeza bagi setiap jabatan?"

SELECT department,
       COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;

Mengira Nilai Unik Secara Keseluruhan

Tanpa GROUP BY, COUNT(DISTINCT col) mengira nilai unik di seluruh jadual — jawapan yang kemas untuk soalan "berapa banyak jabatan berbeza yang kita ada?"

SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;

-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;

Prestasi Selalunya Tiada Perbezaan

Adakah DISTINCT atau GROUP BY lebih pantas? Untuk pembuangan pendua biasa, biasanya setara — pengoptimum merancang kedua-duanya dengan cara yang sama. Pilih berdasarkan tujuan: DISTINCT untuk baris unik, GROUP BY apabila melakukan pengagregatan.

DISTINCT dan NULL

Bagaimanakah DISTINCT mengendalikan NULL? Ia menganggap semua NULL sebagai sama, jadi banyak baris NULL digabungkan menjadi satu. GROUP BY juga berbuat demikian — NULL membentuk satu kumpulan.

-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;

DISTINCT ON Postgres (Tambahan)

Tambahan: Postgres mempunyai DISTINCT ON (expr) yang bukan piawai dan mengekalkan baris pertama bagi setiap kunci berdasarkan ORDER BY. Kod mudah alih menggunakan ROW_NUMBER() sebagai ganti.

-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;

DISTINCT Terpakai pada Seluruh SELECT, Bukan Satu Lajur

Satu lagi perangkap: DISTINCT berfungsi pada keseluruhan baris, jadi SELECT DISTINCT customer_id, order_date tidak akan memberikan satu baris bagi setiap pelanggan. Untuk itu, gunakan GROUP BY dengan MAX atau fungsi tetingkap.

-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;

-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;

Semakan Pantas

Pilih alat yang betul.

Ringkasan

Ringkasan: DISTINCT membuang pendua bagi seluruh baris; GROUP BY menggabungkan baris berdasarkan kunci dan membolehkan agregat. COUNT(DISTINCT col) mengira nilai unik, kedua-duanya menganggap NULL sebagai satu nilai, dan prestasinya biasanya tiada perbezaan.

Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “DISTINCT berbanding GROUP BY untuk Keunikan” percuma?

Ya — teks penuh “DISTINCT berbanding GROUP BY untuk Keunikan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “DISTINCT berbanding GROUP BY untuk Keunikan”?

Bila DISTINCT ialah jawapan yang tepat dan bila penemu duga menjangkakan GROUP BY Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “DISTINCT berbanding GROUP BY untuk Keunikan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Memproyeksikan Lajur dan Perangkap Alias
  2. Lajur Terhitung dan Keutamaan Ungkapan
  3. DISTINCT berbanding GROUP BY untuk Keunikan
  4. Ungkapan CASE dalam SELECT
← Kembali ke Persediaan Temu Duga Pengaturcaraan