Вы находитесь на странице: 1из 30

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

El lenguaje SQL
El paso de la gestin automatizada de informacin basada en ficheros a la gestin basada en el uso de Sistemas Gestores de Bases de Datos (SGBDs) trajo consigo importantes cambios en el modo de disear, construir e utilizar aplicaciones informticas. Uno de los cambios ms significativos fue la aparicin de los denominados lenguajes de consulta : muchos de los primeros SGBDs estaban acompaados de uno o ms lenguajes desarrollados especficamente para el acceso a la informacin contenida en las BDs bajo su control. La idea es que esos lenguajes proporcionan una interfaz sencilla que simplifica el acceso a los datos, descargando buena parte de la responsabilidad (y la complejidad) del mismo sobre el propio SGBD. La autntica diferencia de esos lenguajes con respecto a otros lenguajes de programacin es su carcter declarativo: en lugar de especificar paso a paso las operaciones a realizar (la esencia de los lenguajes de programacin imperativos), estos lenguajes permiten especificar nicamente el resultado deseado; dejando al SGBD la tarea de decidir la forma ms adecuada de conseguir ese resultado. Esto convierte a los lenguajes de consulta de BDs en autnticos lenguajes de alto nivel; y los hace adecuados, por otro lado, para solucionar el problema de la dificultad de acceso a los datos: necesidades de informacin inesperadas y puntuales pueden ser resueltas de forma rpida y flexible. Uno de los primeros lenguajes de consulta de BDs fue el Structured Query Language (ms conocido por sus siglas SQL), desarrollado por la compaa IBM para SYSTEM R, un SGBD relacional experimental. Con el paso del tiempo, SQL se ha convertido en un lenguaje estndar: prcticamente todos los SGBD relacionales del mercado lo soportan, en mayor o menor medida. De hecho, SQL cuenta ya con varias versiones, resultantes de sucesivas revisiones, datando la versin ms reciente del ao 1999 (de ah esta sea conocida como SQL99) SQL es soportado por los SGBDs relacionales porque est fuertemente vinculado al modelo relacional: el SGBD da respuesta a cada consulta SQL por medio de la ejecucin de una secuencia de operaciones del lgebra relacional (el lgebra con los correspondientes operadores - que el modelo relacional incluye para permitir la manipulacin de las relaciones). Los SGBDs suelen incluir entre las herramientas que los acompaan un intrprete de SQL: se trata de un programa informtico capaz de recibir y evaluar consultas SQL, conectndose con la BD adecuada, y presentando al usuario los resultados obtenidos. Y los SGBDs tambin admiten que los programas de aplicacin que necesiten acceder a una determinada BD le enven sus solicitudes de informacin en forma de consultas SQL. Aunque hablemos de lenguajes de consulta, SQL es un lenguaje completo: no slo permite recuperar informacin desde una BD, sino que tambin permite actualizar dicha informacin, e incluso definir la estructura de la propia BD. Podemos decir que SQL tiene dos vertientes: Lenguaje de Manipulacin de Datos (LMD) : SQL incluye instrucciones para el acceso y manipulacin de la informacin contenida en una BD

Autor: Juan Ramn Lpez Rodrguez

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Instruccin SELECT: permite la recuperacin de informacin Instruccin INSERT: permite introducir nuevos datos en la BD Instruccin UPDATE: permite la actualizacin de datos en la BD Instruccin DELETE: permite la eliminacin de informacin de la BD Lenguaje de Definicin de Datos (LDD) : SQL permite tambin la definicin y estructuracin de las diferentes BDs controladas por un SGBD - Instruccin CREATE TABLE: crea una nueva relacin en la BD. - Instruccin ALTER TABLE : permite la modificacin de la estructura de una relacin ya existente en la BD. - Instruccin DROP TABLE: permite la eliminacin de una relacin en la BD. Estas notas estn destinadas a explicar nicamente la parte de SQL correspondiente a la instruccin SELECT. En caso de estar interesado en el resto de instrucciones, el lector o lectora puede acudir a la bibliografa citada en la ltima pgina, donde hayar excelentes explicaciones y ejemplos.

Diferencias SQL Modelo relacional


Si bien SQL est fuertemente ligado al modelo relacional, no es menos cierto que presenta algunas diferencias importantes en cuanto al manejo de los datos: Una primera diferencia es terminolgica: donde el modelo relacional habla de relaciones, tuplas, y atributos, SQL habla de tablas, filas y columnas. Nosotros no haremos distinciones y manejaremos indistintamente ambas terminologas. El modelo relacional no admite la existencia de tuplas repetidas en una relacin (restriccin de clave). En cambio, SQL admite sin problemas la existencia de filas repetidas en una tabla (veremos ms adelante por qu). Lo que en el modelo relacional son dominios (conjunto de valores vlidos para un atributo), en SQL son tipos de datos. Los tipos de datos definen los valores posibles para un atributo, pero tambin las operaciones que pueden ser realizadas con esos valores (suma, resta, multiplicacin, divisin, concatenacin....) . Los tipos de datos ms frecuentes en SQL son:
Tipo de datos SQL NUMBER (numDigitos) CHAR(numCaracteres) DATETIME Nombre que recibe en Access Nmerico TEXTO (numCaracteres) Fecha/Hora Operaciones soportadas +,-,*,/ + (concatenacin) Ejemplo 53 Casa 03/09/57

Ejemplo a utilizar
Antes de abordar la descripcin de la instruccin SELECT de SQL, estableceremos el ejemplo de partida que utilizaremos a lo largo de la explicacin. Se trata del esquema lgico - relativo a la gestin de una empresa que habamos obtenido al analizar la transformacin desde el modelo ER al modelo relacional.

Autor: Juan Ramn Lpez Rodrguez

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Empleado (NSS, NPila, Ap1, Ap2, Sexo, Direccin, FNac, NumDept, NSSSupervisor)

Departamento (NumDept, NomDept, NSS, FechaIniGerente)

TrabajaEn (NSS, Numero, Horas) LocalidadDpt (NumDept, Loc)

Proyecto (Numero, Nombre, Loc, NumDept)

Las relaciones, desde el punto de vista de SQL, deben ser consideradas como tablas; asumiremos que, como tales, contienen los siguientes datos en un momento dado:
NSS NPila 1 Juan 2 Pedro 3 Mara 4 Antonio Empleado Ap1 Ap2 Sexo Direccin Prez Prez H R/ Vilar 2 Lpez Blas H R/ Fontes 12 Prez Pi M R/ Galicia 6 Botn Castro H Pza Galicia 1 FNac NumDept NSSSupervisor 02/06/64 D01 23/12/50 D01 1 12/03/75 D02 13/01/65 D02 3

Departamento NumDept NomDept NSS FechaIniGerente D01 Ventas 1 01/01/2000 D02 Produccion 2 01/01/2004 Proyecto Numero Nombre Localidad NumDept V1 Sistema contable A Corua D01 P1 Producto A Ferrol D02 P2 Producto B Ferrol D02

TrabajaEn NSS Numero Horas 1 V1 10 2 V1 35 3 P1 20 4 P1 5 4 P2 30

LocalidadDpt NumDept Loc D01 A Corua D02 A Corua D02 Ferrol

La instruccin SELECT
La instruccin SELECT de SQL se utiliza para recuperar (realizando un procesamiento previo, si fuese necesario) informacin de la BD. Se trata de una instruccin que toma como parmetros de entrada una o mas tablas, y devuelve como resultado una nueva tabla, generada dinmicamente, que contiene la informacin solicitada. El resultado puede ser desde una tabla con una nica fila y una nica columna (es decir, un nico valor) hasta una tabla con mltiples filas y columnas.

Autor: Juan Ramn Lpez Rodrguez

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

La instruccin SELECT est formada por un conjunto de clusulas, que ayudan a precisar la informacin que se solicita. La sintaxis general de una instruccin SELECT es la siguiente SELECT [distinct] <lista de expresiones> FROM <lista de tablas> WHERE <condiciones de seleccin> ORDER BY <lista expresiones ordenacin> clusula select clusula from clusula where clusula order by

