Memahami SQL GROUP BY Klausa dan Fungsi Agregat
Menggunakan klausa GROUP BY
SQL sering menyebabkan kekeliruan tentang atribut yang boleh diakses selepas pengumpulan. Mari jelaskan:
GROUP BY
dan Lajur Bukan Agregat
Percubaan untuk mengakses lajur tidak teragregat selepas mengumpulkan menghasilkan ralat "bukan KUMPULAN OLEH ungkapan". Ini kerana setiap kumpulan mungkin mengandungi berbilang baris dan nilai dalam lajur tidak teragregat akan berbeza merentas baris tersebut.
Fungsi Agregat: Pandangan Lebih Dalam
Sebaliknya, fungsi agregat (seperti SUM
, MAX
, AVG
, dll.) boleh mengakses lajur asas dalam setiap kumpulan walaupun selepas menggunakan GROUP BY
. Mereka mengira satu nilai ringkasan untuk keseluruhan kumpulan.
Contoh:
Pertimbangkan pertanyaan ini:
<code class="language-sql">SELECT * FROM order_details GROUP BY order_no;</code>
Pertanyaan ini akan gagal kerana ia cuba memilih semua lajur tanpa menggunakan fungsi agregat pada lajur bukan agregat seperti order_price
.
Walau bagaimanapun, ini adalah pertanyaan yang sah:
<code class="language-sql">SELECT SUM(order_price) FROM order_details GROUP BY order_no;</code>
Di sini, SUM
memproses setiap kumpulan, menjumlahkan nilai order_price
untuk memberikan jumlah harga bagi setiap order_no
.
Termasuk Lajur Bukan Agregat dalam GROUP BY
Untuk mengakses lajur tidak teragregat selepas dikumpulkan, masukkannya dalam klausa GROUP BY
:
<code class="language-sql">SELECT order_no, SUM(order_price) FROM order_details GROUP BY order_no;</code>
Ini mengambil setiap order_no
dengan betul bersama-sama dengan jumlah order_price
nya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengelakkan Ralat 'bukan KUMPULAN OLEH ungkapan' Apabila Menggunakan Fungsi Agregat dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!