Es una SELECT anidada en una instrucción INSERT, DELETE, SELECT o UPDATE.
- Como una tabla derivada
SELECT E.EMP_NO AS NUMERO ,E.APELLIDO FROM (SELECT EMP_NO, APELLIDO FROM EMP) AS E
- Como una expresión
SELECT EMP_NO AS [NUMERO] ,APELLIDO ,SALARIO ,(SELECT AVG(SALARIO) FROM EMP) AS DIFERENCIA FROM EMP WHERE OFICIO = 'EMPLEADO'
- Para correlacionar datos
- Expresión dinámica que cambia en cada fila de una consulta externa
- Es una combinación entre la subconsulta y la fila de la consulta externa.
- Dividen consultas complejas con dos o más consultas simples relacionadas
SELECT APELLIDO, OFICIO,DEPT_NO FROM EMP AS E WHERE 20 < (SELECT DEPT_NO FROM DEPT AS D WHERE E.DEPT_NO = D.DEPT_NO AND D.DNOMBRE = 'VENTAS')
Simulacion de una clausula JOIN
Vamos a mostrar los oficios que están en más de un departamento.
SELECT DISTINCT E1.OFICIO FROM EMP AS E1 WHERE E1.OFICIO IN(SELECT E2.OFICIO FROM EMP AS E2 WHERE E1.DEPT_NO <> E2.DEPT_NO)
Se debe utilizar antes una combinación que una subconsulta, la combinación sería asi, dando los mismos resultados:
SELECT DISTINCT E1.OFICIO FROM EMP AS E1 INNER JOIN EMP AS E2 ON E1.OFICIO = E2.OFICIO WHERE E1.DEPT_NO <> E2.DEPT_NO
Estos son los dos oficios que están en más de un departamento.
Subconsulta para simular una clausula HAVING
SELECT E1.APELLIDO,E1.OFICIO, E1.SALARIO FROM EMP AS E1 WHERE E1.SALARIO > (SELECT AVG(E2.SALARIO) FROM EMP AS E2 WHERE E1.OFICIO = E2.OFICIO)
Esta es la consulta utilizando el HAVING, que es la que deberíamos utilizar antes que una subconsulta de simulación HAVING:
SELECT E1.APELLIDO,E1.OFICIO, E1.SALARIO FROM EMP AS E1 INNER JOIN EMP AS E2 ON E1.OFICIO = E2.OFICIO GROUP BY E1.OFICIO, E1.SALARIO,E1.APELLIDO HAVING E1.SALARIO > AVG (E2.SALARIO)
Twittear
No hay comentarios:
Publicar un comentario