La clusula FROM permite especificar la tabla o tablas de la base de datos desde donde se va a recuperar la informacin que se necesita. La clusula WHERE permite especificar un conjunto de condiciones para la seleccin de los datos que se recuperarn de las tablas para elaborar el resultado. La clusula SELECT permite especificar la informacin a recuperar exactamente, y, de ser necesario, el procesamiento que debe ser realizado sobre esos datos. Finalmente, la clusula ORDER BY permite especificar el orden en el que va a ser presentada la informacin en la tabla resultante.

En realidad, no todas estas clusulas deben aparecer obligatorias en una consulta Select. Slo ls clusulas SELECT y FROM son imprescindibles para formar una consulta Select mnima.

La clusula SELECT
Supongamos que queremos recuperar el NSS y el nombre completo (nombre de pila + apellidos) de todos los empleados de la empresa. Una consulta que lo permite sera la siguiente:
Select NSS, NPila, Ap1, Ap2 FROM Empleado

...y el resultado de evaluar la consulta sera el siguiente:


NSS NPila 1 Juan 2 Pedro 3 Mara 4 Antonio Ap1 Ap2 Prez Prez Lpez Blas Prez Pi Botn Castro

Cmo se obtiene esta tabla? Una consulta Select se evala de la siguente manera: 1) En primer lugar, se evala la clusula FROM: es necesario determinar de qu tabla vamos a recuperar la informacin: por ejemplo, Empleado. 2) A continuacin, se accede a la tabla indicada, y se recuperan, una a una, todas sus filas, sobre las que ser evaluada, una por una, la clusula SELECT: cada fila de la tabla original (Empleado) va a dar lugar a una nueva fila en la tabla que contendr el resultado de la consulta.

3) La clusula SELECT debe contener una lista de una o ms expresiones, separadas


Autor: Juan Ramn Lpez Rodrguez 4

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

por comas. - Cada una de esas expresiones ser evaluada sobre cada fila de la tabla original, dando lugar a una lista de valores atmicos (tantos como expresiones) - La lista obtenida servir para crear una nueva fila en la tabla resultado. - La tabla resultado tendr una columna por cada expresin incluida en la clusula SELECT - El nombre de cada columna ser igual a la expresin que la genera. 4) Sern expresiones vlidas (expresiones que pueden ser utilizadas en la clusula SELECT): - Un valor constante, de cualquiera de los tipos de datos admitidos en SQL: por ejemplo Juan, 5, 03/02/2004. El resultado de evaluar un valor constante sobre una fila coincide siempre con el propio valor constante. - Un nombre de columna de aquellos incluidos en la tabla indicada en el FROM: por ejemplo, NSS, NPila, Ap1 o Ap2. Al evaluar un nombre de columna sobre una fila determinada, el resultado ser el valor de la fila en esa columna. - Una expresin que incluya operaciones realizadas sobre valores constantes y/o nombres de columnas. El resultado de la expresin ser el mismo que el resultado de evaluar primero los valores constantes y los nombres de columnas, y operarlos despus. Por ejemplo: 2 (Resultado: 2) 2+3 (Resultado: 5) Fede + rico (Resultado: Federico) Ap1 + Ap2 (Resultado: dada una fila de la tabla original, la concatenacin de los valores de sus columnas Ap1 y Ap2) Nombre: + NPila (Resultado: dada una fila de la tabla original, la concatenacin de la cadena Nombre: y el valor de la fila en la columna NPila)

En el caso de nuestro ejemplo, la evaluacin de la consulta se realiza como sigue: En primer lugar, se utiliza la clusula FROM para determinar la tabla de origen de los datos: Empleado, que es la tabla que contiene toda la informacin que necesitamos. A continuacin, se analiza una por una cada fila de Empleado: Para la primera fila...
NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor 1 Juan Prez Prez H R/ Vilar 2 02/06/64 D01

...las expresiones de la clusula SELECT se evalan as:


NSS: 1 NPila: Juan Ap1: Prez Ap2: Prez

...y por lo tanto, la fila que se genera en la tabla resultado es:


1 Juan Prez Prez

Autor: Juan Ramn Lpez Rodrguez

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Para la segunda fila...


NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor 2 Pedro Lpez Blas H R/ Fontes 12 23/12/50 D01 1

...las expresiones de la clusula SELECT se evalan as:


NSS: 2 NPila: Pedro Ap1: Lpez Ap2: Blas

...y por lo tanto, la fila que se aade a la tabla resultado es:


2 Pedro Lpez Blas

Para la tercera fila...


NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor 3 Mara Prez Pi M R/ Galicia 6 12/03/75 D02

...las expresiones de la clusula SELECT se evalan as:


NSS: 3 NPila: Mara Ap1: Prez Ap2: Pi

...y por lo tanto, la fila que se aade a la tabla resultado es:


3 Mara Prez Pi

Finalmente, para la cuarta y ltima fila...


NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor 4 Antonio Botn Castro H Pza Galicia 1 13/01/65 D02 3

...las expresiones de la clusula SELECT se evalan as:


NSS: 4 NPila: Antonio Ap1: Botn Ap2: Castro

...y por lo tanto, la fila que se aade a la tabla resultado es:


4 Antonio Botn Castro

Como ltimo paso, las filas obtenidas se unen para obtener la tabla resultante:
NSS NPila 1 Juan 2 Pedro 3 Mara 4 Antonio Ap1 Ap2 Prez Prez Lpez Blas Prez Pi Botn Castro

Como se puede apreciar, las columnas tienen por nombre la expresin (incluida en la clusula SELECT) que da lugar a sus valores

La consulta que hemos visto utiliza expresiones en la clusula SELECT que estn constituidas por simples nombres de columnas. Sin embargo, podemos realizar consultas ms sofisticadas incluyendo expresiones ms complejas. Por ejemplo, podemos modificar la consulta anterior para que el nombre completo de cada empleado aparezca en una nica columna:
Autor: Juan Ramn Lpez Rodrguez 6

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Select NSS, Ap1 + + Ap2 + , + NPila FROM Empleado

En esta nueva consulta, reemplazamos las tres expresiones que se referan a las columnas de nombre y apellidos de los empleados por una expresin nica, en la que se utiliza el operador de concatenacin de cadenas (+) para unir los valores de dichas columnas, separados por espacios y comas: se trata de una expresin en la que se combinan nombres de atributos y valores constantes ( y , ). La consulta se evaluar de la siguiente forma: Para la primera fila...
NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor 1 Juan Prez Prez H R/ Vilar 2 02/06/64 D01

...las expresiones de la clusula SELECT se evalan as:


NSS: 1 Ap1 + + Ap2 + , + NPila = Prez + + Prez + , + Juan = Prez Prez, Juan

...y por lo tanto, la fila que se genera en la tabla resultado es:


1 Prez Prez, Juan

Para la segunda fila...


NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor 2 Pedro Lpez Blas H R/ Fontes 12 23/12/50 D01 1

...las expresiones de la clusula SELECT se evalan as:


NSS: 2 Ap1 + + Ap2 + , + NPila = Lpez + + Blas + , + Pedro = Lpez Blas, Pedro

...y por lo tanto, la fila que se aade a la tabla resultado es:


2 Lpez Blas, Pedro

Para la tercera fila...


NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor 3 Mara Prez Pi M R/ Galicia 6 12/03/75 D02

...las expresiones de la clusula SELECT se evalan as:


NSS: 3 Ap1 + + Ap2 + , + NPila = Prez + + Pi + , + Mara = Prez Pi, Mara

...y por lo tanto, la fila que se aade a la tabla resultado es:


3 Prez Pi, Mara

Finalmente, para la cuarta y ltima fila...


NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor 4 Antonio Botn Castro H Pza Galicia 1 13/01/65 D02 3

...las expresiones de la clusula SELECT se evalan as:


NSS: 4

Autor: Juan Ramn Lpez Rodrguez

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Ap1 + + Ap2 + , + NPila = Botn + + Castro + , + Antonio = Botn Castro, Antonio

...y por lo tanto, la fila que se aade a la tabla resultado es:


4 Botn Castro, Antonio

