0% encontró este documento útil (0 votos)
106 vistas14 páginas

Lectura 21 - SQL A Mayor Profundidad CORREGIDO PDF

El documento describe el uso de subconsultas en SQL. Las subconsultas permiten anidar consultas SELECT dentro de otras sentencias como SELECT, INSERT, UPDATE y DELETE. Las subconsultas pueden usarse en las cláusulas SELECT, FROM y WHERE. En SELECT devuelven un valor por cada fila, en FROM funcionan como vistas temporales y en WHERE permiten filtrar datos. También se describen las subconsultas correlacionadas, que ejecutan la subconsulta por cada fila de la consulta principal usando referencias externas.

Cargado por

Gabriel
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
106 vistas14 páginas

Lectura 21 - SQL A Mayor Profundidad CORREGIDO PDF

El documento describe el uso de subconsultas en SQL. Las subconsultas permiten anidar consultas SELECT dentro de otras sentencias como SELECT, INSERT, UPDATE y DELETE. Las subconsultas pueden usarse en las cláusulas SELECT, FROM y WHERE. En SELECT devuelven un valor por cada fila, en FROM funcionan como vistas temporales y en WHERE permiten filtrar datos. También se describen las subconsultas correlacionadas, que ejecutan la subconsulta por cada fila de la consulta principal usando referencias externas.

Cargado por

Gabriel
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 14

4.

1 SQL A MAYOR PROFUNDIDAD

En el Mdulo anterior se introdujeron las sentencias del Lenguaje SQL que permiten desarrollar
todas las tareas que una aplicacin debe realizar, cargar filas, actualizarlas, eliminarlas y
consultarlas para brindar informacin al usuario final.

Para profundizar en el uso de todas las caractersticas de la sentencia SELECT, es que en esta
lectura veremos la posibilidad que ofrece el lenguaje de poder anidar consultas SELECT, llamadas
Subconsultas, en otra consulta SELECT y en las sentencias INSERT, UPDATE, DELETE y
CREATE TABLE.

Subconsultas en el SELECT
En la sentencia SELECT se pueden incluir subconsultas, en la clusula SELECT para traer un
valor que devolver por cada fila recuperada por la consulta contenedora de la sub consulta, que
llamaremos principal. Esto hace que la sub consulta obligatoriamente deba devolver slo un valor.

En el ejemplo de la Figura 1, vemos un ejemplo de una subconsultas que para cada fila devuelve
el valor de promedio de sueldos sobre la misma tabla. Son dos accesos a la misma tabla, el de la
subconsultas, que se realiza por cada fila encontrada por la consulta principal:

Figura 1. Ejecucin de una subconsultas dentro de la lista de columnas del SELECT

La consulta es:

SELECT ename, sal, (SELECT avg(sal) from empleados) promedio

Materia: Base de Datos I -1-


Profesor: Calixto Maldonado
FROM empleados;
Es interesante el uso de estas subconsultas que se denominan subconsultas escalares y
recuerdan el uso de las funciones de fila simple, por que devuelve un valor (y slo uno) para cada
fila procesada en la consulta principal. Notar el uso de alias de columna promedio que evita que
la columna se titule (SELECT ) .

Otro uso de subconsultas en la sentencias SELECT es en la clusula FROM, all toman el nombre
de In line views por que cumplen la funcin de ser como vistas, sin necesidad de crearlas como
objetos de esquema. En la figura 2 vemos un ejemplo de subconsultas en el FROM.

Figura 2. Una subconsultas en el FROM de la consulta principal

Esta forma de escribir subconsultas, permite al desarrollador tener el poder de las vistas sin
necesidad de tener que crearlas en el esquema, solo se escriben y se ejecutan.

El uso de subconsultas en el WHERE, se justifica en la necesidad de realizar filtros con valores


que ya estn almacenados en las tablas de la base.

El caso de ejemplo deriva de un requerimiento muy simple del usuario: Es necesario saber qu
empleado gana ms sueldo que el sueldo promedio de toda la empresa y sabemos que el
promedio del sueldo se obtiene con esta consulta:

SELECT AVG(sal)
FROM empleados;

Vemos el resultado de la consulta, en la Figura 3.

Materia: Base de Datos I -2-


Profesor: Calixto Maldonado
Figura 3 resultado del promedio de sueldos de todos los empleados

Ahora hay que comparar todos los salarios contra este valor, ahora conocido y constante.

Podra hacer simplemente:

SELECT ename
FROM empleados
WHERE sal > 2073;

Pero si hay aumento de salarios o ingresan nuevos empleados, el promedio ser distinto del
calculado, por lo que se prefiere hacer una sub consulta y obtener el promedio en el momento de
realizar la ejecucin de la consulta principal:

SELECT ename, sal


FROM empleados
WHERE sal > ( SELECT AVG(sal) FROM empleados);

En vez de la constante colocamos la sentencia con la que obtenemos el valor de la constante y


vemos el resultado:

Materia: Base de Datos I -3-


Profesor: Calixto Maldonado
Figura 4. Vemos que todos los empleados que ganan mas que el promedio de sueldos

