You are on page 1of 26

Instituto Universitario Experimental de Tecnologa La Victoria

Departamento de Informtica
Ctedra de Organizacin de Datos
Asignatura Modelos de Datos

SQL

El SQL (lenguaje de consulta estructurado) es un lenguaje para la recuperacin y


manipulacin de datos en bases de datos relacionales. Las sentencias SQL estn agrupadas
en tres categoras, de acuerdo a su finalidad:
DDL Data Description Language (Lenguaje de definicin de datos). Permite
crear y modificar la estructura de los objetos de la base de datos.
DCL Data Control Language (Lenguaje de control de datos). Contiene
instrucciones para el trabajo en ambiente multiusuario, que permiten coordinar
trabajos concurrentes, la proteccin de los datos, la seguridad de las tablas, entre
otros.
DML Data Manipulation Language (Lenguaje de manipulacin de datos). Est
formado por las instrucciones para recuperar, modificar, aadir y eliminar
informacin de la base de datos.

A continuacin desarrollaremos lo referente al lenguaje de manipulacin de datos.


Este lenguaje consta de varias sentencias; por lo pronto estudiaremos la sentencia SELECT,
la cual es, con mucho, la ms utilizada.

Prof. Flix Arturo Gamarra


La sentencia SELECT

Nos permite recuperar datos de una o varias tablas, al tiempo que indicamos cuales
columnas nos interesan y aplicamos criterios de seleccin sobre las filas, adems de agrupar
u ordenar los resultados. El motor de datos procesa la peticin y devuelve un conjunto de
registros, es decir, la salida de la instruccin SELECT es una tabla lgica, la cual podemos
utilizar como cualquiera de las tablas fsicas que fueron creadas en el esquema de la base de
datos.
La sintaxis general es la siguiente:

Lo primero a resaltar de esta instruccin es el predicado, que especifica el mximo


de registros a seleccionar y viene dado por las palabras reservadas ALL, DISTINCT,
DISTINCTROW y TOP, cuyo significado es el siguiente:

ALL Es el valor predeterminado.


Indica que se seleccionarn todos los registro que cumplan las
condiciones
DISTINCT Omite las filas que tengan todos los campos iguales
El resultado no se puede actualizar y tampoco reflejar los
cambios hechos por otros usuarios

2
SQL

DISTINCTROW Omite las filas que provengan de registros completamente


duplicados, es decir, filas iguales, pero que provienen de registros
diferentes sern incluidas.
DISTINCTROW se omite si la consulta es sobre una sola tabla o
si contiene datos de todas las tablas
TOP n Devuelve los primeros n registros
No diferencia en el caso de valores iguales, es decir, si indicamos
TOP 10 y los registros 10 y 11 son iguales, devolver 11 registros
PERCENT Permite indicar no la cantidad de registros, sino el porcentaje del
total que queremos incluir en el resultado

Luego del predicado podemos especificar las columnas que queremos que en el
resultado. Cuando especificamos solamente algunos de los atributos de la tabla origen,
hablamos de una proyeccin.

* Indica que queremos en la salida todos los campos de la tabla.


Adems de aminorar el trabajo, al no tener que escribir el
nombre de cada una de las columnas, tiene la ventaja de que si
en algn momento agregamos columnas a la tabla, estas tambin
saldrn en el resultado sin tener que modificar la sentencia.
tabla Nombre de tabla. Debe anteponerse al nombre de columna
cuando este aparece repetido en ms de una tabla
col Nombre de columna. Hace referencia a un atributo de una de las
tablas mencionadas en la clusula FROM, o a una funcin
agregada SQL
alias Nombre por el cual va a nombrarse la columna en lo
subsiguiente. En la tabla resultado las columnas tienen el mismo
nombre de la columna de origen o de la funcin que la produjo;
el alias permite indicar un nuevo nombre de acuerdo a nuestros
requerimientos

Prof. Flix Arturo Gamarra 3


La clusula FROM