Como ltimo paso, las filas obtenidas se unen para obtener la tabla resultante:
NSS Ap1 + + Ap2 + , + NPila 1 Prez Prez, Juan 2 Lpez Blas, Pedro 3 Prez Pi, Mara 4 Botn Castro, Antonio

Las expresiones complejas no tienen por que utilizar slo atributos o valores de tipo carcter. La siguiente consulta devuelve el nmero mensual de horas que cada empleado le dedica a cada proyecto (que se obtienen multiplicando por 4 el nmero de horas semanal por proyecto, almacenado en la tabla TrabajaEn):
Select NSS, Numero, Horas* 4 FROM TrabajaEn

Es fcil comprobar que el resultado de esta consulta sera la siguiente tabla:


TrabajaEn NSS Numero Horas*4 1 V1 40 2 V1 140 3 P1 80 4 P1 20 4 P2 120

Con este ejemplo demostramos algo que habamos afirmado anteriormente: la instruccin Select de SQL permite no slo recuperar informacin almacenada en una BD, sino tambin procesar dicha informacin para generar informacin nueva.

Valores nulos
El modelo relacional admite el uso de los valores nulos durante la asignacin de valores a los atributos de una tupla. Eso significa, en la terminologa de SQL, que podemos encontrarnos con celdas de una tabla que alberguen valores nulos. Por lo tanto, la clusula SELECT puede involucrar, en sus expresiones, valores nulos (al evaluar esas expresiones sobre los valores de una fila determinada). La pregunta es cmo afectan los valores nulos al clculo de expresiones incluidas en una clusula SELECT? Y la respuesta es sencilla: el valor de un nulo es desconocido; por lo tanto, en toda expresin en la que intervenga un valor nulo, el resultado ser tambin desconocido.1 Y en la tabla resultante, el valor desconocido se representar mediante otro valor nulo.
-

2 + Nulo = Nulo Casa + Nulo = Nulo NSS 5 = Nulo (si NSS se evala a Nulo)

Ya que, si nos falta alguno de los parmetros de la expresin, es imposible determinar el resultado.

Autor: Juan Ramn Lpez Rodrguez

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Ejemplo: Indica el NSS de cada empleado y el de su jefe.


Select NSS, NSSSupervisor FROM Empleado

La consulta se evala de la siguiente forma:


NSS Npila 1 Juan 2 Pedro 3 Mara 4 Antonio Empleado Ap1 Ap2 Prez Prez ... Lpez Blas ... Prez Pi ... Botn Castro ... NSSSupervisor 1 3 ... ... ... ... NSS 1 2 3 4 NSSSupervisor (Nulo) 1 (Nulo) 3 NSS 1 2 3 4 NSSSupervisor 1 3

Filas repetidas: el modificador distinct


Supongamos que necesitamos conocer las diferentes localidades en las que nuestra empresa dispone de alguna sede. En la base de datos contamos con informacin referente a las sedes de los departamentos de la empresa (concretamente, en la tabla LocalidadDpt); y conociendo las sedes de los departamentos, conoceremos las de la empresa (ya que, en buena lgica, deben coincidir). Por lo tanto, la siguiente consulta debera servir a nuestros fines:
SELECT Loc FROM LocalidadDpt

Como en los casos anteriores, la consulta se evala recuperando una por una las filas de la tabla indicada y evaluando las expresiones de la clusula SELECT sobre cada una de ellas:
LocalidadDpt NumDept Loc D01 A Corua D02 A Corua D02 Ferrol Evaluacin de Loc: A Corua A Corua Ferrol

El resultado de la consulta sera este:


Loc A Corua A Corua Ferrol

Como se puede apreciar, una de las localidades aparece repetida: se trata de A Corua, como resultado de ser obtenida como sede de dos departamentos diferentes. Esto es as porque SQL incumple la restriccin de clave del modelo relacional, que exige que en una relacin (una tabla) no puede haber filas repetidas. As, al verse liberado de la obligacin de comprobar esta restriccin, cualquier intrprete de SQL podr procesar una consulta mucho ms rpidamente. Sin embargo, SQL s que permite eliminar filas repetidas en el resultado de una consulta (aunque provocando, probablemente, un retraso adicional por parte del intrprete en la

Autor: Juan Ramn Lpez Rodrguez

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

obtencin del resultado final). Para hacerlo, la clusula SELECT cuenta con el modificador distinct: aadiendo este modificador a nuestra consulta...
SELECT distinct Loc FROM LocalidadDpt

...el resultado de la misma pasara a ser este:


Loc A Corua Ferrol

...de forma que obtendramos ya los datos en la forma deseada. Es importante resaltar que distinct permite eliminar filas repetidas, y no valores repetidos. Por ejemplo, estas dos consultas (que nos devuelven una lista con los nombres de los empleados y el departamento en el que trabajan):
SELECT NumDept, Npila FROM Empleado SELECT distinct NumDept, Npila FROM Empleado

devolvern como resultado la misma tabla:


NumDept NPila D01 Juan D01 Pedro D02 Mara D02 Antonio

Si bien en la columna NumDept hay varios valores repetidos, no hay ninguna fila repetida; por lo tanto, la presencia o no de distinct en la consulta no afecta al resultado final.

Versin abreviada del SELECT


Es bastante usual encontrarse en la necesidad de recuperar toda la informacin contenida en una tabla. Hacerlo por medio de una consulta SQL implicara escribir uno por uno todos los nombres de sus columnas en la clusula SELECT:
SELECT NSS, Npila, Ap1, Ap2, Sexo, Direccion, Fnac, NumDept, NSSSupervisor FROM Empleado

Para evitar esto, la clusula SELECT admite un carcter comodn, que representa a todas las columnas de una tabla: el asterisco (*). As, la siguiente consulta sera equivalente a la anterior:
SELECT * FROM Empleado

Ordenacin del resultado: la clusula ORDER BY .


En los ejemplos anteriores estamos asumiendo que el orden de presentacin de los resultados de una consulta se basa en el orden inicial de las filas de la tabla de partida.

Autor: Juan Ramn Lpez Rodrguez

10

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

En realidad, nada nos garantiza ese orden: la definicin formal de SQL no nos indica nada a ese respecto. Adems, la definicin del modelo relacional (que, no lo olvidemos, es la base de SQL) especifica que una relacin (una tabla) es un conjunto de tuplas: tratndose de un conjunto, el concepto de orden no es aplicable. A dnde nos lleva todo esto? Si ejecutamos dos veces una misma consulta, nada nos garantiza que los resultados aparezcan en el mismo orden las dos veces. En realidad, se trata de un problema que tiene fcil solucin: SQL incorpora, en la instruccin SELECT, una clusula ORDER BY que nos permite especificar el orden deseado de presentacin de los resultados. El orden se establece a travs de una o ms expresiones de ordenacin, que se incluyen en la clusula ORDER BY separadas por comas: Para cada fila de la tabla original se calculan los valores de esas expresiones. Las filas originales se ordenan de acuerdo a los valores resultantes de evaluar las expresiones de ordenacin: en primer lugar se tienen en cuenta los resultados de la primera expresin; se toman despus en cuenta los resultados de la segunda; y as sucesivamente. Los valores resultantes de cada expresin pueden ser ordenados de forma ascendente o descendente: para ello se utilizan los modificadores ASC (la opcin por defecto) y DESC. Las filas del resultado se ordenan en funcin del orden establecido para las filas de la tabla original a partir de las que son obtenidas.

Veremos a continuacin dos ejemplos del uso de la clusula ORDER BY para precisar mejor su funcionamiento. Ejemplo: Obtener la lista de empleados de la empresa, ordenados alfabticamente por sus apellidos.
SELECT NSS, Ap1+ + Ap2 + , + Npi la FROM Empleado ORDER BY Ap1, Ap2, Nombre

Esta consulta se evala de la siguiente forma: Para cada fila de la tabla Empleado se evalan las expresiones de ordenacin:
Empleado NSS NPila Ap1 Ap2 1 Juan Prez Prez 2 Pedro Lpez Blas 3 Mara Prez Pi 4 Antonio Botn Castro ... ... ... ... Ap1 Ap2 NPila Prez Prez Juan Lpez Blas Pedro Prez Pi Mara Botn Castro Antonio

