Vous êtes sur la page 1sur 30

Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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 1


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

-
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:

Nombre que
Tipo de datos SQL recibe en Access Operaciones soportadas Ejemplo
NUMBER (numDigitos) Nmerico +,-,*,/ 53
CHAR(numCaracteres) TEXTO (numCaracteres) + (concatenacin) Casa
DATETIME Fecha/Hora 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 2


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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:

Empleado
NSS NPila Ap1 Ap2 Sexo Direccin FNac NumDept NSSSupervisor
1 Juan Prez Prez H R/ Vilar 2 02/06/64 D01
2 Pedro Lpez Blas H R/ Fontes 12 23/12/50 D01 1
3 Mara Prez Pi M R/ Galicia 6 12/03/75 D02
4 Antonio Botn Castro H Pza Galicia 1 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 LocalidadDpt
1 V1 10 NumDept Loc
2 V1 35 D01 A Corua
3 P1 20 D02 A Corua
4 P1 5 D02 Ferrol
4 P2 30

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 3


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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> clusula select


FROM <lista de tablas> clusula from
WHERE <condiciones de seleccin> clusula where
ORDER BY <lista expresiones ordenacin> 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 Ap1 Ap2


1 Juan Prez Prez
2 Pedro Lpez Blas
3 Mara Prez Pi
4 Antonio 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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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 5


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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 Ap1 Ap2
1 Juan Prez Prez
2 Pedro Lpez Blas
3 Mara Prez Pi
4 Antonio 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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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 7


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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)

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

Autor: Juan Ramn Lpez Rodrguez 8


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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:

Empleado
NSS Npila Ap1 Ap2 NSSSupervisor NSS NSSSupervisor NSS NSSSupervisor
1 Juan Prez Prez ... ... 1 (Nulo) 1
2 Pedro Lpez Blas ... 1 ... 2 1 2 1
3 Mara Prez Pi ... ... 3 (Nulo) 3
4 Antonio Botn Castro ... 3 ... 4 3 4 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 Evaluacin de Loc:
D01 A Corua A Corua
D02 A Corua A Corua
D02 Ferrol 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 9


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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 SELECT distinct NumDept, Npila


FROM Empleado 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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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 + , + Npila


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 Ap1 Ap2 NPila
1 Juan Prez Prez ... Prez Prez Juan
2 Pedro Lpez Blas ... Lpez Blas Pedro
3 Mara Prez Pi ... Prez Pi Mara
4 Antonio Botn Castro ... Botn Castro Antonio

- Las filas se ordenan empleando la primera expresin (Ap1), de forma ascendente (la
opcin por defecto):

Empleado
NSS NPila Ap1 Ap2 Ap1 Ap2 NPila
4 Antonio Botn Castro ... Botn Castro Antonio
2 Pedro Lpez Blas ... Lpez Blas Pedro

Autor: Juan Ramn Lpez Rodrguez 11


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

3 Mara Prez Pi ... Prez Pi Mara


1 Juan Prez Prez ... Prez Prez Juan

- 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 Ap1 Ap2 NPila
4 Antonio Botn Castro ... Botn Castro Antonio
2 Pedro Lpez Blas ... Lpez Blas Pedro
1 Juan Prez Prez ... Prez Prez Juan
3 Mara Prez Pi ... 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 NSS Ap1+ + Ap2 + , + Npila
4 Antonio Botn Castro ... 4 Botn Castro, Antonio
2 Pedro Lpez Blas ... 2 Lpez Blas, Pedro
1 Juan Prez Prez ... 1 Prez Prez, Juan
3 Mara Prez Pi ... 3 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 Ap2 NumDept FNac NSS NumDept
1 Juan Prez Prez ... D01 02/06/64 1 D01
2 Pedro Lpez Blas ... D01 23/12/50 2 D01
3 Mara Prez Pi ... D02 12/03/75 3 D02
4 Antonio Botn Castro ... D02 13/01/65 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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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

Empleado
NSS Npila Ap1 Ap2 NumDept NumDept D01 NumDept=D01 Fila seleccionada
1 Juan Prez Prez ... D01 ... D01 D01 Verdadero
2 Pedro Lpez Blas ... D01 ... D01 D01 Verdadero
3 Mara Prez Pi ... D02 ... D02 D01 Falso
4 Antonio Botn Castro ... D02 ... D02 D01 Falso

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

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

