Pertanyaan menarik. Saya juga tertarik pada apakah jawabannya tergantung pada implementasi (misalnya apakah hasil kueri sama di SQL Server seperti di Oracle).
Jon Schneider
Jawaban:
107
Parameter untuk fungsi COUNT adalah ekspresi yang akan dievaluasi untuk setiap baris. Fungsi COUNT mengembalikan jumlah baris yang dievaluasi ekspresi menjadi nilai bukan nol. (* adalah ekspresi khusus yang tidak dievaluasi, ini hanya mengembalikan jumlah baris.)
Ada dua pengubah tambahan untuk ekspresi: ALL dan DISTINCT. Ini menentukan apakah duplikat akan dibuang. Karena ALL adalah defaultnya, contoh Anda sama dengan count (ALL 1), yang berarti duplikat dipertahankan.
Karena ekspresi "1" bernilai bukan nol untuk setiap baris, dan karena Anda tidak menghapus duplikat, COUNT (1) harus selalu mengembalikan angka yang sama dengan COUNT (*).
Ingat pilih DISTINCT kolom1 dari table1! = Pilih count (DISTINCT kolom1) dari table1;
Kanagavelu Sugumar
Juga hitung (1) di sini 1 bukan kolom no, itu adalah ekspresi. misalnya) pilih 1 dari table1; akan mencetak 1 kali tidak ada baris yang memiliki tabel.
Kanagavelu Sugumar
pilih count (DISTINCT / ALL columnName) dari table1; tidak akan mengembalikan semua / nilai NOT NULL yang berbeda dari kolom (nama kolom).
Kanagavelu Sugumar
pilih DISTINCT kolom1 dari table1; akan menyertakan satu nilai NULL di kolom (kolom1). pilih hitungan (DISTINCT kolom1) dari tabel1; tidak akan menyertakan bahkan satu baris NULL.
Kanagavelu Sugumar
1
@datps - Sebenarnya ada jumlah ekspresi tidak terbatas yang memberikan hasil yang sama. HITUNGAN ('Halo, dunia!') Juga akan berfungsi dengan baik. (Saya belum mencobanya.) Jadi pertanyaannya adalah, mengapa membuat ekspresi khusus (*) padahal sudah ada cara yang tidak terbatas untuk melakukan hal yang sama? Saya tidak dapat berbicara mewakili pencipta SQL (yang memiliki banyak dosa untuk ditebus :)), tetapi itu mungkin agar orang tidak harus memilih ekspresi non-null secara sewenang-wenang. Itu akan mengacaukan maksud penulis kueri. "Mengapa mereka menulis 1, bukan 2? Ini pasti ada artinya!"
Jeffrey L Whitledge
26
Berikut ini tautan yang akan membantu menjawab pertanyaan Anda. Pendeknya:
hitung (*) adalah cara yang benar untuk menulisnya dan hitung (1) DIOPTIMALKAN UNTUK MENJADI hitung (*) secara internal - karena
a) menghitung baris di mana 1 bukan nol kurang efisien daripada
b) menghitung baris
SELECT * FROM table_name andSELECT1FROM table_name.
Jika kamu melakukan
SELECT1FROM table_name
itu akan memberi Anda angka 1 untuk setiap baris dalam tabel. Jadi ya count(*)dan count(1)akan memberikan hasil yang sama seperti keinginan count(8)ataucount(column_name)
count (column_name) tidak persis sama - tidak menghitung baris dengan null di kolom itu. Lihat di sini untuk detailnya: stackoverflow.com/questions/169784
Blorgbeard keluar
Hmm, sebenarnya itu untuk SQL Server. Oracle mungkin bekerja secara berbeda, saya kira.
Blorgbeard keluar
Hitungan tidak boleh menggunakan nilai NULL sesuai standar SQL, ORacle dan SQL Server harus memiliki perilaku yang sama dalam hal ini.
Thorsten
"mirip dengan perbedaan antara SELECT * FROM table_name dan SELECT 1 FROM table_name." -- tidak juga. PILIH * dan PILIH 1 berbeda. SELECT (*) dan SELECT (1) memberikan hasil yang sama.
David Aldridge
7
Tidak ada perbedaan.
COUNT(1)pada dasarnya hanya menghitung nilai konstanta 1 kolom untuk setiap baris. Seperti yang dikatakan pengguna lain di sini, ini sama dengan COUNT(0)atau COUNT(42). Tidak ada NULLnilai apa pun sudah cukup.
Pengoptimal Oracle tampaknya menggunakan bug di dalamnya, yang menyebabkan penghitungan dipengaruhi oleh kolom mana yang Anda pilih dan apakah itu ada dalam indeks, sehingga konvensi COUNT (1) muncul.
Mungkin ada atau masih ada beberapa alasan mengapa ini akan bekerja lebih baik daripada SELECT COUNT(*)pada beberapa database, tetapi saya akan menganggap itu bug di DB.
SELECTCOUNT(col_name) from <tablename>
Namun memiliki arti yang berbeda, karena hanya menghitung baris dengan nilai bukan null untuk kolom tertentu.
tidak, 1 mengacu pada konstanta nomor 1. Saat Anda mengatakan, ORDER BY 1, itu mengacu pada kolom satu.
Thilo
Itulah yang saya pikirkan beberapa waktu lalu, tetapi Anda dapat menentukan angka apa pun yang lebih besar dari jumlah kolom, tetap hasilnya sama. Jadi itu pasti bukan nomor kolom.
Nrj
@dacracot: Mungkin tapi saya tidak percaya begitu. Dari apa yang saya mengerti oracle hanya menulis ulang hitungan (1) menjadi hitungan (*) di latar belakang
Jarod Elliott
2
Anda bisa mengujinya seperti ini:
createtable test1(
idnumber,
namevarchar2(20)
);
insertinto test1 values (1,'abc');
insertinto test1 values (1,'abc');
select * from test1;
selectcount(*) from test1;
selectcount(1) from test1;
selectcount(ALL1) from test1;
selectcount(DISTINCT1) from test1;
Bergantung pada siapa Anda bertanya, beberapa orang melaporkan bahwa eksekusi select count(1) from random_table;berjalan lebih cepat dari select count(*) from random_table. Yang lain mengklaim bahwa mereka persis sama.
Tautan ini mengklaim bahwa perbedaan kecepatan antara keduanya adalah karena FULL TABLE SCAN vs FAST FULL SCAN.
Anda salah menafsirkan tautan. LS membuat poin bahwa COUNT (COLUMN) bisa sama dan lebih cepat dari COUNT (*), tetapi hanya ketika tidak ada kolom NOT NULL yang diindeks tetapi COLUMN diindeks dan sebenarnya tidak memiliki nilai null. Lebih dari pertanyaan jebakan.
David Aldridge
1
Saya mencoba menggunakan tautan untuk mendokumentasikan klaim bahwa, dalam beberapa keadaan, COUNT (1) bisa lebih cepat dari COUNT (*). Beberapa jawaban sebelumnya telah membuat pernyataan bahwa tidak ada perbedaan antara keduanya, dan saya memberikan contoh tandingan yang mungkin.
Jawaban:
Parameter untuk fungsi COUNT adalah ekspresi yang akan dievaluasi untuk setiap baris. Fungsi COUNT mengembalikan jumlah baris yang dievaluasi ekspresi menjadi nilai bukan nol. (* adalah ekspresi khusus yang tidak dievaluasi, ini hanya mengembalikan jumlah baris.)
Ada dua pengubah tambahan untuk ekspresi: ALL dan DISTINCT. Ini menentukan apakah duplikat akan dibuang. Karena ALL adalah defaultnya, contoh Anda sama dengan count (ALL 1), yang berarti duplikat dipertahankan.
Karena ekspresi "1" bernilai bukan nol untuk setiap baris, dan karena Anda tidak menghapus duplikat, COUNT (1) harus selalu mengembalikan angka yang sama dengan COUNT (*).
sumber
Berikut ini tautan yang akan membantu menjawab pertanyaan Anda. Pendeknya:
sumber
Perbedaan antara count (*) dan count (1) di oracle?
count (*) berarti itu akan menghitung semua record yaitu setiap sel TAPI
count (1) berarti akan menambahkan satu kolom semu dengan nilai 1 dan mengembalikan hitungan semua record
sumber
Ini mirip dengan perbedaan antara
SELECT * FROM table_name and SELECT 1 FROM table_name.
Jika kamu melakukan
SELECT 1 FROM table_name
itu akan memberi Anda angka 1 untuk setiap baris dalam tabel. Jadi ya
count(*)
dancount(1)
akan memberikan hasil yang sama seperti keinginancount(8)
ataucount(column_name)
sumber
Tidak ada perbedaan.
COUNT(1)
pada dasarnya hanya menghitung nilai konstanta 1 kolom untuk setiap baris. Seperti yang dikatakan pengguna lain di sini, ini sama denganCOUNT(0)
atauCOUNT(42)
. Tidak adaNULL
nilai apa pun sudah cukup.http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Pengoptimal Oracle tampaknya menggunakan bug di dalamnya, yang menyebabkan penghitungan dipengaruhi oleh kolom mana yang Anda pilih dan apakah itu ada dalam indeks, sehingga konvensi COUNT (1) muncul.
sumber
SELECT COUNT(1) from <table name>
harus melakukan hal yang sama persis seperti
SELECT COUNT(*) from <table name>
Mungkin ada atau masih ada beberapa alasan mengapa ini akan bekerja lebih baik daripada
SELECT COUNT(*)
pada beberapa database, tetapi saya akan menganggap itu bug di DB.SELECT COUNT(col_name) from <table name>
Namun memiliki arti yang berbeda, karena hanya menghitung baris dengan nilai bukan null untuk kolom tertentu.
sumber
di oracle saya percaya ini memiliki arti yang persis sama
sumber
Anda bisa mengujinya seperti ini:
create table test1( id number, name varchar2(20) ); insert into test1 values (1,'abc'); insert into test1 values (1,'abc'); select * from test1; select count(*) from test1; select count(1) from test1; select count(ALL 1) from test1; select count(DISTINCT 1) from test1;
sumber
Bergantung pada siapa Anda bertanya, beberapa orang melaporkan bahwa eksekusi
select count(1) from random_table;
berjalan lebih cepat dariselect count(*) from random_table
. Yang lain mengklaim bahwa mereka persis sama.Tautan ini mengklaim bahwa perbedaan kecepatan antara keduanya adalah karena FULL TABLE SCAN vs FAST FULL SCAN.
sumber