La clusula FROM nos sirve para indicar la fuente desde la cual obtendremos los
datos deseados. Podemos indicar una sola tabla, lo cual llamamos una consulta simple, o
podemos trabajar con varias tablas realizando una unin o una composicin. Tambin
podemos indicar el nombre de una base de datos externa, es decir, diferente a la que
estamos usando y a la cual tenemos permitido el acceso.

Consultas sobre una tabla


Podemos realizar consultas que extraigan informacin de una sola tabla, la cual
especificaremos en la clusula FROM, para lo cual nos regiremos por el siguiente diagrama
de sintaxis:

tabla Nombre de una tabla, fsica o lgica


alias Nombre con el cual vamos a referirnos a la tabla en adelante. El
uso de alias permite diferenciar tablas con el mismo nombre, ya
sea en una consulta anidada o porque se usa un base de datos
externa. Aunque la palabra reservada AS es opcional su uso
permite, a nuestro entender, una lectura ms fluida de la
instruccin
BDexterna Nombre de la base de datos en donde se encuentra la tabla. Debe
indicar el camino completo y estar entre apstrofos

4
SQL

Supongamos una base de datos sencilla, que nos permite mantener informacin
sobre alumnos, los equipos deportivos y los clubes de actividades extracurriculares. A
continuacin presentamos es el esquema lgico de esa base de datos y una instancia de la
misma.

Tabla: Equipos

Tabla: Est Equipos Tabla: Est clubes

Prof. Flix Arturo Gamarra 5


Tabla: Estudiantes

Tabla: Clubes

Tabla: Materias

Tabla: Notas

6
SQL

Cuando desarrollamos el paso nmero uno para el diseo de la base de datos,


elaboramos el diseo de las salidas que debera proporcionar el sistema. Uno de estos
requerimientos sera contestar la pregunta Hacia cuales ciudades deberamos tener
transporte? Para saberlo, necesitamos conocer las ciudades desde las cuales provienen los
estudiantes, lo cual podramos intentar con la siguiente instruccin:

SELECT ciudad
FROM Estudiantes;

Sin embargo vemos que en la salida existen registros repetidos, lo cual no es


exactamente lo que queremos; debemos entonces eliminar esos registros del resultado, para
lo cual disponemos del predicado DISTINCT.

SELECT DISTINCT ciudad


FROM Estudiantes;

Para que la tupla o registro sea eliminada con el predicado DISTINCT, todos los
atributos deben ser iguales. En el siguiente ejemplo vemos que cuando esto no ocurre, el
uso de DISTINCT no tiene ningn efecto.

SELECT nombre, ciudad


FROM Estudiantes;

Prof. Flix Arturo Gamarra 7


SELECT DISTINCT nombre, ciudad
FROM Estudiantes;

La clusula WHERE
La clusula WHERE es opcional, pero cuando se la utiliza debe estar enseguida
despus de FROM. Con esta clusula implementamos la restriccin, la cual consiste en
especificar las condiciones que deben cumplir los registros para ser incluidos en el
resultado. Si no se especifica, el motor de datos regresar todos los registros encontrados.

Las condiciones de seleccin son las siguientes:


Comparacin
Rango
Pertenencia a un conjunto
Prueba de valor nulo
Prueba de correspondencia con un patrn

Comparacin

Compara el valor de dos expresiones.

Cules estudiantes tienen una estatura mayor o igual a 1,80 mts?

SELECT nombre, estatura


FROM Estudiantes
WHERE estatura >= 1.80;

8
SQL

Tambin podemos incluir varias comparaciones; por ejemplo, podemos modificar el


ejercicio anterior preguntando Cules mujeres miden ms de 1,60 mts?

SELECT nombre, estatura


FROM Estudiantes
WHERE estatura >= 1.60 AND
Sexo = F;

Rango (BETWEEN)

Selecciona los valores que estn (o no) dentro del rango especificado.

Cules estudiantes tienen una estatura entre 1,70 y 1,80 mts.?

SELECT Estudiantes.nombre, Estudiantes.estatura


FROM Estudiantes
WHERE Estudiantes.estatura BETWEEN 1.7 AND 1.8;

Pertenencia a un conjunto (IN)

