Quando eseguiamo select count(*) from table_name
restituisce il numero di righe.
Cosa fa count(1)
? Cosa 1
significa qui? È lo stesso di count(*)
(dato che dà lo stesso risultato all'esecuzione)?
Quando eseguiamo select count(*) from table_name
restituisce il numero di righe.
Cosa fa count(1)
? Cosa 1
significa qui? È lo stesso di count(*)
(dato che dà lo stesso risultato all'esecuzione)?
Risposte:
Il parametro della funzione COUNT è un'espressione che deve essere valutata per ogni riga. La funzione COUNT restituisce il numero di righe per le quali l'espressione restituisce un valore non nullo. (* è un'espressione speciale che non viene valutata, restituisce semplicemente il numero di righe.)
Sono disponibili due modificatori aggiuntivi per l'espressione: ALL e DISTINCT. Questi determinano se i duplicati vengono scartati. Poiché ALL è l'impostazione predefinita, il tuo esempio è uguale a count (ALL 1), il che significa che i duplicati vengono conservati.
Poiché l'espressione "1" restituisce un valore diverso da null per ogni riga e poiché non stai rimuovendo i duplicati, COUNT (1) dovrebbe sempre restituire lo stesso numero di COUNT (*).
Ecco un collegamento che ti aiuterà a rispondere alle tue domande. In breve:
count (*) è il modo corretto per scriverlo e count (1) è OTTIMIZZATO PER ESSERE count (*) internamente - poiché
a) contare le righe dove 1 non è nullo è meno efficiente di
b) contare le righe
Differenza tra count (*) e count (1) in Oracle?
count (*) significa che conterà tutti i record cioè ogni cella MA
count (1) significa che aggiungerà una pseudo colonna con valore 1 e restituirà il conteggio di tutti i record
Questo è simile alla differenza tra
SELECT * FROM table_name and SELECT 1 FROM table_name.
Se fate
SELECT 1 FROM table_name
ti darà il numero 1 per ogni riga della tabella. Quindi sì count(*)
e count(1)
fornirà gli stessi risultati di Will count(8)
ocount(column_name)
Non c'è differenza.
COUNT(1)
fondamentalmente sta solo contando una colonna con valore costante 1 per ogni riga. Come hanno detto altri utenti qui, è lo stesso di COUNT(0)
o COUNT(42)
. Qualsiasi non NULL
valore sarà sufficiente.
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Apparentemente l'ottimizzatore Oracle aveva dei bug al suo interno, il che faceva sì che il conteggio fosse influenzato dalla colonna selezionata e dal fatto che fosse in un indice, quindi è nata la convenzione COUNT (1).
SELECT COUNT(1) from <table name>
dovrebbe fare esattamente la stessa cosa di
SELECT COUNT(*) from <table name>
Potrebbero esserci stati o ancora esserci alcuni motivi per cui avrebbe funzionato meglio rispetto SELECT COUNT(*)
a qualche database, ma lo considero un bug nel DB.
SELECT COUNT(col_name) from <table name>
tuttavia ha un significato diverso, poiché conta solo le righe con un valore non nullo per la colonna data.
in oracle credo che abbiano esattamente lo stesso significato
Puoi provare in questo modo:
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;
A seconda di chi chiedi, alcune persone segnalano che l'esecuzione select count(1) from random_table;
viene eseguita più velocemente di select count(*) from random_table
. Altri affermano che sono esattamente la stessa cosa.
Questo collegamento afferma che la differenza di velocità tra i 2 è dovuta a una SCANSIONE COMPLETA DELLA TABELLA rispetto a una SCANSIONE COMPLETA VELOCE.