2008-10-08 20 views
53

Cuando ejecutamos select count(*) from table_name, devuelve el número de filas.¿Qué significa "seleccionar count (1) from table_name" en cualquier tabla de base de datos?

¿Qué hace count(1) hacer? ¿Qué significa 1 aquí? ¿Es esto lo mismo que count(*) (dado que da el mismo resultado en la ejecución)?

+0

Interesante pregunta. También me interesaría saber si la respuesta depende de la implementación (por ejemplo, si el resultado de la consulta es el mismo en SQL Server que en Oracle). –

Respuesta

70

El parámetro para la función COUNT es una expresión que se evaluará para cada fila. La función COUNT devuelve el número de filas para las cuales la expresión evalúa a un valor no nulo. (* es una expresión especial que no se evalúa, simplemente devuelve el número de filas.)

Existen dos modificadores adicionales para la expresión: ALL y DISTINCT. Estos determinan si los duplicados se descartan. Como ALL es el valor predeterminado, su ejemplo es el mismo que count (ALL 1), lo que significa que se conservan los duplicados.

Dado que la expresión "1" se evalúa como no nula para cada fila, y como no está eliminando duplicados, COUNT (1) siempre debe devolver el mismo número que COUNT (*).

+0

Recuerde seleccionar DISTINCT coloumn1 de table1! = Select count (DISTINCT coloumn1) de table1; –

+0

También cuente (1) aquí 1 no es columno no, es una expresión. por ejemplo, seleccione 1 de la tabla 1; imprimirá 1 no de veces para ninguna de las filas que tiene la tabla. –

+0

select count (DISTINCT/ALL columnName) de table1; devolverá ningún valor de todos/distinct NOT NULL de la columna (columnName). –

2

en el oráculo Creo que estos tienen exactamente el mismo significado

+0

¿El 1 se refiere a la columna uno? – dacracot

+0

no, 1 se refiere al número constante 1. Cuando dice, ORDER BY 1, se refiere a la columna uno. – Thilo

+0

eso es lo que me pregunté hace un tiempo, pero puedes especificar cualquier número que sea mayor que el recuento de columnas, pero el resultado es el mismo. Entonces definitivamente no es un número de columna. – Nrj

6

Esto es similar a la diferencia entre

SELECT * FROM table_name and SELECT 1 FROM table_name. 

Si lo hace

SELECT 1 FROM table_name 

que le dará el número 1 para cada fila en la mesa. Entonces sí count(*) y count(1) proporcionarán los mismos resultados que count(8) o count(column_name)

+3

recuento (nombre_columna) no es lo mismo: no cuenta las filas con nulo en esa columna. Consulte aquí para obtener más información: http://stackoverflow.com/questions/169784 – Blorgbeard

+0

Hmm, en realidad eso es para SQL Server. Oracle puede funcionar de manera diferente, supongo. – Blorgbeard

+0

Count nunca debe usar valores NULL como por SQL estándar, ORacle y SQL Server deberían tener el mismo comportamiento a este respecto. – Thorsten

4

No hay diferencia.

COUNT(1) es básicamente contar una columna de valor constante 1 para cada fila. Como han dicho otros usuarios aquí, es lo mismo que COUNT(0) o COUNT(42). Cualquier valor que no sea NULL será suficiente.

http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789

El optimizador de Oracle se utilizan al parecer a tener errores en ella, lo que causó la cuenta a verse afectada por el cual la columna que eligió y si era en un índice, por lo que el COUNT (1) Convención entró en siendo.

2
SELECT COUNT(1) from <table name> 

debe hacer exactamente lo mismo como

SELECT COUNT(*) from <table name> 

Puede que haya habido o estar todavía en algunas de las razones por las que sería un mejor desempeño que SELECT COUNT(*) en alguna base de datos, pero yo consideraría que un error en el DB.

SELECT COUNT(col_name) from <table name> 

Sin embargo, tiene un significado diferente, ya que solo cuenta las filas con un valor no nulo para la columna especificada.

17

Aquí está a link que ayudará a responder sus preguntas.En resumen:

cuenta (*) es la forma correcta de escribir y contar que (1) está optimizado para ser cuenta (*) internamente - desde

a) contar las filas en las que 1 no es nulo es menos eficiente que
b) contar las filas

0

Dependiendo de a quién le pregunte, algunas personas reportan que la ejecución de select count(1) from random_table; corre más rápido que select count(*) from random_table. Otros afirman que son exactamente lo mismo.

Este link afirma que la diferencia de velocidad entre los 2 se debe a una EXPLORACIÓN DE LA MESA COMPLETA frente a la EXPLORACIÓN RÁPIDA COMPLETA.

+0

Estás malinterpretando el enlace. LS está argumentando que COUNT (COLUMN) puede ser igual y más rápido que COUNT (*), pero solo cuando no se indexan las columnas NOT NULL, pero COLUMN se indexa y en realidad no tiene valores nulos. Más de una pregunta capciosa. –

+1

Estaba intentando utilizar el enlace para documentar el reclamo de que, en algunas circunstancias, COUNT (1) podría ser más rápido que COUNT (*). Algunas respuestas anteriores habían hecho la declaración de que no había diferencias entre los 2, y estaba proporcionando un posible contraejemplo. –

10

Diferencia entre el recuento (*) y el recuento (1) en el oráculo?

cuenta (*) significa que va a contar todos los registros, es decir, cada célula PERO

recuento (1) significa que se sumará una pseudo columna con valor 1 y devuelve el recuento de todos los registros

+0

gracias! esto ayudó después de leer otras respuestas principales –

1

Usted puede probar así:

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; 
Cuestiones relacionadas