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)?
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)?
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 (*).
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
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
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)
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.
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.
di oracle saya percaya ini memiliki arti yang persis sama
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;
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.