Beberapa orang berusaha keras untuk menghindari klausa GROUP BY dan HAVING dalam kueri mereka. Pesan kesalahannya rewel tetapi biasanya benar. GROUP BY dan HAVING kata kunci sangat penting untuk pelaporan SQL yang baik.
Alasan utama GROUP BY adalah untuk mengurangi jumlah baris, biasanya dengan agregasi. Ini menghasilkan hanya satu baris untuk setiap pengelompokan yang cocok dari input. Ini memungkinkan Anda membuat perhitungan yang canggih melalui SQL biasa.
Contoh Buah:
Kami punya beberapa buah:
Kasus berikutnya ini memungkinkan kita untuk melihat ke depan. Pertengahan tahun, buah apa yang akan tersedia? Kami melakukan ini dengan kueri yang sama seperti di atas, namun, setelah kueri berjalan, kami memeriksa nilai min(fresh_until) dengan menggunakan klausa have. MEMILIKI adalah bagaimana Anda memenuhi syarat agregat.
Semua apel dan anggur akan tersedia pada pertengahan tahun.
Daftar item antara SELECT dan FROM, daftar target. mungkin mengandung non-agregat dan agregat. Kolom non-agregat dalam daftar target
harus berada di grup demi klausa. Pesan kesalahan mengatakan demikian. Urutan kolom dalam grup menurut klausa penting. Ini menentukan bagaimana agregat dikelompokkan. Urutannya sering hierarkis. Apa artinya kolom Anda adalah fokus Anda. Bisa berupa buah, atau sumber dan/atau segar_sampai tanggal.
Contoh Bermain Kartu
Mari kita lihat kumpulan contoh lain yang mengilustrasikan penggalian informasi tentang kartu remi. Anda dapat mempelajari tentang kartu di Wikipedia Kartu Standar.
Misalkan Anda membagikan secara terprogram enam tangan 5 kartu, seperti enam orang bermain poker. Total 30 kartu digunakan dalam kesepakatan ini. Mereka berada di tangan tabel seperti berikut dimana nama kartu dan suit digabungkan dengan tabel lookup. Kami menyimpan peringkat sehingga kami dapat mengurutkan dengan benar. Kami menggunakan nama untuk tampilan. Nama dan peringkat memiliki hubungan satu lawan satu untuk masing-masing kartu dan suit.
Berapa jumlah suit untuk masing-masing tangan? Kami benar-benar hanya peduli dengan tangan mana pun yang memiliki 3 kartu atau lebih dengan jenis yang sama. Itu akan memberi tahu kami siapa yang memiliki peluang lebih baik untuk poker flush. Perhatikan bahwa meskipun GROUP BY tampaknya menyiratkan ORDER BY, itu tidak. ORDER BY harus eksplisit.
Jadi bagaimana jika Anda salah mengelompokkan kueri Anda? Jika ini tangan tabel tidak dikelompokkan berdasarkan handid, maka Anda akan mendapatkan 30 record dari 6 hand dari 5 kartu. Jika Anda memiliki agregat, mereka akan dikelompokkan berdasarkan baris. Tidak terlalu membantu.
Jika Anda menggabungkan nama kartu dan tidak memasukkan
nama kartu solo pada daftar target dan mencoba untuk memesan berdasarkan nama kartu,
Anda akan menerima pesan kesalahan yang tidak boleh di
urutan demi klausa. Urutan demi klausa harus mengandung
elemen kelompok demi klausa.
Namun, jika nama kartu secara eksplisit ada dalam daftar target,
maka nama kartu harus dalam kelompok demi klausa dan
oleh karena itu diperbolehkan pada klausa urutan per.
Jika kueri sesuai, akan ada minimal 1 atau maksimal 4 catatan per setelan untuk masing-masing dari enam tangan. Perhatikan bahwa kita mengurutkan berdasarkan peringkat setelan yang
juga harus ada dalam kelompok demi klausa. su_name dan su_rank memiliki hubungan satu lawan satu.
Untuk melihat pembagian kartu ke tangan, Kita harus mengelompokkan berdasarkan kolom peringkat kartu. Tentu saja ada 4 suit untuk setiap kartu, jadi Anda tidak akan melihat kartu di lebih dari empat tangan.
Untuk mengintip dan melihat siapa yang memegang kartu As, kita bisa menggunakan query singkat berikut. Perhatikan bahwa ada klausa WHERE yang dieksekusi saat mengumpulkan baris. HAVING dieksekusi setelah baris dikumpulkan.
Ringkasan
Contoh-contoh ini adalah cara sederhana untuk mengevaluasi entitas yang diketahui. Eksperimen dan gunakan aturan sederhana ini.
- Jika kolom ada dalam daftar target dan bukan gabungan, kolom tersebut harus berada dalam klausa GROUP BY.
- klausa WHERE muncul selama proses pemilihan.
- Klausa HAVING muncul setelah agregat selesai.
- Hanya non-agregat yang boleh ada dalam klausa ORDER BY.
- Urutan klausa GROUP BY penting.