¿Qué significa seleccionar 1 de la tabla?


He visto muchas consultas con algo como sigue.

Select 1  
From table

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

También, ¿en qué tipo de escenarios, se puede usar esto?

Author: Bilesh Ganguly, 2011-08-24

14 answers

SELECT 1 FROM TABLE_NAME significa, "Devolver 1 de la tabla". Es bastante sencillo por sí solo, por lo que normalmente se utilizará con WHERE y a menudo EXISTS (como señala @gbn, esto no es necesariamente una buena 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" inmediatamente. Por supuesto, eso podría ser un problema de pollo vs. huevo viscoso, 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 volverá todo lo de la tabla 1 que tiene un ID correspondiente de la tabla 2. (Este es un ejemplo artificial, obviamente, pero creo que transmite la idea. Personalmente, probablemente haría lo anterior como SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2); ya que lo veo como MUCHO más explícito para el lector a menos que haya una razón circunstancialmente convincente para no hacerlo).

EDITAR

En realidad hay un caso del que me olvidé hasta ahora. En el caso de que usted está tratando de determinar la existencia de un valor en la base de datos desde un lenguaje externo, a veces se usará SELECT 1 FROM TABLE_NAME. 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 hacer un SELECT *, simplemente porque a menudo es el caso que cuantas más columnas que la base de datos devuelve a un lenguaje, mayor es la estructura de datos, lo que a su vez significa que se tomará más tiempo.

 76
Author: cwallenpoole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-23 15:24:19

select 1 from table devolverá la constante 1 para cada fila de la tabla. Es útil cuando desea determinar a bajo costo si el registro coincide con su cláusula where y/o join.

 53
Author: Sahil Muthoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-24 05:58:18

Si quieres decir algo como

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

Entonces es un mito que el 1 es mejor que

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

El 1 o * en el EXISTE es ignorado y puede escribir esto según Página 191 del estándar ANSI SQL 1992 :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 
 34
Author: gbn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-27 15:07:09

Hace lo que dice - siempre devolverá el entero 1. Se utiliza para comprobar si existe un registro que coincida con su cláusula where.

 17
Author: Neville Kuyt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-24 05:57:38

select 1 from table es utilizado por algunas bases de datos como una consulta para probar una conexión para ver si está activa, a menudo se usa cuando se recupera o devuelve una conexión a / desde un grupo de conexiones.

 15
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-24 06:03:07

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

 10
Author: TiMr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-03 13:39:44

Aunque no es ampliamente conocido, una consulta puede tener una cláusula HAVING sin una cláusula GROUP BY.

En tales circunstancias, la cláusula HAVING se aplica a todo el conjunto. Claramente, la cláusula SELECT no puede hacer referencia a ninguna columna, de lo contrario (corregiría) obtendría el error, "La columna no es válida en seleccionar porque no está contenida en el GRUPO POR", 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 el valor literal 1 (INTEGER) se usa comúnmente: si la cláusula HAVING evalúa TRUE, entonces el conjunto resultante será una fila con una columna que muestre el valor 1, de lo contrario obtendrá el conjunto vacío.

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

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);
 8
Author: onedaywhen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-24 08:31:57

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

SELECT cons_value FROM table_name;

Por 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 este tiempo devuelve 1 para todas las filas);
  2. Si no hay ninguna fila en su tabla, no devolverá nada.

Por lo tanto, usamos esta consulta SQL para saber si hay algún dato en la tabla y el número de filas indica cuántas las filas son existen en esta tabla.

 5
Author: mahbub_siddique,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-26 09:08:38

Para ser un poco más específico, usarías 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. Preguntar por el número 1 es muy fácil para la base de datos (ya que no tiene que hacer ninguna búsqueda).

 4
Author: Robert Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-24 06:00:59

Esto significa que desea un valor "1" como salida o la mayor parte del tiempo se utiliza como Consultas internas porque por alguna razón desea calcular las consultas externas basadas en el resultado de las consultas internas.. no todo el tiempo que usas 1 pero tienes algunos valores específicos...

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

 3
Author: DShah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-24 06:00:27

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

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-22 16:31:28

Veo que siempre se usa en 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.

 2
Author: EmilyAvon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-08 02:36:46

Simplemente significa que está recuperando la primera columna del número de la tabla,,,, significa seleccione Emply_num,Empl_no De los Empleados ; aquí está usando select 1 de Empleados; eso significa que está recuperando la columna Emply_num. Gracias

 0
Author: zeeshan rajput,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-26 21:35:52

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 tomar un tiempo significativo en los sistemas que particionan los datos en muchas tablas. Dado que esta sobrecarga solo se aplica a la operación inicial de apertura de la tabla, para" calentar " una tabla para su uso posterior, acceda a ella inmediatamente después del inicio mediante emitir una instrucción como SELECT 1 FROM tbl_name LIMIT 1

 0
Author: Ramona Morea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-02 01:39:30