Lectura 21 - SQL A Mayor Profundidad CORREGIDO PDF
Lectura 21 - SQL A Mayor Profundidad CORREGIDO PDF
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:
La consulta es:
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.
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 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;
Ahora hay que comparar todos los salarios contra este valor, ahora conocido y constante.
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:
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);
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.
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.
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
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
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:
ANALYST, 1800
PRESIDENT, 5000
CLERK, 1200
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.
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.
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.