¿Qué hace "seleccionar 1 de"?

80

Leí algunos artículos pero realmente no entendí lo que select 1 fromhace. Alguien dice "deberías usar en select 1lugar de select *". Aquí hay una tabla de ejemplo:

cust_id     cust_name       cust_address

1000000001  Village Toys    Mapl
1000000002  Kids Place      South
1000000003  Fun4All         Sunny
1000000004  Fun4All         Riverside
1000000005  The Toy Store   53rd

¿Cuál será el resultado cuando escriba select 1 from customer_tablequé hace esta declaración?

Mehmet
fuente
Hace aproximadamente una década , era un consejo razonable sugerir en select 1lugar de, select *por ejemplo, una EXISTScláusula. El optimizador se mejoró hace mucho tiempo. Fue Nunca un reemplazo para "obtener todas las columnas de este conjunto de resultados".
Damien_The_Unbeliever
12
¿¿¿Lo intentaste???
Jimmy D

Respuestas:

72
select 1 from table

devolverá una columna de unos por cada fila de la tabla. Puede usarlo con una instrucción where para verificar si tiene una entrada para una clave determinada, como en:

if exists(select 1 from table where some_column = 'some_value')

Lo que probablemente estaba diciendo su amigo es que en lugar de hacer selecciones masivas con select * from table, debe especificar las columnas que necesita con precisión, por dos razones:

1) rendimiento y es posible que recupere más datos de los que realmente necesita.

2) el usuario de la consulta puede confiar en el orden de las columnas. Si su tabla se actualiza, el cliente recibirá columnas en un orden diferente al esperado.

Vladimir
fuente
33

La construcción se usa generalmente en controles de "existencia"

if exists(select 1 from customer_table where customer = 'xxx')

o

if exists(select * from customer_table where customer = 'xxx')

Ambas construcciones son equivalentes. En el pasado, la gente decía que la selección * era mejor porque el gobernador de consultas usaba la mejor columna indexada. Se ha demostrado que esto no es cierto.

Filip De Vos
fuente
24

Se hace lo que se pide, SELECT 1 FROM tablese SELECT(regreso) una 1para cada fila de esa tabla, si había 3 filas de la tabla que se obtendría

1
1
1

Eche un vistazo a Count (*) vs Count (1), que puede ser el problema que describieron.

Alex K.
fuente
3
¿Por qué querría eso?
CodyBugstein
7
@Imray Esto es útil cuando solo está interesado en si la condición en su WHEREcláusula es verdadera o falsa. A menudo se utiliza en subconsultas.
Andreas
9

La declaración SELECT 1 FROM SomeTablesolo devuelve una columna que contiene el valor 1de cada fila en su tabla. Si agrega otra columna, por ejemplo SELECT 1, cust_name FROM SomeTable, lo hace un poco más claro:

            cust_name
----------- ---------------
1           Village Toys
1           Kids Place
1           Fun4All
1           Fun4All
1           The Toy Store
Justin
fuente
4
SELECT COUNT(*) in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- la EXISTScondición siempre será verdadera independientemente de que se cumplan o no las CONDICIONES.

NOT EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- la NOT EXISTScondición siempre devolverá falso independientemente de que CONDITIONSse cumpla o no.

SELECT COUNT 1 in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- la EXISTScondición se volverá verdadera si CONDITIONSse cumple. De lo contrario, falso.

NOT EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- la NOT EXISTScondición devolverá falso si CONDITIONSse cumple. De lo contrario, es cierto.

Veera
fuente