Apa yang dimaksud dengan "pilih jumlah (1) dari nama_tabel" pada tabel database apa pun?

93

Ketika kami mengeksekusi select count(*) from table_nameitu mengembalikan jumlah baris.

Apa yang count(1)dilakukannya? Apa artinya di 1sini? Apakah ini sama dengan count(*)(karena memberikan hasil yang sama pada eksekusi)?

Nrj
sumber
1
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 (*).

Jeffrey L. Whitledge
sumber
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

Eddie Awad
sumber
17

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
9

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(*)dan count(1)akan memberikan hasil yang sama seperti keinginan count(8)ataucount(column_name)

ChrisHDog
sumber
3
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.

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.

Cade Roux
sumber
5
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.

Thilo
sumber
3

di oracle saya percaya ini memiliki arti yang persis sama

Jarod Elliott
sumber
Apakah angka 1 mengacu pada kolom satu?
dacracot
1
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:

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;
Vikas Kumar
sumber
0

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.

Johann Zacharee
sumber
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.
Johann Zacharee