Selecciona la fila si el valor de la columna est dentro de la lista de valores o en el


conjunto de resultados de una consulta anidada.

Prof. Flix Arturo Gamarra 9


SELECT Nombre, Cdigo
FROM Materias
WHERE Cdigo IN ("BDI303","MDI403");

Prueba de valor nulo (IS NULL)


Cuando una columna que interviene en una expresin de seleccin contiene el valor
nulo (NULL), es resultado no ser ni verdadero ni falso sino nulo, es decir, no aparecer en
los resultados, independientemente del criterio de seleccin. En este caso es necesario
utilizar la prueba de valor nulo.

Cules estudiantes no pertenecen a ningn club?

SELECT Estudiantes.cdula, Estudiantes.nombre, [est clubes].club


FROM Estudiantes LEFT JOIN [est clubes]
ON Estudiantes.cdula = [est clubes].estudiante
WHERE Club IS NULL;

Prueba de correspondencia con un patrn (LIKE)


Un patrn nos permite utilizar caracteres comodines para generalizar la
comparacin. Los comodines son:
? representa un carcter cualquiera
* representa cero o ms caracteres
# representa un dgito cualquiera (0-9)

10
SQL

Cules materias se dictan en el tercer semestre? El cuarto carcter del cdigo de la


materia nos indica el semestre en el cual es dictada; por lo tanto realizaremos una bsqueda
de aquellos cdigos que tengan un 3 como cuarto carcter, sin importar los tres primeros ni
ningn otro que pueda venir despus.

SELECT Materias.Nombre, Materias.Cdigo


FROM Materias
WHERE Cdigo LIKE "???3*";

Alguno (ANY o SOME)


Verifica si el valor de la columna coincide con alguno de los valores que estn en el
conjunto de resultados de una consulta anidada. El uso de ANY o de SOME es indiferente;
si se realiza la consulta con el generador de consultas, siempre aparecer ANY.
Cules estudiantes cursan alguna materia del tercer semestre?
SELECT DISTINCT Estudiantes.Nombre, Estudiantes.Sexo
FROM Estudiantes INNER JOIN Notas
ON Estudiantes.Cdula = Notas.Estudiante
WHERE Notas.Materia = ANY ( SELECT Materias.Cdigo
FROM Materias
WHERE Cdigo LIKE "???3*" );

En este ejemplo hemos utilizado el predicado DISTINCT para eliminar las filas
repetidas en el caso de que un estudiante curse varias materias del tercer semestre.

Prof. Flix Arturo Gamarra 11


Parmetros

Tambin podemos usar parmetros con las consultas, de manera que el usuario
pueda introducir un valor para una variable que utilizaremos en la clusula WHERE,
haciendo de esta manera ms flexible el funcionamiento de la consulta. Para hacerlo
sustituiremos el valor con el cual queremos comparar por un nombre cualquiera de
variable. Al ejecutar la consulta aparecer un mensaje solicitando que se introduzca el valor
del parmetro.
Podemos modificar la consulta anterior, de manera que el usuario introduzca la
estatura sobre la cual desea la consulta. Hemos llamado al parmetro con el nombre
estatura a buscar; debido a que este nombre contiene espacios en blanco, lo encerraremos
entre corchetes.

SELECT nombre, estatura


FROM Estudiantes
WHERE estatura >= [estatura a buscar] AND
Sexo = F;

De esta manera tenemos una consulta que sirve no solo para encontrar las mujeres
que midan ms de 1,60, sino que podremos especificar cualquier estatura, dependiendo de
la necesidad del momento, sin necesidad de crear otra consulta o de modificar la existente.

La clusula ORDER BY

Adems se puede indicar el orden en el cual queremos que aparezcan los resultados.

SELECT nombre, estatura


FROM Estudiantes
WHERE estatura >= 1,60 AND
Sexo = F
ORDER BY estatura DESC;

12
SQL

SELECT nombre, estatura, peso, peso/(estatura*estatura) AS IMC


FROM Estudiantes
ORDER BY peso/(estatura*estatura) DESC;

Funciones agregadas

