¿SQL necesita subconsultas?
Imagine una implementación suficientemente generalizada del lenguaje de consulta estructurado para bases de datos de relaciones. Como la estructura de la SELECT
declaración canónica de SQL es bastante importante para que esto tenga sentido, no apelo directamente al álgebra relacional, pero podría enmarcar esto en esos términos haciendo restricciones apropiadas en la forma de las expresiones.
Un SQL SELECT
consulta generalmente consiste en un saliente (la SELECT
parte) cierto número de JOIN
operaciones (la JOIN
parte), cierto número de SELECTION
operaciones (en SQL, las WHERE
cláusulas), y a continuación, establecer en cuanto a las operaciones ( UNION
, EXCEPT
, INTERSECT
, etc.), seguido de otro Consulta SQL SELECT
.
Las tablas que se unen pueden ser los resultados calculados de expresiones; en otras palabras, podemos tener una declaración 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;
Nos referiremos al uso de una tabla calculada como parte de una consulta SQL como subconsulta. En el ejemplo anterior, el segundo (sangrado) SELECT
es una subconsulta.
¿Se pueden escribir todas las consultas SQL de tal manera que no se utilicen subconsultas? El ejemplo anterior puede:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Este ejemplo es algo espurio o trivial, pero uno puede imaginar casos en los que se podría requerir un esfuerzo considerablemente mayor para recuperar una expresión equivalente. En otras palabras, ¿es el caso de que para cada consulta SQL con subconsultas, exista una consulta q ' sin subconsultas de modo que q y q ' tengan garantizados los mismos resultados para las mismas tablas subyacentes? Limitemos las consultas SQL a la siguiente forma:
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 ...
Y así. Creo que las uniones externas izquierda y derecha no agregan mucho, pero si me equivoco, no dudes en señalarlo ... en cualquier caso, también son un juego justo. En cuanto a las operaciones de configuración, supongo que cualquiera de ellos está bien ... unión, diferencia, diferencia simétrica, intersección, etc. todo lo que sea útil. ¿Hay alguna forma conocida a la que se puedan reducir todas las consultas SQL? ¿Alguno de estos elimina las subconsultas? ¿O hay algunos casos en los que no existe una consulta equivalente libre de subconsultas? Se agradecen las referencias ... o una demostración (por prueba) de que son o no necesarias sería fantástico. Gracias, y lo siento si este es un resultado celebrado (o trivial) del cual soy dolorosamente ignorante.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Porque incluye group by
no he puesto esto como respuesta.
ON
cláusula es necesaria para JOIN
s, aunque se obtiene un producto cruzado con solo una coma.