Sean bienvenidos a esta sección donde se revisa el uso de subconsultas para solucionar consultas, recuerden estas sentencias estan siendo ejecutadas en SQL developer administrador de la Base de datos Oracle.
Objetivos de la publicación:
Al finalizar esta lección, debería estar capacitado para lo siguiente:
- Definir subconsultas
- Describir los tipos de problemas que pueden solucionar las subconsultas
- Mostrar los tipos de subconsultas
- Escribir subconsultas de una o varias filas
En esta lección aprenderá funciones avanzadas de la sentencia SELECT. Puede escribir subconsultas en la cláusula WHERE de otra sentencia SQL para obtener valores basados en un valor condicional desconocido. En esta lección se tratan también subconsultas de una y de varias filas.
Subconsulta: tipos, sintaxis e instrucciones
Uso de una Subconsulta para Solucionar Problemas
¿Quién tiene un salario mayor que el de Abel?
Supongamos que desea escribir una consulta para saber quién gana un salario mayor que el de Abel.
Para solucionar este problema, necesita dos consultas: Una para saber cuánto gana Abel y otra para saber quién gana más que esa cantidad.
También puede solucionar este problema combinando las dos consultas y colocando una dentro de la otra.
La consulta interna (o subconsulta) devuelve un valor que utiliza la consulta externa (o consulta principal). El uso de una subconsulta es equivalente a la realización de dos consultas secuenciales y al uso del resultado de la primera consulta como el valor de búsqueda en la segunda consulta.
Sintaxis de la Subconsulta
- La subconsulta (consulta interna) se ejecuta una vez antes de la consulta principal (consulta externa).
- La consulta principal utiliza el resultado de la subconsulta.
Una subconsulta es una sentencia SELECT que está embebida en la cláusula de otra sentencia SELECT. Puede crear sentencias potentes a partir de sentencias simples utilizando las subconsultas. Pueden ser muy útiles cuando necesite seleccionar filas de una tabla con una condición de que dependa de los datos de la propia tabla.
Puede colocar la subconsulta en diferentes cláusulas SQL, entre las que se incluyen las siguientes:
Cláusula WHERE
Cláusula HAVING
Cláusula FROM
En la sintaxis:
operator incluye una condición de comparación como >, = o IN
Nota: las condiciones de comparación pueden ser de dos clases: operadores de una sola fila (>, =, >=, <, <>, <=) y operadores de varias filas (IN, ANY, ALL, EXISTS).
Se suele hacer referencia a la subconsulta como una sentencia SELECT anidada, una subconsulta SELECT o una sentencia SELECT interna. Por lo general, la subconsulta se ejecuta en primer lugar y su resultado se utiliza para completar la condición de consulta para la consulta principal (o externa).
Uso de Subconsultas
En la ejemplo, la consulta interna determina el salario del empleado Abel. La consulta externa obtiene el resultado de la consulta interna y lo utiliza para mostrar a todos los empleados que ganan más que el empleado Abel.
Instrucciones para el Uso de Subconsultas
- Incluir subconsultas entre paréntesis.
- Coloque las subconsultas a la derecha de la condición de comparación para facilitar la legibilidad. (Sin embargo, la subconsulta puede aparecer a cualquier lado del operador de comparación.)
- Utilizar operadores de una sola fila con subconsultas de una fila y utilizar los operadores de varias filas con subconsultas de varias filas.
Una subconsulta debe estar incluida entre paréntesis.
Coloque las subconsultas a la derecha de la condición de comparación para facilitar la legibilidad. Sin embargo, la subconsulta puede aparecer a cualquier lado del operador de comparación.
En las subconsultas, se utilizan dos clases de condiciones de comparación: operadores de una sola fila y operadores de varias filas.
Subconsultas de una sola fila: consultas que devuelven sólo una fila de la sentencia SELECT interna.
Subconsultas de varias filas: consultas que devuelven más de una fila de la sentencia SELECT interna.
Nota: también existen varias subconsultas de varias columnas, que son consultas que devuelven más de una columna de la sentencia SELECT interna. Éstas se tratan en el curso Oracle Database: Conceptos Fundamentales de SQL II.
Subconsultas de una sola fila:
Funciones de grupo en una subconsulta
Cláusula HAVING con subconsultas
Subconsultas de Una Sola Fila
- Devuelven una sola fila
- Utilizan operadores de comparación de una sola fila
Una subconsulta de una sola fila devuelve una fila de la sentencia SELECT interna. Este tipo de subconsulta utiliza un operador de una sola fila. El ejemplo proporciona una lista de los operadores de una sola fila.
Ejemplo:
Muestre los empleados cuyo ID de cargo sea el mismo que el del empleado 141:
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE employee_id = 141);
Ejecución de Subconsultas de una Sola Fila
Una sentencia SELECT se puede considerar como un bloque de consulta. El ejemplo muestra los empleados que realizan el mismo trabajo que “Taylor”, pero que tienen un salario mayor que él.
El ejemplo tiene tres bloques de consulta: la consulta externa y las dos consultas internas. Los bloques de consulta internos se ejecutan primero, produciendo los resultados de consulta SA_REP y 8600, respectivamente. A continuación, se procesa el bloque de consulta externo y utiliza los valores devueltos por las consultas internas para completar sus condiciones de búsqueda.
Tanto las consultas internas como externas devuelven valores únicos (SA_REP y 8600, respectivamente), por lo que a esta sentencia SQL se la denomina subconsulta de una sola fila.
Nota: las consultas externas e internas pueden obtener datos de diferentes tablas.
Uso de Funciones de Grupo en una Subconsulta
Uso del Operador ANY en Subconsultas de Varias Filas
El operador ANY (y su sinónimo, el operador SOME) compara un valor con cada valor devuelto por una subconsulta. El ejemplo muestra los empleados que no son programadores de TI y cuyo salario es menor al de cualquier programador de TI. El salario máximo de un programador es de 9.000 dólares.
Uso del Operador ALL en Subconsultas de Varias Filas
Puede mostrar los datos de una consulta principal utilizando una función de grupo en una subconsulta para que devuelva una sola fila. La subconsulta está entre paréntesis y se coloca al final de la condición de comparación.
El ejemplo muestra el apellido del empleado, el ID de cargo y el salario de todos los empleados cuyo salario sea igual al salario mínimo. La función de grupo MIN devuelve un valor único (2500) a la consulta externa.
Cláusula HAVING con Subconsultas
El servidor de Oracle ejecuta primero las subconsultas.
El servidor de Oracle devuelve los resultados a la cláusula HAVING de la consulta principal.
Puede utilizar las subconsultas en la cláusula WHERE y en la cláusula HAVING. El servidor de Oracle ejecuta la subconsulta y los resultados se devuelven en la cláusula HAVING de la consulta principal.
La sentencia SQL muestra todos los departamentos que tienen un salario mínimo mayor que el del departamento 50.
Ejemplo:
Busque el puesto con el salario medio más bajo.
SELECT job_id, AVG(salary)
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id);
¿Qué Parte de esta Sentencia Es Incorrecta?
Un error muy común en las subconsultas se produce cuando se devuelve más de una fila para una subconsulta de una sola fila.
En la sentencia SQL, la subconsulta contiene una cláusula GROUP BY, que implica que la subconsulta devolverá varias filas, una por cada grupo que encuentre. En este caso, los resultados de la subconsulta son 4400, 6000, 2500, 4200, 7000, 17000 y 8300.
La consulta externa toma esos resultados y los utiliza en su cláusula WHERE. La cláusula WHERE contiene un operador igual (=), un operador de comparación de una sola fila que espera un único valor. El operador = no puede aceptar más de un valor de la subconsulta y, por lo tanto, genera el error.
Para corregir este error, cambie el operador = a IN.
La Consulta Interna No Devuelve Ningún Resultado
Otro problema común de las subconsultas se produce cuando la consulta interna no devuelve ninguna fila.
En la sentencia SQL, la subconsulta contiene una cláusula WHERE. Supuestamente, la intención es encontrar el empleado cuyo nombre es Haas. La sentencia es correcta, pero no selecciona ninguna fila al ejecutarse porque no hay ningún empleado con el nombre Haas. Por lo tanto, la subconsulta no devuelve ninguna fila.
La consulta externa toma los resultados de la subconsulta (nula) y los utiliza en la cláusula WHERE. La consulta externa no encuentra ningún empleado con un ID de cargo igual que un valor nulo, por lo tanto, no devuelve ninguna fila. Si existía un cargo con un valor nulo, la fila no se devolverá porque la comparación de dos valores nulos tiene como resultado un valor nulo; por lo tanto, la condición WHERE no es verdadera.
Subconsultas de varias filas
Usar el operador IN, ALL o ANY
Uso del operador EXISTS
Subconsultas de Varias Filas
- Devuelven más de una fila
- Utilizan operadores de comparación de varias filas
Las subconsultas que devuelven más de una fila se denominan subconsultas de varias filas. Con una subconsulta de varias filas, puede utilizar un operador de varias filas en lugar de utilizar un operador de una sola fila. El operador de varias filas espera uno o más valores:
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
FROM employees
GROUP BY department_id);
Ejemplo:
Busque los empleados que ganan el mismo salario que el salario mínimo de cada departamento.
Primero se ejecuta la consulta interna, produciendo el resultado de consulta. A continuación, se procesa el bloque de consulta principal y se utilizan los valores devueltos por la consulta interna para completar la condición de búsqueda. De hecho, la consulta principal aparece en el servidor de Oracle de la siguiente forma:
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (2500, 4200, 4400, 6000, 7000, 8300, 8600, 17000);
El operador ANY (y su sinónimo, el operador SOME) compara un valor con cada valor devuelto por una subconsulta. El ejemplo muestra los empleados que no son programadores de TI y cuyo salario es menor al de cualquier programador de TI. El salario máximo de un programador es de 9.000 dólares.
<ANY significa menos que el máximo.
>ANY significa más que el mínimo.
=ANY es igual que IN.
El operador ALL compara un valor con cada valor devuelto por una subconsulta. El ejemplo muestra los empleados cuyo salario es inferior al salario de todos los empleados con un ID de cargo IT_PROG y cuyo trabajo no es IT_PROG.
>ALL significa más que el máximo y <ALL significa menos que el mínimo.
El operador NOT se puede utilizar con los operadores IN, ANY y ALL.
Uso del Operador EXISTS
El operador EXISTS se utiliza en consultas en las que el resultado depende de si existen determinadas filas en la tabla o no. Se evalúa en TRUE si la subconsulta devuelve al menos una fila.
El ejemplo muestra los departamentos que no tienen empleados. Para cada fila de la tabla DEPARTMENTS, la condición comprueba si existe o no una fila en la tabla EMPLOYEES con el mismo ID de departamento. En caso de que no exista dicha fila, la condición se cumple para la fila en cuestión y se selecciona. Si existe una fila correspondiente en la tabla EMPLOYEES, la fila no se selecciona.
Valores nulos en una subconsulta
Valores Nulos en una Subconsulta
La sentencia SQL intenta mostrar todos los empleados que no tienen ningún subordinado. Lógicamente, esta sentencia SQL debe haber devuelto 12 filas. Sin embargo, la sentencia SQL no devuelve ninguna fila. Uno de los valores devueltos por la consulta interna es un valor nulo y, por lo tanto, la consulta completa no devuelve ninguna fila.
El motivo es que todas las condiciones que comparan un valor nulo tienen un resultado nulo. Por lo tanto, cuando los valores nulos probablemente formen parte del juego de resultados de una subconsulta, no utilice el operador NOT IN. El operador NOT IN es equivalente a <> ALL.
Tenga en cuenta que el valor nulo que forma parte del juego de resultados de una subconsulta no representa ningún problema si se utiliza el operador IN. El operador IN es equivalente a =ANY. Por ejemplo, para mostrar los empleados que tienen subordinados, utilice la siguiente sentencia SQL:
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id IN
(SELECT mgr.manager_id
FROM employees mgr);
Por otro lado, una cláusula WHERE se puede incluir en la subconsulta para mostrar todos los empleados que no tienen ningún subordinado:
SELECT last_name FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL);
Resumen
En esta lección, debe haber aprendido lo siguiente:
- Identificar cuándo una subconsulta puede ayudar a resolver un problema
- Escribir subconsultas cuando una consulta está basada en valores desconocidos
En esta lección, debe haber aprendido a utilizar las subconsultas. Una subconsulta es una sentencia SELECT que está embebida en una cláusula de otra sentencia SQL. Las subconsultas son útiles cuando una consulta está basada en criterios de búsqueda con valores intermedios desconocidos.
Las subconsultas tienen las siguientes características:
Pueden transferir una fila de datos a una sentencia principal que contenga un operador de una sola fila como =, <>, >, >=, < o <=.
Pueden transferir varias filas de datos a una sentencia principal que contenga un operador de varias filas, como IN.
Primero las procesa el servidor de Oracle y, a continuación, la cláusula WHERE o HAVING utiliza los resultados.
Pueden contener funciones de grupo.
No hay comentarios.:
Publicar un comentario