El SQL proporciona una serie de funciones para realizar clculos sobre los valores
de las columnas en varias filas, convirtiendo la consulta en una consulta de totales, tambin
llamada de resumen. El estndar ANSI permite cinco funciones: cuenta (COUNT), suma
(SUM), promedio (AVG), mximo (MAX) y mnimo (MIN); Access permite tambin
Desviacin estndar (STDEV), Desviacin estndar de una muestra (STDEVP), varianza
(VAR) y varianza de una muestra (VARP).
Las funciones agregadas se colocan en la lista de atributos de la instruccin
SELECT, pero no deben mezclarse con nombres de atributos, a menos que estos estn
incluidos en una clusula GROUP BY.

Cul es el promedio de estatura entre los estudiantes?

SELECT AVG (estatura) AS Promedio


FROM Estudiantes;

Podemos usar varias funciones agregadas en la misma sentencia.


Cuntos estudiantes estn inscritos y cul es el promedio de estatura?

SELECT count (nombre) AS Cantidad, AVG (estatura) AS Promedio


FROM Estudiantes;

Prof. Flix Arturo Gamarra 13


En este caso hemos especificado contar sobre la columna nombre, pero podramos
haberlo hecho sobre otra columna, por ejemplo la columna cdula, con idntico resultado.
Cuando utilizamos funciones agregadas SQL, los campos mencionados en la lista de
campos a los cuales no se les ha aplicado ninguna funcin agregada deben aparecer en la
clusula GROUP BY, de lo contrario se nos indicar un error.

La clusula GROUP BY

Permite agrupar varias filas con un mismo valor en una o varias columnas, en una
sola fila (consulta de totales). En general vamos a utilizar GROUP BY conjuntamente con
las funciones agregadas de SQL, para calcular totales para cada grupo.
Anteriormente encontramos cuales eran las ciudades de donde provenan nuestros
estudiantes. Tambin podramos querer saber cuntos estudiantes vienen de cada ciudad.

SELECT ciudad, count (cdula) AS Cantidad


FROM Estudiantes
GROUP BY ciudad;

14
SQL

La clusula HAVING

Al igual que el WHERE permite seleccionar los datos que sern incluidos en el
resultado, con la diferencia de que acta a nivel de grupo. Si buscamos a cuantos clubes
pertenece cada alumno, encontraremos lo siguiente:

SELECT cdula, nombre, count(club) AS cantidad


FROM Estudiantes INNER JOIN [est clubes]
ON cdula = estudiante
GROUP BY cdula, nombre;

Pero podemos pedir que solo se muestre a los estudiantes que pertenecen a ms de
un club.

SELECT cdula, nombre, count (club) AS cantidad


FROM Estudiantes INNER JOIN [est clubes]
ON cdula = estudiante
GROUP BY cdula, nombre
HAVING count (club) > 1;

Prof. Flix Arturo Gamarra 15


Unin y composicin de tablas

Adems de realizar consultas sobre una sola tabla, el SQL nos permite hacerlo sobre
varias, lo cual es una de sus caractersticas ms tiles. Cuando nos referimos a tablas,
podemos hablar de una relacin base, es decir, de aquella que creamos en el esquema de la
base de datos y que existe fsicamente, o de una relacin derivada o lgica, la cual es el
producto de una operacin sobre una o varias tablas. Con el SQL de Microsoft Jet 4.x
podemos realizar las operaciones de Unin y de Composicin de relaciones.

Unin de relaciones
La unin de dos relaciones consiste en crear otra que contengas las filas de ambas.
Las relaciones que deseamos unir deben tener las mismas columnas, aunque pueden tener
nombres diferentes. En el caso de Access, no es necesario que sean del mismo tipo sino que
sean la misma cantidad. En la prctica, esta operacin se realiza casi siempre sobre tablas
lgicas, debido a que no es frecuente tener tablas iguales en una base de datos.
Las columnas de la relacin resultante reciben el mismo nombre que en la primera
relacin mencionada. Su sintaxis es la siguiente:

ALL La opcin predefinida es eliminar aquellas filas repetidas, es decir,


