Che cosa significa "select count (1) from table_name" su qualsiasi tabella di database?


92

Quando eseguiamo select count(*) from table_namerestituisce il numero di righe.

Cosa fa count(1)? Cosa 1significa qui? È lo stesso di count(*)(dato che dà lo stesso risultato all'esecuzione)?


1
Domanda interessante. Sarei anche interessato a sapere se la risposta dipende dall'implementazione (ad es. Se il risultato della query è lo stesso in SQL Server come in Oracle).
Jon Schneider

Risposte:


106

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


Ricorda selezionare DISTINCT coloumn1 da table1! = Select count (DISTINCT coloumn1) da table1;
Kanagavelu Sugumar

Anche contare (1) qui 1 non è la colonna no, è un'espressione. ad esempio) seleziona 1 da table1; stamperà 1 numero di volte per il numero di righe di quella tabella.
Kanagavelu Sugumar

selezionare il conteggio (DISTINCT / ALL columnName) dalla tabella1; restituirà il no di tutti / i valori NOT NULL distinti della colonna (columnName).
Kanagavelu Sugumar

selezionare DISTINCT column1 da table1; includerà un valore NULL nella colonna (colonna1). seleziona il conteggio (DISTINCT coloumn1) dalla tabella1; non includerà nemmeno una riga NULL.
Kanagavelu Sugumar

1
@datps: in realtà esiste un numero illimitato di espressioni che danno lo stesso risultato. COUNT ('Hello, world!') Dovrebbe funzionare altrettanto bene. (Non l'ho provato.) Quindi la domanda è: perché creare un'espressione speciale (*) quando esiste già un numero illimitato di modi per fare la stessa cosa? Non posso parlare per i creatori di SQL (che hanno molti peccati da espiare :)), ma probabilmente era così che le persone non avrebbero dovuto scegliere arbitrariamente un'espressione non nulla. Ciò avrebbe confuso l'intento dell'autore della domanda. "Perché hanno scritto 1 invece di 2? Questo deve significare qualcosa!"
Jeffrey L Whitledge,

26

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


17

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


9

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)


3
count (nome_colonna) non è esattamente lo stesso - non conta le righe con null in quella colonna. Vedi qui per maggiori dettagli: stackoverflow.com/questions/169784
Blorgbeard è fuori

Hmm, in realtà è per SQL Server. Oracle potrebbe funzionare diversamente, suppongo.
Blorgbeard uscirà l'

Count non dovrebbe mai usare valori NULL come per SQL standard, ORacle e SQL Server dovrebbero avere lo stesso comportamento a questo proposito.
Thorsten

"simile alla differenza tra SELECT * FROM table_name e SELECT 1 FROM table_name." -- non proprio. SELECT * e SELECT 1 sono diversi. SELECT (*) e SELECT (1) danno lo stesso risultato.
David Aldridge,

7

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 NULLvalore 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).


5
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.


3

in oracle credo che abbiano esattamente lo stesso significato


L'1 si riferisce alla colonna uno?
dacracot

1
no, 1 si riferisce alla costante numero 1. Quando dici ORDER BY 1, ci si riferisce alla colonna uno.
Thilo

questo è quello che mi chiedevo tempo fa, ma puoi specificare qualsiasi numero maggiore del conteggio delle colonne, tuttavia il risultato è lo stesso. Quindi non è sicuramente il numero di colonna.
Nrj

@dacracot: potrebbe ma non ci credo. Da quello che ho capito, oracle riscrive in background count (1) per essere count (*)
Jarod Elliott

2

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;

0

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.


Stai interpretando male il collegamento. LS sta sottolineando che COUNT (COLUMN) può essere uguale e più veloce di COUNT (*), ma solo quando nessuna colonna NOT NULL è indicizzata ma COLUMN è indicizzata e in realtà non ha valori null. Più di una domanda trabocchetto.
David Aldridge,

1
Stavo cercando di utilizzare il collegamento per documentare l'affermazione che, in alcune circostanze, COUNT (1) potrebbe essere più veloce di COUNT (*). Alcune risposte precedenti avevano affermato che non c'erano differenze tra i 2 e stavo fornendo un possibile contro esempio.
Johann Zacharee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.