Uma subconsulta é uma instrução SELECT aninhada dentro de um SELECT, SELECT... INTO, INSERT... Instrução INTO, DELETE ou UPDATE ou dentro de outra subconsulta.
Sintaxe
Pode utilizar três formas de sintaxe para criar uma subconsulta:
comparação [ANY | TUDO | ALGUNS] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NÃO] EXISTS (sqlstatement)
Uma subconsulta tem as seguintes partes:
Parte |
Descrição |
comparação |
Uma expressão e um operador de comparação que compara a expressão com os resultados da subconsulta. |
expressão |
Uma expressão para a qual o conjunto de resultados da subconsulta é pesquisado. |
instruçãosql |
Uma instrução SELECT, seguindo o mesmo formato e regras que qualquer outra instrução SELECT. Tem de estar entre parênteses. |
Observações
Pode utilizar uma subconsulta em vez de uma expressão na lista de campos de uma instrução SELECT ou numa cláusula WHERE ou HAVING. Numa subconsulta, utilize uma instrução SELECT para fornecer um conjunto de um ou mais valores específicos a avaliar na expressão da cláusula WHERE ou HAVING.
Utilize o predicado ANY ou SOME, que são sinónimos, para obter registos na consulta principal que satisfaçam a comparação com quaisquer registos obtidos na subconsulta. O exemplo seguinte devolve todos os produtos cujo preço unitário é superior ao de qualquer produto vendido com um desconto de 25% ou mais:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Utilize o predicado ALL para obter apenas os registos na consulta principal que satisfazem a comparação com todos os registos obtidos na subconsulta. Se alterou ANY para ALL no exemplo anterior, a consulta devolveria apenas os produtos cujo preço unitário é maior do que o de todos os produtos vendidos com um desconto de 25% ou mais. Isto é muito mais restritivo.
Utilize o predicado IN para obter apenas esses registos na consulta principal para a qual algum registo na subconsulta contém um valor igual. O exemplo seguinte devolve todos os produtos com um desconto de 25% ou mais:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Por outro lado, pode utilizar NOT IN para obter apenas esses registos na consulta principal para a qual nenhum registo na subconsulta contém um valor igual.
Utilize o predicado EXISTS (com a palavra opcional NÃO reservada) em comparações verdadeiras/falsas para determinar se a subconsulta devolve registos.
Também pode utilizar aliases de nome de tabela numa subconsulta para fazer referência a tabelas listadas numa cláusula FROM fora da subconsulta. O exemplo seguinte devolve os nomes dos colaboradores cujos salários são iguais ou superiores ao salário médio de todos os colaboradores com o mesmo cargo. A tabela Funcionários recebe o 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;
No exemplo anterior, o palavra reservada AS é opcional.
Algumas subconsultas são permitidas em consultas cruzadas , especificamente, como predicados (os da cláusula WHERE). As subconsultas como saída (as da lista SELECT) não são permitidas em consultas cruzadas.