2011-12-06 8 views
7

Tengo una base de datos, database1, con dos tablas (Table 1, Table2) en él.SELECCIONAR CUENTA (*);

Hay 3 filas en Table1 y 2 filas en Table2. Ahora si ejecuto la siguiente consulta SQL SELECT COUNT(*); en database1, entonces la salida es "1".

¿Alguien tiene la idea? ¿Qué significa esto "1"?

La definición de las dos tablas es la siguiente.

CREATE TABLE Table1 
(
ID INT PRIMARY KEY, 
NAME NVARCHAR(20) 
) 

CREATE TABLE Table2 
(
ID INT PRIMARY KEY, 
NAME NVARCHAR(20) 
) 
+0

¿Cuál es la consulta exacta? – Reactormonk

+0

No creo nada más que 'SELECT COUNT (*)', sin nombre de tabla. Siempre es 1 – Matten

+0

Hola Tass, la consulta es, cuando ejecuto la consulta sql "Seleccionar recuento (*)", entonces la salida es 1. ¿Qué significa esto 1? Tenga en cuenta que no hay un nombre de tabla especificado en la consulta. – IsmailBaig

Respuesta

0

sin nombre de la tabla que siempre devuelve 1 si cualquier base de datos ....

2

Es porque se ha ejecutado select count(*) sin especificar una tabla.

La función de recuento devuelve el número de filas en el conjunto de datos especificado. Si no especifica una tabla para seleccionar, una sola selección solo devolverá una sola fila; por lo tanto, count(*) devolverá 1. (En algunas versiones de SQL, como Oracle, usted tiene para especificar una tabla o similar objeto de base de datos; Oracle incluye una tabla ficticia (llamada DUAL) que se puede seleccionar cuando no se requiere una tabla específica.)

1

normalmente no ejecutará un recuento selectivo (*) sin especificar una tabla para consultar. Es probable que su servidor de base de datos le dé un recuento de "1" en función de la tabla de sistema predeterminada que está consultando.

Intente utilizar

select count(*) from Table1 

Sin un nombre de tabla no tiene sentido.

0

Dado que esto está etiquetado como servidor SQL, los estados MSDN.

COUNT siempre devuelve un valor de tipo de datos int.

Además,

COUNT (*) devuelve el número de elementos de un grupo. Esto incluye NULL valores y duplicados.

Por lo tanto, ya que usted no proporcionó una mesa para hacer un COUNT partir, el valor por defecto (supuesto) es que devuelve un 1.

+0

¿Hay alguna razón por la cual debería devolver uno en lugar de cero? –

+1

@LukeGirvin sí, las selecciones simples actúan como si se ejecutaran contra una tabla con una fila. Eche un vistazo a mi respuesta. –

6

Normalmente todos son selecciona de forma SELECT [columns, scalar computations on columns, grouped computations on columns, or scalar computations] FROM [table or joins of tables, etc]

porque esto permite que los cálculos escalares de civil que podemos hacer algo como SELECT 1 + 1 FROM SomeTable y ha de devolver un conjunto de registros con el valor de 2 para cada fila de la tabla SomeTable.

Ahora, si no nos importara ninguna tabla, pero solo quisiéramos calcular nuestro escalar, podríamos hacer algo como SELECT 1 + 1. Esto no está permitido por el estándar, pero es útil y la mayoría de las bases de datos lo permiten (Oracle no lo hace a menos que haya cambiado recientemente, al menos antes no).

Por lo tanto, estos SELECT desnudos se tratan como si tuvieran una cláusula from que especificaba una tabla con una fila y sin columna (imposible, por supuesto, pero hace el truco). Por lo tanto SELECT 1 + 1 se convierte en SELECT 1 + 1 FROM ImaginaryTableWithOneRow que devuelve una sola fila con una sola columna con el valor 2.

Principalmente no pensamos en esto, simplemente nos acostumbramos al hecho de que los SELECT desnudos dan resultados y ni siquiera se piensa en el hecho de que debe haber una sola fila seleccionada para devolver una fila.

Al hacer SELECT COUNT(*) que hizo el equivalente de SELECT COUNT(*) FROM ImaginaryTableWithOneRow que por supuesto devuelve 1.

6

En una línea similar al siguiente también devuelve un resultado.

SELECT 'test' 
WHERE EXISTS (SELECT *) 

La explicación de que el comportamiento (de this Connect item) también se aplica a su pregunta.

En ANSI SQL, una declaración SELECT sin FROM cláusula no está permitido - es necesario especificar una fuente de mesa. Entonces la declaración "SELECT 'test' WHERE EXISTS(SELECT *)" debería dar error de sintaxis. Este es el comportamiento correcto .

Con respecto a la implementación de SQL Server, la cláusula FROM es opcional y siempre ha funcionado de esta manera. Entonces puede hacer "SELECT 1" o "SELECT @v" y así sucesivamente sin requerir una tabla. En otras sistemas de bases de datos, hay una tabla ficticia llamada "dual" con una sola fila que se utiliza para hacer tales declaraciones como SELECT "SELECT 1 FROM dual;" o "SELECT @v FROM dual;". Ahora, al llegar a la cláusula EXISTS - la lista de proyectos no importa en términos de la sintaxis o el resultado de la consulta y SELECT * es válida en una subconsulta. Si unimos esto con el hecho de que permitimos SELECT sin FROM, obtienes el comportamiento que ves. Podríamos solucionarlo, pero no tiene mucho valor y podría romper el código de la aplicación existente.

0

COUNT función devuelve el número de filas como resultado. Si no especifica ninguna tabla, devuelve 1 por defecto. es decir, COUNT(*), COUNT(1), COUNT(2), ... devolverá 1 siempre.

-1
Select * 

sin a from clause es "Seleccione TODAS del universo" ya que no ha filtrado nada. En su caso, usted está preguntando "¿Cuántos universo?" Esto es exactamente cómo lo enseñaría. Escribiría en la pizarra el primer día, Seleccione * y pregunte qué significa. Respuesta: Dame el mundo. Y desde allí enseñaría cómo filtrar el universo a algo significativo.

Debo admitir que nunca pensé en Select Count (*), lo que lo haría más interesante pero aún así trae una respuesta verdadera. Solo tenemos un mundo
Sin consultar a Steven Hawking, SQL tendrá que lidiar solo con 1.

Los resultados de la consulta son correctos.