Las filas se ordenan empleando la primera expresin ( Ap1), de forma ascendente (la opcin por defecto):
Empleado NSS NPila Ap1 Ap2 4 Antonio Botn Castro ... 2 Pedro Lpez Blas ... Ap1 Ap2 NPila Botn Castro Antonio Lpez Blas Pedro

Autor: Juan Ramn Lpez Rodrguez

11

Grao en Informacin e Documentacin: Bases de datos documentais


3 1 Mara Juan Prez Pi Prez Prez ... ... Prez Pi Prez Prez Mara Juan

Curso 2013 2014

Como se puede observar, dos filas (las correspondientes a Mara y Pedro) presentan en mismo valor para Ap1. Para decidir su orden, recurrimos a la segunda expresin (Ap2)
Empleado NSS NPila Ap1 Ap2 4 Antonio Botn Castro 2 Pedro Lpez Blas 1 Juan Prez Prez 3 Mara Prez Pi ... ... ... ... Ap1 Ap2 NPila Botn Castro Antonio Lpez Blas Pedro Prez Prez Juan Prez Pi Mara

Ya no es necesario recurrir a la ltima expresin ( NPila) para resolver el orden final. Conocido el orden, llega el momento de evaluar la clusula SELECT y resolver la consulta, respetando el orden previamente establecido.
Empleado NSS NPila Ap1 Ap2 4 Antonio Botn Castro 2 Pedro Lpez Blas 1 Juan Prez Prez 3 Mara Prez Pi ... ... ... ... NSS 4 2 1 3 Ap1+ + Ap2 + , + Npila Botn Castro, Antonio Lpez Blas, Pedro Prez Prez, Juan Prez Pi, Mara

Ejemplo: Indicar los NSS de todos los empleados de la empresa, ordenados por departamento y por edad (los ms jvenes primero). Ordenar por edad, de forma ascendente, implica ordenar por fecha de nacimiento (el dato que poseemos sobre los empleados) de forma descendente. Por lo tanto, la consulta a realizar sera esta:
SELECT NSS, NumDept FROM Empleado ORDER BY NumDept, Fnac DESC

Obsrvese el uso que se hace del modificador DESC para exigir que las filas se ordenen por fecha de forma descendente (de mayor a menor, en lugar de de menor a mayor) El resultado de la consulta sera el siguiente:
Empleado NSS Npila Ap1 1 Juan Prez 2 Pedro Lpez 3 Mara Prez 4 Antonio Botn Ap2 Prez Blas Pi Castro ... ... ... ... NumDept D01 D01 D02 D02 FNac 02/06/64 23/12/50 12/03/75 13/01/65 NSS NumDept 1 D01 2 D01 3 D02 4 D02

(Se da la casualidad en el ejemplo que el orden solicitado en origen para las tuplas es aquel en el que las habamos presentado inicialmente).

Filtrado de informacin: la clusula WHERE


La clusula WHERE permite afinar en mayor medida la recuperacin de informacin mediante una instruccin SELECT. Hasta ahora hemos visto cmo seleccionar cules de

Autor: Juan Ramn Lpez Rodrguez

12

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

las columnas de una tabla nos interesan; mediante WHERE podremos seleccionar cules de las filas contenidas en una tabla nos interesan. Eso nos permitir, por ejemplo, restringir cualquiera de las consultas que hemos realizado hasta ahora a los empleados de un determinado departamento. As, la consulta siguiente permitir obtener el nombre de todos los empleados del departamento de Ventas.
Select NSS, Ap1 + + Ap2 + , + NPila FROM Empleado WHERE NumDept=D01

Para seleccionar las filas que nos interesen, la clusula WHERE va acompaada de un conjunto de condiciones de seleccin. Slo las filas que cumplan esas condiciones sern tenidas en cuenta para evaluar la consulta. Condiciones simples La condicin de seleccin ms sencilla que se puede definir es aquella que obliga a comparar los valores de dos expresiones evaluadas sobre cada fila de la tabla. = > < <> >= <=

Expresin1

Expresin 2

La idea es que tanto Expresin1 como Expresin2 se evalen sobre los valores de cada fila de la tabla original. Una vez evaluados, se comparan. Si la condicin especificada se cumple, la fila se selecciona. Si la condicin no se cumple, la fila es descartada. En el caso del ejemplo de la consulta anterior (datos de los empleados del departamento de Ventas, D01), la evaluacin se hara as: En primer lugar, seleccionar las filas a utilizar para calcular el resultado, aplicando la condicin de seleccin del WHERE
NSS Npila 1 Juan 2 Pedro 3 Mara 4 Antonio Empleado Ap1 Ap2 Prez Prez Lpez Blas Prez Pi Botn Castro NumDept ... D01 ... ... D01 ... ... D02 ... ... D02 ... NumDept D01 D01 D02 D02 D01 D01 D01 D01 D01 NumDept=D01 Verdadero Verdadero Falso Falso Fila seleccionada

Una vez seleccionadas las filas, se procede de la forma acostumbrada:


Empleado NSS Npila Ap1 Ap2 NumDept 1 Juan Prez Prez ... D01 ... 2 Pedro Lpez Blas ... D01 ... NSS Ap1 + + Ap2 + , + NPila 1 Prez Prez, Juan 2 Lpez Blas, Pedro

Autor: Juan Ramn Lpez Rodrguez

13

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Otro ejemplo podra ser este: Nombres de todos los empleados de la empresa que hayan nacido antes que Pedro . La consulta que nos permite obtener esa informacin es esta:
Select NPila FROM Empleado WHERE Fnac<23/12/50

Y se evaluar de la siguiente forma:


NSS Npila 1 Juan 2 Pedro 3 Mara 4 Antonio Empleado Ap1 Ap2 Prez Prez Lpez Blas Prez Pi Botn Castro NumDept ... D01 ... ... D01 ... ... D02 ... ... D02 ... Fnac 02/06/64 23/12/50 12/03/75 13/01/65 23/12/50 23/12/50 23/12/50 23/12/50 23/12/50 Fnac < 23/12/50 Falso Falso Falso Falso Fila seleccionada

Como se puede apreciar, ninguna fila de la tabla satisface la condicin, por lo que el resultado de la consulta ser una tabla vaca: Pedro es el empleado ms viejo de la empresa!
NPila

Valores nulos: el predicado IS NULL Los valores nulos tambin afectan a la evaluacin de las condiciones de seleccin. La evaluacin de cualquier condicin de seleccin en la que intervenga una expresin con evaluacin desconocida, ser tambin desconocida.
-

2 > Nulo ? Desconocido Casa <> Nulo ? Desconocido NSS = 5 ? Desconocido (si NSS se evala a Nulo)

Siempre que no sea posible determinar si una condicin se verifica para una determinada fila, adoptaremos una postura conservadora: al ser desconocido el resultado de la comparacin, descartaremos la fila al calcular el resultado de la condicin, por si en un momento dado, y con ms informacin, llegsemos a determinar que la condicin no se cumple. Ejemplo: Recuperar el NSS de todos los empleados de la empresa que cuentan con un supervisor.

La consulta que nos permite obtener esta informacin es la siguiente:


Select NSS FROM Empleado WHERE NSSSupervisor > 0

y se evala de la siguiente forma:


Autor: Juan Ramn Lpez Rodrguez 14

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

NSS 1 2 3 4

Npila Juan Pedro Mara Antonio

Empleado Ap1 Ap2 NSSSupervisor Prez Prez Lpez Blas Prez Pi Botn Castro ... ... ... ... ... ... ... ...

NSS NSSSupervisor 1 2 3 4 (Nulo) 1 (Nulo) 3

1 3

NSSSupervisor >0? Desconocido Verdadero Desconocido Verdadero

Fila seleccionada

Como se puede apreciar, dos filas correspondientes a dos empleados de la empresa presentan un valor nulo en la columna NSSSupervisor. En esos dos casos, la condicin NSSSupervisor > 0 ? no puede ser evaluada, y las dos filas se descartan. Es decir, estamos descartando las filas correspondientes a empleados sin supervisor; que es precisamente lo que pretendamos hacer. La consulta se termina de evaluar de la siguiente forma:
NSS Npila 2 Pedro 4 Antonio Empleado Ap1 Ap2 Lpez Blas ... Botn Castro ... NSSSupervisor 1 3 ... ... NSS 2 4 NSS 2 4

