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).
Jon Schneider
Respuestas:
106
El parámetro de 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 que la expresión se evalúa como un valor no nulo. (* es una expresión especial que no se evalúa, simplemente devuelve el número de filas).
Hay dos modificadores adicionales para la expresión: ALL y DISTINCT. Estos determinan si se descartan los duplicados. Dado que 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 dado que no está eliminando duplicados, COUNT (1) siempre debe devolver el mismo número que COUNT (*).
Recuerde seleccionar DISTINCT coloumn1 de table1! = Seleccionar count (DISTINCT coloumn1) de table1;
Kanagavelu Sugumar
También cuente (1) aquí 1 no es una columna no, es una expresión. por ejemplo, seleccione 1 de la tabla1; imprimirá 1 número de veces por el número de filas que tiene la tabla.
Kanagavelu Sugumar
seleccione el recuento (DISTINCT / ALL columnName) de la tabla1; devolverá ninguno de todos / distintos valores NOT NULL de la columna (columnName).
Kanagavelu Sugumar
seleccione DISTINCT column1 de table1; incluirá un valor NULO en la columna (columna1). seleccione el recuento (DISTINCT coloumn1) de la tabla1; no incluirá ni siquiera una fila NULL.
Kanagavelu Sugumar
1
@datps: en realidad, hay un número ilimitado de expresiones que dan el mismo resultado. COUNT ('¡Hola, mundo!') Debería funcionar igual de bien. (No lo he probado). Entonces la pregunta es, ¿por qué crear una expresión especial (*) cuando ya hay un número ilimitado de formas de hacer lo mismo? No puedo hablar por los creadores de SQL (que tienen muchos pecados por los que expiar :)), pero probablemente fue para que la gente no tuviera que elegir arbitrariamente una expresión no nula. Eso habría enturbiado la intención del autor de la consulta. "¿Por qué escribieron 1 en lugar de 2? ¡Esto debe significar algo!"
Jeffrey L Whitledge
26
Aquí hay un enlace que le ayudará a responder sus preguntas. En breve:
count (*) es la forma correcta de escribirlo y count (1) está OPTIMIZADO PARA SER count (*) internamente, ya que
a) contar las filas donde 1 no es nulo es menos eficiente que
b) contar las filas
count (column_name) no es exactamente lo mismo, no cuenta filas con nulo en esa columna. Consulte aquí para obtener más detalles: stackoverflow.com/questions/169784
Blorgbeard sale el
Hmm, en realidad eso es para SQL Server. Oracle puede funcionar de manera diferente, supongo.
Blorgbeard sale el
Count nunca debe usar valores NULL según el estándar SQL, ORacle y SQL Server deben tener el mismo comportamiento a este respecto.
Thorsten
"similar a la diferencia entre SELECT * FROM table_name y SELECT 1 FROM table_name". -- realmente no. SELECT * y SELECT 1 son diferentes. SELECT (*) y SELECT (1) dan el mismo resultado.
David Aldridge
6
No hay diferencia.
COUNT(1)básicamente está contando 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 falta de NULLvalor será suficiente.
El optimizador de Oracle aparentemente solía tener errores, lo que provocó que el recuento se viera afectado por la columna que eligió y si estaba en un índice, por lo que la convención COUNT (1) entró en vigor.
Puede que haya habido o todavía haya algunas razones por las que funcionaría mejor que SELECT COUNT(*)en alguna base de datos, pero lo consideraría un error en la base de datos.
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 dada.
no, 1 se refiere al número constante 1. Cuando dices, ORDEN POR 1, se refiere a la columna uno.
Thilo
eso es lo que me preguntaba hace un tiempo, pero puede especificar cualquier número que sea mayor que el recuento de columnas, pero el resultado es el mismo. Así que definitivamente no es el número de columna.
Nrj
@dacracot: puede que sí, pero no lo creo. Por lo que entiendo, Oracle simplemente reescribe el recuento (1) para que sea recuento (*) en segundo plano
Jarod Elliott
2
Puedes probar así:
createtable test1(
id number,
name varchar2(20));insertinto test1 values(1,'abc');insertinto test1 values(1,'abc');select*from test1;select count(*)from test1;select count(1)from test1;select count(ALL1)from test1;select count(DISTINCT1)from test1;
Dependiendo de a quién le pregunte, algunas personas informan que la ejecución se select count(1) from random_table;ejecuta más rápido que select count(*) from random_table. Otros afirman que son exactamente iguales.
Este enlace afirma que la diferencia de velocidad entre los 2 se debe a un EXPLORACIÓN DE MESA COMPLETA frente a un EXPLORACIÓN COMPLETA RÁPIDA.
Estás malinterpretando el enlace. LS hace hincapié en que COUNT (COLUMN) puede ser igual y más rápido que COUNT (*), pero solo cuando no hay columnas NOT NULL indexadas, pero COLUMN está indexada y en realidad no tiene valores nulos. Más bien una pregunta con trampa.
David Aldridge
1
Estaba intentando utilizar el enlace para documentar la afirmación de que, en algunas circunstancias, COUNT (1) podría ser más rápido que COUNT (*). Algunas respuestas anteriores habían afirmado que no había diferencias entre los 2, y estaba proporcionando un posible contraejemplo.
Respuestas:
El parámetro de 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 que la expresión se evalúa como un valor no nulo. (* es una expresión especial que no se evalúa, simplemente devuelve el número de filas).
Hay dos modificadores adicionales para la expresión: ALL y DISTINCT. Estos determinan si se descartan los duplicados. Dado que 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 dado que no está eliminando duplicados, COUNT (1) siempre debe devolver el mismo número que COUNT (*).
fuente
Aquí hay un enlace que le ayudará a responder sus preguntas. En breve:
fuente
¿Diferencia entre count (*) y count (1) en Oracle?
count (*) significa que contará todos los registros, es decir, todas y cada una de las celdas PERO
count (1) significa que agregará una pseudocolumna con valor 1 y devuelve el recuento de todos los registros
fuente
Esto es similar a la diferencia entre
Si lo haces
le dará el número 1 para cada fila de la tabla. Así que sí
count(*)
ycount(1)
proporcionará los mismos resultados que willcount(8)
ocount(column_name)
fuente
No hay diferencia.
COUNT(1)
básicamente está contando una columna de valor constante 1 para cada fila. Como han dicho otros usuarios aquí, es lo mismo queCOUNT(0)
oCOUNT(42)
. Cualquier falta deNULL
valor será suficiente.http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
El optimizador de Oracle aparentemente solía tener errores, lo que provocó que el recuento se viera afectado por la columna que eligió y si estaba en un índice, por lo que la convención COUNT (1) entró en vigor.
fuente
debería hacer exactamente lo mismo que
Puede que haya habido o todavía haya algunas razones por las que funcionaría mejor que
SELECT COUNT(*)
en alguna base de datos, pero lo consideraría un error en la base de datos.sin embargo, tiene un significado diferente, ya que solo cuenta las filas con un valor no nulo para la columna dada.
fuente
en oráculo creo que estos tienen exactamente el mismo significado
fuente
Puedes probar así:
fuente
Dependiendo de a quién le pregunte, algunas personas informan que la ejecución se
select count(1) from random_table;
ejecuta más rápido queselect count(*) from random_table
. Otros afirman que son exactamente iguales.Este enlace afirma que la diferencia de velocidad entre los 2 se debe a un EXPLORACIÓN DE MESA COMPLETA frente a un EXPLORACIÓN COMPLETA RÁPIDA.
fuente