O SQL precisa de subconsultas?
Imagine uma implementação suficientemente generalizada da linguagem de consulta estruturada para bancos de dados de relações. Como a estrutura da SELECT
instrução SQL canônica é realmente muito importante para que isso faça sentido, não apelo diretamente à álgebra relacional, mas você pode enquadrar isso nesses termos, fazendo restrições apropriadas na forma das expressões.
Um SQL SELECT
consulta geralmente consiste de uma projecção (a SELECT
parte) um certo número de JOIN
operações (a JOIN
parte), um certo número de SELECTION
operações (em SQL, as WHERE
cláusulas), e, em seguida, definir-sábio operações ( UNION
, EXCEPT
, INTERSECT
, etc), seguida por outra SELECT
Consulta SQL .
As tabelas que estão sendo unidas podem ser os resultados calculados das expressões; em outras palavras, podemos ter uma declaração como:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN (SELECT id, address
FROM table2 AS t3
WHERE t3.id = t1.id) AS t2
WHERE t1.salary > 50,000;
Vamos nos referir ao uso de uma tabela computada como parte de uma consulta SQL como uma subconsulta. No exemplo acima, o segundo (recuado) SELECT
é uma subconsulta.
Todas as consultas SQL podem ser gravadas de maneira a não usar subconsultas? O exemplo acima pode:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Este exemplo é um tanto espúrio ou trivial, mas pode-se imaginar casos em que um esforço consideravelmente maior pode ser necessário para recuperar uma expressão equivalente. Em outras palavras, é o caso de cada consulta SQL com subconsultas, existe uma consulta q ' sem subconsultas, de forma que e são garantidos para produzir os mesmos resultados para as mesmas tabelas subjacentes? Vamos limitar as consultas SQL ao seguinte formato:
SELECT <attribute>,
...,
<attribute>
FROM <a table, not a subquery>
JOIN <a table, not a subquery>
...
JOIN <a table, not a subquery>
WHERE <condition>
AND <condition>
...
AND <condition>
UNION
-or-
EXCEPT
-or-
<similar>
SELECT ...
E assim por diante. Acho que as junções externas esquerda e direita não acrescentam muito, mas se eu estiver enganado, sinta-se à vontade para apontar isso ... de qualquer forma, elas também são um jogo justo. No que diz respeito às operações definidas, acho que qualquer uma delas é boa ... união, diferença, diferença simétrica, interseção, etc ... qualquer coisa que seja útil. Existem formulários conhecidos nos quais todas as consultas SQL podem ser reduzidas? Algum deles elimina subconsultas? Ou existem alguns casos em que não existe consulta equivalente livre de subconsulta? As referências são apreciadas ... ou uma demonstração (por prova) de que são ou não são necessárias seria fantástica. Obrigado e desculpe se este é um resultado célebre (ou trivial) do qual sou dolorosamente ignorante.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Porque inclui group by
, não coloquei isso como resposta.
ON
cláusula é necessária para JOIN
s, embora um produto cruzado seja obtido com apenas uma vírgula.