Autor: Juan Ramn Lpez Rodrguez 13


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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:

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

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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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

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:

Empleado
NSS Npila Ap1 Ap2 NSSSupervisor NSS NSS
2 Pedro Lpez Blas ... 1 ... 2 2
4 Antonio Botn Castro ... 3 ... 4 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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

Select NSS
FROM Empleado
WHERE NSSSupervisor IS NULL
Y se evala de esta manera:

Empleado
NSS Npila Ap1 Ap2 NSSSupervisor NSS NSSSupervisor NSSSupervisor Fila
IS NULL ? seleccionada
1 Juan Prez Prez ... ... 1 (Nulo) Verdadero
2 Pedro Lpez Blas ... 1 ... 2 1 Falso
3 Mara Prez Pi ... ... 3 (Nulo) Verdadero
4 Antonio Botn Castro ... 3 ... 4 3 Falso
...siendo este el resultado final:
Empleado
NSS Npila Ap1 Ap2 NSSSupervisor NSS
1 Juan Prez Prez ... ... 1
3 Mara Prez Pi ... ... 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:

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

...siendo ahora este el resultado final:


Empleado
NSS Npila Ap1 Ap2 NSSSupervisor NSS
2 Pedro Lpez Blas ... 1 ... 2
4 Antonio Botn Castro ... 3 ... 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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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 condicin2 condicion1 AND condicin2 condicion1 OR condicin2


Verdadero Verdadero Verdadero Verdadero
Verdadero Falso Falso Verdadero
Falso Falso Falso Falso
Verdadero Desconocido Desconocido Verdadero
Falso Desconocido Falso Desconocido
Desconocido Desconocido Desconocido Desconocido

condicin1 NOT (condicin1)


Verdadero Falso
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
Condicin2: Condicin1
Condicin1: Fila
NSS NumDept NSSSupervisor NSSSupervisor AND
NumDept=D01? Seleccionada
IS NOT NULL? Condicin2?
1 ... D01 Verdadero Falso Falso
2 ... D01 1 Verdadero Verdadero Verdadero
3 ... D02 Falso Falso Falso
4 ... D02 3 Falso Verdadero Falso

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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

NSS NumDept NSSSupervisor NSS


2 ... D01 1 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
Condicin2: Condicin1
Condicin1: Fila
NSS NumDept NSSSupervisor NSSSupervisor OR
NumDept=D01? Seleccionada
IS NOT NULL? Condicin2?
1 ... D01 Verdadero Falso Verdadero
2 ... D01 1 Verdadero Verdadero Verdadero
3 ... D02 Falso Falso Falso
4 ... D02 3 Falso Verdadero Verdadero

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 NumDept NSSSupervisor NSS


1 ... D01 1
2 ... D01 1 2
4 ... D02 3 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
Condicin1: Not (Condicin1): Fila
NSS NumDept
NumDept=D01? NOT (NumDept=D01)? Seleccionada
1 ... D01 Verdadero Falso

Autor: Juan Ramn Lpez Rodrguez 18


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

2 ... D01 Verdadero Falso


3 ... D02 Falso Verdadero
4 ... D02 Falso Verdadero

Como se puede ver, seleccionamos exclusivamente a aquellos empleados que no


pertenecen a Ventas.

