SELECCIONAR COUNT (*);

Tengo una database, database1 , con dos tablas ( Table 1 , Table2 ) en ella.

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 este "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) ) 

Normalmente, todas las selects tienen la forma SELECT [columns, scalar computations on columns, grouped computations on columns, or scalar computations] FROM [table or joins of tables, etc]

Como esto permite cálculos escalares simples, podemos hacer algo como SELECT 1 + 1 FROM SomeTable y devolverá un set de loggings con el valor 2 para cada fila en 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 less que haya cambiado recientemente, al less antes no).

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

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

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

En líneas similares, lo siguiente también arroja un resultado.

 SELECT 'test' WHERE EXISTS (SELECT *) 

La explicación de ese comportamiento (de este elemento de Connect ) también se aplica a su pregunta.

En ANSI SQL, no se permite una instrucción SELECT sin la cláusula FROM ; debe especificar un origen de tabla. Entonces la statement " SELECT 'test' WHERE EXISTS(SELECT *) " debería dar error de syntax. Éste 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. De modo que puede hacer " SELECT 1 " o " SELECT @v " y así sucesivamente sin requerir una tabla. En otros sistemas de bases de datos, hay una tabla ficticia llamada "DUAL" con una fila que se utiliza para hacer tales declaraciones SELECT como " SELECT 1 FROM dual; " o " SELECT @v FROM dual; ". Ahora, llegando a la cláusula EXISTS , la list de proyectos no importa en términos de la syntax 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 hacerlo y podría romper el código de la aplicación existente.

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

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

normalmente no ejecutaría un recuento selectivo (*) sin especificar una tabla para consultar. Es probable que su server de database le dé un recuento de "1" en function de la tabla de sistema pnetworkingeterminada que está consultando.

Intenta usar

 select count(*) from Table1 

Sin un nombre de tabla, no tiene sentido.

sin nombre de tabla siempre devuelve 1 si es cualquier database ….

Dado que este es un server SQL labeldo, los estados de MSDN .

COUNT siempre devuelve un valor de tipo de datos int.

También,

COUNT (*) devuelve la cantidad de elementos en un grupo. Esto incluye valores NULL y duplicates.

Por lo tanto, dado que no proporcionó una tabla para hacer un COUNT desde, el valor pnetworkingeterminado (suposition) es que devuelve un 1 .

COUNT function COUNT 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.

 Select * 

sin una cláusula from es "Seleccionar TODO del Universo" ya que no ha filtrado nada. En tu caso, estás preguntando "¿Cuántos universo?" Así es exactamente como lo enseñaría. Escribiría en la pizarra el primer día, selecciona * y preguntaría 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 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.