El siguiente ejemplo resulta ms complicado de resolver: Ejemplo: Recuperar el NSS de todos los empleados de la empresa que no tienen supervisor. Se trata de seleccionar aquellas filas (empleados) con valor nulo en la columna NSSSupervisor. El problema es el siguiente: cualquier comparacin con un valor nulo har que una fila sea descartada, precisamente lo contrario de lo que deseamos en este caso. Por ejemplo, es fcil ver cmo la siguiente consulta...
Select NSS FROM Empleado WHERE NSSSupervisor = NULL

devolvera como resultado una tabla vaca, por la propia semntica definida para la clusula WHERE: el operador de comparacin = se evala a nulo si hay un nulo de por medio, y en este caso todas las filas de la tabla original seran descartadas (en todas las comparaciones intervendr el valor NULL). Para resolver este contratiempo, SQL permite una alternativa en forma de predicado lgico2: IS NULL. Este predicado (asociado a un nombre de columna) nos permitir saber si el valor de dicha columna para una fila es nulo o no. Si el valor de la columna es nulo, IS NULL se evaluar como Verdadero Si el valor de la columna no es nulo, IS NULL se evaluar como Falso

Utilizando IS NULL en nuestro ejemplo, la consulta se resuelve as:


2

Podemos entender un predicado como una funcin que devuelve como resultado un valor lgico de Verdadero o Falso

Autor: Juan Ramn Lpez Rodrguez

15

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Select NSS FROM Empleado WHERE NSSSupervisor IS NULL

Y se evala de esta manera:


NSS 1 2 3 4 Npila Juan Pedro Mara Antonio Empleado Ap1 Ap2 NSSSupervisor Prez Prez Lpez Blas Prez Pi Botn Castro ... ... ... ... ... ... ... ... NSS NSSSupervisor 1 2 3 4 (Nulo) 1 (Nulo) 3 NSSSupervisor IS NULL ? Verdadero Falso Verdadero Falso Fila seleccionada

1 3

...siendo este el resultado final:


Empleado NSS Npila Ap1 Ap2 NSSSupervisor 1 Juan Prez Prez ... ... 3 Mara Prez Pi ... ... NSS 1 3

El predicado IS NULL presenta adems una forma negada, que nos permite resolver de forma ms elegante la consulta original (la lista de empleados con jefe):
Select NSS FROM Empleado WHERE NSSSupervisor IS NOT NULL

Esta consulta se evala de esta manera:


NSS 1 2 3 4 Npila Juan Pedro Mara Antonio Empleado Ap1 Ap2 NSSSupervisor Prez Prez Lpez Blas Prez Pi Botn Castro ... ... ... ... ... ... ... ... NSS NSSSupervisor NSSSupervisor IS Fila NOT NULL ? seleccionada 1 (Nulo) Falso 2 1 Verdadero 3 (Nulo) Falso 4 3 Verdadero

1 3

...siendo ahora este el resultado final:


Empleado NSS Npila Ap1 Ap2 NSSSupervisor 2 Pedro Lpez Blas ... 1 ... 4 Antonio Botn Castro ... 3 ... NSS 2 4

...ya que el predicado IS NOT NULL, asociado a un nombre de columna, presenta la siguiente evaluacin: Si el valor de la columna es nulo, IS NOT NULL se evaluar como Falso Si el valor de la columna no es nulo, IS NOT NULL se evaluar como Verdadero

Condiciones compuestas

Autor: Juan Ramn Lpez Rodrguez

16

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

La clusula WHERE permite especificar condiciones ms complejas de consulta, por medio de las conectivas lgicas: AND , OR y NOT. Las conectivas lgicas permiten combinar dos o mas condiciones (simples o compuestas), de la siguiente forma:
condicin1 Verdadero Verdadero Falso Verdadero Falso Desconocido condicin1 Verdadero Falso Desconocido condicin2 Verdadero Falso Falso Desconocido Desconocido Desconocido NOT (condicin1) Falso Verdadero Desconocido condicion1 AND condicin2 Verdadero Falso Falso Desconocido Falso Desconocido condicion1 OR condicin2 Verdadero Verdadero Falso Verdadero Desconocido Desconocido

La mejor forma de entender la forma de especificar una condicin de seleccin compuesta es con un ejemplo. Supongamos que pretendemos realizar la siguiente consulta: Ejemplo: Recuperar los NSS de todos aquellos empleados del departamento de Ventas que tienen jefe. En esta consulta tenemos que seleccionar a los empleados a mostrar de acuerdo con dos condiciones: Por un lado, los empleados deben pertenecer al departamento de Ventas (D01) Por otro lado, los empleados deben tener un supervisor (un jefe)

Se trata claramente de una condicin compuesta. La consulta que proporciona esta informacin es esta:
Select NSS FROM Empleado WHERE NumDept=D01 AND NSSSupervisor IS NOT NULL

Como se puede apreciar, se piden dos condiciones que deben cumplirse a la vez (de ah que usemos la conectiva AND). La consulta se evala como sigue:

Empleado NSS NumDept NSSSupervisor 1 2 3 4 ... ... ... ... D01 D01 D02 D02 Condicin2: Condicin1 Condicin1: Fila NSSSupervisor AND NumDept=D01? Seleccionada IS NOT NULL? Condicin2? Verdadero Falso Falso Verdadero Verdadero Verdadero Falso Falso Falso Falso Verdadero Falso

1 3

Como se ve, solo hay un empleado que cumpla las dos condiciones. El resultado de la consulta sera este:

Autor: Juan Ramn Lpez Rodrguez

17

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

NSS NumDept NSSSupervisor 2 ... D01 1

NSS 2

Supongamos ahora que la informacin solicitada es la siguiente: Ejemplo: Recuperar los NSS de todos aquellos empleados de la empresa que o bien pertenezcan al departamento de Ventas o bien tengan jefe. En este caso, las condiciones indicadas varan ligeramente: ya no se trata de dos condiciones que deban cumplirse juntas; ahora nos interesan los empleados que cumplan una cualquiera de ellas. Por lo tanto, la conectiva a utilizar es, en este caso, OR:
Select NSS FROM Empleado WHERE NumDept=D01 OR NSSSupervisor IS NOT NULL

Esta nueva consulta se evala como sigue:


Empleado NSS NumDept NSSSupervisor 1 2 3 4 ... ... ... ... D01 D01 D02 D02 Condicin2: Condicin1 Condicin1: Fila NSSSupervisor OR NumDept=D01? Seleccionada IS NOT NULL? Condicin2? Verdadero Falso Verdadero Verdadero Verdadero Verdadero Falso Falso Falso Falso Verdadero Verdadero

1 3

Como se ve, solo hay un empleado que no cumple ninguna de las dos condiciones, y que por lo tanto debe ser descartado. El resultado de la consulta sera este:
NSS 1 2 4 NumDept NSSSupervisor ... D01 ... D01 1 ... D02 3 NSS 1 2 4

Otro ejemplo podra ser este: Seleccionar a aquellos empleados que no trabajen en el departamento de Ventas.

Se trata de una consulta ideal para el uso de NOT, ya que debemos establecer como condicin que algo no se cumpla.
Select distinct NSS FROM Empleado WHERE NOT(NumDept=D01) Empleado NSS NumDept 1 ... D01 Condicin1: Not (Condicin1): Fila NumDept=D01? NOT (NumDept=D01)? Seleccionada Verdadero Falso

Autor: Juan Ramn Lpez Rodrguez

18

Grao en Informacin e Documentacin: Bases de datos documentais


2 3 4 ... ... ... D01 D02 D02 Verdadero Falso Falso Falso Verdadero Verdadero

Curso 2013 2014

Como se puede ver, seleccionamos exclusivamente a aquellos empleados que no pertenecen a Ventas.
Empleado NSS NumDept 3 ... D02 4 ... D02 NSS 3 4