Si recordamos el valor obtenido en la consulta interna, era aproximadamente 2073, por lo que
comprobamos que funcion, ahora nos despreocupamos de calcularlo a mano antes, la
subconsultas lo har por nosotros. Si reunimos los dos usos en el SELECT y en el FROM de
Subconsultas, podramos saber ahora cuanto gana de ms cada empleado:

SELECT ename,
sal,
(SELECT AVG(sal) FROM empleados) promedio,
Sal-(SELECT AVG(sal) FROM empleados) diferencia
FROM empleados
WHERE sal > ( SELECT AVG(sal) FROM empleados);

Vemos en la Figura 5, la ejecucin de esta consulta con varias subconsultas:

Materia: Base de Datos I -4-


Profesor: Calixto Maldonado
Figura 5. Ejecucin de la Consulta con tres subconsultas con diferentes usos

Siguiendo con el uso de subconsultas en el WHERE, resta mencionar que es importante elegir
adecuadamente el operador de comparacin por que si definimos que es igual, mayor, menor que
el valor que devuelve la sub consulta, se sta devolviera ms de un valor, la consulta completa
dara error al momento de ejecutarse, con un mensaje que dira que la subconsultas que va a ser
comparada como un solo valor, ha devuelto mas valores de los esperados.

Si por el contrario queremos usar el operador de comparacin IN, NOT IN, o los operadores >, =,
< con los modificadores ALL o ANY, podremos comparar un valor de una columna contra un
conjunto o lista de valores.

Las subconsultas se pueden usar tambin en la clusula ORDER BY, aunque en casos aislados,
por ejemplo para desordenar las filas en base a un valor arbitrario. Veremos en la Figura 6, todas
las filas ordenadas alfabticamente y en orden ascendente por apellido. Luego en la figura 7
desordenadas aleatoriamente y en la Figura 8, repetimos para comprobar que trae otro orden. Se
usa la funcin RND() que genera nmeros aleatorios en MySQL.

Materia: Base de Datos I -5-


Profesor: Calixto Maldonado
Figura 6 Consulta ordenada

Materia: Base de Datos I -6-


Profesor: Calixto Maldonado
Figura 7. Primer consulta desordenada

Materia: Base de Datos I -7-


Profesor: Calixto Maldonado
Figura 8. Segunda consulta desordenada, comparar con la Fig. 7

Entonces, este uso de una sub consulta con una funcin RND() en el ORDER BY permitir
mezclar el orden de aparicin de las filas de una consulta comn.

4.2 Sub consultas correlacionadas


Para estudiar este tipo de consultas sirve conocer para qu sirven y cmo funcionan. El enunciado
anterior, resuelto con consultas simples era Traer los apellidos de los empleados que ganan ms
que el promedio de los sueldos de TODA la empresa. Es claro entonces que el motor obtiene ese
valor y lo compara con todas las filas del la consulta principal.

En estas sub consultas simples, como las que resuelve esta consigna, el optimizador de SQL
empieza a ejecutar la sentencia principal y cuando encuentra la sub consulta, la resuelve y obtiene
el o los valores de las tablas afectadas y mantiene este resultado en memoria hasta que termina el
proceso de la consulta principal. En las sub consultas correlacionadas el proceso es diferente,
cuando el optimizador intenta ejecutar la sub consulta encuentra un Alias a una tabla de la
consulta principal, cambia la estrategia y lee la primer fila de la consulta principal, all conoce el
valor que esta necesitando la subconsultas y, con esta informacin ejecuta la sub consulta,
obtiene el valor buscado, el promedio en este caso y recin ah decide si la fila actual de la
consulta principal cumple con la condicin, si lo hace es seleccionado el empleado y si no, trae la
siguiente fila y vuelve a realizar todo el mismo proceso, aceptando o rechazando filas si cumplen o

Materia: Base de Datos I -8-


Profesor: Calixto Maldonado
no la condicin. Este proceso, se habr dado cuenta, repite tantas veces la ejecucin de la sub
consulta, como filas encuentre la consulta principal. Este proceso es evidentemente ms costoso
en tiempo que la sub consulta simple, ya que la subconsultas se ejecuta una sola vez.

Entonces, si el requerimiento es que debo traer los que ganan ms pero de un subgrupo de filas,
en el cual est incluido el empleado a elegir, es decir, traer el empleado que gana ms que el
promedio de los empleados que tienen su mismo trabajo, la solucin anterior de sub consulta
simple, ya no se aplica. Es necesario que la sub consulta conozca un dato de la consulta principal
para traer el promedio correcto para comparar con la fila que esta procesando la consulta
principal. Este contacto entre niveles de ejecucin se denomina REFERENCIA EXTERNA, la sub
consulta tiene una variable que se inicializa en la consulta principal.

Esta sera la consulta que resuelve este requerimiento, note el uso de los alias de tablas para
realizar la REFERENCIA EXTERNA

SELECT ename, sal


FROM empleados E1
WHERE sal > (SELECT avg(sal)
FROM empleados E2
WHERE E2.job = E1.job);
E1 es una referencia externa en la sub consulta que trae el valor de la fila que esta consultando la
principal y ayuda a la resolucin de la consulta

