- 18/02/2018
- 21 minutos para leer
-
- W
- M
- T
- M
- j
-
+3
Se aplica a: SQL Server (todas las versiones compatibles) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Almacenamiento de datos paralelos
Una subconsulta es una consulta que está anidada dentro de un SELECT
, INSERT
, UPDATE
o DELETE
, o dentro de otra subconsulta. Se puede utilizar una subconsulta en cualquier lugar donde se permita una expresión. En este ejemplo, una subconsulta se usa como una expresión de columna llamada MaxUnitPrice en una instrucción SELECT.
Subconsulta Fundamentos
Una subconsulta también es llamada consulta interna o selección interna, mientras que la instrucción que contiene una subconsulta también se llama consulta externa o selección externa.
Muchas instrucciones Transact-SQL que incluyen subconsultas se pueden formular alternativamente como combinaciones. Solo se pueden plantear otras preguntas con subconsultas. En Transact-SQL, normalmente no hay diferencia de rendimiento entre una instrucción que incluye una subconsulta y una versión semánticamente equivalente que no la incluye. Sin embargo, en algunos casos en los que se debe comprobar la existencia, una combinación produce un mejor rendimiento. De lo contrario, la consulta anidada debe procesarse para cada resultado de la consulta externa para garantizar la eliminación de duplicados. En tales casos, un enfoque conjunto produciría mejores resultados. El siguiente es un ejemplo que muestra una subconsulta SELECT
y una combinación SELECT
que devuelven el mismo conjunto de resultados:
Una subconsulta anidada en la sentencia SELECT externa tiene los siguientes componentes:
- Una consulta
SELECT
normal incluidos los componentes de la lista de selección normal. - Una cláusula
FROM
normal que incluya uno o más nombres de tablas o vistas. - Un
WHERE
cláusula. - Una
GROUP BY
cláusula opcional. - Una cláusula.
La consulta SELECT de una subconsulta siempre se incluye entre paréntesis. No puede incluir una cláusula COMPUTE
o FOR BROWSE
, y solo puede incluir una cláusula ORDER BY
cuando También se especifica una cláusula TOP.
Una subconsulta se puede anidar dentro de la cláusula WHERE
o HAVING
de una cláusula externa SELECT
, INSERT
, UPDATE
o DELETE
declaración, o dentro de otra subconsulta. Es posible hasta 32 niveles de anidamiento, aunque el límite varía según la memoria disponible y la complejidad de otras expresiones en la consulta. Es posible que las consultas individuales no admitan el anidamiento de hasta 32 niveles. Una subconsulta puede aparecer en cualquier lugar donde se pueda usar una expresión, si devuelve un solo valor.
Si una tabla aparece solo en una subconsulta y no en la consulta externa, las columnas de esa tabla no se pueden incluir en la salida (la lista de selección de la consulta externa).
Las declaraciones que incluyen una subconsulta generalmente toman uno de estos formatos:
- DONDE expresión IN (subconsulta)
- DONDE expresión comparación_operador (subconsulta)
- DONDE EXISTE (subconsulta)
En algunas sentencias Transact-SQL, la subconsulta se puede evaluar como si fuera una consulta. Conceptualmente, los resultados de la subconsulta se sustituyen en la consulta externa (aunque no es necesariamente así como SQL Server procesa realmente las instrucciones Transact-SQL con subconsultas).
Hay tres tipos básicos de subconsultas. Aquellos que:
- Operan en listas introducidas con
IN
, o aquellos que un operador de comparación modificó porANY
oALL
. - Se introducen con un operador de comparación no modificado y deben devolver un solo valor.
- ¿Se introducen las pruebas de existencia con
EXISTS
.
Reglas de subconsultas
Una subconsulta está sujeta a las siguientes restricciones:
- La lista de selección de una subconsulta introducida con un operador de comparación puede incluir solo una expresión o nombre de columna (excepto que
EXISTS
yIN
operan enSELECT *
o una lista, respectivamente). - Si la cláusula
WHERE
de una consulta externa incluye un nombre de columna, debe ser compatible con la unión con la columna de la lista de selección de subconsultas. - Los tipos de datos ntext, text e image no se pueden usar en la lista de selección de subconsultas.
- Debido a que deben devolver un solo valor, las subconsultas introducidas por un operador de comparación no modificado (una no seguido de la palabra clave ANY o ALL) no puede incluir las cláusulas
GROUP BY
yHAVING
. - Las
DISTINCT
no se puede utilizar con subconsultas que incluyan GROUP BY. - Las
COMPUTE
yINTO
no se pueden especificar. -
ORDER BY
solo se puede especificar cuandoTOP
también se especifica. - Una vista creada mediante una subconsulta no se puede actualizar.
- La lista de selección de una subconsulta introducida con
EXISTS
, por convención, tiene un asterisco ( *) en lugar de un nombre de columna única. Las reglas para una subconsulta introducida conEXISTS
son las mismas que las de una lista de selección estándar, porque una subconsulta introducida conEXISTS
crea una existencia prueba y devuelve VERDADERO o FALSO, en lugar de datos.
Nombres de columna calificados en subconsultas
En el siguiente ejemplo, la columna BusinessEntityID en WHERE
cláusula de la consulta externa está implícitamente calificada por el nombre de la tabla en la consulta externa FROM
cláusula (Sales.Store). La referencia a CustomerID en la lista de selección de la subconsulta está calificada por la subconsulta FROM
cláusula, es decir, por la tabla Sales.Customer.
La regla general es que los nombres de columna en una declaración están implícitamente calificados por la tabla a la que se hace referencia en la cláusula FROM
en el mismo nivel. Si una columna no existe en la tabla a la que se hace referencia en la cláusula FROM
de una subconsulta, está implícitamente calificada por la tabla a la que se hace referencia en FROM
cláusula de la consulta externa.
Así es como se ve la consulta con estas suposiciones implícitas especificadas:
Nunca está mal para indicar el nombre de la tabla explícitamente, y siempre es posible anular las suposiciones implícitas sobre los nombres de la tabla con calificaciones explícitas.
Importante
Si se hace referencia a una columna en una subconsulta que no existe en la tabla a la que hace referencia la subconsulta «s FROM
cláusula, pero existe en una tabla a la que hace referencia la consulta externa» s FROM
cláusula, la consulta se ejecuta sin errores. SQL Server califica implícitamente la columna de la subconsulta con el nombre de la tabla en la consulta externa.
Múltiples niveles de anidamiento
Una subconsulta puede incluir una o más subconsultas. Se puede anidar cualquier número de subconsultas en una declaración.
La siguiente consulta busca los nombres de empleados que también son vendedores.
Aquí está el conjunto de resultados.
La consulta más interna devuelve los ID de los vendedores. La consulta en el siguiente nivel superior se evalúa con estos ID de vendedor y devuelve los números de ID de contacto de los empleados. Finalmente, la consulta externa usa los ID de contacto para encontrar los nombres de los empleados.
También puede expresar esta consulta como una combinación:
Se pueden evaluar muchas consultas ejecutando la subconsulta una vez y sustituyendo el valor o los valores resultantes en la cláusula WHERE
de la consulta externa. En las consultas que incluyen una subconsulta correlacionada (también conocida como subconsulta repetida), la subconsulta depende de la consulta externa para sus valores. Esto significa que la subconsulta se ejecuta repetidamente, una vez para cada fila que pueda ser seleccionada por la consulta externa. Esta consulta recupera una instancia del nombre y apellido de cada empleado para el cual la bonificación en la tabla SalesPerson es 5000 y para la cual el Los números de identificación de los empleados coinciden en las tablas de Empleado y Personal de ventas.
Aquí está el conjunto de resultados.
La subconsulta anterior en esta declaración no se puede evaluar independientemente de la consulta externa. Necesita un valor para Employee.BusinessEntityID, pero este valor cambia cuando SQL Server examina diferentes filas en Employee.
Así es exactamente como esto La consulta se evalúa: SQL Server considera cada fila de la tabla de empleados para su inclusión en los resultados sustituyendo el valor de cada fila en la consulta interna. Por ejemplo, si SQL Server primero examina la fila para Syed Abbas
, la variable Employee.BusinessEntityID toma el valor 285, que SQL Server sustituye utes en la consulta interna.
El resultado es 0 (Syed Abbas
no recibió una bonificación porque no un vendedor), por lo que la consulta externa se evalúa como:
Debido a que esto es falso, la fila para Syed Abbas
no está incluido en los resultados.