Para realizar alguna operación de consulta a veces necesitamos los datos obtenidos en otras consultas, esto lo podemos hacer en una única consulta, utilizando las subconsultas.
Una subconsulta no es más que un select dentro de otro select. Las subconsultas son aquellas sentencias select que forman parte de la clausula where de otra sentencia select. El formato es el siguiente:
SELECT
FROM .
WHERE columna operador_comparativo (SELECT .. FROM WHERE );
Cuando se ejecuta esta sentencia primero se realiza la subconsulta y luego el resto de sentencia.
Condiciones de búsqueda en subconsultas
Las subconsultas normalmente aparecen como parte de la condición de una búsqueda dentro del where o having.
Condiciones de búsqueda que puede haber dentro de una subconsulta:
Comparación de subconsultas: Comparan el valor de la expresión con un valor único obtenido en la subconsulta. Son los simbolos típicos de comparación (<,>,=,<=,>=).
Select * from empleado where oficio=(select oficio from empleado where apellido='Lopez');
Pertenencia a un conjunto de valores devueltos por la subconsulta: Comprueba si el valor esta dentro del conjunto de valores devuelto por la subconsulta.
Select * from empleado where oficio IN (select oficio from empleado where departamento=20);
Existencia: nos dice si la subconsulta devuelve alguna fila o no. Para ello utilizamos las palabras EXISTS o NOT EXITS.
Select * from departamento where EXISTS (select * from empleado where empleado.id_departamento = departamento.id_departamento);
Comparación cuantificada: Para esto también utilizamos los comparadores basicos unidos a ANY o ALL.
ANY compara el valor de una expresión con cada uno del conjunto de valores obtenidos en la subconsulta. Con que una de las comparaciones de TRUE la consulta da TRUE
Select * from empleado where salario = ANY (select salario from empleado where id_departamento=30);
ALL compara el valor de una expresión con cada uno del conjunto de valores obtenidos en la subconsulta. Tienen que ser todos TRUE para que la subconsulta devuelva TRUE
Select * from empleado where salario < ALL (select salario from emple where id_departamento=20);
Subconsultas que generan valores simple
Son las subconsultas que obtienen un solo registro. Para ello utilizamos los operadores de comparación básicos. Si la subconsutla devuelve más de un registro nos sale un mensaje de error.
Subconsultas que generan listas de valores
Son las subconsultas que nos devuelven más de un registro. Para estas subconsultas utilizamos el operador IN.
Subconsultas correlacionadas
Estas subconsultas hacen referencia a una columna o varias de la consulta principal. Para verlo mejor ponemos un ejemplo.
Queremos obtener los datos de los empleados cuyo salario sea el máximo salario del departamento.
Select * from empleado E where salario = (select max(salario) form empleado where id_empleado=E.id_empleado);
Esta sentencia devuelve para cada fila que se obtiene el máximo salario del departamento que se está obteniendo en la consulta principal.
SELECT
FROM .
WHERE columna operador_comparativo (SELECT .. FROM WHERE );
Cuando se ejecuta esta sentencia primero se realiza la subconsulta y luego el resto de sentencia.
Condiciones de búsqueda en subconsultas
Las subconsultas normalmente aparecen como parte de la condición de una búsqueda dentro del where o having.
Condiciones de búsqueda que puede haber dentro de una subconsulta:
Comparación de subconsultas: Comparan el valor de la expresión con un valor único obtenido en la subconsulta. Son los simbolos típicos de comparación (<,>,=,<=,>=).
Select * from empleado where oficio=(select oficio from empleado where apellido='Lopez');
Pertenencia a un conjunto de valores devueltos por la subconsulta: Comprueba si el valor esta dentro del conjunto de valores devuelto por la subconsulta.
Select * from empleado where oficio IN (select oficio from empleado where departamento=20);
Existencia: nos dice si la subconsulta devuelve alguna fila o no. Para ello utilizamos las palabras EXISTS o NOT EXITS.
Select * from departamento where EXISTS (select * from empleado where empleado.id_departamento = departamento.id_departamento);
Comparación cuantificada: Para esto también utilizamos los comparadores basicos unidos a ANY o ALL.
ANY compara el valor de una expresión con cada uno del conjunto de valores obtenidos en la subconsulta. Con que una de las comparaciones de TRUE la consulta da TRUE
Select * from empleado where salario = ANY (select salario from empleado where id_departamento=30);
ALL compara el valor de una expresión con cada uno del conjunto de valores obtenidos en la subconsulta. Tienen que ser todos TRUE para que la subconsulta devuelva TRUE
Select * from empleado where salario < ALL (select salario from emple where id_departamento=20);
Subconsultas que generan valores simple
Son las subconsultas que obtienen un solo registro. Para ello utilizamos los operadores de comparación básicos. Si la subconsutla devuelve más de un registro nos sale un mensaje de error.
Subconsultas que generan listas de valores
Son las subconsultas que nos devuelven más de un registro. Para estas subconsultas utilizamos el operador IN.
Subconsultas correlacionadas
Estas subconsultas hacen referencia a una columna o varias de la consulta principal. Para verlo mejor ponemos un ejemplo.
Queremos obtener los datos de los empleados cuyo salario sea el máximo salario del departamento.
Select * from empleado E where salario = (select max(salario) form empleado where id_empleado=E.id_empleado);
Esta sentencia devuelve para cada fila que se obtiene el máximo salario del departamento que se está obteniendo en la consulta principal.