En la figura 9 agregamos la subconsultas correlacionada en el SELECT para comprobar que los


promedios son diferentes en cada trabajo diferente, que es lo que se busca calcular con las
REFERENCIAS EXTERNAS.

Materia: Base de Datos I -9-


Profesor: Calixto Maldonado
Figura 9. Subconsultas Correlacionadas

4.3 Consultas complejas


Bajo este ttulo vamos a colocar las consultas que combinan cada uno de los temas que hemos
visto individualmente, para comprender el poder de las sentencias SELECT del SQL, por ltimo y
cerrando esta lectura, veremos los casos de UPDATE, DELETE e INSERT que combinan tambin
lo visto para SELECT.

4.3.1. Anidando funciones de grupo

Las funciones de grupo en algunos motores como ORACLE pero no en otros, como en MySQL
pueden usarse una dentro de otra, por ejemplo para calcular el mximo de los promedios de
sueldo de las funciones laborales. Esta sera la consulta que lo resuelve:

SELECT job, MAX(AVG(sal)


FROM empleados
GROUP BY job;

Si los promedios por trabajo son (valores al azar):

ANALYST, 1800
PRESIDENT, 5000
CLERK, 1200

La sentencia propuesta elegir

Materia: Base de Datos I - 10 -


Profesor: Calixto Maldonado
PRESIDENT, 5000
Al anidar las funciones de grupo es obligatorio que exista la clusula GROUP BY.

4.3.2 Funciones de grupo y multi tablas

Es tarea habitual tener que emitir una informacin de las tablas que contemple datos agrupados
de distintas tablas y la combinacin de mltiples tablas en una misma consulta, por ejemplo, el
requerimiento de mostrar los Departamento con su nombre y la cantidad de empleados y monto
total de sueldos que se pagan. En la Figura 10 vemos el primer intento de agrupar los resultados.
Observar el uso de las condiciones de reunin con los alias de tabla e y d.

Figura 10. Agrupando por columnas de una tabla y calculando por columnas de otras tablas

En el ejemplo agregamos un nivel ms de agrupamiento, note que si agregamos una columna sin
funcin de grupo en el SELECT, debe ir al GROUP BY. Lo podemos ver en la Figura 11.
Aumentan las filas resultado y estas definen ms totales especficos.

Materia: Base de Datos I - 11 -


Profesor: Calixto Maldonado
Figura 11. Agregamos otro nivel de agrupamiento, Trabajo

4.3.3. Funciones de grupo y multitablas y subconsultas

A los ejemplos anteriores le agregamos ms requerimientos, para observar como crece en


complejidad la consulta. Ahora nos piden que muestre solamente las localidades cuya cantidad de
empleados sea mayor a uno. Ver Figura 12

Figura 12. Funciones de Grupos, Multi tablas, ms sub consultas

4.3.4 EL resto de las Sentencias DML

Materia: Base de Datos I - 12 -


Profesor: Calixto Maldonado
En las sentencias del sub lenguaje DML, tenemos posibilidades de aplicar las caractersticas del
SELECT y sus clusulas, por ejemplo, para sacar datos de otras tablas con sub consultas y luego
insertarlas en otras tablas como con la sentencia INSERT. Usaremos la tabla emp1, que no tiene
filas y las mismas columnas de empleados y realizaremos un INSERT con algunas filas de la
tabla empleados, slo los empleados del departamento 10. ACLARACIN: Esta accin
incorporar redundancia en el modelo, si fuera necesario trabajar en forma especfica con este
conjunto de tablas, se puede usar una Vista, tema no incluido en este trabajo. Veamos la
sentencia INSERT con sub consultas y su resultado en la Figura 13 y 14.

Figura 13 INSERT con subconsultas

Figura 14. Resultado del INSERT con sub consulta, todos los datos de los empleados del departamento 10

Para UPDATE, podemos usar subconsultas para obtener un valor de las tablas para modificar los
valores de la columna y tambin usar la clusula WHERE con todo el potencial que tiene en el
SELECT.

Mostraremos en la Figura 15 una sentencia UPDATE con sub consultas simples y


correlacionadas. Notar el uso de las REFERENCIAS EXTERNAS para este ltimo tipo de
subconsultas.

Materia: Base de Datos I - 13 -


Profesor: Calixto Maldonado
Figura 15. Uso complejo de subconsultas en el UPDATE

Figura 16. Estado despus del UPDATE complejo

Observamos que el salario de Clark se ha modificado y ahora tiene el promedio general de la


empresa.

Por ltimo nombraremos que con DELETE se puede utilizar una clusula WHERE como con
UPDATE para limitar el alcance de actualizacin o borrado, solamente a las filas que cumplen con
las condiciones del filtro. Vale destacar que si no se incluye la clusula WHERE en estas
sentencias SQL, al ejecutarse modifican o borraran TODAS las filas de la tabla afectada.

Con este ltimo caso hemos cubierto los temas tericos previstos en el presente mdulo.

Materia: Base de Datos I - 14 -


Profesor: Calixto Maldonado

También podría gustarte