que tengan los mismos valores en todas las columnas. Si deseamos
conservar las filas duplicadas colocamos ALL, lo cual har el
proceso ms rpido.
columna o Es el nombre o nmero de la columna por la cual queremos ordenar
los resultados
Ncolumna
ASC o Nos sirve para indicar si queremos ordenar de manera ascendente
(ASC) o descendente (DESC). Si no especificamos nada, se
DESC
realizar de manera ascendente.
Ejemplo:

16
SQL

Supongamos que queremos tener un listado de todas las oportunidades de


actividades extracurriculares de las cuales disponen los alumnos, independientemente de si
se trata de un deporte o de una actividad cultural.
Para obtenerla podemos seleccionar de cada relacin las columnas que necesitamos
y luego unir estas tablas lgicas.

SELECT nombre, tema, coordinador


FROM Clubes UNION SELECT nombre, deporte, entrenador FROM Equipos
ORDER BY tema;

Las consultas podan haber sido creadas con anterioridad. Supongamos que las
consultas fueron guardadas con los nombres [Clubes unin] y [Equipos unin]
respectivamente. En este caso el ejemplo se resolvera as:

TABLE [Clubes unin] UNION TABLE [Equipos unin]


ORDER BY tema;

En ambos casos obtendremos la misma salida.

Prof. Flix Arturo Gamarra 17


Composicin de relaciones

En la composicin de relaciones lo que hacemos es concatenar las filas de una tabla


con las de la otra. En la relacin resultante tendremos las columnas de ambas tablas y las
filas concatenas. La composicin nos permite trabajar con datos de distintas tablas, que es
precisamente lo que perseguimos al normalizar la base de datos. Tambin podemos
componer una tabla con ella misma.

Producto Cartesiano

Cuando estudiamos teora de conjuntos aprendimos que el producto cartesiano de


dos conjuntos A y B, consiste en asociar cada elemento del conjunto A con cada uno de los
elementos del conjunto B.

En el caso que nos ocupa, el producto cartesiano de dos relaciones contendr cada
fila de la primera relacin, concatenada con cada una de las filas de la otra relacin. Es
importante darse cuenta de que la cantidad de filas de la relacin resultante es la
multiplicacin de la cantidad de filas de las relaciones. Por ejemplo, con tres relaciones de

18
SQL

apenas cien (100) filas cada una, al calcular el producto cartesiano de las tres obtendramos
un milln de registros (100 x 100 x 100). Esto nos indica lo tremendamente costoso, en
trminos de tiempo de procesamiento y espacio de almacenamiento, que resulta el producto
cartesiano. Es por esta razn que debemos ser cuidadosos y utilizarlo slo cuando sea
estrictamente necesario. Podramos usarlo cuando estemos seguros de que las relaciones no
sean demasiado grandes, en general, sobre relaciones que sean producto de una restriccin
previa.
El producto cartesiano se implementa mediante la clusula FROM de la sentencia
SELECT, colocando los nombres de las tablas separadas por coma, como muestra el
siguiente diagrama de sintaxis.

tabla nombre de una tabla o consulta


alias nombre temporal dado a la tabla o consulta
BDexterna nombre de la base de datos externa, en caso de que las relaciones se
encuentren en una base de datos diferente a la que estamos usando

Normalmente, al utilizar el producto cartesiano realizamos tambin una restriccin


sobre los resultados, de manera de seleccionar las filas que nos interesan.

Ejemplo:
Supongamos que queremos tener los nombres de los estudiantes inscritos en los
clubes, as como el tema y nombre del club. Los dos ltimos atributos los encontramos en
la tabla Clubes, mientras que el nombre del estudiante se encuentra en la tabla Estudiantes.
Como no existe una relacin entre Clubes y Estudiantes, es necesario utilizar la tabla [est
clubes]. Queremos entonces una nueva relacin con las filas de la relacin Clubes, solo los
atributos tema y nombre, concatenadas con el nombre del estudiante.
Si realizamos la consulta con un producto cartesiano, nos quedara de esta manera:

SELECT tema, Clubes.nombre, Estudiantes.nombre


