¿Qué significa seleccionar 1 de la tabla?


146

He visto muchas consultas con algo de la siguiente manera.

Select 1  
From table

¿Qué significa esto 1, cómo se ejecutará y qué devolverá?

Además, ¿en qué tipo de escenarios, se puede usar esto?


Respuestas:


107

SELECT 1 FROM TABLE_NAMEsignifica "Devolver 1 de la tabla". Es bastante poco notable por sí solo, por lo que normalmente se usará WHEREy con frecuencia EXISTS(como señala @gbn, esto no es necesariamente la mejor práctica, sin embargo, es lo suficientemente común como para ser observado, incluso si no es realmente significativo ( Dicho esto, lo usaré porque otros lo usan y es "más obvio" de inmediato. Por supuesto, eso podría ser un problema viscoso de pollo versus huevo, pero generalmente no me detengo)).

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

Básicamente, lo anterior devolverá todo de la tabla 1 que tiene una ID correspondiente de la tabla 2. (Este es un ejemplo artificial, obviamente, pero creo que transmite la idea. Personalmente, probablemente haría lo anterior tal SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);como lo veo como MUCHO más explícito para el lector a menos que haya una razón circunstancialmente convincente para no hacerlo).

EDITAR

De hecho, hay un caso que olvidé hasta ahora. En el caso de que intente determinar la existencia de un valor en la base de datos desde un idioma externo, a veces SELECT 1 FROM TABLE_NAMEse utilizará. Esto no ofrece un beneficio significativo sobre la selección de una columna individual, pero, dependiendo de la implementación, puede ofrecer ganancias sustanciales sobre hacerlo SELECT *, simplemente porque a menudo ocurre que mientras más columnas devuelve la base de datos a un idioma, mayores son los datos estructura, lo que a su vez significa que se tomará más tiempo.


¿Y por qué "normalmente" con EXISTS? ¿Tienes prueba de por qué ?
gbn

66
Y un -1 por propagar el mito de...EXISTS (SELECT 1...
gbn

2
@Gbn No tengo idea de por qué lo he visto allí con mucha más frecuencia que cualquier otra cosa. Lo he visto allí mucho más a menudo.
cwallenpoole

2
¿Un pollo viscoso? ¡No me gustaría comer eso! ¿Tal vez debería ser un 'problema vicioso de pollo y huevo'?
No'am Newman

2
@Ben: IN y EXISTs generalmente se optimizarán para el mismo plan
gbn

107

select 1 from tabledevolverá la constante 1 para cada fila de la tabla. Es útil cuando desea determinar de forma económica si el registro coincide con su wherecláusula y / o join.


1
Esta respuesta tenía más sentido para mí
Joseph Astrahan el

2
Punto muy importante de hecho: "para CADA fila en la tabla". Por lo tanto, verificar la "disponibilidad de la tabla" como parte de, por ejemplo, una comprobación de estado de una tabla con cientos de millones de filas, terminará en un conjunto de resultados de cientos de millones "1". (nota: no es que esto suceda NUNCA ... en producción;);))
conny

¡Literalmente, esta debería ser la respuesta aceptada aquí!
Fahad Javed

41

Si te refieres a algo como

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

entonces es un mito que 1es mejor que

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

Se ignora 1o *en EXISTS y puede escribir esto según la página 191 del estándar ANSI SQL 1992 :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 

