Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT, SELECT... INTO, INSERT... Instrucción INTO, DELETE o UPDATE, o dentro de otra subconsulta.
Sintaxis
Puede usar tres formas de sintaxis para crear una subconsulta:
comparación [ANY | TODO | SOME] (instrucción sql)
expresión [NOT] IN (instrucción sql)
[NO] EXISTS (instrucción SQL)
Una subconsulta consta de las siguientes partes:
Parte |
Descripción |
Comparación |
Un expresión y un operador de comparación que compara la expresión con los resultados de la subconsulta. |
expresión |
Una expresión para la que se busca el conjunto de resultados de la subconsulta. |
instrucción_sqls |
Una instrucción SELECT, siguiendo el mismo formato y reglas que cualquier otra instrucción SELECT. Debe estar entre paréntesis. |
Observaciones
Puede usar una subconsulta en lugar de una expresión en la lista de campos de una instrucción SELECT o en una cláusula WHERE o HAVING. En una subconsulta, use una instrucción SELECT para proporcionar un conjunto de uno o más valores específicos para evaluar en la expresión de cláusula WHERE o HAVING.
Use el predicado ANY o SOME, que son sinónimos, para recuperar los registros de la consulta principal que cumplen la comparación con los registros recuperados en la subconsulta. En el ejemplo siguiente se devuelven todos los productos cuyo precio unitario es mayor que el de cualquier producto vendido con un descuento del 25 por ciento o más:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Use el predicado ALL para recuperar solo los registros de la consulta principal que cumplen la comparación con todos los registros recuperados en la subconsulta. Si cambió ANY a ALL en el ejemplo anterior, la consulta devolverá solo los productos cuyo precio unitario sea mayor que el de todos los productos vendidos con un descuento del 25 por ciento o más. Esto es mucho más restrictivo.
Use el predicado IN para recuperar solo los registros de la consulta principal para los que algún registro de la subconsulta contiene un valor igual. En el ejemplo siguiente se devuelven todos los productos con un descuento del 25 por ciento o más:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Por el contrario, puede usar NOT IN para recuperar solo los registros de la consulta principal para los que ningún registro de la subconsulta contiene un valor igual.
Use el predicado EXISTS (con la palabra reservada NO opcional) en comparaciones de verdadero/falso para determinar si la subconsulta devuelve registros.
También puede usar alias de nombre de tabla en una subconsulta para hacer referencia a tablas enumeradas en una cláusula FROM fuera de la subconsulta. En el ejemplo siguiente se devuelven los nombres de los empleados cuyos salarios son iguales o superiores al salario promedio de todos los empleados que tienen el mismo puesto. La tabla Empleados recibe el alias "T1":
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
En el ejemplo anterior, la palabra reservada AS es opcional.
Algunas subconsultas están permitidas en las consultas de tabla de referencias cruzadas, concretamente, como predicados (los de la cláusula WHERE). Las subconsultas como resultado (las de la lista SELECT) no están permitidas en las consultas de tabla de referencias cruzadas.