FROM Clubes, [est clubes], Estudiantes;

En la figura XX (a) vemos que el resultado muestra 147 filas, puesto que est
relacionando cada fila de la tabla Clubes ( 3 ) con las filas de la tabla [est clubes] ( 7 ) y
luego este resultado con las filas de la tabla Estudiantes ( 7 ). Al multiplicar obtenemos 3 x

Prof. Flix Arturo Gamarra 19


7 x 7 = 147 filas. En este punto es muy importante darnos cuenta de que la gran mayora de
estas filas no reflejan la realidad modelada, puesto que hace aparecer a los estudiantes
como inscritos en un club al cual no pertenecen. De esta forma es claro que es necesario
seleccionar aquellos registros que si reflejen la realidad y desechar los dems. Esto lo
vamos a lograr con la utilizacin de la clusula WHERE, tal como vemos en la siguiente
sentencia.

SELECT tema, Clubes.nombre, Estudiantes.nombre


FROM Clubes, [est clubes], Estudiantes
WHERE Clubes.nombre = club AND
estudiante = cdula ;

La figura XX (b) nos muestra que en la salida ahora hay solo siete filas. En este caso
la clusula WHERE nos permite seleccionar solamente aquellas filas en donde el nombre
del club es igual en las tablas Clubes y [est clubes] y la cdula de estudiante es igual en las
tablas [est clubes] y Estudiantes.
El producto cartesiano solo debe usarse cuando las tablas que nos interesan no
tienen una relacin definida, puesto que si existe la relacin la consulta debe realizarse con
un INNER, RIGHT o LEFT JOIN.

20
SQL

INNER JOIN

Permite combinar las filas de tablas distintas usando valores coincidentes de un


campo comn. Su sintaxis es la siguiente:

tabla1 y Nombre de tabla o consulta. Puede tratarse de la misma tabla; en este


tabla2 caso es necesario el uso de al menos un alias.
alias Nombre temporal dado a la tabla o consulta
columna1 y Columnas por las cuales se van a relacionar las tablas. Deben contener la
columna2 misma clase de datos
comp Cualquier operador de comparacin. Se puede combinar varias
condiciones utilizando AND y OR

Ahora podemos resolver el ejemplo anterior utilizando el INNER JOIN, y la


consulta quedara de esta manera:

SELECT Clubes.tema, Clubes.nombre, Estudiantes.nombre


FROM (Estudiantes INNER JOIN [est clubes]
ON Estudiantes.cdula = [est clubes].estudiante)
INNER JOIN Clubes
ON [est clubes].club) = Clubes.nombre;

En este caso vemos que la salida es la misma y como la cantidad de datos es tan
pequea no parece haber diferencias entre el producto cartesiano y el INNER JOIN; sin
embargo cuando tenemos grandes cantidades de datos la diferencia en el tiempo de
procesamiento es notable.

Prof. Flix Arturo Gamarra 21


LEFT JOIN y RIGHT JOIN

Existen casos en los cuales el INNER JOIN podra no mostrarnos los resultados
deseados. Por ejemplo, supongamos que queremos saber cuantos estudiantes estn inscritos
en cada club. Si hacemos una consulta utilizando INNER JOIN veramos un resultado
como el mostrado en la figura xx.

SELECT Clubes.tema, Clubes.nombre, count (estudiante) AS Inscritos


FROM Clubes INNER JOIN [est clubes]
ON Clubes.nombre = [est clubes].club
GROUP BY Clubes.tema, Clubes.nombre;

Pero por la figura xx de la pgina zz sabemos que existen tres clubes y no dos.
Entonces, qu ha sucedido con el otro registro? En este caso lo que pasa es que existe un
club al cual todava no se han inscrito estudiantes.
Si deseamos que aparezcan todos los clubes, independientemente de si tienen o no
estudiantes inscritos, necesitamos usar el LEFT JOIN o el RIGHT JOIN, los cuales son una
extensin del INNER JOIN. Adems de encontrar los registros encontrados con un INNER
JOIN, con el LEFT JOIN encontraremos los registros de la primera tabla que no estn
relacionados con la segunda. En el caso de RIGHT JOIN sern los registros de la segunda
tabla. En otras palabras, LEFT JOIN devuelve todos los registros de la tabla que est a la
izquierda (que se nombra primero) y RIGHT JOIN regresa todos los de la derecha.

