Professional Documents
Culture Documents
Departamento de Informtica
Ctedra de Organizacin de Datos
Asignatura Modelos de Datos
SQL
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:
2
SQL
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.
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.
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: Clubes
Tabla: Materias
Tabla: Notas
6
SQL
SELECT 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.
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.
Comparacin
8
SQL
Rango (BETWEEN)
Selecciona los valores que estn (o no) dentro del rango especificado.
10
SQL
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.
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.
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.
12
SQL
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.
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.
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:
Pero podemos pedir que solo se muestre a los estudiantes que pertenecen a ms de
un club.
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:
16
SQL
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:
Producto Cartesiano
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.
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:
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
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
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.
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.
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.
22
SQL
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:
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.
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