Analizaremos un ltimo ejemplo, algo ms complejo de lo que podra parecer en un principio: Seleccionar a los empleados cuyo jefe no es Juan. Aparentemente, esta consulta se resuelve fcilmente utilizando de nuevo el predicado NOT:
Select NSS FROM Empleado WHERE NOT(NSSSupervisor=1)

Es decir, seleccionamos a aquellos empleados cuyo jefe no tenga 1 por valor de NSS (que es el de Juan).
Empleado NSS NSSSupervisor 1 2 3 4 ... ... ... ... NOT(Condicin1): Condicin1: Fila NOT ( NSSSupervisor NSSSupervisor=1? Seleccionada =1 ? Desconocido Desconocido Verdadero Falso Desconocido Desconocido Falso Verdadero

1 3

Como se puede apreciar, estamos descartando las filas correspondientes a dos empleados (Juan y Mara) que no tienen a Juan como jefe! 3; y que por lo tanto deberan aparecer en el resultado de la consulta. La culpa de que no aparezcan es de los valores nulos. Efectivamente, ni Juan ni Mara tienen jefe, por lo que NSSSupervisor toma para ambos el valor Nulo. Al comparar NSSSupervisor con 1 (el NSS de Juan), el resultado es desconocido, por lo que ambas filas resultan descartadas. Se impone por lo tanto una modificacin de la consulta, para tratar convenientemente todos aquellos casos en los que NSSSupervisor sea Nulo. La forma de hacerlo es esta:
Select NSS FROM Empleado WHERE NOT(NSSSupervisor=1) OR NSSSupervisor IS NULL

De hecho, ninguno de los dos tiene jefe.

Autor: Juan Ramn Lpez Rodrguez

19

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Es decir, sern incluidos en el resultado todos aquellos empleados que no tengan jefe (NSSSupervisor IS NULL) o bien, si tienen jefe, su NSS no sea 1 (el de Juan)
Empleado NSS NSSSupervisor 1 2 3 4 ... ... ... ... Condicin1: NOT(Condicin1): Condicin2: NOT(Condicin1) Fila NSSSupervisor NOT (NSSSupervisor NSSSupervisor OR Condicin 2? seleccionada =1? =1) ? IS NULL? Desconocido Desconocido Verdadero Verdadero Verdadero Falso Falso Falso Desconocido Desconocido Verdadero Verdadero Falso Verdadero Falso Verdadero

1 3

Ahora s hemos conseguido descartar solamente a Pedro, que es el nico empleado que tiene a Juan por jefe.
Empleado NSS 1 ... 3 ... 4 ... NSSSupervisor NSS 1 3 4

Como hemos podido comprobar en este ejemplo, la presencia de valores nulos complica siempre la realizacin de consultas. Se trata de uno de los motivos por los que como ya ha sido sealado en alguna ocasin el diseo de las tablas de una BD debe ser analizado detenidamente para evitar en lo posible la necesidad del uso de valores nulos.

Consultas sobre varias tablas


Hasta ahora, todos los ejemplos que hemos visto se referan a consultas que permitan recuperar la informacin contenida en una nica tabla. Sin embargo, en muchas ocasiones va a ser necesario combinar los datos almacenados en varias tablas para poder obtener la informacin que se necesite. Supongamos por ejemplo esta peticin de informacin: Obtener los nombres de todos los empleados de la empresa, junto con el nombre de los departamentos en los que trabajan. La principal dificultad de escribir una consulta que obtenga esta informacin radica precisamente en que la informacin est distribuida en dos tablas: El nombre de los empleados se encuentra en la tabla Empleado El nombre de los departamentos se encuentra en la tabla Departamento

Sin embargo, ambas tablas incluyen una columna comn: NumDept. Esta columna, en la tabla Empleado, nos permite representar/averiguar el nmero del departamento correspondiente a cada empleado. A partir de ese nmero, podemos localizar la fila correspondiente en la tabla Departamento y averiguar los datos del mismo. Para resolver el problema, SQL nos permite especificar dos o ms tablas (separadas por comas) en la clusula FROM; es decir, podemos especificar que queremos extraer la informacin desde dos o ms tablas de la BD. Sin embargo, la evaluacin de la consulta va a diferir ligeramente con respecto al mecanismo que habamos visto hasta ahora. Dicho mecanismo de evaluacin constaba de los siguientes pasos:

Autor: Juan Ramn Lpez Rodrguez

20

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

1. Determinar la tabla de origen, indicada en la clusula FROM 2. Seleccionar aquellas filas que cumplen la condicin o condiciones especificadas en la clusula WHERE 3. Ordenar las filas de la tabla original de acuerdo con lo especificado en la clusula ORDER BY 4. A partir de cada fila de la tabla original, generar una fila en la tabla resultante, a partir de la evaluacin de las expresiones indicadas en la clusula SELECT El mecanismo a seguir en el caso de consultas definidas sobre varias tablas va a ser ahora: 1. Determinar las tablas de origen, indicadas en la clusula FROM 2. Combinar las tablas originales, de forma que se genere una tabla nica sobre la que trabajar. 3. Seleccionar aquellas filas de la tabla original que cumplen la condicin o condiciones especificadas en la clusula WHERE 4. Ordenar las filas de la tabla original de acuerdo con lo especificado en la clusula ORDER BY 5. A partir de cada fila de la tabla original, generar una fila en la tabla resultante, a partir de la evaluacin de las expresiones indicadas en la clusula SELECT Como se puede apreciar, los cambios (sealados en negrita) son mnimos: La esencia del cambio radica en que vamos a obtener, de las tablas originales, una nueva tabla, nica, sobre la que trabajar. Una vez obtenida esa tabla, podremos continuar procediendo como habamos visto hasta ahora: evaluando las clusulas WHERE, ORDER BY y SELECT sobre una nica tabla. Evidentemente, la clave del correcto funcionamiento de la consulta est en la forma en la que se realizar la combinacin de las (dos o mas) tablas originales. La idea es combinar las filas de una tabla con las filas que tenga asociadas en el resto de tablas. En el caso de nuestro ejemplo, deberamos intentar combinar cada fila correspondiente a un empleado con la fila correspondiente a su departamento. De esta forma, en la tabla combinada seguiramos contando con una fila por cada empleado, que incluira adems toda la informacin relativa a su departamento.

Autor: Juan Ramn Lpez Rodrguez

21

Grao en Informacin e Documentacin: Bases de datos documentais


Empleado ... NumDept NSSSupervisor ... D01 ... D01 1 ... D02 ... D02 3

Curso 2013 2014

NSS 1 2 3 4

Departamento NumDept NomDept NSS FechaIniGerente D01 Ventas 1 01/01/2000 D02 Produccion 3 01/01/2004

NSS 1 2 3 4

Tabla Combinada ... NumDept NSSSupervisor NumDept NomDept NSS FechaIniGerente ... D01 D01 Ventas 1 01/01/2000 ... D01 1 D01 Ventas 1 01/01/2000 ... D02 D02 Produccion 2 01/01/2004 ... D02 3 D02 Produccion 2 01/01/2004

Como se puede apreciar, sera sencillo definir una consulta sobre la tabla combinada para recuperar la informacin que se solicita en el ejemplo. Esa tabla combinada se obtiene, en SQL, en dos pasos: 1. En primer lugar, se realiza el producto cartesiano de los conjuntos de filas de todas las tablas. Es decir, se establecen todas las combinaciones posibles de cada fila de una tabla con las filas de todas las dems tablas, tengan o no sentido! En el caso de la consulta de nuestro ejemplo, sabemos ya que la clusula FROM contendr dos tablas: Empleado y Departamento.
SELECT FROM Empleado, Departamento WHERE

Esas dos tablas sern combinadas, dando lugar a una tabla nica: cada fila de la tabla Empleado ser combinada con todas y cada una de las filas de la tabla Departamento, dando lugar a una nueva fila en la tabla combinada. Es decir, si en la tabla Empleado tenemos 4 filas, y en la tabla Departamento tenemos 2 filas, la tabla combinada tendr un total de 4 x 2 = 8 filas.
Tabla Combinada: Paso 1 Origen: Tabla Empleado Origen: Tabla Departamento ... NumDept NSSSupervisor NumDept NomDept NSS FechaIniGerente ... D01 D01 Ventas 1 01/01/2000 ... D01 D02 Produccion 2 01/01/2004 ... D01 1 D01 Ventas 1 01/01/2000 ... D01 1 D02 Produccion 2 01/01/2004 ... D02 D01 Ventas 1 01/01/2000 ... D02 D02 Produccion 2 01/01/2004 ... D02 3 D01 Ventas 1 01/01/2000 ... D02 3 D02 Produccion 2 01/01/2004

NSS 1 1 2 2 3 3 4 4

Como se ve en la figura, en la tabla resultante del primer paso han sido incluidas las siguientes combinaciones: La fila del empleado 1 (Juan) ha sido combinada con las filas de los departamentos D01 y D02

Autor: Juan Ramn Lpez Rodrguez

22

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

La fila del empleado 2 ( Pedro) ha sido combinada con las filas de los departamentos D01 y D02 La fila del empleado 3 (Mara) ha sido combinada con las filas de los departamentos D01 y D02 La fila del empleado 4 (Antonio) ha sido combinada con las filas de los departamentos D01 y D02

...resultando un total de 8 filas, tal y como habamos calculado 2. No todas la combinaciones realizadas tienen inters para nosotros. Atendiendo a la consulta que queremos realizar, slo son relevantes aquellas en las que los datos de un empleado han sido combinados con los datos del departamento en el que trabaja. El segundo paso consiste en seleccionar aquellas combinaciones de inters, por medio del establecimiento de una o ms condiciones de reunin: las condiciones que hacen vlida una combinacin de filas de diferentes tablas. Cmo se especifican las condiciones de reunin? Aprovechando un mecanismo ya conocido: la clusula WHERE. Ampliaremos las condiciones de esta clusula incluyendo aquellas que convierten en vlidas a las filas de la tabla combinada. En el caso de nuestro ejemplo, para nosotros sern vlidas aquellas combinaciones de filas de empleado y departamento para las que el valor de NumDepto coincida. Esa ser pues, la condicin de reunin a establecer en la clusula WHERE.
SELECT FROM Empleado, Departamento WHERE NumDept = NumDept

Un problema de combinar varias tablas es que la tabla combinada puede acabar incluyendo varias columnas con el mismo nombre. Nuestro ejemplo no poda ser menos y existen varias columnas en esa situacin en la tabla combinada: NSS, procedente de la tabla Empleado (representa el NSS de cada empleado) y NSS, procedente de la tabla Departamento (que representa el NSS del director del departamento); NumDept, procedente de la tabla Empleado (que representa el nmero de departamento de cada empleado de la empresa), y NumDept, procedente de la tabla Departamento (que representa en nmero de cada departamento de la empresa). Cmo distinguirlas cuando nos refiramos a ellas? (por ejemplo, en la condicin de reunin NumDept = NumDept) Para solucionar esta aparente ambigedad, lo que haremos ser utilizar prefijos para designar a las columnas: cada nombre de columna, cuando la referenciemos, ir precedida del nombre de la tabla de la que provenga, separando ambos nombres por un punto (.) As, la consulta de reunin de nuestro ejemplo pasa a ser...
SELECT FROM Empleado, Departamento WHERE Empleado.NumDept = Departamento.NumDept

y de este modo resolvemos cualquier posible ambigedad en cuanto a las columnas a las que nos referimos en la condicin. Podemos as seleccionar las filas que son coherentes:
Autor: Juan Ramn Lpez Rodrguez 23

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Tabla Combinada: Paso 2 Origen: Tabla Empleado Origen: Tabla Departamento NSS ... NumDept NumDept NomDept 1 ... D01 D01 Ventas ... 1 ... D01 D02 Produccion ... 2 ... D01 D01 Ventas ... 2 ... D01 D02 Produccion ... 3 ... D02 D01 Ventas ... 3 ... D02 D02 Produccion ... 4 ... D02 D01 Ventas ... 4 ... D02 D02 Produccion ... Empleado.NumDept = Departamento.NumDept Verdadero Falso Verdadero Falso Falso Verdadero Falso Verdadero Fila seleccionada

Resultando la tabla combinada final:


Tabla Combinada despus del paso 2 Origen: Tabla Empleado NSS NPila ... NumDept 1 Juan ... D01 2 Pedro ... D01 3 Mara ... D02 4 Antonio ... D02 Origen: Tabla Departamento ... NumDept NomDept ... D01 Ventas ... ... D01 Ventas ... ... D02 Produccion ... ... D02 Produccion ...

Una vez obtenida la tabla combinada definitiva, es posible ya comprobar el resto de condiciones especificadas en la clusula WHERE, evaluar las expresiones de la clusula SELECT y calcular el resultado final
SELECT Npila, NomDept FROM Empleado, Departamento WHERE Empleado.NumDept = Departamento.NumDept Tabla Combinada despus del paso 2 ... NumDept ... NumDept NomDept ... D01 ... D01 Ventas ... D01 ... D01 Ventas ... D02 ... D02 Produccion ... D02 ... D02 Produccion Resultado consulta NPila NomDept Juan Ventas Pedro Ventas Mara Produccion Antonio Produccion

NSS NPila 1 Juan 2 Pedro 3 Mara 4 Antonio

... ... ... ...

Es necesario observar que, de pretender incluir en el resultado el nmero del departamento, deberamos especificar de cul de las dos columnas con el mismo nombre de la tabla combinada pretenderamos extraerlo. Las posibilidades seran dos: la columna procedente de Empleado, o la columna procedente de Departamento. Cualquiera de las dos opciones sera vlida
SELECT Npila, Empleado.NumDept, NomDept FROM Empleado, Departamento WHERE Empleado.NumDept = Departamento.NumDept SELECT Npila, Departamento.NumDept, NomDept FROM Empleado, Departamento WHERE Empleado.NumDept = Departamento.NumDept

Consultas que involucran varias veces a la misma tabla.

Autor: Juan Ramn Lpez Rodrguez

24

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Qu sucede cuando tenemos una clave fornea que referencia a una clave primaria de la misma tabla? Que las cosas se complican! Volvamos a nuestro ejemplo: la tabla Empleado contiene una clave fornea de ese tipo: NSSSupervisor. Esta columna permite almacenar, para cada empleado, el NSS de su jefe, que a su vez es un empleado y debe estar registrado en la tabla. Sin embargo, no se incluye una columna para poder registrar el nombre del jefe da cada empleado entre el resto de sus datos. Supongamos ahora que nos hacen llegar la siguiente peticin: Para todos aquellos empleados de la empresa que tengan jefe, se necesita la lista de sus nombres y los nombres de sus jefes inmediatos. Es fcil pensar cmo obtener manualmente la informacin: Se recuperan los datos de todos los empleados con jefe de la empresa: todas las filas de la tabla Empleado con NSSSupervisor no nulo. De cada fila, nos quedamos con el nombre del empleado ( NPila) y el NSS de su supervisor (NSSSupervisor). Utilizamos el NSS del supervisor, y localizamos la fila que le corresponde en la tabla (de nuevo) Empleado. Recuperamos de la fila el nombre del supervisor ( NPila)

Como se puede ver, estamos dando dos usos a la tabla Empleado; o, dicho de otra manera, estamos contemplando la tabla desde dos puntos de vista: 1. Tabla que mantiene informacin sobre los empleados de la empresa. 2. Tabla que mantiene informacin sobre los jefes de la empresa. O lo que es lo mismo: estamos combinando una tabla consigo misma! Este hecho sugiere una posible va para la elaboracin de una consulta SQL que permita obtener la informacin deseada: incluir dos veces la misma tabla ( Empleado) en la clusula FROM; y combinar las dos tablas de forma que cada fila de un empleado se una a la fila correspondiente a su jefe. De ese modo, la tabla resultante tendr una fila por cada empleado de la empresa, e incluir en cada una de ellas el nombre del empleado, y el nombre de su jefe: precisamente, la informacin que necesitamos. La consulta a realizar sera esta:
SELECT Emp.Npila, Jefe.NPila FROM Empleado Emp, Empleado Jefe WHERE Emp.NSSSupervisor = Jefe.NSS

Para poder entender la consulta, debemos aclarar una serie de cuestiones: Incluir dos veces a Empleado la misma tabla en la clusula FROM nos da la ilusin de contar con dos copias exactamente iguales de la tabla: una con informacin sobre empleados y otra con informacin sobre jefes. Para poder diferenciar cada una de las copias, utilizaremos sendos alias de la tabla: nombres (apodos) que le daremos a la tabla original cada vez que la

Autor: Juan Ramn Lpez Rodrguez

25

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

incluyamos en la clusula FROM, y que utilizaremos en todo el resto de la consulta para referirnos a cada una de las copias resultantes. En el ejemplo, usamos el alias Emp para referirnos a la tabla Empleado en su papel de contenedora de informacin sobre los empleados; y el alias Jefe para referirnos a Empleado en su papel de contenedora de informacin sobre los jefes - supervisores - de empleados. Cada vez que debamos referirnos a una columna de alguna de las copias, usaremos el alias como prefijo para indicar de cul de ellas. Si queremos acceder a un dato sobre un empleado, usamos la copia Emp; y si queremos referirnos a un dato sobre un jefe, usamos la copia Jefe. Para combinar los datos de cada empleado con los datos de su jefe, establecemos la condicin de reunin siguiente: una fila de la copia Emp y otra de la copia Jefe se unirn si la segunda representa al jefe del empleado representado por la primera: es decir, si el NSS de la segunda ( Jefe.NSS) es igual al NSS del jefe indicado por la primera ( Emp.NSSSupervisor).

Podemos verlo mejor acudiendo a los datos, y viendo cmo se combinan. Partimos de dos copias idnticas de la tabla Empleado: Emp y Jefe
NSS NPila 1 Juan 2 Pedro 3 Mara 4 Antonio Emp ... NSSSupervisor ... ... 1 ... ... 3 NSS NPila 1 Juan 2 Pedro 3 Mara 4 Antonio Jefe ... NSSSupervisor ... ... 1 ... ... 3

Al evaluar la consulta, combinamos las dos copias, resultando la tabla siguiente:


NSS 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 Origen: Emp Origen: Jefe NPila ... NSSSupervisor NSS NPila ... NSSSupervisor Juan ... 1 Juan ... Juan ... 2 Pedro ... 1 Juan ... 3 Mara ... Juan ... 4 Antonio ... 3 Pedro ... 1 1 Juan ... Pedro ... 1 2 Pedro ... 1 Pedro ... 1 3 Mara ... Pedro ... 1 4 Antonio ... 3 Mara ... 1 Juan ... Mara ... 2 Pedro ... 1 Mara ... 3 Mara ... Mara ... 4 Antonio ... 3 Antonio ... 3 1 Juan ... Antonio ... 3 2 Pedro ... 1 Antonio ... 3 3 Mara ... Antonio ... 3 4 Antonio ... 3

Y al evaluar la condicin de reunin, el resultado ser este otro:


Origen: Emp NSS 1 1 NPila Juan Juan ... NSSSupervisor NSS ... ... 1 2 Origen: Jefe NPila Juan Pedro ... NSSSupervisor ... ... 1 Emp.NSSSupervisor Fila = Jefe.NSS? Seleccionada Desconocido Desconocido

Autor: Juan Ramn Lpez Rodrguez

26

Grao en Informacin e Documentacin: Bases de datos documentais


1 1 2 2 2 2 3 3 3 3 4 4 4 4 Juan Juan Pedro Pedro Pedro Pedro Mara Mara Mara Mara Antonio Antonio Antonio Antonio ... ... ... ... ... ... ... ... ... ... ... ... ... ... 3 4 1 2 3 4 1 2 3 4 1 2 3 4 Mara Antonio Juan Pedro Mara Antonio Juan Pedro Mara Antonio Juan Pedro Mara Antonio ... ... ... ... ... ... ... ... ... ... ... ... ... ... Desconocido Desconocido Verdadero Falso Falso Falso Desconocido Desconocido Desconocido Desconocido Falso Falso Verdadero Falso

Curso 2013 2014

3 1 3 1 3 1 3

1 1 1 1

3 3 3 3

Nos quedamos, pues, con slo dos filas, sobre las que evaluamos las expresiones del SELECT:
Origen: Emp Origen: Jefe NSS NPila ... NSSSupervisor NSS NPila ... NSSSupervisor 2 Pedro ... 1 1 Juan ... 4 Antonio ... 3 3 Mara ... Emp.NPila Jefe.NPila Pedro Juan Antonio Mara

Y conseguimos as la informacin que necesitbamos, con una consulta de lo ms sencilla.

Vistas
Una vista, en SQL, es una consulta a la que se le asigna un nombre. De ese modo podemos utilizar una consulta como si fuese una tabla, e incluirla incluso en otras consultas. La utilidad principal de las vistas es proporcionar una manera de dar diferentes visiones de la BD a los diferentes usuarios de la misma. 4 Lo veremos con un ejemplo: comprobaremos como mediante una vista podemos ampliar la tabla Empleado permitiendo representar en ella un atributo derivado (la edad del empleado), calculada con una funcin especial de SQL (datediff) que permite calcular la diferencia en aos entre dos fechas dadas. 5 La consulta que nos permite aadir esa columna a la tabla Empleado es esta:
SELECT *, DateDiff("yyyy", FNac,Now()) AS Edad FROM Empleado

...con el siguiente resultado:


NSS NPila 1 Juan 2 Pedro 3 Mara 4 Antonio Ap1 Ap2 Sexo Direccin Prez Prez H R/ Vilar 2 Lpez Blas H R/ Fontes 12 Basco Pi M R/ Galicia 6 Botn Castro H Pza Galicia 1 FNac NumDept NSSSupervisor Edad 02/06/64 D01 40 23/12/50 D01 1 54 12/03/75 D02 29 13/01/65 D02 3 39

4 5

Recordar el nivel externo de la arquitectura de la informacin, ya visto anteriormente. Asumiremos que la funcin se comporta como debe, y no nos preocuparemos aqu de analizar su funcionamiento en detalle.

Autor: Juan Ramn Lpez Rodrguez

27

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Para convertir esta consulta en una vista, utilizamos la instruccin de SQL CREATE VIEW, que presenta la siguiente sintaxis: CREATE VIEW <Nombre vista> AS <Consulta Select> En el caso de nuestro ejemplo:
CREATE VIEW EmpleadoEdad AS SELECT *, DateDiff("yyyy", FNac,Now()) AS Edad FROM Empleado

Una vez definida la vista, ya podr ser utilizada en cualquier consulta:


SELECT * FROM EmpleadoEdad

NOTA: Access no soporta la definicin de vistas. En su lugar, todas las consultas creadas en Access se convierten implcitamente en una vista.

Autor: Juan Ramn Lpez Rodrguez

28

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Apndice: Mecanismo de evaluacin de las consultas SELECT


Se reproduce a continuacin, de forma separada para comodidad del lector/a, la secuencia de evaluacin de una sentencia SELECT:

1. Determinar las tablas de origen, indicadas en la clusula FROM 2. Combinar las tablas originales, de forma que se genere una tabla nica sobre la que trabajar. 3. Seleccionar aquellas filas de la tabla original que cumplen la condicin o condiciones especificadas en la clusula WHERE 4. Ordenar las filas de la tabla original de acuerdo con lo especificado en la clusula ORDER BY 5. A partir de cada fila de la tabla original, generar una fila en la tabla resultante, a partir de la evaluacin de las expresiones indicadas en la clusula SELECT

Autor: Juan Ramn Lpez Rodrguez

29

Grao en Informacin e Documentacin: Bases de datos documentais

Curso 2013 2014

Bibliografa
R. Elmasri y S. Navathe. Fundamentos de los Sistemas de Bases de Datos (3 edicin). Addison-Wesley, 2002. E. Rivero, L. Martnez, J. Benavides, L. Reina y J. Olaizola. Introduccin al SQL para Usuarios y Programadores. Thomson, 2002. A. Silberschatz, H. F. Korth y S. Sudarshan. Fundamentos de Bases de Datos (4 edicin). McGraw Hill, 2002

Autor: Juan Ramn Lpez Rodrguez

30

Вам также может понравиться