Agregat Tanpa GROUP BY
Cara agregat tunggal meringkaskan seluruh jadual menjadi satu baris
Agregat Tanpa GROUP BY ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 4 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.
Satu Agregat, Satu Baris
Penemuduga menguji idea asas melalui soalan ini: "Apakah yang berlaku apabila anda menggunakan fungsi agregat tanpa GROUP BY?"
Jawapannya: keseluruhan jadual diringkaskan menjadi satu baris. Agregat menganggap semua baris yang layak sebagai satu kumpulan tersirat yang besar. Memahami model "kumpulan tersirat" ini menjelaskan banyak peraturan seterusnya, jadi mari kita bina pemahaman ini dengan teliti.
Kumpulan Tunggal Tersirat
Apabila anda menulis agregat tunggal tanpa GROUP BY, SQL berkelakuan seolah-olah terdapat satu kumpulan yang mengandungi setiap baris. Hasilnya sentiasa tepat satu baris, tanpa mengira bilangan baris dalam jadual — walaupun jadual itu kosong.
Jadi SELECT COUNT(*) FROM employees mengembalikan satu baris dengan satu nombor yang merumuskan keseluruhan jadual.
SELECT COUNT(*) AS total_employees
FROM employees;
-- always returns exactly one rowBeberapa Agregat Bersama-sama
Anda boleh menyenaraikan beberapa agregat dalam satu SELECT. Kesemuanya merumuskan kumpulan tersirat yang sama, jadi anda tetap mendapat tepat satu baris dengan beberapa lajur.
Inilah pertanyaan standard untuk "berikan saya statistik ringkasan". Keempat-empat nombor menerangkan set baris penuh yang sama.
SELECT
COUNT(*) AS num_rows,
SUM(salary) AS total_pay,
AVG(salary) AS avg_pay,
MAX(salary) AS top_pay
FROM employees;Ralat Pencampuran
Inilah peraturan yang paling kerap diuji. Anda tidak boleh mencampurkan agregat tunggal dengan lajur bukan agregat dalam SELECT yang sama tanpa GROUP BY.
Mengapa? Agregat menghasilkan satu baris, tetapi lajur biasa mempunyai banyak nilai — nilai yang manakah hendak dipaparkan? Keadaan ini tidak jelas, jadi SQL standard menghasilkan ralat.
-- ERROR: name is not aggregated and there is no GROUP BY
SELECT name, MAX(salary)
FROM employees;Mengapa Ia Tidak Jelas
Fikirkan dengan jadual kita. MAX(salary) meringkaskan semua baris menjadi satu nilai. Tetapi name mempunyai nilai yang berbeza pada setiap baris. Satu baris ringkasan tidak dapat memuatkan lima nama dalam satu sel.
Pangkalan data enggan meneka. Inilah prinsip yang sama di sebalik peraturan GROUP BY: setiap lajur yang dipilih mestilah diagregatkan atau menjadi sebahagian daripada kumpulan. Tanpa GROUP BY, hanya agregat dibenarkan.
Pengecualian MySQL yang Longgar
Satu perincian dialek yang wajar disebut: MySQL yang lebih lama atau tidak ketat akan membenarkan pertanyaan bercampur itu dan mengembalikan nama sewenang-wenangnya — tidak semestinya nama pekerja berpendapatan tertinggi.
MySQL moden dengan ONLY_FULL_GROUP_BY didayakan (kini lalai) menolaknya seperti pangkalan data lain. Menyebut perkara ini menunjukkan kesedaran merentas dialek, tetapi sentiasa anggap pertanyaan bercampur itu salah.
Mendapatkan Baris di Sebalik MAX
Jadi, bagaimanakah anda mendapatkan nama pekerja bergaji paling tinggi? Bukan dengan mencampurkan lajur. Gunakan ORDER BY + LIMIT, atau subpertanyaan yang membandingkan nilai dengan agregat.
Versi ORDER BY/LIMIT ialah yang paling mudah. Versi subpertanyaan mudah digeneralisasikan dan mengembalikan semua pekerja yang berkongsi nilai maksimum.
-- Subquery: returns everyone earning the max
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);Agregat pada Jadual Kosong
Kes pinggiran yang sengaja diselitkan oleh penemuduga: "Apakah yang dikembalikan oleh agregat tunggal pada jadual kosong?"
COUNT(*)mengembalikan 0 (satu baris, nilai 0).SUM,AVG,MIN,MAXmengembalikan NULL (satu baris, nilai NULL).
Yang penting, anda tetap mendapat satu baris, bukan sifar baris. Jaminan satu baris itu ialah tujuan utama agregat tanpa GROUP BY.
SELECT COUNT(*) AS c, SUM(salary) AS s, MAX(salary) AS m
FROM employees
WHERE 1 = 0;
-- one row: c=0, s=NULL, m=NULLAgregat Tidak Boleh dalam WHERE
Satu lagi peraturan yang terhasil daripada model ini: anda tidak boleh meletakkan agregat dalam klausa WHERE, kerana WHERE menapis baris individu sebelum pengagregatan berlaku.
Untuk menapis berdasarkan hasil agregat, gunakan HAVING (dengan pengelompokan) atau bungkus agregat dalam subpertanyaan. WHERE berjalan terlalu awal dalam urutan pelaksanaan untuk melihat agregat.
-- ERROR: aggregate not allowed in WHERE
-- SELECT * FROM employees WHERE salary > AVG(salary);
-- Correct: compare to the aggregate via subquery
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);Agregat Tunggal berbanding GROUP BY
Bandingkan kedua-duanya:
- Tanpa GROUP BY: satu kumpulan tersirat = keseluruhan jadual = tepat satu baris hasil.
- Dengan GROUP BY lajur: satu kumpulan bagi setiap nilai unik lajur = satu baris bagi setiap kumpulan.
Agregat tunggal hanyalah GROUP BY dengan sifar lajur pengelompokan. Mekanisme yang sama, satu bekas besar.
-- Whole table: one row
SELECT AVG(salary) FROM employees;
-- Per department: one row each
SELECT department, AVG(salary)
FROM employees
GROUP BY department;Cara Menerangkannya
Jawapan yang jelas: "Agregat tanpa GROUP BY menganggap keseluruhan set hasil sebagai satu kumpulan tersirat dan mengembalikan tepat satu baris ringkasan, walaupun pada jadual kosong. Anda tidak boleh memilih lajur bukan agregat bersamanya kerana nilai itu tidak jelas. Untuk mendapatkan baris di sebalik MAX atau MIN, saya menggunakan ORDER BY dengan LIMIT atau subpertanyaan yang membandingkan nilai dengan agregat."
Semakan Pantas
Ramalkan bentuk keluaran.
Imbas Kembali
Agregat tanpa GROUP BY secara ringkas:
- Keseluruhan jadual menjadi satu kumpulan tersirat → tepat satu baris hasil.
- Anda tidak boleh mencampurkan agregat tunggal dengan lajur bukan agregat.
- Jadual kosong:
COUNT(*)= 0, yang lain mengembalikan NULL, namun tetap satu baris. - Agregat tidak boleh muncul dalam
WHERE; gunakan subpertanyaan atauHAVING. - Untuk mendapatkan baris di sebalik MIN/MAX, gunakan ORDER BY + LIMIT atau subpertanyaan.
Dengan ini selesai latihan temu duga tentang fungsi agregat.
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 “Agregat Tanpa GROUP BY” percuma?
Ya — teks penuh “Agregat Tanpa GROUP BY” 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 “Agregat Tanpa GROUP BY”?
Cara agregat tunggal meringkaskan seluruh jadual menjadi satu baris 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 4 daripada 4.
Berapa lamakah pelajaran “Agregat Tanpa GROUP BY” 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
- COUNT(*) berbanding COUNT(lajur) berbanding COUNT(DISTINCT)
- SUM dan AVG dengan NULL
- MIN, MAX dan Agregasi Bukan Angka
- Agregat Tanpa GROUP BY