1
acabo de verificar que postgres respeta esto, exists (select 1/0funciona de maravilla
alex

22

hace lo que dice: siempre devolverá el entero 1. Se utiliza para verificar si existe un registro que coincida con su cláusula where.


22
uhm: la pregunta era "qué significa", no "es esta buena práctica". Estoy de acuerdo en que no hace una diferencia desde el punto de vista del rendimiento, pero es una convención que usan los desarrolladores, presumiblemente porque 1 se interpreta comúnmente como "verdadero".
Neville Kuyt

20

select 1 from table Algunas bases de datos lo usan como una consulta para probar una conexión para ver si está viva, a menudo se usa al recuperar o devolver una conexión a / desde un grupo de conexiones.


2
Ese fue mi caso, es bastante común entre las aplicaciones JBOSS y TOMCAT.
Valter Silva

13

El resultado es 1para cada registro en la tabla. __


En realidad no, intenté crear una tabla vacía y ejecutar la consulta, el resultado son seis 1s.
r0ng

9

Aunque no se conoce ampliamente, una consulta puede tener una HAVINGcláusula sin una GROUP BYcláusula.

En tales circunstancias, la HAVINGcláusula se aplica a todo el conjunto. Claramente, la SELECTcláusula no puede referirse a ninguna columna, de lo contrario (correcto) obtendría el error "La columna no es válida en la selección porque no está contenida en GROUP BY", etc.

Por lo tanto, se debe usar un valor literal (porque SQL no permite un conjunto de resultados con cero columnas, ¿por qué?) Y el valor literal 1 ( INTEGER) se usa comúnmente: si la HAVINGcláusula evalúa, TRUEentonces el conjunto de resultados será una fila con una columna que muestra el valor 1, de lo contrario obtendrá el conjunto vacío.

Ejemplo: para determinar si una columna tiene más de un valor distinto:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

"Claramente, la cláusula SELECT no puede referirse a ninguna columna" - ¿No sería más razonable seleccionar una expresión bool SELECT MIN(colA) < MAX(colA) FROM tableA:?
Paul Spiegel

7

Para ser un poco más específico, usaría esto para hacer

SELECT 1 FROM MyUserTable WHERE user_id = 33487

en lugar de hacer

SELECT * FROM MyUserTable WHERE user_id = 33487

porque no te importa mirar los resultados. Pedir el número 1 es muy fácil para la base de datos (ya que no tiene que hacer ninguna búsqueda).


Según los comentarios anteriores, parece que Select 1 no es mejor en rendimiento que select *, ¿es así?
eRaisedToX

5

Si no sabe que existen datos en su tabla o no, puede usar la siguiente consulta:

SELECT cons_value FROM table_name;

Para un ejemplo:

SELECT 1 FROM employee;
  1. Devolverá una columna que contiene el número total de filas y todas las filas tienen el mismo valor constante 1 (por esta vez devuelve 1 para todas las filas);
  2. Si no hay una fila en su tabla, no devolverá nada.

Entonces, usamos esta consulta SQL para saber si hay datos en la tabla y el número de filas indica cuántas filas existen en esta tabla.


3

Esto significa que desea un valor " 1 " como salida o que la mayoría de las veces se utiliza como consultas internas porque, por alguna razón, desea calcular las consultas externas en función del resultado de las consultas internas ... no todo el tiempo usa 1 pero tener algunos valores específicos ...

Esto le dará estáticamente salida como valor 1.


3

Si solo desea marcar un verdadero o falso basado en la cláusula WHERE, seleccione 1 de la tabla donde la condición es la forma más barata.


2

Veo que siempre se usa en la inyección SQL, como:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

Estos números se pueden usar para adivinar dónde existe la base de datos y adivinar el nombre de la columna de la base de datos que especificó. Y los valores de las tablas.


0

simplemente significa que está recuperando el número de la primera columna de la tabla ,,,, significa seleccionar Emply_num, Empl_no From Employees; aquí está utilizando seleccione 1 de Empleados; eso significa que está recuperando la columna Emply_num. Gracias


Recuerdo esa sintaxis, pero es específica de una base de datos que no puedo recordar. Postgresql?
diynevala

0

La razón es otra, al menos para MySQL. Esto es del manual de MySQL

InnoDB calcula los valores de cardinalidad de índice para una tabla la primera vez que se accede a esa tabla después del inicio, en lugar de almacenar dichos valores en la tabla. Este paso puede llevar un tiempo considerable en los sistemas que dividen los datos en muchas tablas. Dado que esta sobrecarga solo se aplica a la operación de apertura de la tabla inicial, para "calentar" una tabla para su uso posterior, acceda a ella inmediatamente después del inicio emitiendo una declaración como SELECT 1 FROM tbl_name LIMIT 1


0

Esto solo se usa por conveniencia con IF EXISTS (). De lo contrario, puedes ir con

select * from [table_name]

Imagen En el caso de 'SI EXISTE', solo necesitamos saber que cualquier fila con una condición especificada existe o no, no importa cuál sea el contenido de la fila.

select 1 from Users

código de ejemplo anterior, devuelve no. de filas es igual a no. de usuarios con 1 en una sola columna

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.