SELECT Clubes.tema, Clubes.nombre, count (estudiante) AS Inscritos


FROM Clubes LEFT JOIN [est clubes]
ON Clubes.nombre = [est clubes].club
GROUP BY Clubes.tema, Clubes.nombre;

22
SQL

La sintaxis es similar a la del INNER JOIN, cambiando INNER por LEFT o


RIGHT segn sea el caso.

Consultas Anidadas

Una consulta puede estar anidada dentro de otra instruccin SELECT. En muchos
textos se encuentra traducida como subconsulta, pero esta palabra no existe en el
diccionario de la Real Academia de la Lengua Espaola, por lo cual nos referiremos a estas
consultas como queda dicho en el ttulo anterior.
La consulta anidada tambin es conocida como consulta interna y la que la contiene
como consulta externa. Cuando la consulta interna se calcula para cada fila resultante de la
consulta externa, entonces se le llama consulta correlacionada.
Con frecuencia, pero no siempre, la consulta interna puede ser expresada mediante
una composicin interna. En general, el seleccionar una u otra forma depender de la
preferencia del desarrollador.
Ejemplo:
Cules estudiantes tienen una estatura igual o superior a la estatura promedio?
Como ya hemos construido una consulta para calcular la estatura promedio,
podemos utilizarla como consulta interna y solucionar el caso de la siguiente manera:

SELECT nombre, estatura


FROM Estudiantes
WHERE estatura >= (SELECT AVG (estatura)
FROM Estudiantes) ;

Prof. Flix Arturo Gamarra 23


A cules clubes pertenecen los estudiantes que estn inscritos en ms de un club?

SELECT cdula, nombre, club


FROM Estudiantes INNER JOIN [est clubes]
ON cdula = estudiante
WHERE cdula IN ( SELECT cdula
FROM Estudiantes INNER JOIN [est clubes]
ON cdula = estudiante
GROUP BY cdula
HAVING count (club) > 1 );

24
SQL

Queremos saber cules son las materias con las cuales se siente ms cmodo cada
estudiante. Para ello buscaremos, para cada uno de ellos, aquellas materias en la que obtuvo
una nota superior a su promedio personal.
Vamos a solucionar este ejemplo paso por paso. Primero hacemos una consulta que
nos indique las notas de los estudiantes en cada materia.

SELECT Estudiantes.nombre, Materias.Nombre, Notas.Nota


FROM (Estudiantes INNER JOIN Notas
ON Estudiantes.cdula = Notas.Estudiante)
INNER JOIN Materias
ON Materias.Cdigo = Notas.Materia;

Luego calcularemos el promedio de notas por estudiante

SELECT Estudiantes.nombre, Avg(Notas.Nota) AS Promedio


FROM Estudiantes INNER JOIN Notas
ON Estudiantes.cdula = Notas.Estudiante
GROUP BY Estudiantes.nombre;

Prof. Flix Arturo Gamarra 25


Por ltimo combinamos ambas consultas para obtener el resultado deseado.

SELECT Estudiantes.nombre, Materias.Nombre, Notas.Nota


FROM (Estudiantes INNER JOIN Notas
ON Estudiantes.cdula = Notas.Estudiante)
INNER JOIN Materias
ON Notas.Materia = Materias.Cdigo
WHERE Notas.Nota > (SELECT Avg(N.Nota)
FROM Estudiantes AS E INNER JOIN Notas AS N
ON E.cdula = N.Estudiante
WHERE E.cdula = Estudiantes.Cdula) ;

En este caso la consulta interna es correlacionada, puesto que debe ser calculada
para cada fila de la consulta externa, es decir, para cada estudiante se calcula su promedio
de notas. Ntese el uso de alias, debido a que las tablas de ambas consultas, interna y
externa, son las mismas.

26