Empleado
NSS NumDept NSS
3 ... D02 3
4 ... D02 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
NOT(Condicin1):
Condicin1: Fila
NSS NSSSupervisor NOT ( NSSSupervisor
NSSSupervisor=1? Seleccionada
=1 ?
1 ... Desconocido Desconocido
2 ... 1 Verdadero Falso
3 ... Desconocido Desconocido
4 ... 3 Falso Verdadero

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

3
De hecho, ninguno de los dos tiene jefe.

Autor: Juan Ramn Lpez Rodrguez 19


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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
Condicin1: NOT(Condicin1): Condicin2:
NOT(Condicin1) Fila
NSS NSSSupervisor NSSSupervisor NOT (NSSSupervisor NSSSupervisor
OR Condicin 2? seleccionada
=1? =1) ? IS NULL?
1 ... Desconocido Desconocido Verdadero Verdadero
2 ... 1 Verdadero Falso Falso Falso
3 ... Desconocido Desconocido Verdadero Verdadero
4 ... 3 Falso Verdadero Falso Verdadero

Ahora s hemos conseguido descartar solamente a Pedro, que es el nico empleado que
tiene a Juan por jefe.
Empleado
NSS NSSSupervisor NSS
1 ... 1
3 ... 3
4 ... 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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

Empleado
NSS ... NumDept NSSSupervisor
1 ... D01 Departamento
2 ... D01 1 NumDept NomDept NSS FechaIniGerente
3 ... D02 D01 Ventas 1 01/01/2000
4 ... D02 3 D02 Produccion 3 01/01/2004


Tabla Combinada
NSS ... NumDept NSSSupervisor NumDept NomDept NSS FechaIniGerente
1 ... D01 D01 Ventas 1 01/01/2000
2 ... D01 1 D01 Ventas 1 01/01/2000
3 ... D02 D02 Produccion 2 01/01/2004
4 ... 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


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

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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

- 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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

Tabla Combinada: Paso 2

Origen: Tabla Empleado Origen: Tabla Departamento Empleado.NumDept = Fila seleccionada


NSS ... NumDept NumDept NomDept Departamento.NumDept
1 ... D01 D01 Ventas ... Verdadero
1 ... D01 D02 Produccion ... Falso
2 ... D01 D01 Ventas ... Verdadero
2 ... D01 D02 Produccion ... Falso
3 ... D02 D01 Ventas ... Falso
3 ... D02 D02 Produccion ... Verdadero
4 ... D02 D01 Ventas ... Falso
4 ... D02 D02 Produccion ... Verdadero

Resultando la tabla combinada final:

Tabla Combinada despus del paso 2

Origen: Tabla Empleado Origen: Tabla Departamento


NSS NPila ... NumDept ... NumDept NomDept
1 Juan ... D01 ... D01 Ventas ...
2 Pedro ... D01 ... D01 Ventas ...
3 Mara ... D02 ... D02 Produccion ...
4 Antonio ... D02 ... 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 Resultado consulta


NSS NPila ... NumDept ... NumDept NomDept NPila NomDept
1 Juan ... D01 ... D01 Ventas ... Juan Ventas
2 Pedro ... D01 ... D01 Ventas ... Pedro Ventas
3 Mara ... D02 ... D02 Produccion ... Mara Produccion
4 Antonio ... D02 ... D02 Produccion ... Antonio Produccion

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 SELECT Npila, Departamento.NumDept, NomDept


FROM Empleado, Departamento FROM Empleado, Departamento
WHERE Empleado.NumDept = Departamento.NumDept WHERE Empleado.NumDept = Departamento.NumDept

Consultas que involucran varias veces a la misma tabla.

Autor: Juan Ramn Lpez Rodrguez 24


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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

Emp Jefe
NSS NPila ... NSSSupervisor NSS NPila ... NSSSupervisor
1 Juan ... 1 Juan ...
2 Pedro ... 1 2 Pedro ... 1
3 Mara ... 3 Mara ...
4 Antonio ... 3 4 Antonio ... 3
Al evaluar la consulta, combinamos las dos copias, resultando la tabla siguiente:
Origen: Emp Origen: Jefe
NSS NPila ... NSSSupervisor NSS NPila ... NSSSupervisor
1 Juan ... 1 Juan ...
1 Juan ... 2 Pedro ... 1
1 Juan ... 3 Mara ...
1 Juan ... 4 Antonio ... 3
2 Pedro ... 1 1 Juan ...
2 Pedro ... 1 2 Pedro ... 1
2 Pedro ... 1 3 Mara ...
2 Pedro ... 1 4 Antonio ... 3
3 Mara ... 1 Juan ...
3 Mara ... 2 Pedro ... 1
3 Mara ... 3 Mara ...
3 Mara ... 4 Antonio ... 3
4 Antonio ... 3 1 Juan ...
4 Antonio ... 3 2 Pedro ... 1
4 Antonio ... 3 3 Mara ...
4 Antonio ... 3 4 Antonio ... 3

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

Origen: Emp Origen: Jefe


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

Autor: Juan Ramn Lpez Rodrguez 26


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

1 Juan ... 3 Mara ... Desconocido


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

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

4
Recordar el nivel externo de la arquitectura de la informacin, ya visto anteriormente.
5
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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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


Licenciatura en Documentacin: Bases de datos documentais Curso 2011 2012

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

Vous aimerez peut-être aussi