Subconsultas (SQL Server)

  • 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ó por ANY o ALL.
  • 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 y IN operan en SELECT * 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 y HAVING.
  • Las DISTINCT no se puede utilizar con subconsultas que incluyan GROUP BY.
  • Las COMPUTE y INTO no se pueden especificar.
  • ORDER BY solo se puede especificar cuando TOP 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 con EXISTS son las mismas que las de una lista de selección estándar, porque una subconsulta introducida con EXISTS 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.

Write a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *