SQL - Sistemas Gestores de Bases de Datos

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 210

SISTEMAS

GESTORES DE
BASES DE DATOS

SQL

TEMA I

1.1.

INTRODUCCION

1.2.

LA INFORMACION Y SU ALMACENAMIENTO
1.2.1. Sistemas de informacin
1.2.2. Estructura bsica de almacenamiento: el archivo
1.2.3. Modos de acceso a los registros de un archivo
1.2.4. Organizaciones fsicas de archivos
1.2.5. Criterios de seleccin de organizaciones fsicas
1.2.6. Gestin de archivos en soportes

SQL

Pg.-3

Notas

Pg.-4

SQL

1.1

INTRODUCCION

Este manual pretende servir como manual para el mdulo profesional Sistemas
Gestores de Bases de Datos del ciclo formativo superior de Administracin de Sistemas
Informticos.
El posible lector puede ser un estudiante de Formacin Profesional, o un
interesado en iniciarse en bases de datos, con preferencia por el modelo relacional y el
lenguaje SQL.
En el manual se introduce la teora del modelo relacional, mediante un ejemplo
continuo, enlazar todos los captulos de cara a la realizacin de un proyecto final de
programacin.
Si bien hasta hace unos aos se han estado implantando sistemas informticos
con aplicaciones basadas en archivos dependientes del software y el hardware, la
tendencia actual persigue independizar la informacin de las aplicaciones y agrupar todos
los datos en una nica entidad llamada base de datos, de forma que distintos procesos,
en muchos casos de aplicaciones, e incluso, sistemas diferentes, utilicen y compartan la
misma informacin.

1.2.

LA INFORMACION Y SU ALMACENAMIENTO
1.2.1. Sistemas de informacin

Un sistema de informacin es un conjunto de actividades que administran la


informacin relevante en una entidad, generalmente, una empresa. Se encarga de la
distribucin de los datos segn unos determinados requerimientos, de la correcta
comparticin de la informacin entre sus usuarios y de su almacenamiento en soportes
adecuados basados en ordenadores y en los avances de las telecomunicaciones.
Los grandes volmenes de informacin manejados por un sistema se agrupan en
conjuntos ms pequeos para poder ser nombrados y representados en las aplicaciones
que los utilizan.
La unidad ms pequea que permite representar informacin es el bit, que
admite dos valores: 0 y 1. Un grupo de 8 bits forman el byte. Cada dato al que puede
hacerse referencia en un sistema de informacin se denomina campo y est formado por
un grupo de bytes. Los datos que forman parte de una entidad comn se agrupan en un
registro, que est formado por un conjunto de campos. El campo o grupo de campos que
identifican unvocamente a cada registro de un archivo se denomina campo clave. Todos
los registros del mismo tipo forman un archivo. El conjunto de archivos que representa
la informacin de un sistema forma una base de datos.

SQL

Pg.-5

1.2.2. Estructura bsica de almacenamiento: el archivo


Para almacenar la informacin, ofrecen una estructura de datos de alto nivel
llamada archivo que distribuye los datos en dispositivos externos de almacenamiento.
Normalmente los archivos de datos sern almacenados en registros de tipo
lgico. Estos registros lgicos no son ms que estructuras de datos formadas por uno o
ms elementos llamados campos que constituyen una unidad para un determinado
proceso.
Cuando se necesita utilizar un archivo en un programa, define el tipo de registro
que lo formar y, posteriormente, lo utiliza segn las operaciones que facilite sobre l el
lenguaje de programacin.
Nombre del archivo: CLIENTES
Nombre del registro: R-CLIEN
Campo clave: NIF
Formato del registro:
Campo
1
2
3
4

Nombre
NIF
APELLIDOS
NOMBRE
NACIMIENTO

Tipo de datos
Alfanumrico
Alfanumrico
Alfanumrico
Fecha

Longitud
10
20
15
8

..............................................................................................................
Las caractersticas ms importantes de los archivos son:

Residen en soportes externos (DD), por lo que su existencia no est


limitada al tiempo de ejecucin del programa que lo crea, sino que
permanece cuando ste termina.
Los datos pueden transportarse de un ordenador a otro.
Tienen capacidad de almacenamiento ilimitada ya que, aunque un
soporte tiene capacidad limitada, un archivo puede distribuirse en
varios soportes.

Los archivos pueden clasificarse atendiendo a la funcin que realizan, se


pueden dividir de la siguiente forma:
a) Permanentes. Sus registros varan poco en el tiempo. Tambin se conocen
con el nombre de archivos maestros.

Pg.-6

SQL

Constantes. Su informacin permanece prcticamente


invariada, utilizndose como archivos de consulta.
De situacin. Reflejan el estado o situacin actual de una
empresa o entidad. Estos archivos se actualizan
peridicamente para adaptarlos a una nueva situacin. Son los
menos permanentes.
Histricos. Se obtienen de los anteriores cuando stos dejan de
utilizarse, y sirven para hacer estudios futuros estadsticos o de
consulta.

b) De movimientos. En ellos se almacena temporalmente la informacin que se


utiliza para actualizar los archivos de situacin.
c) De maniobra. Son archivos temporales creados durante la ejecucin de un
programa y borrados habitualmente al terminar el mismo. Por ejemplo,
archivos intermedios utilizados en procesos de ordenacin.
Las operaciones que pueden realizarse sobre un archivo son:

Crear la estructura del archivo. CREATE, establece la estructura y


posicin del archivo en el dispositivo de almacenamiento.
Abrir un archivo creado para poder utilizarlo. Cuando el archivo ya
existe, debe abrirse para trabajar con l, bien sea para consultarlo o
para actualizarlo. OPEN.
Leer un registro de un archivo. Transfiere la informacin del registro
actual al rea de datos del programa que solicita la lectura. READ.
Escribir un registro en un archivo. Graba en el soporte de
almacenamiento el contenido de un registro con los datos
especificados en el rea de datos del programa. WRITE.
Cerrar un archivo cuando ya no va a utilizarse. Esta operacin es
obligatoria antes de concluir un programa. Si un archivo queda
abierto, se corre el riesgo de perder informacin. CLOSE actualiza
la situacin real del archivo y elimina de memoria la tabla mantenida
por el sistema para agilizar las operaciones de acceso al archivo.
Eliminar un archivo. Cuando un archivo deja de tener validez, es
conveniente borrarlo del dispositivo de almacenamiento para no
desperdiciar espacio. DELETE.
Renombrar un archivo. RENAME permite cambiar el nombre a un
archivo.
Copiar un archivo. Consiste en duplicar la informacin de un archivo
en otro.

SQL

Pg.-7

Editar un archivo. Permite modificar el contenido de un archivo. Se


utiliza, sobre todo, en archivos de texto.
Indexar un archivo. Es una operacin de alto nivel que permite dar a
un archivo organizacin indexada. El acceso a los registros del
archivo se har a travs de un archivo ndice que estar ordenado
por el campo que se index (clave).

1.2.3. Modos de acceso a los registros de un archivo


Independientemente de cmo estn organizados los datos en un archivo, para
los programas, es importante la forma en que puede accederse a los registros. Existen
bsicamente tres modos de acceso:

Acceso secuencial. Las operaciones de lectura o de escritura se hacen sobre


el registro fsicamente contiguo al ltimo que se utiliz. Este modo de
acceso es consecuencia de que los primeros dispositivos de almacenamiento
que eran soportes secuenciales (tarjetas perforadas, cintas perforadas y
cintas magnticas).
Acceso directo. Los registros pueden leerse y escribirse directamente en la
posicin fsica que ocupan en el archivo (tambores y discos magnticos).
Acceso por ndice. Consiste en crear un ndice ordenado con las claves del
archivo. Para acceder a los registros, se busca secuencialmente la clave en el
ndice, que lleva asociada la direccin real del registro en el archivo, el cual
se lee o escribe directamente.

1.2.4. Organizaciones fsicas de archivo


Existen cuatro tipos de organizacin fsica de una archivo, secuencial, relativa,
indexada e invertida.
1) Organizacin secuencial: Con este tipo de organizacin, los registros se
almacenan uno detrs de otro, sin dejar huecos y en el orden en que se van
grabando. El nico modo permitido de acceso a los registros es el
secuencial. Las ventajas de este mtodo radican en que no desaprovechan
espacio de almacenamiento y en la elevada eficiencia de recuperacin de
registros cuando el porcentaje de consultados es suficientemente grande.
Entre sus inconvenientes:

Pg.-8

Para acceder a un registro, hay que leer todos los que hay delante de
l, que de media son la mitad de los registros del archivo.

SQL

No se puede insertar un registro en medio de otros dos, ya que slo


est permitido aadir registros al final del archivo, lo que supone que
si el archivo est ordenado, hay que reordenarlo.
No se puede borrar un registro porque se generara un hueco.
Para actualizar un archivo es necesario un archivo de movimientos,
trasladar el maestro actualizado a uno nuevo y, posteriormente,
cambiar el nombre al nuevo por el del maestro.

En la actualidad se utilizan poco los archivos con organizacin secuencial.


nicamente se aconseja esta organizacin para archivos histricos y constantes. Un
ejemplo de archivo con organizacin secuencial puede ser el de abonados a una
compaa telefnica, en el que se almacenan los datos que aparecen anualmente en las
guas.
2) Organizacin relativa: Un archivo con organizacin relativa es un conjunto
de posiciones contiguas de memoria que tiene longitud fija. Cada posicin
se denomina cubo. El nmero de cubos que forman el archivo est
predeterminado inicialmente. Los cubos estn numerados de 1 a n ( de 0 a
n-1), siendo n el nmero de cubos del archivo. Cada cubo puede contener
uno o varios registros. Por tanto, el nmero total de registros que puede
contener el archivo es el nmero de cubos multiplicado por el nmero de
registros que caben en cada cubo.
Es posible acceder a los registros en los modos secuencial y directo. Para el
modo secuencial basta con utilizar una variable como contador de cubos e ir
accediendo a los cubos cuya direccin coincida con la variable. Si los cubos
tienen ms de un registro, el acceso a los registros del mismo cubo se hace
de forma secuencial.
Para acceder directamente, se debe conocer la direccin que ocupa el
registro en el archivo. Se denomina direccin lgica al nmero de cubo en
el que se encuentra un registro y direccin fsica a la que realmente ocupa el
registro en el soporte donde se almacena el archivo.
La direccin del cubo en el que se encuentra un registro se calcula por su
campo clave. El valor del campo clave se transforma en una de las
direcciones lgicas vlidas mediante un algoritmo de conversin. Esta
tcnica se denomina hashing. De esta forma, siempre que se desea acceder a
los datos de un registro, antes hay que convertir el valor de su campo clave,
aplicando el algoritmo correspondiente. Todos los algoritmos transforman el
valor de la clave en un valor numrico y en algunos, el nmero resultante no
est en el rango de direcciones posibles, por lo que hay que adaptarlo
multiplicndolo por un factor de ajuste.

SQL

Pg.-9

Existen multitud de algoritmos de conversin de claves como:

Direccionamiento directo. Se utiliza cuando las claves tienen rangos


de valores densos y cada valor tiene asociada una direccin en el
archivo; por ejemplo, un archivo de habitaciones de un hotel con clave
el nmero de habitacin.
Direccin real = valor clave buscada clave ms pequea + 1
Conversin binario-octal. Consiste asignar a cada dgito un valor
numrico que se corresponde con su orden alfabtico. A la A se le
asociara 1, a la B, 2, etc. Una variante consiste en asignar el valor
numrico ASCII correspondiente. Los valores de todos los dgitos que
forman la clave se suman y el resultado se transforma en nmero
octal. El nmero as obtenido se multiplica por el factor de ajuste.
De restas sucesivas. Se utiliza para claves numricas consecutivas que
contienen muchos huecos de valores conocidos previamente; por
ejemplo, el archivo de habitaciones de un hotel con un nmero fijo de
habitaciones por planta y con el dgito del nmero de planta
precediendo al nmero de habitacin. El mtodo consiste en restar a la
clave la suma de todos los huecos anteriores. As, en el caso de un
hotel con 10 plantas y 30 habitaciones por planta sera de la siguiente
forma:
Huecos:
Habitacin:
Huecos anteriores:
Direccin asociada:

Pg.-10

1 a 100, 131 a 200, 231 a 300,..., 931 a 999


411
100 + 3 plantas * 70 huecos/planta = 310
411-310 = 101

SQL

Direccionamiento por divisin: Se divide el valor del campo clave por


un nmero fijo, se toma el resto de la divisin entera como direccin
lgica del registro y se le suma 1 si se desea adaptarlo al rango de
direcciones 1,..., n. Para la eleccin del divisor existen varias
opciones, entre las que destacan:

Elegir el nmero de direcciones ms uno. No es el mejor,


porque si el nmero es divisible por nmeros pequeos,
generar demasiados sinnimos (se estudian ms adelante).

Elegir el nmero primo ms cercano al nmero de direcciones


fsicas para minimizar el nmero de sinnimos. Si se elige el
mayor de los primos menores que l, se corre el riesgo de dejar
muchos huecos (nmero de direcciones nmero primo). El
concepto de hueco se estudia ms adelante. Si se elige el
menor de los primos mayores, hay que multiplicar por un
factor de ajuste, y si el primo es bastante mayor que el nmero
de direcciones, tambin se generarn muchos huecos.

Una solucin intermedia consiste en encontrar un nmero


menor que el nmero de direcciones, pero que est muy
cercano, que sea primo o no tenga divisores menores de 10;
por ejemplo:
Nmero de direcciones:
Primo ms cercano:
Clave a transformar:
Resto de 5431 entre 997:
Direccin asociada:

1000
997
5431
446
446

Direccionamiento por el centro del cuadrado. Consiste en


eliminar del nmero obtenido al elevar la clave al cuadrado, las
cifras extremas, es decir, las de la derecha e izquierda y tomar
el mismo nmero de dgitos centrales como tenga el nmero de
direcciones posibles como un valor decimal comprendido entre
0 y 1. A continuacin, multiplicar este valor por el nmero de
direcciones disponibles y despreciar los decimales resultantes.

SQL

Pg.-11

Direccionamiento por plegamiento. En este mtodo, los


dgitos exteriores en ambos extremos se desplazan hacia
dentro de modo que se trasladan y queden dos nmeros del
orden de magnitud del nmero de direcciones. Se suman estos
dos nmeros y el resultado se multiplica por el factor de ajuste,
despreciando los decimales.
La principal ventaja de esta organizacin es la rapidez con que se
pueden recuperar de forma aleatoria. Gracias al acceso directo, se
puede actualizar un archivo sin utilizar otro de movimientos. Las
altas se realizan asignando al registro un cubo con algn registro
vaco. Las modificaciones se hacen directamente sobre el registro
elegido. Sus inconvenientes son los siguientes:
Hay que hacer una estimacin inicial del nmero de
registros que podr tener el archivo, corriendo el riesgo
de desperdiciar espacio o llenarlo pronto y, por
consiguiente, tener que trasladarlo a otro archivo de
mayor capacidad.
Se tiene que elegir un buen algoritmo de
transformacin de claves en direcciones.
Todos los algoritmos, excepto el de direccionamiento
directo, producen sinnimos. Dos registros son
sinnimos si, teniendo claves diferentes, el algoritmo
les asigna la misma direccin. En el ejemplo del
algoritmo de direccionamiento por divisin, a la clave
4434 tambin le correspondera la direccin 446. Este
problema puede solucionarse dando capacidad de ms
de un registro a cada cubo y guardando todos los
sinnimos de una direccin en su cubo (lo que implica,
seguramente, desaprovechamiento de espacio) o
creando un archivo adicional con organizacin
secuencial o relativa exclusivamente para los
sinnimos. El algoritmo que menos sinnimos genera
es el de divisin.
Todos los algoritmos, excepto el de direccionamiento
directo, producen huecos. Un hueco es un cubo que
nunca ser ocupado por ningn registro, ya que no
existe ningn valor en el rango del campo clave que, al
aplicar el algoritmo, genere la direccin de dicho cubo.
En el ejemplo de direccionamiento por divisin los
cubos 998, 999 y 1000 sern huecos.

Pg.-12

SQL

3) Organizacin indexada: La organizacin indexada nace para suplir las


deficiencias de la secuencial (no hay acceso directo a los registros) y de la
relativa (se accede directamente a los registros slo por un campo). En
muchos casos conviene recuperar la informacin accediendo por campos
que no son clave. Tambin puede ser necesario recuperar los registros en
una secuencia distinta a la que ocupan fsicamente.
Se denomina archivo ndice a un archivo que contiene dos campos: uno con
los valores del campo por el que se desea recuperar la informacin y otro
con la direccin fsica (puntero) que ocupa el registro en el archivo de
datos. El archivo ndice se mantiene ordenado por el campo de datos,
facilitando la bsqueda. Su funcin es anloga al ndice de un libro.

Un archivo de datos puede tener asociados tantos ndices como sea


necesario.
Puede utilizarse una combinacin de campos para formar el campo de
un ndice; por ejemplo, Apellidos + Nombre.
Al actualizar el archivo de datos se debe reorganizar todos sus ndices
para mantener la coherencia.
Los ndices pueden ser varios niveles. En los ndices de nivel mayor de
uno se busca el primer elemento mayor o igual que el deseado. Este
procedimiento facilita el acceso a los registros, sin embargo, complica
los algoritmos de mantenimiento del ndice.
Clave

Puntero

Direccin

Cdigo

Nombre

A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q

7
1
8
10
9
2
11
3
5
4
6
12
15
13
14
17
16

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

100
110
120
130
140
160
200
210
250
300
360
400
500
550
600
700
999

B
F
H
J
I
K
A
C
E
D
G
L
N
O
M
Q
P

4) Organizacin invertida: Los sistemas de gestin de bases de datos utilizan


accesos ms complejos que los utilizados en sistemas de archivos. Por ello,
establecen organizaciones de archivos de alto nivel basadas en las anteriores.
Una organizacin de alto nivel es la invertida. Para un archivo de datos se
crean dos ndices:

De nombre. Contiene las claves por las que se desea acceder. Se


almacenan en una columna los nombres de las claves de acceso y en la

SQL

Pg.-13

otra un puntero con la direccin de la clave en el ndice.


De valor. Contiene todos los valores distintos de los campos clave y
un puntero con un conjunto de valores del archivo de datos que
cumplen la condicin de la clave.

DATOS LECTORES
Direccin
Cdigo
1
2
3
4
5
6
7
8

111
222
333
444
555
666
777
888

Nombre

Sexo

Juan
Rosa
Pedro
Ral
Carlos
Sofa
Ana
Ivn

V
M
V
V
V
M
M
V

Tipo
Infantil
Investigador
Colaborador
Infantil
Nomal
Trabajador
Infantil
Colaborador

NDICE VALOR
Direccin Valor-clave Puntero
1
2
3
4
5
6
7

V
M
Colaborador
Infantil
Investigador
Normal
Trabajador

1,3,4,5,6
2,6,7
3,8
1,4,7
2
5
6

NDICE NOMBRE
Nombre-Clave Puntero
Sexo
Tipo

1
3

1.2.5. Criterios de seleccin de organizaciones fsicas


Para decidir el tipo de organizacin que tendr un archivo se deben considerar
las operaciones que se van a realizar con ms frecuencia sobre el mismo. Existen dos
conceptos que miden el grado de utilizacin de los registros de un archivo y que pueden
servir de punto de partida para decidir la organizacin que debe tener un archivo.

Indice de volatilidad. Es el porcentaje de registros que se aaden o


suprimen respecto al nmero medio total de registros del archivo en un
perodo de tiempo fijo. Un archivo es esttico cuando tiene un bajo
porcentaje de adiciones o supresiones y es voltil en caso contrario.
Indice de actividad. Es el porcentaje de registros utilizados para
modificacin o consulta respecto al nmero medio total de registros del
archivo en un perodo de tiempo fijo. Puede emplearse para decidir si la
organizacin de un archivo debe ser secuencial o relativa comparando los
tiempos empleados en acceder a los registros en ambos modos. Se utilizan
dos factores:
A = NRV /NRT

Pg.-14

SQL

B = LR / (TA * VLS)
Donde:
NRV = nmero medio de registros utilizados en tiempo fijo.
NRT = nmero medio total de registros del archivo.
LR = la longitud en bytes de registro.
TA = el tiempo medio de acceso directo a un registro en segundos.
VLS = velocidad de lectura secuencial en bytes por segundo.
Si A < B, deber utilizarse la organizacin relativa y, en caso contrario,
organizacin secuencial.
1.2.6. Gestin de archivos en soportes
La gestin de archivos es una de las tareas principales de los sistemas
operativos. El trabajo es distinto segn el tipo de soporte que se utilice. Existen dos tipos
de soporte:
a) Secuenciales. Los datos se graban a continuacin de otros, de tal forma que
el acceso a un dato se hace pasando sobre todos los datos que le preceden
en el soporte. El ejemplo clsico es la cinta magntica.
b) Direccionables. El espacio de almacenamiento se divide en espacios
parciales direccionables individualmente, pudiendo acceder a un dato por la
direccin en que est almacenado, sin que sea necesario pasar por los datos
almacenados en direcciones fsicas anteriores. Ejemplos pueden ser los
disquetes, los discos duros, los CD-ROM, etc.
Actualmente, la informacin se almacena en soportes direccionables, dejando
los secuenciales para realizar grandes copias de seguridad. Por ello, se explica cmo se
distribuyen los archivos en discos.
El disco se divide en unidades mnimas de E/S llamadas clusters o bloques. A
cada archivo se le asignan bloques segn su organizacin y el mtodo de asignacin de
bloques que utilice el sistema operativo. Existen tres formas tericas de asignar bloques:

La asignacin contigua de bloques requiere que todos los de un archivo


ocupen posiciones contiguas de disco para una eficiente utilizacin. Todos
los bloques de un archivo estn contiguos en el disco. El acceso secuencial
es relativamente sencillo, porque basta con ir leyendo bloques en la
secuencia en que estn en el disco. El acceso directo tampoco es
complicado; sabiendo la direccin del primer bloque del archivo, para
acceder al i basta con sumar i al bloque inicial. No obstante, este mtodo de
asignacin tiene el problema de la predeterminacin de los bloques que
ocupar un archivo. Tambin es posible que en el disco haya suficiente
nmero de bloques para almacenar el archivo, pero no ocupen posiciones
contiguas. Este problema se conoce con el nombre de fragmentacin
externa.

SQL

Pg.-15

La asignacin enlazada fragmenta el archivo en bloques que pueden estar


distribuidos aleatoriamente por el disco. Para saber la secuencia, el sistema
operativo guarda la direccin del primer bloque, y cada bloque almacena en
sus ltimos bytes la direccin del siguiente bloque en secuencia, o, dicho de
otro modo, los ltimos bytes son un puntero al siguiente bloque. La
direccin del ltimo bloque es un valor prefijado de antemano (nil). El
acceso secuencial es muy sencillo, pero el directo es imposible.

La asignacin indexada suple en gran medida los problemas de las


anteriores. Consiste en reunir todos los punteros en un bloque llamado
ndice. El bloque ndice es una tabla de entradas, donde la entrada i-sima
contiene la direccin del bloque i-simo del archivo. El acceso secuencial se
realiza recorriendo las entradas del bloque ndice y el acceso directo a un
bloque b se hace yendo directamente a la direccin que indica la entrada b
del bloque ndice. Tambin facilita el acceso por ndices.

Compactacin
Se conoce como compactacin la resolucin del problema de la fragmentacin
externa cuando el mtodo de bloques de disco es la contigua. Este proceso consiste en
reubicar todos los archivos, de forma que los bloques libres dispersos en el disco formen
un nico hueco.
La fragmentacin interna es un problema inherente a la distribucin del espacio
en bloques y radica en el espacio desaprovechado por los bytes libres que quedan en el
ltimo bloque de cada archivo.
Existen unos programas llamados compresores que, adems de utilizar tcnicas
que reducen el nmero de bytes que ocupa un archivo, unen un nmero indeterminado
de archivos en uno slo, reduciendo la fragmentacin interna a un bloque como mximo.
Por ejemplo, 100 archivos de 100 bytes de tamao distribuidos en bloques de 1.024
bytes desaprovecharan 92.400 bytes, mientras que comprimidos formaran un archivo de
10.000 bytes, que ocuparan 9 bloques completos, y el dcimo desaprovechara 784
bytes.

Pg.-16

SQL

CUESTIONES:
1. Explicar en qu consisten las fragmentaciones interna y externa.
2. Calcular la direccin que correspondera a la clave 5555 en un archivo con
organizacin relativa de 2.500 cubos utilizando los algoritmos de divisin,
plegamiento y centro del cuadrado.
3. Razonar si sera ms conveniente la organizacin secuencial o directa para un
archivo en el que mensualmente se utilizan 60.000 veces alguno de los 20.000
registros del archivo. Tener en cuenta que el registro ocupa 500 bytes, el tiempo
de acceso medio es de 10 milisegundos y la velocidad de lectura secuencial es de
16 Kbytes por segundo.
4. Completar la siguiente tabla marcando con una X las casillas en las que el
modo de acceso y la organizacin sean compatibles.
ACCESO
SECUENCIAL

ACCESO
DIRECTO

ACCESO
NDICE

POR

Organizacin
secuencial
Organizacin
relativa
Organizacin
indexada
5. Escribir un algoritmo en pseudocdigo que implemente la operacin de copia de
un archivo origen en otro destino utilizando operaciones bsicas.
6. Con el siguiente ejemplo de archivo de datos, dibujar cmo quedaran los ndices
para una organizacin invertida con claves de acceso en los campos Provincia e
Hijos.
NIF

APELLIDOS

DIRECCIN

PROVINCIA

HIJOS

11111111A
22222222B
33333333C
44444444D
55555555E
66666666F
77777777G
88888888H
99999999I

BBB CCC
DDD EEE
EEE EEE
AAA BBB
BBB DDD
JJJ AAA
AAA JJJ
RRR SSS
TTT BBB

C/ pisa, 1
C/ roma, 1
C/pars, 1
C/ Madrid, 3
C/ Mnaco,2
C/Pisa, 9
C/ Mnaco, 11
C/ Pars, 21
C/ Madrid, 10

Albacete
Madrid
Murcia
Toledo
Albacete
Toledo
Albacete
Madrid
Toledo

2
3
0
1
1
0
2
1
3

7. Con el archivo de datos anterior, crear un ndice de dos niveles con el primer
nivel dividido en cubos con capacidad para tres claves. El campo clave ser
apellidos.

SQL

Pg.-17

Pg.-18

SQL

TEMA II
2.1.SISTEMAS GESTORES DE BASES DE DATOS
2.1.1 Introduccin
2.1.2 Arquitectura de una base de datos
2.1.3 Sistemas gestores de bases de datos
2.1.4 Componentes
2.1.5Modelos de sistemas gestores de bases de datos

2.2.EL MODELO ENTIDAD-RELACION


2.2.1 Principales elementos del modelo
2.2.2 Grado y cardinalidad
2.2.3 Factores que determinan la calidad de un esquema

2.3.FUNDAMENTOS DEL MODELO RELACIONAL


2.3.1 Arquitectura
2.3.2 Reglas de integridad
2.3.3 Paso del modelo entidad-relacin al modelo relacional

SQL

Pg.-19

Notas

Pg.-20

SQL

2.1.

SISTEMAS GESTORES DE BASE DE DATOS


2.1.1. Introduccin

Una base de datos es un conjunto de datos almacenados de forma organizada y


estructurada en un soporte de informacin que es manejado por un ordenador. La
informacin se guarda en archivos independientes integrados en la base, y puede ser
compartida por distintos usuarios que la utilicen para fines diferentes en instantes de
tiempo que pueden coincidir.
Sus componentes ms importantes son el hardware, los datos, los usuarios y los
procedimientos encargados del uso correcto de la informacin. En estos sistemas, los
programadores y usuarios no tienen que saber cmo est distribuida y organizada la
informacin. De esto se encarga un conjunto de procedimientos que forma parte del
sistema gestor de la base de datos.
2.1.2. Arquitectura de una base de datos
Uno de los objetivos de un sistema de base de datos es proporcionar una visin
lo ms abstracta posible de la informacin, es decir, ocultar detalles referentes a la forma
en que los datos estn organizados y almacenados.
La arquitectura ms estndar y, por tanto, la ms utilizada, es la que hace una
divisin en niveles de la base de datos. Se consideran tres niveles segn la perspectiva
desde la que sea vista la informacin. El nivel interno es el nivel ms bajo de abstraccin,
donde se describe la informacin en funcin del sistema en que se implantar la base de
datos. Por encima, se encuentra el conceptual, que representa a alto nivel toda la
informacin de la base de datos independientemente de la mquina en que vaya a
utilizarse. El ms abstracto de los niveles es el externo, que gestiona la informacin
desde el punto de vista individual de cada usuario, grupo de usuarios, programador o
grupo de programadores.

Nivel interno. Se especifican los archivos que contienen la informacin, su


organizacin, la forma de acceder a los registros, el tipo y longitud del
registro, los campos que lo componen, los campos clave, etc.
Nivel conceptual. Se definen todos los datos que intervendrn en el sistema.
Se obtiene a partir de los requerimientos de los usuarios potenciales del
sistema de base de datos a implantar, sin importar la forma ni el lugar en el
que se almacenarn y recuperarn los datos. Contiene los datos elementales
(campos), los datos compuestos (registros), las relaciones existentes entre
campos elementales y compuestos, las reglas que rigen el funcionamiento de
la empresa, etc.
Nivel externo. Es el conjunto de percepciones individuales de la base de
datos. Cada visin individual se denomina subesquema o vista. Un
subesquema podr ser compartido por varios usuarios, y cada usuario

SQL

Pg.-21

tendr la posibilidad de acceder a distintos subesquemas. Al crear un


subesquema, es posible mezclar campos de distintos registros, omitir
campos, cambiar el orden de los campos, aadir campos que puedan ser
calculados a partir de los descritos en el esquema conceptual, etc.
Para una base de datos especfica, hay un nico esquema interno y conceptual,
pero puede haber varios esquemas externos, cada uno definido para uno o varios
usuarios.
ESQUEMA EXTERNO
Subesquema 1:
JUGADORES CON UNA ALTURA DETERMINADA: JU_ARB, JU_ALT, JU_EQ
Subesquema 2:
PARTIDOS GANADOS POR UN EQUIPO : EQ_LOCAL, EQ_VISIT, RESULTADO
Subesquema 3:
EQUIPOS CON AL MENOS TRES JUGADORES DE 2,05: EQ_NOM, NMERO

ESQUEMA CONCEPTUAL
EQUIPOS : EQ_ARB, EQ_NOM, EQ_DEL, .......
JUGADORES : JU_ARB, JU_NOM, JU_ALT, ....
PARTIDOS : EQ_LOCAL, EQ_VISIT, FECHA, ....
Reglas :
1. Un jugador slo pertence a un equipo.
2. Los equipos no juegan ms de un partido diario.
3. .....

ESQUEMA INTERNO
ARCHIV
Equipos

ORGANIZ.
Indexada

CLAVE
EQ_ARB

LONG.REG.
70

CAMPOS
EQ_ARB
EQ_NOM
EQ_DEL
..........

TIPO_DATOS
X(4)
X(15)
X(20)

Jugadores

Indexada

JU_ARB

100

JU_ARB
JU_NOM
JU_ALT.
........

X(4)
X(20)
9,99

Partidos

Indexada

EQ_LICAL+FECHA

50

EQ_LOCAL X(4)
EQ_VISIT.

X(4)
FECHA
......

DD/MM/AA

2.1.3. Sistemas gestores de bases de datos


Un sistema gestor de base de datos (SGBD) es un conjunto de programas que
permiten la administracin y gestin de la informacin de una base de datos. Una de sus
Pg.-22

SQL

funciones es proporcionar diferentes niveles de abstraccin de la informacin,


dependiendo del tipo de usuario que la maneja. Para la mayora, se ocultan los detalles de
la forma y el lugar en que estn almacenados los datos, as como los procedimientos de
recuperacin y actualizacin de la informacin.
Tambin se encarga de conectar e implementar los distintos niveles de la
arquitectura de la base de datos. El sistema de control de base de datos, es el encargado
de transformar los datos requeridos por los programas de aplicacin en registros fsicos a
leer, hacer la peticin al sistema operativo y, cuando la informacin est disponible,
transferible al rea de trabajo del programa que la solicit.
El administrador del sistema organiza y controla los recursos del sistema. Sus
principales funciones son:

Definir el esquema conceptual con el lenguaje de definicin del SGBD.


Controlar el acceso a la base de datos, concediendo permisos a los usuarios.
Definir estrategias de recuperacin frente a posibles fallos.

Los objetivos que debe cumplir una base de datos para ser lo ms rpida, eficaz
y polivalente son los siguientes:

Debe independizar los datos de las aplicaciones que los utilizan. Es lo que se
conoce como independencia fsica (se puede modificar el esquema fsico sin
que afecte a los superiores) e independencia lgica (si se modifica el
esquema conceptual no es necesario modificar los programas de aplicacin).
Conseguir que los datos repetidos innecesariamente en la base sean los
mnimos posibles (redundancia mnima de informacin).
Suministrar mecanismos de seguimiento de las operaciones realizadas en la
base de datos. Esto se consigue mediante procesos espas que mantienen
archivos en los que se almacena la fecha y hora de conexin de los
usuarios, las operaciones realizadas en cada sesin, los datos modificados,
etc.
Proporcionar versatilidad en las posibilidades de bsqueda de informacin
facilitando al usuario varios criterios.
Asegurar la proteccin de los datos contra accesos no autorizados o
malintencionados de los usuarios.
Controlar la integridad de la informacin en la base de datos. Para ello, debe
dar respuesta a posibles fallos de hardware, defectos en el cdigo de los
programas de aplicacin, actualizaciones incompletas, insercin de datos
incorrectos o no vlidos, etc.
Proporcionar mecanismos para realizar copias de seguridad de la
informacin.
Conseguir un tiempo de respuesta suficientemente pequeo para evitar que
el usuario se desespere. El tiempo respuesta se define como el tiempo que

SQL

Pg.-23

transcurre desde que el usuario termina de realizar una peticin al sistema


hasta que empieza a recibir repuesta.

Solucionar los problemas planteados por la concurrencia. Actualmente es


posible que una base de datos est compartida por varios usuarios situados
en distintos terminales. Por ello, puede darse el caso de que dos o ms
usuarios distintos intenten actualizar de forma concurrente (en el mismo
instante de tiempo) un registro determinado. Fundamentalmente, estos
problemas son la actualizacin incorrecta y el bloqueo mutuo.

Instantes de tiempo

CAJAS DE SUPERMERCADO
Cliente caja 1
Cliente caja 2

T1

El cliente adquiere 5 unidades


del
producto
X.
Para
actualizar, se lee el stock y
quedan 100.

T2

Se hacen las operaciones de El cliente adquiere 10


clculo.
unidades del producto X. Para
actualizar, se lee el stock y
quedan 100.

T3

Se anota que quedan 95 Se hacen las operaciones de


clculo.
(100-5) unidades.
T4

Se anota que quedan 19


(100-10) unidades cuando
realmente quedan 85.

El primer problema se soluciona mediante una tcnica llamada cierre, que


consiste en poner un semforo que se encuentre cerrado cuando el registro est
siendo actualizado y abierto en otro caso.

Pg.-24

SQL

CAJAS DE UN SUPERMERCADO
Instantes de tiempo
Cliente en caja 1
Cliente en caja 2
T1

El cliente adquiere 5 unidades


del
producto
X.
Para
actualizar, se cierra el
semforo del registro y se lee
el stock Quedan 100.
El cliente adquiere 10
unidades del producto X. Para
actualizar, como el semforo
est cerrado, se pasa a la cola
de espera.

T2

T3

Se hacen las operaciones de


clculo.

T4

Se anota que quedan 95 El proceso sale de la cola, se


unidades.
Se
abre
el cierra el semforo y se lee el
semforo.
registro. Quedan 95 unidades.

T5

Se hacen las operaciones de


clculo.

T6

Se anota que quedan 85


unidades y se abre el
semforo.

Las transacciones que se encuentran con el semforo cerrado se guardan en una


cola de espera y se procesan cuando el semforo cambia de estado.
El segundo problema es consecuencia de la solucin al primero. Se produce
bloqueo mutuo cuando dos o ms transacciones se encuentran en una espera
circular indefinida. Para resolver el problema se puede impedir que suceda, algo
difcil que afectara al rendimiento del SGBD. Tambin puede detectarse y dar
marcha atrs para corregirlo.

SQL

Pg.-25

CAJAS DE UN SUPERMERCADO
Instantes de tiempo
Cliente en caja 1
Cliente en caja 2
T1

El proceso accede al archivo El proceso accede al archivo


ARTICULOS cerrando su CLIENTES y cierra su
semforo.
semforo.

T2

Se realizan las operaciones de Se necesita acceder al archivo


clculo.
ARTICULOS, pero como el
semforo est cerrado, se pasa
a la cola de espera.

T3

Se necesita acceder al archivo


CLIENTES, pero como el
semforo est cerrado se pasa
a la cola de espera.

2.1.4. Componentes
El SGBD est dividido en mdulos que llevan a cabo sus funciones asociadas.
Se compone del ncleo, lenguaje, utilidades y diccionario de datos.
1) Ncleo: Es el conjunto de programas que coordinan y controlan el
funcionamiento del SGBD. Son programas transparentes al usuario.

Controlan la integridad y seguridad.


Implementan las funciones de comunicacin entre niveles.
Facilitan la independencia de los datos.
Gestionan el diccionario de datos.
Proporcionan el soporte necesario para los programas de utilidad y
los lenguajes.

2) Lenguajes: El SGBD proporciona lenguajes que permiten la definicin y el


manejo de los datos de la base. Cada SGBD tiene una estructura y
organizacin particular, pero todos tienen la caracterstica comn de ofrecer
al administrador y a los usuarios dos lenguajes:

Pg.-26

El lenguaje de descripcin de datos (DDL) se utiliza para definir el


esquema conceptual y los distintos subesquemas externos de la base
de datos. Se ofrece establecer parte de la seguridad de la base de
datos, permitiendo asignar derechos sobre las operaciones que
pueden realizar usuarios.

SQL

El lenguaje de manipulacin de datos (DML) es el encargado de


gestionar la informacin de la base de datos. Permite aadir, eliminar
y modificar registros, y recuperar informacin de forma estructurada
de la base de datos.

Los SGBD son capaces de procesar peticiones del DML que se han formulado
desde programas escritos en otros lenguajes de programacin.
3) Utilidades: Son aplicaciones que facilitan el trabajo a los usuarios y
programadores. Tiene la caracterstica comn de tener un interfaz fcil de
entender. Se basan en mens que guan al usuario para conseguir el objetivo
final.

Asistentes
Generador de mens. Disea el interfaz de usuario de una
aplicacin.
Generador de informes. Presentan datos en pantalla o impresora con
un formato predefinido o fcil de definir sin conocer lenguajes de
base de datos ni de programacin.
Generador de formularios. Genera pantalla de dilogos que
presentan tems y permiten la introduccin de informacin; bien por
teclado, bien por botones.

4) Diccionario de datos: Es un almacn integrado en el que se almacena toda


la informacin referente a la descripcin, gestin e implantacin de la base
de datos. Tambin se conoce como catlogo del sistema. Contiene la
descripcin de los esquemas interno, conceptual y externo, tablas de
usuarios con sus permisos respectivos, los programas de aplicacin que
utilizan, las operaciones que realizan dichos usuarios en el sistema, otros
recursos implicados en el mismo, etc.
Los diccionarios de datos estn estructurados entres capas o niveles. Si la
complejidad del sistema de base de datos lo requiere, las capas pueden
subdividirse recursivamente. Las tres capas son:

La capa de mayor nivel de abstraccin se llama global, donde se


reproduce la informacin comn a todos los usuarios, incluido el
administrador de la base de datos.
A continuacin, existe una capa intermedia que organiza la relacin
entre las capas globales y local. Puede existir varias capas y,
normalmente, se representan mediante vistas, que son percepciones
individuales que tienen los usuarios de la base de datos.
Finalmente, al ms bajo nivel de abstraccin, se encuentra la capa
local, en la que se representan los datos como grupos de
SQL

Pg.-27

informacin especfica.

2.1.5. Modelos de sistemas gestores de bases de datos


1) Modelo relacional: Los tipos de registro conceptuales se denominan
relaciones y se representan mediante tablas bidimensionales en las que las
filas son las ocurrencias de registros y las columnas, los campos
correspondientes. El nivel externo se describe mediante vistas y la base de
datos se almacena en archivos indexados.
ACTOR
NIF
1111111A
5555555E
3333333C
PELCULA
CDIGO
1111
3333
8888
PROTAGONISTA
NIF
111111
333333E
333333E
333333E

NOMBRE
Juan
Pedro
Rosa

TELEFONO
123456
232323
344444

TITULO
Aladdin
Pocahontas
El rey len

DAS
180
210
99

CDIGO
1111
1111
3333
8888

PAPEL
Genio
Pobre
India
Reina

.....

......

....

2) Modelo orientado a objetos: Los sistemas de gestin de bases de datos


orientados a objetos (SGBDOO) son polivalentes, ya que facilitan las
funciones de los SGBD, algunos de los lenguajes de programacin y otras
propias del desarrollo de sistemas orientados a objetos. Los SGBDOO estn
siendo objeto de estudios, y mediante su evolucin se espera que desplacen
a los sistemas relacionales. El principal obstculo con el que se han
encontrado es el aumento de complejidad del modelo, as como el hecho de
proporcionar un mayor nmero de funciones.

Pg.-28

Objetos e identidad. Cada entidad del mundo real es modelada como


un objeto. Cada objeto tiene un identificador nico, y est asociado a
un estado que se representa por los valores de sus atributos y un
comportamiento que se define por procedimientos llamados mtodos
que actan sobre l.
Objetos complejos. Los valores de los atributos de un objeto pueden
ser objetos.
SQL

Encapsulamiento. Cada objeto tiene definidos en su interior los


mtodos y la interfaz para tener acceso y capacidad de manipulacin
de dicho objeto.

Clases. Todos los objetos definidos por los mismos atributos y


mtodos forman una clase. Cada objeto que pertenece a una clase se
dice instancia de la clase.

Herencia. Una clase (subclase) se puede definir como una


especializacin de otras clases (superclases) existentes, por lo que
heredar sus atributos y mtodos.

Sobrecarga. Una operacin puede tener asociados distintos mtodos.


El sistema decide qu mtodo realiza la operacin. Por ejemplo, un
objeto puede incluir la operacin RESTA (que toma dos parmetros,
hace su diferencia y retorna el resultado) y tener varios mtodos para
implementar la operacin (uno para parmetros enteros, otro para
restar fechas, otro para restar cadenas, etc.).

La arquitectura de los SGBDOO est basada en un enfoque cliente-servidor


donde el servidor soporta las funciones del SGBD. El modelo de datos se apoya en los
conceptos de clase, objeto y funcin. No hay distincin entre atributos y mtodos, ya que
ambos se tratan como funciones. Las funciones heredadas pueden ser redefinidas, de
modo que dos clases pueden tener una funcin con el mismo nombre, pero con
definiciones diferentes. Los dos elementos principales de la arquitectura son, por un lado,
el administrador de objetos que implementa el modelo orientado a objetos y facilita el
soporte para definir esquemas y realizar consultas; y, por otro, el administrador de
almacenamiento externo que actualmente se implementa sobre un relacional.

DOCUMENTO
A
T
R
I
B
U
T
O
S
M
E
T
O
D
O
S

Cdigo:9(6)
Titulo : x(15)
Especialidad : x(15)
Departamento: x(15)

A
T
R
I
B
U
T
O
S
M
E
T
O
D
O
S

PERSONA
A
T
R
I
B
U
T
O
S
M
E
T
O
D
O
S

DNI : x(10)
Nombre: x(20)
Fecha_nacimi: fecha

@Edad: Fecha

A
T
R
I
B
U
T
O
S

Datos: PERSONA
NOTA 1,
NOTA 2,
NOTA3 : 99V99
@NOTA_FINAL:
99V99

SQL

M
E
T
O
D
O
S

Nombre: x(15)
Tema: DOCUMENTO
Alumno: INVESTIGADOR
Tutor: PERSONA
Fecha_inicio: Fecha
Fecha_final : Fecha

@Duracin: 9(3)

Pg.-29

CUESTIONES:
1. Enumerar las funciones de un SGBD.
2. Ejemplificar el problema de la concurrencia sin utilizar el empleado en la
descripcin de dicho problema.
3. Explicar la diferencia entre DML y DDL.
4. Representar grficamente como quedara la informacin en los modelos lgicos
de datos estudiados para una base de datos con los siguientes tipos de registros:
SOCIO: NIF, Nombre, Direccin
LIBRO: ISBN, Ttulo, Autor
PRSTAMO: NIF_socio, ISBN_libro, Fecha_prstamos y Fecha_devolucin.

Pg.-30

SQL

2.2.

EL MODELO ENTIDAD-RELACION

El modelo conceptual de datos ms ampliamente conocido es el de entidades y


relaciones. Permite realizar el diseo conceptual de una base de datos. Como se ha
apuntado, este paso, en la fase de diseo, es previo a la eleccin del modelo lgico de
datos y, por supuesto, al sistema gestor de base de datos.
El modelo entidad-relacin es el que incorporan la mayora de las herramientas
de software para el diseo de sistemas. Es una representacin grfica y lingstica de los
objetos que forman parte del mundo real. Describe los datos que son importantes en un
entorno determinado. Proporciona una visin abstracta de la realidad, sin hacer alusin a
formas de almacenamiento, tiempos de ejecucin, sistemas operativos, sistemas gestores
de bases de datos, etc.
Probablemente, su xito es fruto del equilibrio conseguido en las cualidades
deseables en un modelo de representacin de datos: expresividad, simplicidad,
minimalidad, formalidad y riqueza en su representacin. Es expresivo porque ofrece
varios mecanismos de abstraccin de datos. Es rico en la descripcin de conceptos, lo
que pone de manifiesto su simplicidad. No obstante, determinados conceptos que
complican el modelo, facilitan enormemente el paso al modelo relacional, jerrquico o de
redes, lo que compensa el esfuerzo por entender y acostumbrarse a utilizar dichos
conceptos. El modelo es mnimo, ya que ninguno de los elementos que intervienen
pueden ser sustituidos por la combinacin de otros. Est definido formalmente Peter
Chen lo hizo a finales de los setenta-. Es fcilmente legible y los diagramas son
completos. La legibilidad de un diagrama entidad-relacin se ve perjudicada cuando se
pretenden incluir todos los elementos del modelo en un nico diagrama. Por ello, es
conveniente realizar varios esquemas detallados diferentes.
2.2.1. Principales elementos del modelo
1) Entidad. Una entidad es una clase de objetos del mundo real.
Suelen ser los sustantivos empleados al describir las actividades de una
empresa o institucin: PERSONA, COCHE, ARTCULO, PROYECTO,
ALUMNO etc. Cada objeto que pertenece a la clase se denomina
ocurrencia de la entidad. Por ejemplo, los datos referentes al empleado
Snchez. Se distinguen dos clases de entidad:

Fuertes. Son independientes no necesitan la existencia de


otras entidades. Son la mayora de ellas. Por ejemplo,
EMPLEADOS.
Dbiles. Su existencia est ligada a otra entidad. Por
ejemplo, HIJO_DE_EMPLEADO.

SQL

Pg.-31

2) Relacin. Una relacin es una asociacin entre dos o ms entidades.


Suelen identificarse por verbos que unen las entidades en la descripcin
lingstica de los datos: Por ejemplo, VENDE para EMPLEADO y
COCHE, IMPARTE para PROFESOR Y ASIGNATURA etc.
Una relacin es binaria cuando establece correspondencia entre dos
entidades. Son las ms comunes. Se denomina anillo o relacin
recursiva a la relacin binaria que conecta a la misma clase de objetos;
Por ejemplo, EQUPO SE_ENFRENTA_A_EQUIPO, EMPLEADO
SUPERVIS_A_EMPLEADO, etc.
3) Atributo. Un atributo es una entidad mnima de informacin que
expresa propiedades de las entidades y relaciones.
Por ejemplo : Nombre, Edad, Fecha_nacimiento, Color, Modelo, pvp,
etc. Se corresponde con el trmino campo utilizado en el mbito de los
sistemas de gestin de archivos.
Existen atributos que expresan propiedades de una entidad y
atributos que lo hacen de una relacin entre entidades. Por ejemplo, para
la relacin ACTOR TRABAJA_EN PELCULA, Nombre_actor, Edad y
Telfono pueden ser atributos de la entidad ACTOR; Ttulo, Director y
Fecha_de_estreno pueden ser atributos de la entidad PELCULA y
Papel, Honorarios y Tiempo_en_escena podrn ser atributos de la
relacin TRABAJA_EN.
Se denominan ocurrencias de atributo a los valores vlidos que
pueden tomar los atributos; por ejemplo, para Color, rojo; para
Telfono, 6987877, etc.
Se dice que un atributo es compuesto si puede dividirse en
atributos independientes. Por ejemplo, Fecha_de_nacimiento puede
dividrse en dia, mes y ao; Direccin puede dividirse en Calle, Nmero y
Cdigo_postal , etc.
Un atributo se dice que es obligatorio si todas las ocurrencias de
atributo son valores no nulos y no vacos, mientras que es opcional si
puede estar vaco o contener el valor nulo.
Existe un caso especial llamado multivalor, que significa que el
atributo puede tener un conjunto de valores. Por ejemplo, el atributo
Titulacin para la entidad EMPLEADO es multivalor porque un
empleado puede no tener titulacin, tener alguna, una, dos etc. Las
ocurrencias de atributos multivalores se encierran entre llaves y se
separan con comas. Una ocurrencia de EMPLEADO con atributos NIF,
Nombre, Titulacin, edad, etc. Podra se : 1234567A, Prez, {Bachiller,
FPII ADM, Graduado social}, 30, etc.

Pg.-32

SQL

4) Clave. Se denomina clave a un grupo de atributos que determinan


unvocamente todas las ocurrencias de una entidad (clave de la
entidad) o de una relacin (clave de la relacin).
De todas las claves posibles para una entidad o relacin, la
elegida al realizar el diseo se denomina clave primaria o principal y, el
resto, claves alternativas o secundarias.
Una clave se dice simple si el nmero de atributos que la
forman es uno, y compuesta, si tienen ms de un atributo.
Un grupo de atributos es clave fornea de una entidad si el
conjunto de atributos que la forman es clave primaria en otra
entidad.
Por ejemplo, para la entidad LIBRO con atributos ISBN,
Ttulo, NIF_del_autor, y Nmero_de_ejemplares, las claves candidatas
son ISBN Y Ttulo (considerando que no existen libros con ttulos
idnticos), ISBN es clave primaria simple y Ttulo es clave alternativa.
NFI_del_autor es clave fornea porque es clave primaria en la entidad
Autor.
Cuando existen varias claves candidatas, puede resultar
conflictivo elegir una de ellas como primaria. La decisin afectar a la
rapidez de acceso fsico a las ocurrencias de la entidad.
Para facilitar esta tarea pueden tenerse en cuenta los siguientes
criterios:
1.

Elegir la clave que sirva para acceder directamente


a las ocurrencias en el mayor nmero de operaciones.
2.
Es preferible escoger una clave simple antes que
una compuesta.
3.
Se debe evitar que las claves forneas formen parte
de la clave primaria.
El concepto de clave puede ayudar a diferenciar entidades fuertes y
dbiles. Una entidad con claves candidatas es fuerte, mientras que si slo
tiene claves forneas es dbil.
2.2.2. Grado y cardinalidad

SQL

Pg.-33

El grado de una relacin refleja la participacin de cada una de las entidades


afectadas.
Uno a uno, y se representa 1:1, si a cada ocurrencia de A le corresponde
como mximo una ocurrencia de B, y viceversa
Uno a muchos, y se representa 1:M, si a cada ocurrencia de A le pueden
corresponder varias de B, pero a cada ocurrencia de B slo le
corresponde una de A como mximo. Si la asociacin se entendiera de B
con A, la relacin sera M:1.
Muchos a muchos y se representa M:M, si a cada ocurrencia de A le
pueden corresponder varias de B, y viceversa.
La cardinalidad mide la obligatoriedad de correspondencia entre las ocurrencias
de dos entidades en una relacin. Se dice que una entidad A tiene un tipo de participacin
obligatoria en una ralacin R con otra entidad B, si a cada ocurrencia de A le
corresponde al menos una de B. En cambio, A tiene participacin opcional, si pueden
existir ocurrencias de A que no tengan correspondencia en B. Segn esto, las relaciones
binarias tambin se clasifican en:
a) Obligatoria-Obligatoria. Todas las ocurrencias de cada entidad tienen
correspondencia con como mnimo una ocurrencia de la otra. Por
ejemplo, ALUMNO CURSA ASIGNATURA, todos los alumnos cursan
al menos una asignatura, y cada asignatura es cursada por al menos un
alumno.
b) Obligatoria-Opcional. Cada ocurrencia de la primera entidad tiene
asociada al menos una ocurrencia de la segunda; sin embargo, puede
haber ocurrencias de la segunda entidad que no tengan asociadas
ninguna en la primera entidad. Por ejemplo, en la relacin CLIENTE
OCUPA HABITACIN, suponiendo que slo interesan los clientes
alojados en el hotel, todos los clientes ocupan una habitacin, pero
puede haber habitaciones vacas y, por tanto, no ocupadas por ningn
cliente. Si la relacin hubiera sido enunciada a la inversa. HABITACIN
ES-OCUPADA-POR CLIENTE, la relacin sera opcional-obligatoria.
c) Opcional-Opcional. Alguna ocurrencia de ambas entidades puede no
tener correspondencia con ninguna ocurrencia de la otra entidad. Por
ejemplo, en la relacin LECTOR SACA-PRESTADO LIBRO, un lector
socio de una biblioteca puede no haber sacado nunca un libro prestado y
tambin es posible que ciertos libros nunca hayan sido prestados a
lectores.
Diagramas entidadrelacin
ENTIDADES
E
Fuerte y Obligatoria

Pg.-34

E
Dbil

SQL

E
Opcional

RELACIONES
R

E1

E2
M

R
ATRIBUTOS

a1

a2
an

a11

Simple

a12
a1n

a1
Compuesto

CLAVES
a1

a1

an

a1 primaria y simple

a2
an

E
a 1+

E1

E2

an

a2 primaria y compuesta
ai fornea de E1 en E2

a1 ai

2.2.3. Factores que determinan la calidad de un esquema


A la hora de elaborar un esquema conceptual de base de datos utilizando el
modelo entidad-relacin, se debe intentar que el diagrama resultante sea:

Completo. Se reflejan todas las caractersticas de la realidad que pretende


representar.
Correcto. Utiliza correctamente todos los elementos necesarios del modelo
entidad-relacin.
No redundante. No existen propiedades repetidas en el esquema.
Legible. Una persona que no ha participado en la elaboracin del esquema
es capaz de comprenderlo.
Extensible. Se adapta a futuros cambios que no afecten totalmente a las
estructuras del diagrama.
Normalizado. El esquema est en la forma normal de Boyce-Codd, esta
propiedad puede posponerse hasta que el diagrama se transforme al modelo
lgico de datos elegido (relacional, jerrquico o de redes). Se opta por esta
posibilidad dado que el proceso de normalizacin lleva asociados conceptos
inherentes al modelo relacional de datos.

SQL

Pg.-35

2.3.

FUNDAMENTOS DEL MODELO RELACIONAL


2.3.1. Arquitectura

Esquema conceptual. Se define mediante relaciones que se


representan con tablas. Cada entidad y relacin se corresponde con
una tabla bidimensional. Las columnas son los atributos y las filas las
ocurrencias.

Esquema externo. Se describe mediante vistas que se corresponden


con los subesquemas de la arquitectura estndar. Una vista es una
tabla virtual que se forma a partir de las tablas del esquema
conceptual, pero que no tiene correspondencia en el nivel interno.

Esquema interno. Cada tabla del esquema conceptual se almacena en


un archivo. Para cada clave candidata se crea un ndice para el
posterior acceso directo a los datos del archivo.

El siguiente grfico resume la arquitectura de un sistema gestor de base de


datos relacional.

Vista 1

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

Tabla 1

Tabla n
..............

Indice 1

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

Indice i

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

Indice 1

..........

Pg.-36

Vista N

Indice j

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

SQL

..........................................
Archivo 1

Archivo n

BASE DE DATOS
De las tablas se derivan los siguientes conceptos:

Tupla. Es una fila de la tabla que se corresponde con cada ocurrencia


de la relacin.
Atributo. Es cada una de las columnas de la tabla. Es equivalente al
concepto de atributo del modelo entidad-relacin.
Cardinalidad. Es el nmero de filas de la tabla.
Grado. Es el nmero de atributos de la tabla. Todas las tuplas tienen
el mismo nmero de atributos.
Dominio de un atributo. Es el conjunto de valores que puede tomar
dicho atributo. Pueden ser:
a) Generales. Los valores estn comprendidos entre un mnimo y
un mximo. Por ejemplo, el dominio del atributo Garanta es
un nmero comprendido entre 3 y 18 que representa el nmero
de meses mnimo y mximo que ofrece el concesionario como
garanta del coche.
b) Restringidos. Los valores pertenecen a un conjunto discreto.
Por ejemplo, Sexo puede tomar los valores masculino y
femenino, Color admitir los colores vlidos para el entorno
de la relacin, etc.

Clave. Este concepto est definido de forma similar al expuesto en el


modelo entidad-relacin. Es un conjunto de atributos que identifican
unvocamente cada tupla de la relacin. Todas las claves de una
relacin son candidatas; la utilizada se denomina primaria y el resto
son alternativas. Si un conjunto de atributos es clave en otra tabla
distinta, se considera clave fornea o externa.

En general, una tabla debe reunir los siguientes requisitos para ser consideradas
como una relacin:

Tener un nmero fijo de atributos para todas las tuplas.


SQL

Pg.-37

Cada atributo tiene un nico dominio.


Las tuplas no tienen por qu tener una secuencia determinada.
El orden de los atributos no importa.
No pueden existir tuplas ni atributos repetidos.
Cada interseccin fila-columna debe contener un valor nico
perteneciendo al dominio de la columna correspondiente.

Vistas: Los conceptos que se han expuesto hasta el momento hacan referencia
al esquema conceptual del modelo relacional. Para describir el esquema externo se
utilizan las vistas. Una vista es una tabla que el usuario puede crear y manejar. Es una
tabla virtual que no tienen que corresponderse con ningn archivo del nivel interno. Las
tuplas que pertenecen a una vista se obtienen como resultado de consultas a las tablas del
nivel conceptual.
Las vistas pueden formarse eliminando atributos de una tabla, uniendo tablas
por atributos comunes y de ambas formas. Tambin pueden definirse a partir de otras
vistas. Al crearlas se deben de tener en cuenta las restricciones impuestas por el
administrador de la base de datos para cada usuario.

Usuario1

usuario2
Vista3
Nombre

Cuota

Vista1
Nombre

Vista 2
direccin

Poblacin

Tabla1

DNI

Tipo Cuota

Tabla2

DNI Nombre Direccin

Cod_postal Tipo

Cod_postal

Tabla3
Poblacin Provincia

Tipo

Cuota

2.3.2. Reglas de Integridad


Al enumerar los objetivos que debe cumplir un sistema gestor de bases de datos
se citaba la integridad. Parte de este objetivo se cumple si se consigue mantener la
coherencia y la veracidad de la informacin en la base de datos. Las operaciones que
pueden afectar a la integridad son la insercin, la modificacin y el borrado de registros
en la base de datos.
Existen algunas restricciones que deben cumplirse para mantener la base de
datos ntegra, aunque no todos los sistemas gestores de bases de datos relacionales
facilitan mecanismos de especificacin de tales restricciones. Las tres restricciones
principales que forman parte del modelo relacional de datos son las siguientes:
a) Integridad de entidad. Ningn valor de la clave primaria de una relacin
Pg.-38

SQL

puede ser nulo o desconocido. Tampoco se podr desconocer parte de dicha


clave primaria si est estuviera formada por varios atributos. Es razonable
que si, por definicin, la clave primaria permite distinguir las tuplas de una
relacin, las tuplas con valor nulo en la clave primaria no estarn
identificadas. Esta restriccin se consigue comprobando en cada insercin y
modificacin que ningn valor de los introducidos para la clave primaria es
nulo o no forma parte de su dominio.
b) Integridad de clave. Los valores de claves candidatas en una relacin deben
ser nicos para cada tupla. El razonamiento es anlogo al de la restriccin
anterior. Para evitar violar esa regla, se comprobar en todas las inserciones
y modificaciones que el valor de todas las claves candidatas no existen en
alguna tupla de esa relacin.
c) Integridad referencial. Una tupla de una relacin R1 que haga referencia a
otra relacin R2 debe referirse a una tupla existente en R2. Formalmente,
cada valor de un atributo A que forma parte de una clave fornea en una
relacin R2, R3, etc., en la que A forma parte de la clave primaria. Esta regla
puede verse afectada en la insercin, modificacin y borrado de tuplas. Para
las dos primeras operaciones, el sistema gestor de base de datos relacional
debe asegurarse de que al introducir un valor de una clave fornea, ese valor
sea nulo o exista en todas las relaciones en las que la clave fornea sea clave
primaria. En cuanto a la eliminacin, no se permitir borrar una tupla de una
relacin cuyo valor de clave primaria exista como valor de la clave fornea
de otra relacin.
PROFESORES
NOMBRE
Juan
Jos
Rosa
Javi
Luis

EDAD
27
31
31
33
21

TELEFONO
1111
2222
3433
3232
3456

ASIGNATURAS
Nombre
Matem.
Idioma
FyQ
Lengua
Mtodo

Horas
5
3
5
4
5

Tipo
Obl
Opt
Obl
Opt
Opt

IMPARTE
Profesor
Juan
Jos
Luis

Asignatura
Matem.
Lengua
Idioma

SQL

Pg.-39

Adems de estas restricciones formales, es conveniente que los sistemas


gestores de bases de datos relacionales, tengan en cuenta lo siguiente:
No se permitir introducir valores de atributos que no pertenezcan a sus
dominios o sean de distintos tipo.
Se podrn definir atributos obligatorios y opcionales. Los obligatorios, sean
claves o no, debern contener siempre valores vlidos.
Se podrn formular reglas de gestin de la base de datos (reglas
semnticas), tales como la fecha de devolucin ser mayor que la de
prstamo, el mnimo de unidades suministradas por un proveedor ser
tres, todos los valores numricos debern ser positivos, un rbitro no
podr participar en dos partidos consecutivos de un mismo equipo, etc.
2.3.3. Paso del modelo entidad-relacin al modelo relacional
Recurdese que en el proceso de diseo de una base de datos el primer paso
consista en realizar el diseo conceptual para, posteriormente, abordar el diseo lgico
que generaba el esquema de la base de datos en el modelo lgico elegido (relacional,
jerrquico, de redes u orientado a objetos). Este apartado presenta un procedimiento
sistemtico para transformar el esquema conceptual resultante de aplicar el modelo
entidad-relacin al problema de diseo de una base de datos en un esquema relacional.
Para poder llevar a cabo esta transformacin, es necesario realizar previamente
determinadas conversiones que eliminen elementos del modelo entidad-relacin no
representables en el modelo relacional.
Antes de pasar al modelo relacional, es conveniente analizar el diagrama
entidad-relacin y comprobar que no existen elementos que no puedan ser representados
directamente en el modelo relacional. Para ello pueden seguirse los siguientes pasos:
a) Eliminacin de jerarquas de generalizacin. Al hacerlo hay que tener en
cuenta que no debe existir prdida de informacin. Existen tres posibilidades
para realizar la conversin:

Pg.-40

Integrar todas las entidades en una nica. Esta nueva entidad contendr
todos los atributos de la entidad genrica, los de las subentidades y un
atributo discriminativo para distinguir a qu subentidad pertenecen las
tuplas. Los atributos de las subentidades son tratados como opcionales.
Todas las relaciones que tuvieran subentidades se mantienen ligadas a la
nueva entidad recin creada, reconsiderando la cardinalidad de cada
relacin. Esta alternativa presenta el inconveniente de generar demasiados
valores nulos en los atributos opcionales. Tambin ralentiza el proceso de
bsqueda al tener en cuenta todas las tuplas en vez de las que pertenecen a
la subentidad deseada. Su nica ventaja es que permite modelar todas las
jerarquas (totales o parciales y superpuestas o exclusivas).
Considerar cada subentidad como entidad. Para ello, se aaden los atributos
de la entidad genrica a la subentidad; y la clave primaria de la genrica pasa

SQL

a serlo de las nuevas entidades creadas. Sus inconvenientes son varios:


-

Se pierde el concepto de la entidad genrica.


Los accesos a la entidad genrica deben convertirse en accesos a
todas las subentidades.
- Los atributos de la entidad genrica son repetidos en cada
subentidad.
- Slo es vlida para jerarquas totales y exclusivas.
- Si la entidad genrica tiene alguna relacin, sta debe propagarse a
cada subentidad.
En consecuencia, esta alternativa es vlida cuando la jerarqua es total o
exclusiva, no importa el concepto de la entidad genrica en las operaciones
y no hay relacin entre la entidad genrica y otras entidades.
Modelo inicial:
NIF

Stock

compr
a

CLIENTE

Matrcula

NUEVO

COCHE

USADO

Marca
Modelo
Color

Pon

Nombre
EMPLEADO

ea
punt
o

Transformacin de jerarqua total y exclusiva:


a)
EMPLEADO

Nombre

1
Pon
ea
punt
o

Marca
Modelo
Color

COCHE

Tipo
Matricula
Stock

M
compr
a
NIF

M
CLIENTE

SQL

Pg.-41

B)

Marca
Modelo
Color
Stock

COCHE
NUEVO

NIF

C)

Pon
ea
punt
1 o

EMPLEADO

Nombre

COCHE

Marca
Modelo
Color

Compr
a

Es
nuevo
1

CLIENTE

NIF

Es
usado
Matrcula

NUEVO

Marca
Modelo
Color
Stock

CLIENTE

Stock

Compra-usado

Compr
a
nuevo
M

COCHE
USADO

1
USADO

Pon

EMPLEADO

Nombre

ea
punt
o

Insertar una relacin entre la entidad genrica y cada subentidad. Los


atributos se mantienen y a las subentidades se las puede identificar con la
clave fornea de la entidad genrica. Su inconveniente principal es que el
esquema resultante es bastante complejo e, incluso puede resultar
redundante. En cambio, permite representar todos los tipos de jerarquas.

No existe un criterio general para utilizar una alternativa u otra. En cada caso
hay que plantearse las ventajas e inconvenientes que plantea cada una. En
general, para tomar la decisin se debe tener en cuenta el tipo de jerarqua, los
atributos de la entidad genrica, a qu entidades afectan las operaciones a
realizar y la complejidad del esquema resultante.
b) Eliminar los atributos compuestos. El modelo relacional slo permite
representar atributo simples, por lo que deben convertirse los atributos
compuestos. Existen dos alternativas:

Pg.-42

Considerar como atributo simple cada componente del compuesto;


por ejemplo, el atributo Fecha-de-nacimiento compuesto de Da,

SQL

Mes y Ao convertirlo en tres atributos Da-de-nacimiento, Mes-denacimiento y Ao-de-nacimiento.


Considerar el atributo compuesto como simple. En este caso es
responsabilidad de la aplicacin identificar cada parte del atributo.
Para el atributo Fecha-de-nacimiento, pasara a ser simple y, en vez
de tener tres partes de dos dgitos, se representara con seis dgitos
manteniendo el significado de cada dgito antes de la conversin.

c) Eliminar atributos multivalor. Pueden darse dos casos:

El atributo multivalor pertenece a una entidad. En este caso, se crea


una nueva entidad que contiene el atributo multivalor como
monovalor y la clave primaria de la entidad original. La clave
primaria de la nueva entidad es la suma de sus atributos. Por
ejemplo, el atributo Mritos en una entidad Candidato con atributos
DNI..., Mritos se dividir en dos entidades: Candidato con todos
sus atributos, excepto Mritos, y la entidad Currculum con los
atributos DNI y Mritos.
El atributo multivalor pertenece a una relacin R entre dos entidades
E1 y E2. Tambin se crea una nueva entidad que contiene el atributo
multivalor como simple y:

La clave primaria de una de las entidades participantes en la


relacin si es 1:1.
La clave primaria de la entidad del lado muchos si la relacin es
1:M.
Las claves primarias de ambas relaciones si la relacin es M:M.

METODOLOGA PARA REALIZAR LA CONVERSIN


a) Entidades. Este elemento es equivalente en los dos modelos. Por lo tanto, basta
con cambiar el nombre de la entidad por el de la relacin, que ser representada
por una tabla. La clave primaria de la entidad tambin lo es de la relacin.

CLIENTE

b)

DNI
Nombre
Direccin

CLIENTE

DNI Nombre

Direccin

Relaciones recursivas. Una relacin R de una entidad E consigo misma


se convierte en dos relaciones del modelo relacional: una tabla para la entidad E y
otra para R. La nueva tabla incluir dos veces la clave primaria de E (una vez por
cada papel de la relacin) y los atributos de R. La clave primaria ser una de ellas
si la relacin es 1:M o la combinacin de las dos si es M:M. Si la relacin fuera
1:1 se repetira la clave primaria con el segundo papel y no necesitara la segunda

SQL

Pg.-43

tabla.
Nombre

EMPLEADO

Empleado
Nombre Direccin

Direccin
1

DIRECTOR

Nombre_dire

Nombre_dirigido

DIRI
GE

Debe aclararse que siendo la relacin 1:M, es posible utilizar una nica relacin
con la clave primaria duplicada en los dos papeles. En este caso, el ejemplo se
transformara en la siguiente tabla:
EMPLEADO
Nombre_empleado Telfono

Nombre-director

Sin embargo, esta alternativa no es aconsejable cuando la relacin no es


obligatoria-obligatoria, ya que podran generarse valores nulos (los directores no
tienen por qu estar dirigidos).
c)

Relaciones binarias. La forma de tratarlas depende de su grado y


cardinalidad. En general, todos los caso se refieren a una relacin R entre dos
entidades E1 y E2.
-

Relacin 1:1. En principio puede modelarse con una nica relacin


que incluya los atributos de E 1,E2 y R. Sin embargo, pueden generarse
demasiados valores nulos cuando alguna de las participaciones no sea obligatoria.
Por ello, se deben tratar por separado.
ESTUDIANTE
1

DNI
Nombre

REALIZ
A

1
PROYECTO

Pg.-44

Num_proyecto
Denominacin

Obligatoria-obligatoria. Se integran las dos entidades en una


tabla que contiene los atributos y la clave primaria es cualquiera
de las de E1 y E2. Si coincidiera, slo se incluira una vez en la
nueva relacin. El ejemplo quedara del siguiente modo:

SQL

ESTUDIANTE
DNI

Nombre

Nm_proyecto

Denominacin

Obligatoria-opcional. Cada entidad se convierte en una relacin


representada por una tabla, y a la que tiene participacin
obligatoria se aadira la clave primaria de la opcional. Las
claves primarias de ambas relaciones se mantienen. Suponiendo
ESTUDIANTE opcional, el ejemplo resultara:
ESTUDIANTE
DNI

Nombre

PROYECTO
Nm_proyecto Denominacin

DNI

Opcional-opcional. En este caso, se generarn tres relaciones:


una para cada entidad y otra para la correspondencia entre
ambas. Las entidades no sufrira cambios y la nueva relacin
incluir las claves primarias de E 1 y E2, as como los atributos de
R, si los hubiera. La clave primaria de esta relacin recin creada
ser cualquiera de las de E1 o E2. El ejemplo, sera:

ESTUDIANTE
DNI

Nombre

PROYECTO
Nm_proyecto Denominacin
PROYECTO-DE-ESTUDIANTE
DNI
Nm_proyecto
-

Relacin 1:M. En general, se modelan aadiendo la clave primaria de la


entidad del lado uno a la del lado muchos. Sin embargo, al aparecer
alguna entidad con participacin opcional es conveniente elegir otra solucin.
Ejemplo :
EDITORIAL
SQL

Pg.-45

Cdigo
Nombre
1
SUMINISTR
A

Descuento

M
ISBN

LIBRO

Obligatoria-obligatoria. Cada entidad se convierte en una relacin con su


clave primaria, y la clave primaria de la entidad del lado uno se aade a la
del lado lado muchos. Los atributos de la relacin R, si hubieran, se
incluyen en la del lado muchos. El ejemplo quedara de esta forma:
EDITORIAL
Cdigo
Nombre
LIBRO
ISBN
Ttulo
Cdigo

Ttulo

Descuento

Obligatoria-opcional. Se necesitan tres relaciones, una para cada entidad y


otra para la correspondencia. Las entidades se transforman convirtindolas en
tablas, y la nueva relacin debe contener las claves primarias de las dos
entidades y los posibles atributos de la correspondencia R. La clave primaria
de la relacin creada ser la combinacin de las claves primarias de E 1 y E2;
en el ejemplo:
EDITORIAL
Cdigo
Nombre
LIBRO
ISBN
Ttulo
SUMINISTRA
Cdigo
ISBN
Descuento

Opcional-opcional: Este caso se reduce al de relacin obligatoria-opcional.

- Relacin M:M. Para estas relaciones no importa la cardinalidad. Siempre se


transforman en tres relaciones, una para entidad y otra para la correspondencia. Las
entidades se convierten en tablas y la relacin de la correspondencia incluye las claves
primarias de las entidades y los atributos de la asociacin, siendo su clave primaria la
combinacin de las claves primarias de las entidades. Como ejemplo, vase la

Pg.-46

SQL

siguiente relacin M:M que muestra la figura:


DNI
Nom_alum

ALUMNO
M

Nota_final

CURSA

M
Nom_asig
Horas

ASIGNATURA
Lo que quedara:
ALUMNO
DNI
Nom_alum
ASIGNATURA
Nom_asig
Horas
NOTA
DNI
Nom_asig Nota_final
d)

Relaciones n-arias. Tienen el mismo tratamiento que las relaciones


M:M. Cada entidad se transforma en tabla y se aade una tabla para la asociacin
que incluya las claves primarias de las entidades participantes en la correspondencia
y los atributos de la asociacin. La composicin de las claves primarias de las
entidades es la clave primaria de la nueva relacin. Por ejemplo, la siguiente relacin
ternaria quedara del modo que muestra la figura:
DNI_CLI
Telfono

ALUMNO
Matricula
Pvp
Kms

COCHE

Forma_pago

CURSA

DNI_Emp
Nombre

ASIGNATURA
Direccin

Lo que quedara:
CLIENTE
DNI_CLI Telfono
COCHE
Matrcula
Pvp Km
EMPLEADO
DNI_Emp Nombre Direccin
VENTA
DNI_cli DNI_Emp Matrcula

SQL

Forma_pago

Pg.-47

Pg.-48

SQL

TEMA III
PANORAMICA GENERAL DE SQL
3..1

EL LENGUAJE SQL

3..2

OBJETIVOS DE SQL

3..3

CARACTERISTICAS Y VENTAJAS DE SQL

3..4

TAREAS DE USUARIO Y DE ADMISNISTRADOR

3..5

TIPOS DE ORDENES DEL LENGUAJE SQL

3..6

FORMAS DE TRABAJAR DE SQL

3..7

ENTORNO DE TRABAJO

3..8

SQL Y LA INTERCONEXION POR LA RED

3..9

RESUMEN

3..10 EJERCICIOS

SQL

Pg.-49

Notas

Pg.-50

SQL

3.1.

EL LENGUAJE SQL

SQL es una herramienta para organizar, gestionar y recuperar datos


almacenados en una base de datos informtica. SQl es un lenguaje informtico que se
utiliza para interactuar con una base de datos. De hecho, SQL funciona con un tipo
especfico de base de datos, llamado base de datos relacional.
En la actualidad es el lenguaje de uso y programacin de bases de datos
relacionales ms extendidos.
El programa que controla la base de datos se llama Sistema de Gestin de Base
de Datos, o DBMS.
Cuando es necesario recuperar datos de una base de datos, la peticin se realiza
utilizando SQL. El DBMS procesa la peticin SQL, recoge los datos solicitados y los
devuelve a quien los solicit. Este proceso de peticin de datos de la base de datos y
posterior recepcin de resultados se llama consulta (query); de aqu el nombre lenguaje
estructurado de consultas.
Este es un lenguaje para el manejo de la base de datos a lo largo de todo su
ciclo de vida.
Este lenguaje trabaja de modo declarativo. Cuando un usuario quiere realizar
una operacin con los datos, no debe describirla paso a paso. Basta con especificar el
resultado que se desea mediante clusulas y predicados. El gestor de la base de datos se
ocupar de realizar las tareas necesarias para hacer efectiva la peticin.
SQL se utiliza para controlar todas las funciones que suministra un DBMS a sus
usuarios, incluyendo:

Definicin de datos. SQL permite que un usuario defina l estructura y la


organizacin de los datos almacenados, as como las relaciones existentes
entre ellos.
Recuperacin de datos. SQL permite a un usuario o a un programa
recuperar y utilizar los datos almacenados en una base de datos.
Manipulacin de datos. SQL permite a un usuario o a un programa
actualizar la base de datos aadiendo datos nuevos, borrando los viejos y
modificando los almacenados previamente.

SQL

Pg.-51

Control de acceso. SQL puede ser utilizado para restringir la capacidad de


un usuario para recuperar, aadir y modificar datos, protegiendo los datos
almacenados contra accesos no autorizados.
Comparticin de informacin. SQL es utilizado para coordinar la
comparticin de datos entre usuarios concurrentes, asegurando que no haya
interferencias entre ellos.
Integridad de datos. SQL define restricciones de integridad en la base de
datos, protegindola de alteraciones debidas a actualizaciones inconsistentes
o fallos del sistema.

En segundo lugar, SQL no es realmente un lenguaje completo como COBOL,


FORTRAN o C. SQL no contiene sentencias IF para probar condiciones, ni sentencias
GOTO de salto, Ni siquiera sentencias DO o FOR para realizar bucles. En vez de eso,
SQL es un sublenguaje de base de datos que consiste en alrededor de treinta sentencias
especializadas en tareas de gestin de base de datos. Estas sentencias SQL estn
embebidas en otro lenguaje, como FORTRAN, COBOL o C, que las utiliza para acceder
a las bases de datos.
Finalmente, SQL no es un lenguaje particularmente estructurado, especialmente
cuando se compara con lenguajes altamente estructurados como C o Pascal. Hay
bastantes inconsistencias en el lenguaje SQL, y adems existen reglas especiales que
evitan la construccin de sentencias SQL que parecen perfectamente legales, pero que no
tienen sentido.

3.2.

OBJETIVOS DE SQL

El motor de la base de datos es el corazn del DBMS, responsable de la


estructuracin, almacenamiento y recuperacin de los datos del disco. Acepta peticiones
SQL de otros componentes del DBMS, tales como facilidades de formularios,
generadores de informes o facilidades de consultas interactivas, de programas escritos
por los usuarios e incluso de otros sistemas informticos.

Pg.-52

SQL es un lenguaje interactivo de consultas. Los usuarios escriben rdenes


SQL en un programa SQL interactivo para recuperar datos y presentarlos en
la pantalla.

SQL

3.3.

SQL es un lenguaje de programacin de bases de datos. Los


programadores introducen rdenes SQL en sus programas de acceder a los
datos de las bases de datos.
SQL es un lenguaje de administracin de base de datos. El administrador
responsable de la gestin de la base de una minicomputadora o sistema
basado en una computadora central utiliza SQL para definir la estructura de
la base de datos y el control de acceso a los datos almacenados.
SQL es un lenguaje cliente/servidor. Los programas de las computadoras
personales utilizan SQL para comunicarse, a travs de una red de rea local,
con los servidores de bases de datos que almacenan los datos compartidos.
SQL es un lenguaje de bases de datos distribuidos. Los sistemas de gestin
de bases de datos distribuidas utilizan SQL para ayudar a distribuir los datos
a travs de muchos sistemas informticos conectados.

CARACTERISTICAS Y VENTAJAS DE SQL

A continuacin se muestran las principales caractersticas de SQL y las


tendencias del mercado que le han hecho conseguir el xito.

Independencia de los proveedores


Portabilidad entre sistemas informticas
Acuerdos con Microsoft (ODBC)
Fundamento relacional
Mltiples vistas de los datos
Lenguaje completo de base de datos
Definicin dinmica de base de datos
Arquitectura cliente/servidor

Independencia de los proveedores


Ningn nuevo producto de base de datos puede tener xito si no ofrecen SQL.
Una base de datos basada en SQL, y los programas que la usan, se pueden transferir del
DBMS de un proveedor a otro con un esfuerzo mnimo de conversin y un pequeo
reciclaje personal.
El SQL es tan popular en el entorno de las bases de datos, que muchos
lenguajes de programacin incluyen sentencias SQL como parte de su repertorio de
instrucciones. Tal es el caso del lenguaje Visual Basic que, cuando se utiliza para acceder
a las bases de datos creadas con cualquier producto relacional, permite describir un
subnconjunto de los registros mediante una sentencia SQL.
Portabilidad entre sistemas informticos

SQL

Pg.-53

Los proveedores de DBMS basados en SQL ofrecen sus productos para un


rango de computadoras que incluye las computadoras personales y estaciones de trabajo
en redes de rea local, las minicomputadoras y los sistemas basados en una computadora
central. Las aplicaciones basadas en SQL que comienzan en sistemas monousuarios
pueden ser transferidas a minicomputadoras mayores o a sistemas basados en una
computadora central, segn crecen.
El lenguaje SQL ha sido utilizado con diferentes sistemas comerciales, como
lenguaje nativo o como una incorporacin posterior a un sistema relacional preexistente,
como INGRES.
Tras convertirse en un lenguaje estndar por ISO, se han desarrollado multitud
de productos comerciales SQL. Existen Intrpretes de SQL en micros, minis y grandes
ordenadores, sobre diferentes sistemas operativos.
Acuerdos con Microsoft (ODBC)
Microsoft considera el acceso a las bases de datos como un elemento clave de la
arquitectura software de Windows para computadoras personales. El estndar de
Microsoft que proporciona acceso a bases de datos es ODBC (conexin entre base de
datos abiertas, Open Database Connectivity), una facilidad basada en SQL. Las
principales aplicaciones Windows, tanto de Microsoft como de otros proveedores lderes
de aplicaciones Windows son compatibles con ODBC, y el acceso ODBC est disponible
o anunciado en las principales bases de datos SQL.
Fundamento relacional
La estructura tabular fila/columna de las bases de datos relacionales es intuitiva
para los usuarios, manteniendo el lenguaje sencillo y fcil de entender. El modelo
relacional tambin tiene un fuerte fundamento terico que ha guiado la evolucin y la
implementacin de las bases de datos relacionales.
Mltiples vistas de los datos
Utilizando SQL, el creador de una base de datos puede dar vistas diferentes de
su estructura y contenidos a diferentes usuarios de la base de datos. Por ejemplo, la base
de datos puede ser construida de modo que cada usuario slo vea datos de su propio
departamento o de su propia regin de ventas. Adems, los datos procedentes de
diferentes partes de la base de datos pueden combinarse y presentarse al usuario como
una simple fila/columna de una tabla. Las vistas se SQL pueden ser utilizadas de este
modo para mejorar la seguridad de una base de datos y para acomodarla a las
necesidades particulares de los usuarios individuales.
Lenguaje completo de base de datos
SQL fue inicialmente desarrollado como un lenguaje de consulta ad hoc, pero
su potencia va ahora ms all de la recuperacin de datos. SQL proporciona un lenguaje

Pg.-54

SQL

completo y consistente para crear una base de datos, gestionar su seguridad, actualizar
sus contenidos, recuperar los datos y compartirlos entre muchos usuarios concurrentes.
Definicin dinmica de datos
Utilizando SQL, la estructura de una base de datos puede ser modificada y
ampliada dinmicamente, incluso mientras los usuarios estn accediendo a los contenidos
de la base de datos. Este es un avance importante sobre los lenguajes de definicin de
datos estticos.
Arquitectura cliente/servidor
SQL es un vehculo natural para implementar aplicaciones utilizando una
arquitectura cliente/servidor distribuida.

3.4.

TAREAS DE USUARIO Y DE ADMINISTRADOR

La existencia de una base de datos de tamao medio requiere un mantenimiento


bastante costoso. Por ello, se ponen en marcha bases de datos cuando hay varias
personas interesadas en su aprovechamiento. Un grupo de personas que intenta utilizar
unos datos genera problemas ya conocidos, como las violaciones de integridad y los
posibles errores por acceso simultneo.
Para resolver estos y otros conflictos aparece la figura del administrador de la
base de datos (ABD ODBA, Data Base Administrator). Esta persona posee todos los
privilegios o permisos de acceso sobre los datos, y se ocupa de otorgar algunos de ellos
a los usuarios para que stos realicen su trabajo.
Las personas (o programas) que acceden a la base de datos reciben el nombre
genrico de usuarios. Pero no todos realizan las mismas tareas. Se pueden clasificar en
programadores y usuarios finales:
a) Programadores. Se trata de personas que no estn interesadas
propiamente en los datos, sino en desarrollar un programa que trabaje
sobre los datos. Este programa ser utilizado por un usuario final
cuando est acabado. Para acceder a los datos, su programa dialoga con
el sistema gestor de la base de datos (SGBD). Los programadores
acceden a los datos al menos para probar la aplicacin que estn
desarrollando.
b) Usuarios finales. Son aquellos a los que interesan los datos
almacenados en la base de datos, para modificarlos (como en el caso del
empleado de un banco) o simplemente consultarlos (como en el acceso a
los fondos de una biblioteca). Estos usuarios finales tienen dos opciones
para trabajar: utilizar un lenguaje conversacional propio del SGBD para

SQL

Pg.-55

el dilogo, o bien aprovechar una aplicacin o programa hecho a medida


por un programador.
I.

Tareas del administrador

La creacin y destruccin de los objetos de la base de datos (tablas,


vistas, usuarios, grupos). El administrador disea la organizacin de
la base de datos y la pone en marcha para que los usuarios obtengan
buen servicio de ella. Crear los esquemas de la base de datos y los
dotar de contenido.
La autorizacin de acceso a los objetos. Tanto un usuario que
preguntan por un valor como un usuario que ejecuta un programa
necesitan permiso para ver los datos. Estos permisos son otorgados
por el administrador, de acuerdo con el tipo de usuario de que se
trate. Por ejemplo, en una biblioteca no disponen de iguales permisos
el encargado que registra los prstamos (y puede hacer anotaciones)
que el lector que examina los ttulos.
La gestin del almacenamiento fsico y del espacio en disco.
La poltica de copias de seguridad y la restauracin de la base de
datos en caso de cada.

Un usuario puede crear objetos particulares y permitir a otros trabajar con ellos.
En este caso, ser un usuario quien realice las tareas de administracin.

3.5.

TIPOS DE ORDENES DEL LENGUAJE SQL

Una base de datos es un sistema de hardware, software y datos al servicio de


una organizacin (empresa, institucin, centro de estudios, etc.). Existen dos fases en la
vida de una base de datos: la etapa de preparacin y puesta en marcha, y la etapa de
explotacin. Esta ltima es el objetivo de todo el sistema, y las tareas preparatorias se
realizan antes de entrar en esa fase de utilidad para la organizacin.
Un lenguaje para manejar bases de datos se compone de un conjunto o
repertorio de instrucciones, al igual que en un lenguaje de programacin habitual. Debido
a la clasificacin de las tareas que se realizan sobre la base de datos en dos grupos, se
suelen distinguir dos sublenguajes, cada uno de los cuales sirve para un tipo de actividad
diferente. En particular, en los lenguajes sobre bases de datos relacionales se distinguen
dos partes:
a) DDL (Data Description Language, lenguaje de descripcin de datos). Es el
lenguaje utilizado para la creacin (y mantenimiento) de la estructura de la
base de datos. Con este lenguaje se definen y modifican los esquemas de las
relaciones, se crean o destruyen ndices y se eliminan relaciones. Adems,
pueden definirse vistas y permisos de acceso para los usuarios.

Pg.-56

SQL

b) DML (Data Manipulation Language, lenguaje de manipulacin de datos).


Incluye las instrucciones para consultar la base de datos, as como para
insertar o eliminar tuplas y modificar valores de datos. Este lenguaje es el
utilizado para la fase de explotacin o de trabajo til de la base de datos, y
es empleado por los usuarios finales.
Adems existen tareas en el trabajo sobre una base de datos que no son
propiamente de descripcin ni de manipulacin de datos. Por ejemplo, entran en el tercer
grupo de instrucciones SQL la asignacin de privilegios a un usuario (sentencia
GRANT).

3.6.

FORMAS DE TRABAJAR CON SQL

El lenguaje SQL se utiliza para actuar sobre una base de datos de alguno de
estos modos:
a) De modo interactivo. Desde un terminal se establece una conversacin entre
el usuario y el programa gestor de la base de datos (SGBD). Es similar al
modo en que se mantiene un dilogo con un sistema operativo. Cualquier
orden SQL, sea DDL, DML u otra, puede introducirse por este mtodo, y
no hay restricciones en el orden entre ellas (pueden mezclarse consultas con
creaciones de tablas, por ejemplo). Responde al esquema de trabajo descrito
en la siguiente figura.
Intrprete de
Comandos

SGBD

Usuario

Base de datos

b) Desde un programa. Un usuario ejecuta sobre el sistema operativo una


aplicacin. Esta puede ser de dos tipos:
1. Un programa escrito ntegramente en SQL. Existen extensiones al SQL
que lo dotan de las estructuras de programacin imperativa usuales
(bucles, seleccin). Se trata de un lenguaje procedural que permite
desarrollar programas imperativos que finalmente acceden a la base de
datos va SQL.
2. Un programa escrito en un lenguaje convencional de programacin
parte de cuyo texto est escrito en SQL. A esta variante de utilizacin
del lenguaje se le llama SQL inmerso o embebido, y al lenguaje que
contiene el texto se le conoce como lenguaje husped (host). Las
instrucciones del lenguaje de programacin se ejecutan por el
procedimiento usual, y las instrucciones SQL se le pasan a un mdulo

SQL

Pg.-57

especial de ejecucin del SGBD. Puede verse un esquema en el


siguiente grfico. Una implementacin de SQL embebido establece las
relaciones que deben mantener los objetos de la base de datos con los
objetos del programa husped, as como ciertas restricciones de
funcionamiento.
Intrprete
de SQL

SGBD
Base de datos

Sistema
operativ
o
Programa
de usuario
Ejecucin normal

El modo de trabajo con SQL programado an admite dos variantes:

3.7.

SQL esttico. El programa no admite cambios durante la ejecucin. ste es


el mtodo usado en la mayora de las aplicaciones.
SQL dinmico. Si durante la ejecucin vara algn parmetro o parte del
programa se necesita utilizar SQL dinmico. Es menos eficiente que un
programa en SQL esttico y utiliza tcnicas dinmicas de manejo de
variables, lo que hace su uso ms difcil para el programador.

ENTORNO DE TRABAJO

Para el uso del lenguaje SQL es necesario un cierto entorno de trabajo. ste se
compone de varios elementos que se describen a continuacin. Un presunto usuario de
una base de datos bajo SQL debe disponer de:
a) Sistema operativo. La mquina en que el usuario realiza su trabajo se
denomina local. Lo usual es que una base de datos SQL se active sobre una
plataforma multiusuario con varios puestos de trabajo. El ordenador local
no suele tener instalado todo el SGBD, sino que estar distribuido entre
varias mquinas. Por tanto, el usuario deber tener acceso al sistema
operativo o red que se utilice.
b) Aplicacin para conexin con la base de datos. Una vez que el usuario se ha
conectado al sistema operativo, debe conectarse a la base de datos.
c) Acceso a la base de datos. Debe existir como usuario autorizado en la base

Pg.-58

SQL

de datos.
d) Utilidades. Se trata de programas diseados para realizar operaciones sobre
la base de datos. La utilidad ms bsica es un terminal de texto en el que
introducir rdenes SQL.
e) tiles de administracin del sistema. El ABD utilizar para su trabajo
algunas herramientas que estn vedadas al resto de usuarios, como
programas que evalen el rendimiento del sistema o aplicaciones para la
gestin de usuarios.
f) Compiladores. El usuario puede trabajar con SQL slo en modo
interpretado, para lo cual le basta con los tiles enumerados anteriormente.
Pero si desarrolla o simplemente utiliza un programa ya desarrollado por un
programador puede que necesite compilarlo.

3.8.

SQL Y LA INTERCONEXION POR LA RED

La creciente popularidad de la interconexin de computadoras por red durante


los ltimos aos ha tenido un fuerte impacto en la gestin de base de datos y ha dado a
SQL una nueva importancia. En esta arquitectura, tanto el DBMS como los datos fsicos
residen en un mainframe o minicomputadora central, junto con el programa de aplicacin
que acepta entradas desde el terminal de usuario y muestra los datos en la pantalla del
usuario.
Supongamos que el usuario teclea una consulta que requiere una bsqueda
secuencial en una base de datos, como por ejemplo la peticin para hallar la cantidad
media de mercancas de todos los pedidos. El DBMS recibe la consulta, explora la base
de datos para acceder a cada uno de los registros de datos del disco, calcula el promedio
y muestra el resultado en la pantalla terminal. Tanto el procesamiento de la aplicacin
como el procesamiento de la base de datos se producen en la computadora central, y
como el sistema es compartido por muchos usuarios, cada usuario experimenta una
degradacin del rendimiento cuando el sistema est ms cargado.
Arquitectura servidora de archivos
En esta arquitectura, una aplicacin que se ejecuta en una computadora
personal puede acceder de forma transparente a los datos localizados en un servidor de
archivos, que almacena los archivos compartidos. Cuando la aplicacin de PC solicita los
datos de un archivo compartido, el software de red recupera automticamente el bloque
solicitado del archivo en el servidor.
Esta arquitectura proporciona un rendimiento excelente para consultas tpicas,
ya que cada usuario dispone de la potencia completa de una computadora personal
ejecutando su propia copia del DBMS.
Arquitectura cliente/servidor
Muestra la emergente arquitectura cliente/servidor de gestin de base de datos.
En esta arquitectura las computadoras personales estn combinadas en una red de rea

SQL

Pg.-59

local junto con un servidor de base de datos que almacena las bases de datos
compartidas. Las funciones del DBMS estn divididas en dos partes. Los frontales
(fronts-ends) de base de datos, tales como herramientas de consulta interactiva,
generadores de informe y programas de aplicacin, se ejecutan en la computadora
personal. El motor de soporte (back-end) de la base de datos que almacena y gestiona
los datos se ejecuta en el servidor. SQL se ha convertido en el lenguaje de base de datos
estndar para comunicacin entre las herramientas frontales y el motor soporte de esta
arquitectura.
En la arquitectura cliente/servidor, la consulta viaja a travs de la red hasta el
servidor de base de datos como una peticin SQL. El motor de base de datos el servidor
procesa la peticin y explora la base de datos, que tambin reside en el servidor. Cuando
se calcula el resultado, el motor de la base de datos enva de vuelta, a travs de la red,
una nica contestacin a la peticin inicial, y la aplicacin frontal la muestra en la
pantalla del PC.
La arquitectura cliente/servidor reduce el trfico de red y divide la carga de
trabajo de la base de datos. Las funciones ntimamente relacionadas con el usuario, tales
como el manejo de entradas y la visualizacin de datos, se concentran en el PC. Las
funciones de intenso procesamiento de datos, tales como la entrada/salida de archivos y
el procesamiento de consultas, se concentran en el servidor de la base de datos. Lo que
es ms importante, el lenguaje SQL proporciona un interfaz bien definido entre los
sistemas frontales y de soporte, comunicando las peticiones de acceso a la base de datos
de una manera eficiente.
Las implementaciones de SQL Server, Oracle, Informix e Ingres para LAN de
PC y SQLBase de Gupta Technologies utilizan este enfoque.

3.9.

RESUMEN

Pg.-60

SQL es una herramienta para organizar, gestionar y recuperar datos.


El programa que controla la base de datos se llama sistema de gestin de
base de datos (DBMS).
SQL puede ser usado para restringir la capacidad de un usuario para
recuperar, aadir y modificar datos.
SQL define restricciones de integridad en la base de datos, protegindola de
alteraciones debidas a actualizaciones inconsistentes o fallos del sistema.
SQL es un lenguaje cliente/servidor.
SQL es un lenguaje de bases de datos distribuidos. Los datos de una base de
datos pueden estar distribuidos entre muchos sistemas informticos
conectados.

SQL

Los proveedores de DBMS basados en SQL ofrecen sus productos para un


rango de computadoras de distintos sistemas operativos.
En los lenguajes sobre bases de datos relacionales se distinguen dos partes:
DDL y DML.
Con SQL se puede trabajar en modo interactivo y desde un programa.

SQL

Pg.-61

3.10. EJERCICIOS
1) Localizar al administrador de la base de datos que se tenga disponible.
Averiguar que tareas realiza durante las fases de puesta en marcha de una
base de datos y durante el mantenimiento posterior.
2) Poner ejemplos de tareas que puedan desarrollar sobre una base de datos un
usuario final y un programador.
3) De entre las operaciones sobre tablas ya conocidas, cules corresponden al
DML y cules DDL?
4) Poner ejemplos de usos de una base de datos en que convenga el uso
interpretado del lenguaje SQL y otros en que convenga el uso desde un
programa.

Pg.-62

SQL

TEMA IV
GRAMATICA DE SQL

4.1.

SENTENCIAS

4.2.

NOMBRES

4.3.

TIPOS DE DATOS

4.4.

CONSTANTES

4.5.

EXPRESIONES

4.6.

FUNCIONES INTERNAS

4.7.

RESUMEN

SQL

Pg.-63

Notas

Pg.-64

SQL

4.1. SENTENCIAS
El lenguaje SQL consta de unas treinta sentencias, que a continuacin se
resumen. Cada sentencia demanda una accin especfica por parte del DBMS, tal como
la creacin de una nueva tabla, la recuperacin de datos o la insercin de nuevos datos
en la base de datos.
Sentencia
Manipulacin de datos
SELECT
INSERT
DELETE
UPDATE

Descripcin
Recupera datos de la BD
Aade nuevas filas de datos de la BD
Suprime filas de la BD
Modifica datos existentes en la BD

Definicin de datos
CREATE TABLE
DROP TABLE
ALTER TABLE
CREATE VIEW
DROP VIEW
CREATE INDEX
DROP INDEX
CREATE SYNONUM
DROP SYNONUM
COMMENT
LABEL

Aade una base de datos a la BD


Suprime una tabla de la BD
Modifica la estructura de una tabla existente
Aade una nueva vista a la BD
Suprime una lista de la BD
Construye un ndice para una columna
Suprime el ndice para una columna
Define un alias para un nombre de tabla
Suprime un alias para un nombre de tabla
Define comentarios para una tabla
Define el ttulo de una columna

Control de acceso
GRANT
REVOKE

Concede privilegios de acceso a usuarios


Suprime privilegios de acceso a usuarios

Control de transacciones
COMMIT
ROLLBACK

Finaliza la transaccin actual


Aborta la transaccin actual

SQL programtico
DECLARE
EXPLAIN

Define un cursor para una consulta


Describe el plan de acceso a datos para una
consulta
Abre un cursor para recuperar resultados de
consulta
Recupera una fila de resultados de consulta
Cierra un cursor
Prepara una sentencia SQL para ejecucin
dinmica
Ejecuta dinmicamente una sentencia SQL
Describe una consulta preparada

OPEN
FETCH
CLOSE
PREPARE
EXECUTE
DESCRIBE

SQL

Pg.-65

Todas las sentencias SQL tienen la misma forma bsica ilustrada en la siguiente
figura:
Verbo

Nombre de tabla

Clusulas

DELETE FROM INFVENTAS


Palabras clave

WHERE

Nombres de columna

VENTAS < 2000.00


Constante

Todas las sentencias SQL comienzan con un verbo, una palabra clave que
describe lo que la sentencia hace. CREATE, INSERT, DELETE y COMMIT son verbos
tpicos. La sentencia contina con una o ms clusulas. Una clusula puede especificar
los datos sobre los que debe actuar la sentencia, o proporcionar ms detalles acerca de lo
que la sentencia se supone que hace. Todas las clusulas comienzan tambin con una
palabra clave, tal como WHERE, FROM, INTO y HAVING. Algunas clusulas son
opcionales; otras son necesarias. La estructura y contenido especficos varan de una
clusula a otra. Muchas clusulas contienen nombres de tablas o columnas; algunas
pueden contener palabras claves adicionales, constantes o expresiones.Generalmente es
buena idea evitar palabras clave al nombrar tablas y columnas.
La siguiente tabla lista las palabras clave incluidas en el estndar SQL.
ADA
ALL
AND
ANY
AS
ASC
AUTHORIZATIO
N
AVG
BEGIN
BETWEEN
BY
C
CHAR
CHARACTER
CHECK
CLOSE
COBOL
COMMIT

CURRENT
CURSOR
DEC
DECIMAL
DECLARE
DEFAULT
DELETE

GO
GOTO
GRANT
GROUP
HAVING
IN
INDICATOR

OF
ON
OPEN
OPTION
OR
ORDER
PASCAL

SOME
SQL
SQLCODE
SQLERROR
SUM
TABLE
TO

DESC
DISTINCT
DOUBLE
END
ESCAPE
EXEC
EXISTS
FETCH
FLOAT
FOR
FOREIGN

INSERT
INT
IINTEGER
INTO
IS
KEY
LANGUAGE
LIKE
MAX
MIN
MODULE

PLI
PRESICION
PRIMARY
PRIVILEGES
PROCEDURE
PUBLIC
REAL
REFERENCES
ROLLBACK
SCHEMA
SECTION

UNION
UNIQUE
UPDATE
USER
VALUES
VIEW
WHENEVER
WHERE
WITH
WORK

A lo largo de todo este manual, las formas aceptables de una sentencia SQL se
ilustran mediante un diagrama sintctico, como el que se muestra en el siguiente grfico.

Pg.-66

SQL

DELETE FROM nombre de tabla


WHERE condicin de bsqueda

Una sentencia SQL vlida o una clusula se construye siguiendo la lnea a


travs del diagrama. Las palabras claves del diagrama sintctico y de los ejemplos (tales
como DELETE y FROM) se muestran siempre en maysculas, pero casi todas las
implementaciones SQL aceptan las palabras clave tanto en maysculas como en
minsculas, y con frecuencia es ms conveniente declararlas efectivamente en
minsculas.
Los tems variables de una sentencia SQL (tales como el nombre de una tabla y
la condicin de bsqueda en el grfico anterior) se muestran en cursiva minscula. Es
cuestin del usuario especificar el tem adecuado cada vez que utilice la sentencia. Las
clusulas y palabras clave opcionales, tales como la clusula WHERE del grfico anterior
se indican mediante caminos alternativos dentro del diagrama sintctico. Cuando se
ofrece una eleccin de palabras clave opcionales, la opcin por omisin (es decir, el
comportamiento de la sentencia si no se especifica palabra clave) est subrayada.

4.2.

NOMBRES

Los objetos de una base de datos basada en SQL se identifican asignndoles


nombres nicos. Los nombres se utilizan en las sentencias SQL para identificar el objeto
de la base de datos sobre la que la sentencia debe actuar. El estndar SQL especifica
nombres de tabla (que identifican tablas), nombres de columna (que identifican
columnas) y nombres de usuario (que identifican usuarios de la base de datos). Muchas
implementaciones SQL contemplan objetos nominados adicionalmente, tales como
procedimientos almacenados (Sybase y SQL Server), relaciones clave primaria/clave
ajena (DB2) y formularios de entrada de datos (Ingres).
El estndar SQL especifica que los nombres deben contener de 1 a 18
caracteres, comenzar con una letra, y que no pueden contener espacios o caracteres de
puntuacin especiales. En la prctica los nombres contemplados por los productos
DBMS basados en SQL varan significativamente. DB2, por ejemplo, restringe los
nombres de usuario a ocho caracteres, pero permite 18 caracteres en los nombres de
tablas y columnas. ORACLE permite nombre de tablas y columnas de 30 caracteres, y
muchas otras implementaciones SQL tambin permiten nombres ms largos. Los
diferentes productos tambin se diferencian en los caracteres especiales que permiten en
los nombres de tablas. Para conseguir portabilidad es mejor mantener los nombres
relativamente breves y evitar el uso de caracteres especiales.
Nombres de tabla

SQL

Pg.-67

Cuando se especifica un nombre de tabla en una sentencia SQL, se presupone


que se refiere a una de las tablas propias (es decir una tabla ya creada). Con el permiso
adecuado, tambin se puede hacer referencia a tablas propiedad de otros usuarios,
utilizando un nombre de tabla cualificado. Un nombre de tabla cualificado especifica el
nombre del propietario de la tabla junto con el nombre de la tabla, separados por un
punto (.). Por ejemplo, la tabla CUMPLEAOS, propiedad del usuario de nombre SAM,
tiene el nombre de tabla cualificado.
SAM.CUMPLEAOS

Un nombre de tabla cualificado puede ser utilizado generalmente dentro de una


sentencia SQL en cualquier lugar donde pueda aparecer un nombre de tabla.
Nombres de columna
Cuando se especifica un nombre de columna en una sentencia SQL, SQL puede
determinar normalmente a qu columna se refiere a partir del contexto. Sin embargo, si
la sentencia afecta a dos columnas con el mismo nombre correspondientes a dos tablas
diferentes, debe utilizarse un nombre de columna cualificado para identificar sin
ambigedad la columna designada. Un nombre de columna cualificado especifica tanto el
nombre de la tabla que contiene la columna como el nombre de la columna, separados
por un punto (.). Por ejemplo, la columna de nombre VENTAS de la Tabla
REPVENTAS tiene el nombre de columna cualificado:
REPVENTAS. VENTAS

Si la columna procede de una tabla propiedad de otro usuario, se utiliza un


nombre de tabla cualificado en el nombre de columna cualificado. Por ejemplo, la
columna DIA_MES de la Tabla CUMPLEAOS propiedad del usuario SAM se
especifica mediante el nombre de columna cualificado completo:
SAM.CUMPLEAOS.DIA_MES

Los nombres de columna de cualificados se pueden utilizar generalmente en una


sentencia SQL en cualquier lugar en el que pueda aparecer un nombre de columna simple
(no cualificado); las excepciones se indican en las descripciones de las sentencias SQL
individuales.

4.3.

TIPOS DE DATOS

SQL define una serie de tipos de datos que va a gestionar. El propsito de la


definicin de tipos es mltiple.
a) Es necesario conocer el tamao a reservar para cada uno de los datos
nuevos que se van a introducir.

Pg.-68

SQL

b) Dividiendo los datos en diferentes tipos podemos implementar restricciones


de integridad.
Ejemplo: Dato tipo fecha: 17/13/97. Mes entre 1 y 12.
c) Una buena definicin de los tipos de datos ayuda a los administradores y
programadores en su tarea.
SQL define los siguientes tipos de datos:
1) Nmeros exactos.

Nmeros enteros: INT INTEGER. Hace referencia a un tipo de dato


entero de 32 bits (0 y 232).
Nmeros enteros cortos: SMALLINT. Hace referencia a un tipo de dato
entero de 16 bits (0 y 216).
TINYINT. Tiene un rango de nmeros de 0 a 255. Ocupa 1 byte.

2) Nmeros decimales.

NUMERIC (precision, escala)


DECIMAL (precision, escala)

En ambos hay que especificar dos datos, la precisin, que es el nmero de


dgitos en el nmero; y la escala, que es la cantidad de dgitos que estn a la
derecha del punto decimal. La diferencia entre ellos es que NUMERIC tiene una
longitud (parte entera ms decimal) fija, mientras que esto no ocurre con
DECIMAL. Tanto en un tipo como en el otro, la escala<=precisin.
3) Nmeros aproximados.

Nmeros reales; REAL. Define un nmero decimal de coma flotante con


hasta 7 dgitos de mantisa. 4 Byte de almacenamiento.
Nmeros flotantes: FLOAT (precision). Es necesario especificar la
precisin del nmero.Ocupa 8 Byte de almacenamiento. Tiene 15 digitos
de precisin.

4) Cadenas de caracteres.

Caracteres fijos: CHAR (numero) CHARACTER (numero). Siempre


se almacena el nmero de caracteres indicado en numero, an cuando
sea necesario rellenar los espacios sobrantes con caracteres en blanco
porque la longitud de la cadena de caracteres sea inferior a numero.
Caracteres variables: VARYING CARCTER (VARCHAR). Slo se
almacenan los caracteres que se hayan introducido, hasta un mximo
que viene dado por numero.

SQL

Pg.-69

VARCHAR(numero)
Cadenas de bits.

BIT (numero)

Teniendo numero el mismo significado que en el tipo anterior.


Habitualmente las cadenas de bits se usan para almacenar flags (banderas)
para el control de algn proceso.
5) Datos de fecha y hora.

DATETIME: Resulta de la unin de un tipo DATE y de un tipo TIME.


Est compuesto de 2 segmentos de 4 byte cada uno. 2:00 pm 1/1/97 se
introducen entre comillas.

6) Otros tipos de datos.


Los datos vistos en los puntos anteriores son soportados, por todos los
sistemas gestores de bases de datos relacionales, muchos de ellos definen otros tipos
de datos importantes de conocer en cada caso particular puesto que en muchos tipos
de datos hay una restriccin implcita que podemos aprovechar para colaborar en la
integridad de los mismos. Los sistemas casi siempre incorporan la posibilidad de que
el usuario puede definir sus propios tipos de datos.
Ejemplo: MONEY. Para almacenar unidades monetarias.Ocupa 8 byte de
almacenamiento. SMALLMONEY.
Tipos de datos del sistema gestor de bases de datos relacionales SQL Server:

Pg.-70

Cadenas de caracteres de longitud variable: Casi todos los productos SQL


incorporan los datos VARCHAR, que permiten que una columna almacene
cadena de caracteres que varan de longitud de una fila a otra, hasta una
longitud mxima. El estndar SQL Slo especifica cadenas de longitud fija,
que se rellenan por la derecha con caracteres en blanco adicionales.

Importes monetarios: Muchos productos SQL incorporan un tipo


MONEY, que se almacena generalmente como nmero decimal o en
coma flotante. El tener un tipo monetario distinto permite al DBMS dar
formato adecuadamente a los importes monetarios cuando son
visualizados.

Fechas y horas: Incorporar valores para fechas y horas es tambin


habitual en los productos SQL, aunque los detalles varan ampliamente
de un producto a otro. Generalmente se permiten variadas

SQL

combinaciones de fechas, horas, instantes, intervalos de tiempo y


aritmtica de fecha y hora. El estndar SQL permite una elaborada
especificacin para los tipos de datos TIMESTAMP e INTERVAL, que
incluye la gestin de zonas horarias y precisin en el tiempo (por
ejemplo, decenas o centenas de segundos).

Texto extenso: Varias bases de datos basadas en SQL permiten columnas


que almacenan cadenas de texto extensas (tpicamente de hasta 32000 o
65000 caracteres), y en algunos casos incluso ms. El DBMS restringe
generalmente el uso de estas columnas en consultas y bsquedas
interactivas.
Text hasta 2147 millones de caracteres. nText hasta 2147 millones de
caracteres unicode.

Flujo de bytes no estructurados: Oracle y otros varios productos


permiten almacenar y recuperar secuencias de byte de longitud variable
sin estructurar. Las columnas que contienen estos datos se utilizan para
almacenar imgenes de vdeo comprimidas, cdigo ejecutable y otros
tipos de datos sin estructurar.

Caracteres asiticos: DB2 permite cadenas de longitud fija y de


longitud variable de caracteres de 16 bits utilizados para representar
caracteres Kanji y otros caracteres asiticos. Sin embargo, la bsqueda y
ordenacin de estos tipos GRAPHIC y VARGRAPHIC no est
permitida.

SQL

Pg.-71

4.4.

CONSTANTES

En algunas sentencias SQL, un valor de datos numricos, de caracteres o de


fecha debe de ser expresado en forma textual. Por ejemplo, en esta sentencia INSERT,
que aade un vendedor a la base de datos:
INSERT INTO REPVENTAS (NUM_EMPL, NOMBRE, CUOTA, CONTRATO, VENTAS)
VALUES (115, Dennis Irving, 175000.000, 21-JUN-90, 0.00)

El valor para cada columna en la fila recin insertada se especifica en la clusula


VALUES. Los valores de datos constantes tambin se utilizan en las expresiones, tal
como por ejemplo en la sentencia SELECT:
SELECT CIUDAD
FROM OFICINA
WHERE OBJETIVO > (1.1 * VENTAS) + 10000.00

El estndar SQL ANSI/ISO especifica el formato de las constantes numricas y


de caracteres, o literales, que representan valores de datos especficos. Estos convenios
son seguidos por la mayora de las implementaciones SQL.
Constantes numricas
Las constantes enteras y decimales (tambin denominadas literales numricos
exactos) se escriben como nmeros decimales ordinarios dentro de las sentencias SQL,
com un signo ms o menos opcional delante.
21

-375

2000.00

+497500.8778

No se debe poner una coma entre los dgitos de una constante numrica, y no
todos los dialectos de SQL permiten el signo ms inicial, por lo que es mejor evitarlo.
Para los datos monetarios, la mayora de las implementaciones SQL utilizan simplemente
constantes enteras o decimales, aunque algunas permiten que la constante sea
especificada con un smbolo de moneda.
$0.75

$5000.00

$-567.89

Las constantes en coma flotante (tambin llamadas literales numricos


aproximados) se especifican utilizando la notacin E hallada comnmente en lenguajes
de programacin tales como C y FORTRAN. He aqu algunas constantes SQL en coma
flotante vlidas:
1.5E3

-3.14159E1

2.5E-7

0.783926E21

La E se lee por diez elevado a, de modo que la primera constante es 1.5 por
diez elevado a tres, 1.500.

Pg.-72

SQL

Constantes de cadena
El estndar especifica que las constantes SQL de caracteres han de ir encerradas
entre comillas simples o dobles , como en los siguientes ejemplos:
Jones, John J. New York Oeste
Jones, John J. New York Oeste

SQL permite nombres de columnas que contengan blancos y otros caracteres


especiales. Cuando estos caracteres aparecen como nombres en una sentencia SQL,
deben ir entre corchetes. Por ejemplo, si la columna NOMBRE de la tabla REPVENTAS
fuera en realidad NOMBRE COMPLETO en una base de datos SQL, esta sentencia
SELECT sera vlida.
SELECT [NOMBRE COMPLETO], VENTAS, CUOTA
FROM REPVENTAS
WHERE [NOMBRE COMPLETO] = Jones, John J.

Constantes de fecha y hora


En productos SQL que incluyen datos fecha/hora, los valores constantes para las fechas,
horas e intervalos de tiempo se especifican como constantes de cadenas de caracteres.
SQL Server tambin permite datos fecha/hora y acepta una variedad de
formatos diferentes para las constantes de fecha y hora. El DBMS acepta
automticamente todas las formas alternativas, y se pueden entremezclar si as se quiere.
He aqu algunos ejemplos de constantes de fecha legales en SQL Server.
March 15 1990,

Mar 15 1990, 3/15/1990, 3-15-90, 1990 MAR 15

Y he aqu algunas constantes de tiempos legales:


15:30:25

3:30:25 PM

3:30:25 pm

3 PM

Constantes simblicas
Adems de las constantes suministradas por el usuario, el lenguaje SQL incluye
constantes simblicas especiales que devuelven valores de datos mantenidos por el
propio DBMS.
El estndar especifica solamente una nica constante simblica, pero la mayora
de los productos SQL proporcionan mucha ms. Las constantes simblicas que se
encuentran habitualmente en las implementaciones SQL estn listadas en la siguiente
tabla:

SQL

Pg.-73

Constante
USER

CURRENT_TIMESTAMP

Descripcin
El nombre de usuario bajo el cual se est accediendo
actualmente a la base de datos (DB2, SQL/DS, Oracle,
VAX, SQL, SQLBase y tambin especificado en el
estndar ANSI/ISO.
La fecha y hora actuales (DB2, SQL/DS).

Generalmente, una constante simblica puede aparecer en una sentencia SQL en


cualquier lugar en el que pudiera aparecer una constante ordinaria del mismo tipo de
dato. El estndar adopt las constantes simblicas ms tiles de las implementaciones
SQL2 actuales tales como, CURRENT_TIMESTAMP, USER, y SESSION_USER .
Algunos productos SQL, incluyendo SQL Server, proporcionan acceso a
valores del sistema mediante funciones internas en lugar de hacerlo con constantes
simblicas. La versin SQL Server es:
SELECT NOMBRE, CONTRATO
FROM REPVENTAS
WHERE CONTRATO > GETDATE ()

4.5.

EXPRESIONES

Las expresiones se utilizan en el lenguaje SQL para calcular valores que se


recuperan de una base de datos y para calcular valores utilizados en la bsqueda en la
base de datos. Por ejemplo, esta consulta calcula las ventas de cada oficina como
orcentaje de su objetivo:
SELECT CIUDAD, OBJETIVO, VENTAS, (VENTAS/OBJETIVO) * 100
FROM OFICINAS

y esta consulta lista las ciudades de las oficinas cuyas ventas son superiores a $50.000
por encima del objetivo:
SELECT CIUDAD
FROM OFICINAS
WHERE VENTAS > Objetivo + 50000.00

El estndar SQL ANSI/ISO especifica cuatro operaciones aritmticas que


pueden ser utilizadas en expresiones: suma (X+Y), resta (X-Y), multiplicacin (X*Y) y
divisin (X/Y). Tambin se pueden utilizar parntesis para formar expresiones ms
complicadas, como la siguiente:
(VENTAS * 1.05) (OBJETIVO * 0.95)

Estrictamente hablando, los parntesis no son necesarios en esta consulta, ya

Pg.-74

SQL

que el estndar especifica que la multiplicacin y la divisin tienen una precedencia


superior a la suma y la resta. Sin embargo, deberan utilizarse siempre los parntesis para
lograr que las expresiones no sean ambiguas, ya que diferentes dialectos de SQL pueden
utilizar reglas diferentes. Adems los parntesis incrementan la legibilidad de la sentencia
y hacen que las sentencias de SQL programado sean ms fciles de mantener.
El estndar tambin especifica conversin automtica de tipos de datos desde
nmeros enteros a decimales, y desde nmeros decimales a nmeros en coma flotante,
segn se precise.
Por tanto, estos tipos de datos se pueden mezclar en una expresin numrica.
Muchas implementaciones SQL incluyen otros operadores y permiten operaciones sobre
datos de caracteres y de fechas. SQL, por ejemplo, incluye un operador concatenacin
de cadenas, escrito con el smbolo +. Si dos columnas llamadas NOMBRE y
APELLIDO contiene los valores Jim y Jackson, entonces esta expresin:
(Mr./Mrs. + NOMBRE + APELLIDO)

produce la cadena Mr./Mrs. Jim Jackson. Como ya se ha mencionado, tambin permite


la suma, y resta de datos DATE, TIME y TIMESTAMP, para aquellas ocasiones en las
que estas operaciones tengan sentido.

4.6.

FUNCIONES INTERNAS

Es posible que en alguna ocasin estemos interesados en localizar un registro


que tome un valor en uno o varios campos que desconocemos, pero que posee por algn
motivo una propiedad interesante para nosotros. Un ejemplo clarsimo puede ser nuestro
deseo de conocer cual es el artculo del que menos unidades tenemos, por ejemplo, para
realizar el pedido con ms urgencia o del que ms unidades hay en el almacn para no
realizarlo, o el nmero medio de unidades para cada artculo presentes en almacn.
SQL dispone de lo que se denominan funciones integradas o funciones de
conjuntos para resolver estas cuestiones. Las ms habituales son:

MAX (mximo)
MIN (mnimo)
AVG (media)
SUM (suma)
COUNT (total)

Ejemplo: Hallar el producto, mostrando su referencia y descripcin del que menos


unidades tenemos en almacn.
SELECT cod_art, des_art, MIN (cantidad) FROM artculos.
Funciones integradas en SQL.

SQL

Pg.-75

Funcin
CAST (valor AS tipo_dato)
CONVERT (cadena USING conv)
CURRENT_TIMESTAMP ()
LOWER (cadena)
SUBSTRING (fuente,n , lon)
UPPER (cadena)
LEFT(cadena,lon)
LEN(cadena)
LTRIM(cadena)
RTRIM(cadena)
STR(cadena)
RIGHT(cadena, n elem)

Devuelve
El valor, convertido al tipo de dato
especificado (por ejemplo, una fecha
convertida a una cadena de caracteres)
Cadena convertida segn especifique la
funcin de conversin indicada
Fecha y hora actuales.
Convierte una cadena de tipo varchar a
minsculas.
Extrae de la cadena fuente una subcadena ,
comenzando en el carcter n-simo, con
una longitud lon
Convierte una cadena de tipo varchar a
maysculas.
Devuelve de la cadena una subcadena
comenzando por la izquierda y con una
longitud lon.
Devuelve la longitud de la cadena.
Quita los blancos de la izquierda en la
cadena.
Quita los blancos de la derecha en la
cadena.
Devuelve la cadena alineada a la derecha.
Devuelve el nmero de elementos de la
cadena que estn a la derecha.
RIGHT(CASA,2) = SA

ASCII(cadena)

4.7.

Devuelve el n ASCII correspondiente a la


derecha

RESUMEN

Este captulo ha descrito los elementos bsicos del lenguaje SQL. La estructura
bsica del SQL se puede resumir tal como se expresa seguidamente:

Pg.-76

El lenguaje SQL incluye unas treinta sentencias, cada una formada por un
verbo y una o ms clusulas. Cada sentencia efecta una nica funcin
especfica.

Las bases de datos basadas en SQL pueden almacenar varios tipos de datos
entre los que se incluyen texto, enteros, nmeros, nmeros decimales,
nmeros de coma flotante y, generalmente, varios tipos ms especficos del
vendedor.

Las sentencias SQL pueden incluir expresiones que combinen nombres de

SQL

columnas, constantes, y funciones internas, utilizando


aritmticos y otros operadores especficos del vendedor.

operadores

Las variaciones de los tipos de datos, constantes y funciones internas hacen


que la portabilidad de las sentencias SQL sea ms difcil de lo que en un
principio pudiera parecer.

Los valores NULL proporcionan un modo sistemtico de gestionar los


datos que faltan o son implicados dentro del lenguaje SQL.

SQL

Pg.-77

Pg.-78

SQL

TEMA V
CREANDO BASES DE DATOS Y TABLAS

5.1.

BASES DE DATOS DE SISTEMAS

5.2.

BASES DE DATOS SQL SERVER

5.3.

PGINAS, EXTENSIONES Y FICHEROS

5.4.

ENTRAR EN ANALIZADOR DE CONSULTAS

5.5.

CREACION DE BASES DE
ANALIZADOR DE CONSULTAS

5.6.

MODIFICACION DE BASES DE DATOS

5.7.

SELECCIN DE BASES DE DATOS ACTIVA

5.8.

ELIMINACION DE BASES DE DATOS

5.9.

PROCEDIMIENTOS ALMACENADOS ADICIONALES

DATOS

DESDE

EL

5.10. DEFINICION DE TABLAS (CREATE TABLE)


5.11. ELIMINACION DE UNA TABLA (DROP TABLE)
5.12. MODIFICACION DE UNA DEFINICION DE TABLA (ALTER
TABLE)

SQL

Pg.-79

5.13. INTRODUCCION DE DATOS EN LA BASE DE DATOS


5.13.1. Insertar una fila
5.13.2. Insertar varias filas
5.13.3. Carga masiva

5.14. SUPRESION DE DATOS DE LA BASE DE DATOS


5.15. MODIFICACION DE DATOS DE LA BASE DE DATOS
5.16. RESUMEN
5.17. EJERCICIOS

Pg.-80

SQL

5.1.

BASES DE DATOS DE SISTEMAS


SQL Server es un buen ejemplo de un sistema autoportante: controla las
tablas de datos segn las reglas que ellos mismos establecen a travs de las tablas
de datos. Cuando instala el software de SQL Server, automticamente se crean
cuatro bases de datos conocidas como bases de datos del sistema. Normalmente se
evitar su modificacin, puesto que un erro puede hacer que deje de funcionar el
servidor. De todas formas es conveniente que se sepa cmo funcionan estas bases
de datos, cuyos nombres son master, Model, tempdb y msdb.
Master
Es la encargada de guardar la informacin que se utiliza con la mayora de las
operaciones bsicas SQL Server. En esta base de datos se encuentra la informacin
sobre las cuentas de los usuarios y la configuracin del sistema. Asimismo, tiene
informacin sobre dnde localizar las bases de datos que crean los clientes. Si le
pasa algo a esta base de datos, se encontrar metido en problemas. Conviene que
se hagan peridicamente copias de seguridad.
Model
La base de datos Model es la nica de las cuatro que se puede modificar con
ciertos sucesos. Siempre que se crea una base de datos, SQL Server inicia una
copia de Model. Si quiere que algn elemento aparezca en todas las bases de datos
de su servidor (por ejemplo, cierto tipo de datos que se utilizan en su empresa),
tendrn que aadirlo a la base de datos model para que cada vez que se haga una
copia de ella, se incluya dicho elemento.
No debe borrarse esta base de datos, puesto que SQL Server la usa com plantilla
para todas las bases de datos nuevas, y si no la encuentra, no funcionar.
Tempdb
La base de datos tempdb es una parte de SQL Server. En ella se almacenan todas
las tablas temporales que se generan durante la ejecucin de los proceso. La base
de datos tempdb se crea automticamente cada vez que se inicia SQL Server y no
hay ninguna razn por la que deba tocarse.
Msdb
Esta base de datos se utiliza para que el agente SQL Server guarde la informacin
que necesita para procesar trabajos y alertas. Nunca deber modificarse MSDB
directamente. Debe utilizarse la interfaz del usuario para crear, modificar o eliminar
cualquier objeto del Agente SQL Server.

5.2.

BASES DE DATOS DE SQL SERVER

SQL

Pg.-81

Una de las formas que tiene SQL Server para proteger los datos es a travs de
registros de transacciones, bases de datos especiales que se utilizan para registrar la
actividad de un cliente.
REGISTRO DE TRANSACCIONES
Cuando se crea una base de datos, SQL Server crea automticamente un registro
de transacciones para ella. Este registro es un archivo especial en el que se guarda
toda la actividad relacionada con dicha base de datos. Siempre que un usuario
agregue, elimine o modifique la informacin de la base de datos, el registro de
transacciones tomar nota de la accin. Por defecto, estos registros tienen el mismo
nombre que la base de datos, pero utilizan la extensin .ldf, aunque a la hora de crear
la base de datos puede darle cualquier nombre.
El registro de transacciones proporciona cierto nivel de seguridad a los datos de
SQL Server. En caso de fallo, es posible aplicar las transacciones que se encuentran en
este archivo en otra copia de la base de datos. Por ejemplo, supongamos que se hace
una copia de seguridad de la base de datos de los clientes el lunes a las diez de la
maana. Si el dispositivo encargado del mantenimiento de la base de datos falla el
viernes a las cinco de la tarde, se pueden aplicar los registros de la semana a la copia
de la base de datos que se hizo el lunes, con lo que se recuperar el trabajo de la
semana.
Para protegerse de los fallos del hardware, el registro de transacciones se ha de
guardar en un dispositivo fisico distinto de aquel en el que se encuentra la base de
datos. Para obtener una proteccin mxima, conviene hacer un mirror (una copia) de
ambos dispositivos. Adems, tiene que hacer un backup de la base de datos principal
con cierta regularidad para que el tamao del registro de transacciones no se dispare.
Para mantener el archivo de registro, SQL Server escribe las ltimas acciones al
principio del fichero. Cuando se modifican los datos, SQL Server da los siguientes
pasos:
1. El cambio se guarda en el registro de transacciones.
2. Las pginas de datos modificadas se guardan en la memoria cach de
almacenamiento.
3. Se efectan los cambios en las pginas que se encuentran en la memoria
cach.
4. En el proceso de comprobacin se guardan los cambios en el disco.
El proceso de comprobacin es un procedimiento interno de SQL Server que
escribe todos los cambios de la memoria cach en el disco duro en el que se encuentra
la base de datos. Si lo desea, se puede ejecutar manualmente CHECKPOINT en
Transact_SQL para obligar a que se efecte el proceso de comprobacin.

Pg.-82

SQL

5.3.

PGINAS, EXTENSIONES Y FICHEROS

Tres son los trminos relacionados con SQL Server con los que hay que
familiarizarse:
-

Pginas.
Extensiones.
Ficheros.

Una pgina es la unidad ms pequea de almacenamiento de SQL Server. Tiene


8K, o lo que es lo mismo, 8.192 bytes. Las pginas de una base de datos nicamente
guardarn informacin de un solo objeto (por ejemplo, las filas de una tabla), aunque lo
normal es que stos ocupen varias pginas. Cada una de ellas tiene 96 bytes reservados
para guardar informacin, como el objeto al que pertencen y la cantidad de espacio libre
que les queda. Como una fila de datos no puede ocupar varias pginas, las filas de las
tablas SQL Server tienen una limitacin de tamao de 8K.
Una extensin la forman ocho pginas consecutivas, o lo que es lo mismo, 64K.
Ahora que los objetos ocupan una pgina, es posible que las pginas de una misma
extensin tengan objetos distintos. Cuando una tabla o un ndice crece hasta el punto en
que ocupa ocho pginas de extensiones distintas, se reorganizan para que se encuentren
todas juntas. SQL Server agrega las extensiones que sean necesarias hasta que se alcance
el lmite de espacio del dispositivos de almacenamiento con el que trabaja.
SQL Server guarda la informacin directamente en ficheros (o archivos) del
sistema operativo. Por defecto, las extensiones de archivos que se utilizan son los
siguientes:
o Archivos con la extensin .mdf son los ficheros de datos principales.
o Archivos con la extensin .ndf son los ficheros de datos secundarios,
encargados de los datos adicionales definidos en el archivo principal.
o Ficheros con la extensin .ldf son los archivos de registro.
Los archivos de SQL Server crecen automticamente segn se les van aadiendo
datos. Al crecer una base de datos se puede especificar el incremento y el tamao
mximo de dichos ficheros.

5.4.

ENTRAR EN ANALIZADOR DE CONSULTAS

Para hacer pruebas con estas sentencias SELECT utilizaremos una herramienta,
que viene dentro del paquete de SQL Server y que se llama analizador de consultas.
Para poner en marcha el analizador de consultas deberemos acudir al men
Inicio de Windows NT 4, seleccionar Programas, marcar SQL Server y dentro de l

SQL

Pg.-83

analizador de consultas.
Nos mostrar la pantalla de conexin al servidor de SQL Server.
Seleccionaremos el nombre del ordenador Server donde se encuentra instalado el
programa SQL Server. Si se encuentra en la maquina donde nos encontramos entonces
se puede seleccionar local. Nos pedir el nombre de usuario y contrasea con la que se
har la autentificacin, usaremos las mismas que tiene Windows NT en su base de datos
del Dominio.
Tras ello aparecer la ventana principal de analizador de consultas. Se muestra
una ventana donde pone Query e introduciremos la instruccin en lenguaje SQL
(concretamente Transact SQl, que es el dialecto de Microsoft SQL Server).
Por defecto nos aparecer conectada a Master, aunque podemos seleccionar
cualquier otra base de datos de nuestro servidor.
Tenemos dos formas de seleccionar la base de datos sobre la que queremos
lanzar consultas.
Una de ellas, la ms fcil, es desplegar el combo que contiene las bases de datos
disponibles y que se encuentran marcado como DB encima de las pestaas de consulta.
La segunda, la ms curiosa, consiste en enviar una consulta USE con el nombre
de la base de datos. Por ejemplo USE PUBS.
Tras escribir USE PUBS pulsaremos con el ratn la flecha de ejecucin de la
instruccin, o bien pulsaremos la combinacin de teclas F5.
Veremos cmo automticamente queda seleccionada la pestaa Results con la
siguiente frase: comandos completados con xito indica que se ha ejecutado
correctamente.
En la ventana puede volver a escribirse otra instruccin SQL. Pueden escribirse
varias instrucciones SQL de forma consecutiva y ejecutarlas simultneamente al pulsar la
tecla F5.
Como saber quin est conectado al sistema
SQL Server dispone de instrucciones de administracin, las cules siguen el
principio de Codd de que la configuracin de la propia base de datos debe ser accesible
mediante consultas SQL.
Dado que estas consultas implican conocer las tablas de sistema y que stas
pueden variar dependiendo de la versin de SQL Server, Microsoft proporciona una serie
de procedimientos almacenados o Stored Procedures que realizan por nosotros estas

Pg.-84

SQL

consultas.
Los procedimientos almacenados que proporciona Microsoft comienzan
siempre por sp_.
En este caso, para conocer los usuarios conectados a nuestro sistema,
utilizaremos la consulta sp_who.
De hecho lo que estamos obteniendo son los procesos que estn vivos dentro de
SQL Server, no slo los usuarios reales. La informacin que nos aporta es :
Id de proceso,
Estado del proceso,
Nombre del registro de usuario,
Nombre del Host,
Nombre de la base de datos que el usuario usa,
Comando SQL Server recien ejecutado.
Cmo obtener el listado de las tablas de la base de datos
Para obtener el listado de las tablas tambin disponemos de otra stored
procedure que se llama sp_tables:
Cmo obtener la descripcin de los campos de una tabla
Para obtener la descripcin de los campos de una tabla utilizaremos el
procedimiento almacenado llamado sp_columns seguido del nombre de la tabla que
queremos ver. Por ejemplo:
Sp_columns authors

5.5.

CREACION DE BASES DE DATOS DESDE ANALIZADOR


DE CONSULTAS

Para crear una base de datos, hay que estar conectado como administrador del sistema
SA' (o tener el permiso de utilizar CREATE DATABASE), y estar en la base de datos
de sistema master.
El objeto DATABASE debe crearse en primer lugar. Una base de datos contiene todos
los dems objetos.
- El catlogo de base de datos (18 tablas de sistema).
- Los objetos de usuario (tablas, valores por defecto, vistas, reglas, desencadenadores,
procedimientos).
- Los ndices, los tipos de datos, las restricciones de integridad.
- El registro de transacciones.
SQL

Pg.-85

SINTAXIS :
CREATE DATABASE nombre [ON [PRIMARY]
[( [NAME = nombrelgico,]
FILENAME = 'nombreFisico'
[, SIZE = tamao]
[ , MAXSIZE = { tamMax l UNLIMITED } ]
[, FILEGROWTH = valorIncremento] ) [,...]]
[ LOG 0N { <archivo> } ]
[ FOR LOAD | FOR ATTACH ]
NAME

Nombre lgico del archivo.

FILE LENAME Ubicacin y nombre fsico del archivo.


SIZE

Tamao inicial del archivo en megabytes (MB) o kilobyies (KB). El


tamao predeterminado es de 1 megabytes.

MAXSIZE

Tamao mximo del archivo indicado en kilobytes o megabytes (por


defecto megabytes). Si no se indica ningn valor el tamao del archivo
estar limitado por el espacio libre en disco.

UNLIMITED (Sin tamao mximo) el limite es el espacio libre en disco.


FILEGROWTH Esta parmetro se utiliza cuando se precisa aumentar o disminuir el
tamao de los archivos de forma automtica o manual. Este paso puede
precisarse en porcentaje o de forma esttica en kilobytes o megabytes.Las
extensiones poseen un tamao de 64 KB, este es pues el valor mnimo
del paso de incremento que se puede indicar. El fichero ir aumentando
mientras sea necesario y no sobrepase su valor mximo.
LOG 0N

Ubicacin del registro de transacciones.El registro de transacciones


guarda las modificaciones aportadas a los datos.Por cada INSERT,
UPDATE o DELETE, se hace una escritura en el registro antes de la
escritura en la base. La validacin de las transacciones se consigna
tambin en el registro. Este registro sirve para la recuperacin de los
datos en caso de fallo.

FOR LOAD Para crear una base que ser recuperada a partir de una copia de
seguridad.
FOR ATTACH Para crear una base utilizando archivos ya creados. Esta peticin es til
cuando la base se crea con ms de 16 archivos.
Ejemplo:
Pg.-86

SQL

Creacin de la base de datos. Gescom (6 MB) con el registro de transacciones


(2MB).
CREATE DATABASE GESCOM
ON PRIMARY
(name=gescom_data,
filename="c:\mssql7\data\g_data.mdf",
size=6MB,
maxsize=15MB,
filegrowth=1MB)
LOG ON
(name=gescom_log,
filename="c:\mssql7\glog.ldf",
size=2MB,
maxsize=15MB,
filegrowth=1)

5.6.

MODIFICACION DE BASES DE DATOS

Vista la instruccin CREATE DATABASE, no nos ser difcil entender


comparativamente cmo funciona ALTER DATABASE:
ALTER DATABASE nombre
MODIFY FILE
(name=nombrelgico
[,size=tamao]
[, maxsize=tammax]
[FILEGROWTH=valor incremento])
ADD FILE
(name=nombrelgico
, FILENAME=nombrefisico
[,size=tamao]
[, maxsize=tammax]
[FILEGROWTH=valor incremento])
Es posible modificar manualmente el tamao, el tamao mximo y la tasa de aumento de
un archivo de datos con la instruccin ALTER DATABASE.
Aumentar el tamao de un archivo existente:
ALTER DATABASE GESCOM

SQL

Pg.-87

MODIFY FILE
( NAME=GESCOM_DATA,
SIZE=7MB)

Aadir archivos a la base de datos gescom


ALTER DATABASE GESCOM
ADD FILE
(NAME=GESCOM_DATA2,
FILENAME=C:\MSSQL7\DATA\G_DATA2.NDF,
SIZE=3)

5.7.

SELECCION DE BASES DE DATOS ACTIVA

La instruccin USE NombreBaseDatos sirve para seleccionar la base de datos


activa desde la interfaz analizador de consultas.
Desde el momento en que una base de datos est activa, se pueden enviar
consultas SQL contra las tablas de esa base de datos sin necesidad de especificar con el
nombre y un punto a qu base de datos pertenece la tabla.

5.8.

ELIMINACION DE BASES DE DATOS

La instruccin DROP DATABASE NombreBaseDatos permite borrar una base


de datos existente con las siguientes excepciones:

5.9.

No se puede borrar una base de datos cuando est siendo utilizada por otro
usuario.
No se puede borrar la base de datos Model, ya que sta es la que se toma
como patrn para la creacin de nuevas bases de datos.
No se puede borrar la base de datos master, ya que se toma como base de
datos principal de SQL Server.
No se puede borrar la base de datos tempdb, ya que es el lugar donde se
almacenan temporalmente algunos datos de sistema necesarios para el
funcionamiento del SQL Server.

PROCEDIMIENTOS ALMACENADOS ADICIONALES

Para simplificar las consultas a las tablas de sistema, Microsoft ofrece la


posibilidad de trabajar con unos procedimientos almacenados que a continuacin vamos
a detallar:

Pg.-88

SQL

sp_helpdb
Proporciona informacin sobre todas las bases de datos o sobre la base de datos
que suministremos como parmetro, mostrando el tamao en MB, el usuario propietario
de la base de datos, el nmero identificador de la base de datos, el status y la fecha de
creacin.
sp_spaceused
Muestra el espacio consumido y el espacio disponible de la base de datos en
uso.
Sp_rename
Permite modificar el nombre de cualquier objeto definido como tablas, columnas,
indices o tipos definidos por el usuario. No puede cambiar los nombres de la mayora de
objetos del sistema y, de los que puede cambiar, nicamente tendr acceso a aqullos de
los que sea propietario. La sintaxis es :
Sp_rename {nombre_objeto} [, nombre_nuevo] [, tipo_objeto]
El parmetro tipo_objeto permite especificar exactamente qu objeto se est
renombrando en los casos en los que una columna de una tabla tiene el mismo nombre
que un ndice de otra tabla.
Sp_rename pedidos, pedidos2000
La informacin sobre las vistas y los procedimientos se actualiza automticamente en la
tabla del sistema sysobjects cuando se modifica su nombre. Cuando se renombra una
restriccin PRIMARY KEY o UNIQUE, se actualiza tods los ndices asociados. Si se
cambia el nombre de un indice asociado a una clave principal (PRIMARY KEY), Esta
tambin se renombrar.

5.10. DEFINICION DE TABLAS (CREATE TABLE)


La estructura ms importante de una base de datos relacional es la tabla. En una
base de datos multiusuario, las tablas principales son tpicamente creadas una vez por el
administrador de la base de datos y utilizadas luego da tras da.

Creacin de una tabla (CREATE TABLE)


La sentencia define una nueva tabla en la base de datos y la prepara para aceptar
datos. Las diferentes clusulas de la sentencia especifican los elementos de la definicin
de la tabla.

SQL

Pg.-89

En la prctica, la creacin de una nueva tabla es relativamente sencilla. Cuando


se ejecuta una sentencia CREATE TABLE, uno se convierte en el propietario de la tabla
recin creada, a la cual se le da el nombre especificado en la sentencia. El nombre de la
tabla debe ser un nombre SQL legal y no debe entrar en conflicto con el nombre de
alguna otra tabla ya existente. La tabla recin creada est vaca, pero el DBMS la prepara
para aceptar datos aadidos con la sentecia INSERT.
Definiciones de columnas
Las columnas de la tabla recin creada se definen en el cuerpo de la sentencia
CREATE TABLE. Las definiciones de columnas aparecen en una lista separada por
comas e incluida entre parntesis. El orden de las definiciones de las columnas determina
el orden de izquierda a derecha de las columnas en la tabla. Cada definicin especifica:

El nombre de la columna, que se utiliza para referirse a la columna en


sentencias SQL. Cada columna de la tabla debe tener un nombre nico, pero
los nombres pueden ser iguales a los de las columnas de otras tablas. El
nmero mximo de columnas por tabla es de 1024. La longitud mxima de
una lnea (registro, es decir la suma de las longitudes de las columnas) es de
8060 byte (sin contar los datos de texto o imagen).

CREATE TABLE nombre_tabla


(nombrecolumna tipcolumna [restricciones]
[, nombrecolumna .......]
[, restricciones])
[ON grupoarchivo]
nombretabla
nombrecolumna
Tipocolumna
Restricciones
Grupoarchivo

Puede ser de la forma base.propietario.tabla


Nombre de la columna que debe ser nica en la tabla. Puede haber
250 columnas por tabla.
Tipo de sistema o tipo definido por el usuario.
Reglas de integridad (UNIQUE, IDENTITY, REFERENCES,
NULL, DEFAULT ....).
Grupo de archivos sobre el cual se crear la tabla.

Define la Tabla OFICINAS y sus columnas.


CREATE TABLE OFICINAS
(OFICINA INTEGER NOT NULL,
CIUDAD VARCHAR (15) NOT NULL,
REGION VARCHAR (10) NOT NULL,
DIR INTEGER,

Pg.-90

SQL

OBJETIVO MONEY,
VENTAS MONEY NOT NULL)
Define la Tabla PEDIDOS y sus columnas.
CREATE TABLE PEDIDOS
(NUM_PEDIDO INTEGER NOT NULL,
FECHA_PEDIDO DATETIME NOT NULL,
CLIE INTEGER NOT NULL,
REP INTEGER,
FAB CHAR (3) NOT NULL,
PRODUCTO CHAR (5) NOT NULL,
CANT INTEGER NOT NULL,
IMPORTE MONEY NOT NULL)
El estndar especifica que una columna puede contener valores NULL a menos
que especficamente se declare NOT NULL.
Valores por omisin (DEFAULT)
Define la Tabla OFICINAS con valores por omisin
CREATE TABLE OFICINAS
(OFICINA INTEGER NOT NULL,
CIUDAD VARCHAR (15) NOT NULL,
REGION VARCHAR (10) NOT NULL DEFAULT 'Este',
DIR INTEGER DEFAULT 106,
OBJETIVO MONEY DEFAULT NULL,
VENTAS MONEY NOT NULL DEFAULT 0.00)

Con esta definicin de tabla, slo es necesario especificar el nmero de oficinas


y la ciudad cuando se inserte una nueva oficina. La regin por omisin es el Este, el
director de la oficina es Sam Clark (106) , las ventas son cero y el objetivo es NULL. El
campo objetivo tomara el valor por omisin NULL incluso sin la especificacin
DEFAULT NULL.
Definiciones de clave primaria y ajena.
Adems de la definicin de las columnas de una tabla, la sentencia CREATE
TABLE identifica la clave primaria de la tabla y las relaciones de la tabla con otras tablas
de la base de datos.
La clusula PRIMARY KEY especifica la columna o columnas que forman la
clave primaria de la tabla. Esta columna (o combinacin de columnas) sirve como
identificador nico para cada fila de la tabla. El DBMS requiere automticamente que el
SQL

Pg.-91

valor de clave primaria sea nico en cada fila de la tabla. Adems, la definicin de
columna para todas las columnas que forman la clave primaria debe especificar que la
columna es NOT NULL.
La clusula FOREIGN KEY especifica una clave ajena en la tabla y la relacin
que crea con otra tabla (padre) de la base de datos. La clusula especifica:

La columna o columnas que forman la clave ajena, todas las cules son
columnas de la tabla que est siendo creada.
La tabla que es referenciada por la clave ajena. Esta es la tabla padre en la
relacin; la tabla que est siendo definida es la hija.
Un nombre opcional para la relacin. El nombre no se utiliza en ninguna
sentencia SQL, pero puede aparecer en mensajes de error y es necesaria si
se desea poder suprimir la clave ajena posteriormente.
Cmo debe tratar el DBMS un valor NULL en una o ms columnas de la
clave ajena, cuando la compare con las filas de la tabla padre.
Una restriccin de comprobacin opcional que restrinja los datos de la tabla
para que sus filas encuentren una condicin de bsqueda especificada.

En general la defincin de las restricciones se hace por las instrucciones CREATE y


ALTER TABLE o por la interfaz Enterprise Manager. Se guarda en las tablas de sitema
syscomments, sysreferences y sysconstraints. Se pueden obtener datos sobre las
restricciones por los procedimientos almacenados, sp_help nombretabla y
sp_helpconstraint nombretabla.
[CONSTRAINT nombreRestriccin]
{
[ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED]
{ ( columna[,...n] ) }
[ WITH FILLFACTOR = factorRelleno]
[ON {grupoArchivos | DEFAULT} ]
]
| FOREIGN KEY
[(columna[,...n])]
REFERENCES tablaReferencia [(columnaReferencia[,...n])]
[NOT FOR REPLICATION]
| CHECK [NOT FOR REPLICATION]
(condicionesBsqueda)
}

CONSTRAINT
Es una palabra clave que indica el principio de la definicin de una
restriccin PRIMARY KEY, UNIQUE, FOREIGN KEY o CHECK. Las
restricciones son propiedades especiales que exigen la integridad de los datos y
Pg.-92

SQL

crean tipos especiales de ndices para la tabla y sus columnas.


nombreRestriccin
Es el nombre de una restriccin. Los nombres de restriccin deben ser nicos en
una base de datos.
PRIMARY KEY
Es una restriccin que exige la integridad de entidad para una o varias
columnas dadas a travs de un ndice nico. Slo se puede crear una restriccin
PRIMARY KEY por cada tabla.
UNIQUE
Es una restriccin que proporciona la integridad de entidad para una o
varias columnas dadas a travs de un ndice nico. Una tabla puede tener varias
restricciones UNIQUE.
CLUSTERED | NONCLUSTERED
Son palabras clave que indican que se ha creado un ndice agrupado o
no agrupado para la restriccin PRIMARY KEY o UNIQUE. De forma
predeterminada, el valor de las restricciones PRIMARY KEY es CLUSTERED,
y el de las restricciones UNIQUE es NONCLUSTERED.
Slo se puede especificar CLUSTERED para una nica restriccin de
una instruccin CREATE TABLE. Si especifica CLUSTERED para una
restriccin UNIQUE y especifica tambin una restriccin PRIMARY KEY, el
valor predeterminado de PRIMARY KEY es NONCLUSTERED.
[WITH FILLFACTOR = factorRelleno]
Especifica cunto se debe llenar cada pgina de ndice de SQL Server utilizada
para almacenar los datos de ndice. Los valores de factorRelleno especificados
por el usuario pueden estar entre 1 y 100; el valor predeterminado es 0. Un
factor de relleno pequeo crea el ndice con ms espacio disponible para las
nuevas entradas de ndice sin tener que asignar nuevo espacio.
FOREIGN KEY...REFERENCES
Es una restriccin que proporciona integridad referencial para los datos
de la columna o columnas. Las restricciones FOREIGN KEY requieren que
cada valor de la columna exista en la columna de referencia correspondiente de
la tabla a la que se hace referencia. Las restricciones FOREIGN KEY pueden

SQL

Pg.-93

hacer referencia slo a columnas que sean restricciones PRIMARY KEY o


UNIQUE en la tabla de referencia.
tablaRef
Es el nombre de la tabla a la que hace referencia la restriccin
FOREIGN KEY.

(columnaRef[,...n])
Es una columna o lista de columnas de la tabla a la que hace referencia la
restriccin FOREIGN KEY.
CHECK
Es una restriccin que exige la integridad del dominio al limitar los
valores posibles que se pueden escribir en una o varias columnas.
NOT FOR REPLICATION
Palabras clave que se utilizan para impedir que se exija la restriccin
CHECK durante el proceso de distribucin utilizado por la duplicacin. La
clusula NOT FOR REPLICATION significa que la restriccin se fuerza en las
modificaciones de los usuarios, pero no en el proceso de duplicacin.
La restriccin NOT FOR REPLICATION CHECK se aplica tanto a la
imagen anterior como posterior de un registro actualizado para impedir que se
agreguen o eliminen registros del intervalo duplicado. Se comprueban todos los
borrados e inserciones; si stos se encuentran en el intervalo duplicado, se
rechazan.
Cuando esta restriccin se utiliza con una columna de identidad, SQL
Server permite que la tabla no tenga que reinicializar los valores de columna de
identidad cuando un usuario de duplicacin la actualiza.
expresinLgica
Es una expresin lgica que devuelve TRUE o FALSE.
columna
Es una columna o lista de columnas, entre parntesis, que se utiliza en
las restricciones de tabla para indicar las columnas que se estn utilizando en la
definicin de la restriccin.
Es un marcador de posicin que indica que el elemento anterior se puede repetir

Pg.-94

SQL

n veces.
He aqu una sentencia CREATE TABLE ampliada para la Tabla PEDIDOS, que
incluye la definicin de su clave primaria y de las tres claves ajenas que contiene:
CREATE TABLE PEDIDOS1
(NUM_PEDIDO INTEGER NOT NULL CONSTRAINT clave PRIMARY KEY,
FECHA_PEDIDO DATETIME NOT NULL,
CLIE VARCHAR(4) NOT NULL CONSTRAINT PEDIDOPOR FOREIGN KEY
REFERENCES CLIENTES,
REP VARCHAR(3),
FAB VARCHAR (3) NOT NULL,
PRODUCTO VARCHAR (5) NOT NULL,
CANT INTEGER NOT NULL,
IMPORTE MONEY NOT NULL,
CONSTRAINT TOMADOPOR FOREIGN KEY (REP)
REFERENCES REPVENTAS (NUM_EMPL),
CONSTRAINT ESPOR FOREIGN KEY (FAB, PRODUCTO)
REFERENCES PRODUCTOS (ID_FAB,ID_PRODUCTO))

La figura muestra las tres relaciones creadas por esta sentencia y los nombres
que se les asigna . En general es buena idea asignar un nombre de relacin, ya que ayuda
a clarificar la relacin creada por la clave ajena. Por ejemplo, cada pedido fue remitido
por el cliente cuyo nmero aparece en la columna CLIE de la Tabla PEDIDOS. La
relacin creada por esta columna ha recibido el nombre de PEDIDOPOR.
Cuando el DBMS procesa la sentencia CREATE TABLE, compara cada
definicin de clave ajena con la definicin de la tabla referenciada. El DBMS se asegura
que la clave ajena y la clave primaria de la tabla referenciada concuerdan en el nmero de
columnas que contienen y en sus tipos de datos. La tabla referenciada debe estar ya
definida en la base de datos para que esta comparacin tenga xito.

SQL

Pg.-95

Tabla CLIENTES

Tabla REPVENTAS

NUM_CLIE

NUM_CLIE

EMPRESA

21003 Acme Mfg.

PEDIDOPOR

Tabla PRODUCTOS

NOMBRE

ID_FAB

105 Bill Adams

ID_PRODUCTO

ACI

TOMADOPOR

41004

DESCRIPCION
Art. Tipo 4

ESPOR

tabla PEDIDOS
NUM_PEDIDO

FECHA_PEDIDO

CLIE

REP

FAB

PRODUCTO

CANT

IMPORTE

112963

12/17/1989

2103

105

ACI

41004

28

$3,276.00

Ejemplo:
Supongamos que queremos crear una tabla llamada CATEGORA cuya clave principal
es cod_cat.
Create table CATEGORA
(cod_cat varchar(2) NOT NULL,
Etiqueta varchar(30) NULL,
CONSTRAINT pk_categ PRIMARY KEY CLUSTERED (cod_cat))
Ejemplo:
Se pretende que las columnas Designacin y Precio debe ser nica en la tabla
ARTICULOS:
Create table ARTICULOS
(NUM_ART varchar(2) PRIMARY KEY,
DESIGNACIN_art varchar(3),
precio integer,
constraint pk_desig UNIQUE NONCLUSTERED,
constraint pk_precio UNIQUE NONCLUSTERED)
La propiedad identity
Esta propiedad puede ser asignada a una columna numrica (entera, tinyint, smallint, int,
decimal(p,0) o numeric(p,0)), en la creacin o en la modificacin de la tabla y permite
que el sistema genere valores para esta columna. Los valores sern generados en la
creacin de la lnea, sucesivamente y partiendo del valor inicial especifiado (por defecto
1) y aumentando o disminuyendo lnea tras lnea en un incremento (por defecto 1).
Slo puede haber una columna IDENTITY por tabla

Pg.-96

SQL

CREATE TABLE PEDIDOS


(num_pedido int identity (1000,1),
numero_cli int,
fecha_pdo datetime,
estado_pdo varchar(2))
En las creaciones de lnea (INSERT), no se precisa un valor para
NMERO_PEDIDO. La primera insercin asignar el num_pedido 1000, a la segunda el
num_pedido 1001, etc ...
Ejemplo:
Crear una tabla llamada PRODUCTOS cuyo precio por producto debe ser superior a
cero.
CREATE TABLE PRODUCTOS
(ID_FAB VARCHAR(3),
ID_PRODUCTO VARCHAR(5),
DESCRIPCION VARCHAR(20),
PRECIO MONEY,
EXISTENCIAS SMALLINT,
CONSTRAINT CLAVE_PRODUCTOS PRIMARY KEY (ID_FAB,ID_PRODUCTO),
CONSTRAINT PK_PRECIO CHECK (precio>0))

5.11. ELIMINACION DE UNA TABLA (DROP TABLE)


Con el tiempo la estructura de una base de datos crecer y se modificar.
Nuevas tablas sern creadas para representar nuevas entidades, y algunas tablas antiguas
ya no sern necesarias. Se puede eliminar de la base de datos una tabla que ya no es
necesaria con la sentencia DROP TABLE.
El nombre de la tabla en la sentencia identifica la tabla a eliminar. Normalmente
se eliminar una de las tablas propias del usuario y se utilizar un nombre de tabla no
cualificado. Con el permiso adecuado, tambin se puede eliminar una tabla propiedad de
otro usuario especificando un nombre de tabla cualificado.
DROP TABLE CLIENTES
Sam te da permiso para eliminar su tabla, llamada CUMPLEAOS.
DROP TABLE SAM.CUMPLEAOS
Cuando la sentencia DROP TABLE suprime una tabla de la base de datos, su
definicin y todos sus contenidos se pierden. No hay manera de recuperar los datos, y
habra que utilizar una nueva sentencia CREATE TABLE para volver a crear la
SQL

Pg.-97

definicin de la tabla. Debido a sus serias consecuencias, debe utilizarse la sentencia


DROP TABLE con mucho cuidado.
La supresin de una tabla suprimir los datos y los ndices asociados. La
supresin no ser posible si la tabla es referenciada por una clave externa.

5.12. MODIFICACION DE UNA DEFINICION DE UNA TABLA


(ALTER TABLE)
Despus de que una tabla ha sido utilizada durante algn tiempo, los usuarios
suelen descubrir que desean almacenar informacin adicional con respecto a las entidades
representadas en la tabla. En la base de datos ejemplo, por ejemplo, se podra desear:

Aadir el nombre y el nmero de telfono de una persona de contacto a


cada fila de la Tabla CLIENTES, que se utilizar para contactar con los
clientes.
Hacer de la columna REGION en la Tabla OFICINAS una clave ajena de la
tabla REGIONES recin creada.
Suprimir la definicin de clave ajena que enlaza la columna CLIE en la Tabla
PEDIDOS con la Tabla CLIENTES, sustituyndola con dos definiciones de
clave ajena que enlacen la columna CLIE con las Tablas recin creadas
INFO_CLIE e INFO_CONTA.

Cada uno de estos cambios, y algunos otros, pueden ser realizados con la
sentencia ALTER TABLE. Al igual que con la sentencia DROP TABLE, ALTER TABLE
se utilizar normalmente sobre tablas propias. Con el permiso adecuado, sin embargo, se
puede especificar un nombre de tabla cualificado y alterar la definicin de la tabla de
otro usuario. La sentencia ALTER TABLE puede:

Aadir una definicin de columna a una tabla.


Cambiar el valor por omisin de una columna.
Aadir o eliminar una clave primaria para una tabla.
Aadir o eliminar una nueva clave ajena para una tabla.
Aadir o eliminar una restriccin de unicidad para una tabla.
Aadir o eliminar una restriccin de comprobacin para una tabla.

ALTER TABLE nombre-de-tabla

ADD definicin-de-columna
ALTER nombre-de-columna

DEFAULT valor
DROP DEFAULT

DROP nombre-de-columna

CASCADE
RESTRICT

ADD CONSTRAINT

Pg.-98

SQL

definicin-clave-primaria
definicin-clave-ajena

.. .definicin-unicidad
... .restriccin-comprobacin

DROP CONSTRAINT nombre-restriccin

Cada una de las clusulas de la sentencia ALTER TABLE puede aparecer slo
una vez en la sentencia. Se puede aadir una columna y definir una clave ajena en una
nica sentencia ALTER TABLE, pero deben utilizarse dos sentencias ALTER TABLE
para aadir dos columnas.
Aadir una columna.
El uso ms comn de la sentencia ALTER TABLE es aadir una columna a una
tabla existente. La clusula de definicin de columna en la sentencia ALTER TABLE es
prcticamente idntica a la de la sentencia CREATE TABLE y funciona del mismo modo.
La nueva columna se aade al final de las definiciones de la columna de la tabla y aparece
como la columna ms a la derecha en consultas posteriores. El DBMS asume
normalmente un valor NULL para la columna recin aadida en todas las filas existentes
de la tabla . Si la columna se declara NOT NULL con un valor por omisin , el DBMS
supone que el valor por omisin es el del tipo de datos de la columna. Observa que no
puede declararse simplemente la nueva columna NOT NULL, ya que el DBMS asumira
valores NULL para la columna en las filas existentes, violando inmediatamente la
restriccin.
Aade un nombre de contacto y un nmero telefnico a la Tabla CLIENTES.
ALTER TABLE CLIENTES
ADD NOMBRE_CONTACTO VARCHAR (30)
ALTER TABLE CLIENTES
ADD TELEF_CONTACTO CHAR (10)
Aade una columna de nivel inventario mnimo a la Tabla PRODUCTOS.
ALTER TABLE PRODUCTOS
ADD CANT_MIN INTEGER NOT NULL WITH DEFAULT
Modificacin de claves primaria y ajena.
El otro uso habitual para la sentencia ALTER TABLE es cambiar o aadir
definiciones de clave primaria y clave ajena a una tabla.
Las clusulas que aaden definiciones de claves primaria y ajena son
exactamente las mismas que las de la sentencia CREATE TABLE y funcionan del mismo

SQL

Pg.-99

modo. Slo se puede eliminar una clave ajena si la relacin que crea tuvo asignado un
nombre originalmente. Si la relacin no tiene nombre, no hay manera de especificarla en
la sentencia ALTER TABLE. En este caso no se puede suprimir la clave ajena a menos
que se elimine y vuelva a crear la tabla utilizando el procedimiento descrito para suprimir
una columna.
Haz de la columna REGION en la Tabla OFICINAS una clave ajena para la Tabla
REGIONES recin creada, cuya clave primaria es el nombre regin.
ALTER TABLE OFICINAS
ADD CONSTRAINT ENREGION FOREIGN KEY (REGION)
REFERENCES REGIONES (REGION)
Nombre de campo clave en
la tabla REGIONES.
He aqu un ejemplo de una sentencia ALTER TABLE que modifica una clave primaria, la
clave ajena correspondiente a la clave primaria original debe ser suprimida, puesto que ya
no es una clave ajena para la tabla alterada:
-

Borra la clave ajena OPERAEN

ALTER TABLE REPVENTAS


DROP CONSTRAINT OPERAEN

5.13. INTRODUCCION DE DATOS EN LA BASE DE DATOS


Tpicamente, una nueva fila de datos se aade a una base de datos relacional
cuando una nueva entidad representada por la fila aparece en el mundo exterior. Por
ejemplo, en la base de datos ejemplo:

Cuando se contrata un nuevo vendedor, debe aadirse una nueva fila a la


Tabla PROVEEDORES para almacenar los datos de ese vendedor.
Cuando un vendedor firma con un nuevo cliente, debe aadirse una nueva
fila a la Tabla CLIENTES que representa al nuevo cliente.

En cada caso, la nueva fila se aade para mantener la base de datos como un
modelo preciso del mundo real. La unidad de datos ms pequea que puede aadirse a
una base de datos relacional es una fila. En general, un DBMS basado en SQL
proporciona tres maneras de aadir nuevas filas de datos a una base de datos:

Pg.-100

Una sentencia INSERT de una fila aade una nica nueva fila de datos a
una tabla.
Una sentencia INSERT multifila extrae filas de datos de otra parte de la
base de datos y las aade a una tabla. Se utiliza habitualmente en

SQL

procesamiento de fin de mes o de fin de ao cuando filas antiguas de una


tabla se trasladan a una tabla inactiva.
Una utilidad de carga masiva aade datos a una tabla desde un archivo
externo a la base de datos. Se utiliza habitualmente para cargar inicialmente
la base de datos o para incorporar datos transferidos desde otro sistema
informtico o recolectado desde muchas localizaciones.

5.13.1. Insertar una fila


La sentencia INSERT de una fila, aade una nueva fila a una tabla. La clusula
INTO especifica la tabla que recibe la nueva fila (la tabla destino) y la clusula VALUE
especifica los valores de los datos que contendr la nueva fila. La lista de columnas
indica qu valor va a qu columna de la nueva fila.
Supongamos que se acaba de contratar un nuevo vendedor, Henry Jacobsen,
con los siguientes datos personales:
Nombre:
Edad:
Nmero de empleado:
Ttulo:
Oficina:
Fecha de contrato:
Cuota:
Ventas anuales hasta la fecha:

Henry Jacobsen
36
111
Director de ventas
Atlanta (nmero de oficina 13)
25 de julio de 1990
An no asignada
$0.00

He aqu la sentencia INSERT que aade al Sr. Jacobsen a la base de datos:

SQL

Pg.-101

INSERT INTO nombre-de tabla


(
VALUES (

constante
NULL

nombre-de-columna
,

,
Incluir a Henry Jacobsen como nuevo vendedor.
INSERT INTO
REPVENTAS (NOMBRE, EDAD, NUM_EMPL, VENTAS, TITULO, CONTRATO, OFICINA_REP)
VALUES (Henry Jacobsen, 36, 111, 0.00, Dir Ventas, 25-JUL-90, 13)

1 fila insertada.
La sentencia INSERT construye una fila de datos que se corresponde con la
estructura en columnas de la tabla, la rellena con los datos de la clusula VALUES y
luego aade la nueva fila a la tabla. Las filas de una tabla no estn ordenadas, por lo que
no existe la nocin de insertar la fila al comienzo o al final o entre dos filas de la
tabla. Despus de ejecutar la sentencia INSERT, la nueva fila es simplemente una parte
de la tabla. Una consulta posterior de la tabla REPVENTAS incluir la nueva fila, pero
puede aparecer en cualquier punto entre las filas del resultado de la consulta.
Supongamos que el Sr. Jacobsen recibe ahora su primer pedido, de InterCorp,
un nuevo cliente que tiene asignado el nmero de cliente 2.126. El pedido es para 20
Widgets ACI-41004, por un precio total de $2.340, y le ha sido asignado el nmero de
pedidos 113.069. He aqu las sentencias INSERT que aaden el nuevo cliente y el pedido
a la base de datos:
Inserta un nuevo cliente y nuevo pedido para el Sr. Jacobsen.
INSERT INTO
CLIENTES (EMPRESA, NUM_CLIE, LIMITE_CREDITO, REP_CLIE)
VALUES (InterCorp, 2126, 15000.00,111)
1 fila insertada.
INSERT INTO
PEDIDOS (IMPORTE, FAB, PRODUCTO, CANT, FECHA_PEDIDO,
NUM_PEDIDO, CLIE, REP)
VALUES (2340.00, ACI, 41004, 20,GETDATE(), 113069, 2126, 111)
1 fila insertada.

Pg.-102

SQL

Como muestra este ejemplo, la sentencia INSERT puede ser larga si hay muchas
columnas de datos, pero su formato sigue siendo muy sencillo. La segunda sentencia
INSERT utiliza la constante de sistema GETDATE() en la clusula VALUES, haciendo
que se inserte la fecha actual como fecha de pedido.
En la prctica, sin embargo, los datos referentes a un nuevo cliente, un nuevo
pedido o un nuevo vendedor son caso siempre aadidos a una base de datos mediante un
programa de entrada orientado a formularios. Cuando la entrada de datos est completa,
el programa inserta la nueva fila de datos utilizando SQL programado. Sin embargo,
independientemente de que se utilice SQL programado o interactivo, la sentencia
INSERT es la misma.
El propsito de la lista de columnas en la sentencia INSERT es hacer
corresponder los valores de datos en la clusula VALUES con las columnas que van a
recibirlos. La lista de valores y la lista de columnas deben contener el mismo nmero de
elementos y el tipo de dato de cada valor debe ser compatible con el tipo de dato de la
columna correspondiente, o en caso contrario se producir un error.
Insercin de valores NULL.
Cuando SQL inserta una nueva fila de datos en una tabla, automticamente
asigna un valor NULL a cualquier columna cuyo nombre falte en la lista de columnas de
la sentencia INSERT. En esta sentencia INSERT, que aade al Sr. Jacobsen a la Tabla
REPVENTAS, las columnas CUOTA y DIRECTOR estn omitidas:
INSERT INTO
REPVENTAS (NOMBRE, EDAD, NUM_EMPL, VENTAS, TITULO, CONTRATO, OFICINA_REP)
VALUES (Henry Jacobsen, 36, 111, 0.00, Dir Ventas, 25-JUL-90, 13)

Como resultado, la fila recin aadida tiene un valor NULL, en las columnas
CUOTA y DIRECTOR. Puede hacer ms explcita la asignacin del valor NULL
incluyendo las columnas en la lista y especificando la palabra clave NULL en los valores.
Insercin de todas las columnas.
Por conveniencia, SQL permite omitir la lista de columnas de la sentencia
INSERT. Cuando se omite la lista de columnas, SQL genera automticamente una lista
formada por todas las columnas de la tabla, una secuencia de izquierda a derecha. Esta es
la misma secuencia de columnas generadas por SQL cuando se utiliza una consulta
SELECT. Utilizando esta forma abreviada, la sentencia INSERT anterior podra
escribirse de la siguiente forma:
INSERT INTO REOVENTAS
VALUES (111, Henry Jacobsen, 36, 13, Dir Ventas, 25-JUL-90, NULL, NULL, 0.00)

5.13.2. Insertar varias filas.

SQL

Pg.-103

La segunda forma de la sentencia INSERT, aade mltiples filas de datos a su


tabla destino. En esta forma de la sentencia INSERT, los valores de datos para las nuevas
filas no son especificados explcitamente dentro del texto de la sentencia. En su lugar, la
fuente de las nuevas filas es una consulta de base de datos especificadas en al sentencia.
La adicin de filas cuyos valores provienen de la propia base de datos puede
parecer extraa al principio, pero es muy til en algunas situaciones especiales. Por
ejemplo, supongamos que se desea copiar el nmero de pedido, la fecha y el importe de
todos los pedidos remitidos con anterioridad al 1 de enero de 1990, desde la Tabla
PEDIDOS en otra Tabla llamada ANTPEDIDOS. La sentencia INSERT multifila
proporciona un modo eficiente
Y compacto de copiar los datos:
Copia pedidos antiguos en la Tabla ANTPEDIDOS.
INSERT INTO ANTPEDIDOS (NUM_PEDIDO, FECHA_PEDIDO, IMPORTE)
SELECT NUM_PEDIDO, FECHA_PEDIDO, IMPORTE
FROM PEDIDOS
WHERE FECHA_PEDIDO < 01-ENE-90
9 FILAS INSERTADAS.

La sentencia INSERT parece complicada, pero realmente es muy simple. La


sentencia identifica la tabla que va a recibir las nuevas filas (ANTPEDIDOS) y las
columnas que reciben los datos, lo mismo que la sentencia INSERT de una sola fila. El
resto de la sentencia es una consulta que recupera datos de la Tabla PEDIDOS.
INSERT INTO nombre-de tabla
(

consulta
nombre-de-columna
,

Conceptualmente SQL efecta primero la consulta sobre la Tabla PEDIDOS y


luego inserta los resultados, fila a fila en la Tabla ANTPEDIDOS.
He aqu otra situacin donde se podra utilizar la sentencia INSERT multifila.
Supongamos que se desea analizar los patrones de compra de un cliente examinando que
clientes y qu vendedores son responsables de los grandes pedidos. Las consultas que se
realizaran combinaran datos de la Tablas CLIENTES; REPVENTAS y PEDIDOS.
Estas consultas de tres tablas de efectuaran bastante rpidamente en nuestra pequea
base de datos ejemplo, pero en una base de datos corporativa real con muchos miles de
filas, llevara mucho tiempo. En lugar de ejecutar muchas consultas de tres tablas largas,
se podra crear una nueva tabla llamada GRANPEDIDOS para que contuviera los datos
requeridos. Esta tabla estara definida del modo siguiente:
IMPORTE
EMPRESA
NOMBRE
REND

Pg.-104

Importe del pedido (procedente de PEDIDOS)


Nombre del cliente (procedente de CLIENTES)
Nombre del vendedor (procedente de REPVENTAS)
Importe superior o inferior a la cuota (calculado de REPVENTAS)

SQL

FAB
PRODUCTO
CANT

Id del fabricante (procedente de PEDIDOS)


Id del producto (Procedente de PEDIDOS)
Cantidad pedido (procedente de PEDIDOS)

Una vez que se ha creado la Tabla GRANPEDIDOS, se puede utilizar esta


sentencia INSERT multifila para rellenarla:
Carga datos en la Tabla GRANPEDIDOS para anlisis:
INSERT INTO GRANPEDIDOS (IMPORTE, EMPRESA, NOMBRE, REND, PRODUCTO, FAB,
CANT)
SELECT IMPORTE, EMPRESA, NOMBRE, REND, PRODUCTO, FAB, CANT
FROM PEDIDOS, CLIENTES, REPVENTAS
WHERE CLIE = NUM_CLIE
AND REP = NUM_EMPL
AND IMPORTE >15000.00

6 filas insertadas.
En una base de datos de grandes dimensiones, esta sentencia INSERT puede
tardar un buen rato en ejecutarse, ya que implica una consulta de tres tablas. Cuando la
sentencia se complete, los datos de la Tabla GRANPEDIDOS contendrn informacin
duplicada de otras tablas. Adems, la Tabla GRANPEDIDOS no se mantendr,
automticamente actualizada cuando se aadan nuevos pedidos a la base de datos, por lo
que sus datos pueden quedar rpidamente obsoletos. Cada uno de estos factores parece
desventaja. Sin embargo, las consultas de anlisis subsiguientes que utiliza una tabla
como sta pueden expresarse de forma muy sencilla.
El estndar SQL especifica varias restricciones lgicas sobre la consulta que
aparece dentro de la sentencia INSERT multifila:

La consulta no puede contener una clusula ORDER BY.


El resultado de la consulta debe contener el mismo nmero de columnas que
hay en la lista de columnas de la sentencia INSERT y los tipos de los datos
deben ser compatibles columna a columna.
La consulta no puede ser la UNION de varias sentencias SELECT
diferentes. Slo puede especificarse una nica sentencia SELECT.
La tabla destino de la sentencia INSERT no puede aparecer en la clusula
FROM de la consulta o de ninguna subconsulta que sta contenga.

5.13.3. Carga masiva


Los datos a insertar en una base de datos son con frecuencia extrados de otro
sistema automtico o recolectados de otros lugares y almacenados en un archivo
secuencial. Para cargar los datos en una tabla, se podra escribir un programa con un
bucle que leyera cada registro del archivo y utilizara la sentencia INSERT de una fila
para aadir la fila a la tabla. Sin embargo, el recargo de hacer que el DBMS ejecute
repetidamente sentencias INSERT de una fila puede ser bastante alto. Si insertar una sola
fila tarda medio segundo para una carga de sistema tpica, ste es un rendimiento
SQL

Pg.-105

probablemente aceptable para un programa interactivo. Pero este rendimiento


rpidamente pasa a ser inaceptable cuando se aplica a la tarea de cargar 50.000 filas de
datos de una vez. En este caso, la carga de los datos requerira ms de 6 horas.
Por esta razn, todos los productos DBMS comerciales incluyen una capacidad
de carga masiva que carga los datos desde un archivo a una tabla a alta velocidad.

5.14. SUPRESION DE DATOS DE LA BASE DE DATOS


Tpicamente, una fila de datos se suprime de una base de datos cuando la
entidad representada por la fila desaparece del mundo exterior.

Cuando un cliente cancela un pedido, la correspondiente fila de la Tabla


PEDIDOS debe ser suprimida.
Cuando un vendedor abandona la empresa, la fila correspondiente de la
Tabla REPVENTAS debe ser eliminada.
Cuando una oficina de ventas se cierra, la fila correspondiente de la Tabla
OFICINAS debe ser cancelada. Si los vendedores de la oficina son
despedidos, sus filas tambin deberan ser suprimidas de la Tabla
REPVENTAS, Si son reasignados, sus columnas OFICINA_REP deben ser
actualizadas.

La sentencia DELETE
La sentencia DELETE elimina filas seleccionadas de datos de una nica tabla.
La clusula FROM especifica la tabla destino que contiene las filas. La clusula WHERE
especifica qu filas de la tabla van a ser suprimidas.
DELETE FROM nombre-de tabla
WHERE condicin de bsqueda
Elimina a Henry Jacobsen de la base de datos.
DELETE FROM REPVENTAS
WHERE NOMBRE = Henry Jacobsem

1 fila suprimida.
La clusula WHERE de este ejemplo identifica una sola fila de la Tabla
REPVENTAS, que SQL elimina de la tabla.
Elimina todos los pedidos de InterCorp (nmero de cliente 2.126).
DELETE FROM PEDIDOS
WHERE CLIE = 2126

2 filas suprimidas.
En este caso, la clusula WHERE selecciona varias filas de la Tabla PEDIDOS y
Pg.-106

SQL

SQL elimina todas las filas seleccionadas de la tabla. Conceptualmente, SQL aplica la
clusula WHERE a cada una de las filas de la Tabla PEDIDOS, suprimiendo aqullas
para las cuales la condicin de bsqueda produce un resultado TRUE y manteniendo
aqullas para las cuales la condicin de bsqueda produce un resultado FALSE o NULL.
Suprime todos los pedidos remitidos antes del 15 de noviembre de 1989.
DELETE FROM PEDIDOS
WHERE FECHA_PEDIDO < 15-NOV-89

5 filas suprimidas.
Suprime todas las filas correspondientes a los clientes atendidos por Bill Adams, Mary
Jones o Dan Roberts (nmeros de empleados 105, 109 y 101).
DELETE FROM REPVENTAS
WHERE CONTRATO < 01-JUL-88
AND CUOTA IS NULL

0 filas suprimidas
Supresin de todas las filas
La clusula WHERE en una sentencia DELETE es opcional, pero casi siempre
est presente. Si se omite la clusula WHERE de una sentencia DELETE, se suprimen
todas las filas de la tabla destino, como en este ejemplo:
Suprime todos los pedidos.
DELETE FROM PEDIDOS

30 filas suprimidas.
Aunque esta sentencia DELETE produce una tabla vaca, no borra la Tabla
PEDIDOS de la base de datos. La definicin de la Tabla PEDIDOS y sus columnas
siguen estando almacenadas en la base de datos. La tabla an existe y nuevas filas
pueden ser insertadas en la Tabla PEDIDOS con la sentencia INSERT. Para eliminar la
definicin de la tabla de la base de datos, debe utilizarse la sentencia DROP TABLE.
Debido al dao potencial que puede producir una sentencia DELETE como
sta, es importante especificar siempre una condicin de bsqueda y tener cuidado de
que se seleccionan realmente filas que se desean. Cuando se utiliza SQL interactivo, es
buena idea utilizar primero la clusula WHERE en una sentencia SELECT para visualizar
las filas seleccionadas, asegurarse de que son las que realmente se desea suprimir y slo
entonces utilizar la clusula WHERE en una sentencia DELETE.
DELETE con subconsulta.
Las sentencias DELETE con condiciones de bsqueda simples, como las de los
ejemplos anteriores, seleccionan las filas a suprimir basndose nicamente en los propios
contenidos de las filas. A veces, la seleccin de las filas debe efectuarse en base a datos

SQL

Pg.-107

contenidos en otras tablas.


Halla los pedidos aceptados por Sue Smith.
SELECT NUM_PEDIDO, IMPORTE,
FROM PEDIDOS, REPVENTAS
WHERE REP = NUM_EMPL
AND NOMBRE = Sue Smith

NUM_PEDIDO

IMPORTE

112979
113065
112993
113048

$15,000.00
$ 2,130.00
$ 1,896.00
$ 3,750.00

Pero no se puede utilizar una composicin en una sentencia DELETE. La


sentencia DELETE paralela es ilegal:
DELETE FROM PEDIDOS, REPVENTAS
WHERE REP = NUM_EMPL
AND NOMBRE = Sue Smith

Error: Ms de una tabla especificada en la clusula FROM.


El modo de manejar la peticin es con una de las condiciones de bsqueda
subconsulta. He aqu una forma vlida de la sentencia DELETE que realiza la peticin:
Suprime los pedidos aceptados por Sue Smith.
DELETE FROM PEDIDOS
WHERE REP = (SELECT NUM_EMPL
FROM REPVENTAS
WHERE NOMBRE = Sue Smith)

4 filas suprimidas.
La consulta halla el nmero de empleado de Sue Smith y la clusula WHERE
selecciona entonces los pedidos tratados por ese nmero de empleado.

5.15. MODIFICACION DE DATOS DE LA BASE DE DATOS


Tpicamente, los valores de los datos almacenados en una base de datos se
modifican cuando se producen cambios correspondientes en el mundo exterior. Por
ejemplo, en la base de datos ejemplo:

Pg.-108

Cuando un cliente llama para modificar la cantidad de un pedido, la columna


SQL

CANT de la fila apropiada en la Tabla PEDIDOS debe ser modificada.


Cuando un director se traslada de una oficina a otra, la columna DIR en la
Tabla OFICINAS y la columna OFICINA_REP en la Tabla REPVENTAS
deben ser modificadas para que reflejen la nueva asignacin.

La sentencia UPDATE
La sentencia UPDATE modifica los valores de una o ms columnas en las filas
seleccionadas de una tabla nica. La tabla destino a actualizar se indica en la sentencia y
es necesario disponer de permiso para actualizar la tabla as como cada una de las
columnas individuales que sern modificadas. La clusula WHERE selecciona las filas de
la tabla a modificar. La clusula SET especifica qu columnas se van a actualizar y
calcula los nuevos valores.

SQL

Pg.-109

UPDATE nombre-de-tabla SET

nombre-de-columna = expresin
,

WHERE condicin-de-bsqueda

Eleva el lmite de crdito de la empresa Acme Manufacturing a $60.0000 y la reasigna a


Mary Jones (mmero de empleado 109(.
UPDATE CLIENTES
SET LIMITE_CREDITO = 60000.00, REP_CLIE = 109
WHERE EMPRESA = Acme Mfg.
1 fila actualizada.
En este ejemplo, la clusula WHERE identifica una sola fila de la Tabla
CLIENTES y la clusula SET asigna nuevos valores a dos de las columnas de esta fila.
Transfiere todos los vendedores de la oficina de Chicago (nmero 12) a la oficina de
New York (nmero 11) y rebaja sus cuotas un 10 por 100.
UPDATE REPVENTAS
SET OFICINA_REP = 11, CUOTA = 0.9 * CUOTA
WHERE OFICINA_REP = 12
1 fila actualizada.
En este caso, la clusula WHERE selecciona varias filas de la Tabla
REPVENTAS y el valor de las columnas OFICINA_REP y CUOTA se modifica en todas
ellas. Conceptualmente, SQL procesa la sentencia UPDATE al recorrer la Tabla
REPVENTAS fila a fila, actualizando aquellas filas para las cuales la condicin de
bsqueda produce un resultado TRUE y omitiendo aqullas para las cuales la condicin
de bsqueda produce un resultado FALSE o NULL.
La clusula SET en la sentencia UPDATE es una lista de asignaciones separadas
por comas. Cada asignacin identifica una columna destino a actualizar y especifica
cmo calcular el nuevo valor para la columna destino. Cada columna destino debera
aparecer solamente una vez en la lista; no debera haber dos asignaciones para la misma
columna destino.
La expresin en cada asignacin puede ser cualquier expresin SQL vlida que
genere un valor tipo de dato apropiado para la columna destino. La expresin se debe

Pg.-110

SQL

poder calcular con los valores de la fila que actualmente est en actualizacin en la tabla
destino. No pueden incluirse funciones de columna ni subconsulta.
Actualizacin de todas las filas.
La clusula WHERE en la sentencia UPDATE es opcional. Si se omite la
clusula WHERE, entonces se actualizan todas las filas de la tabla destino, como en este
ejemplo:
Eleva todas las cuota un 5%.
UPDATE REPVENTAS
SET CUOTA = 1.05 * CUOTA
10 filas actualizadas.
UPDATE con subconsulta.
Al igual que con la sentencia DELETE, las subconsultas pueden jugar un papel
importante en la sentencia UPDATE ya que permiten seleccionar las filas a actualizar en
base a informacin contenida en otras tablas. He aqu varios ejemplos de sentencias
UPDATE que utilizan subconsultas:
Eleva en $5.000 el lmite de crdito de cualquier cliente que haya remitido una orden de
ms de $25.000.
UPDATE CLIENTES
SET LIMITE_CREDITO = LIMITE_CREDITO + 5000.00
WHERE NUM_CLIE IN (SELECT DISTINCT CLIE
FROM PEDIDOS
WHERE IMPORTE > 25000.00)
4 filas actualizadas.
Reasigna todos los clientes atendidos por vendedores cuyas ventas son menores al 80
por 100 de sus cuotas.

SQL

Pg.-111

UPDATE CLIENTES
SET REP_CLIE = 105
WHERE REP_CLIE IN (SELECT NUM_EMPLP
FROM REPVENTAS
WHERE VENTAS < (0.8 * CUOTA))
2 filas actualizadas.
Las subconsultas en la clusula WHERE de la sentencia UPDATE pueden
anidarse a cualquier nivel y pueden contener referencias externas a la tabla destino de la
sentencia UPDATE.
La tabla destino no puede aparecer en la clusula FROM de ninguna
subconsulta a ningn nivel de anidacin.
Cualquier referencia a la tabla destino en las subconsultas son por tanto
referencias externas a la fila de la tabla destino que actualmente est siendo comprobada
por las clusulas WHERE de la sentencia UPDATE.

5.16. RESUMEN

Pg.-112

La sentencia INSERT de una fila aade una fila de datos a una tabla. Los
valores para la nueva fila se especifican en la sentencia como constantes.
La sentencia INSERT multifila aade cero o ms filas a una tabla. Los
valores para las nuevas filas provienen de una consulta, especificada como
parte de la sentencia INSERT.
La sentencia DELETE suprime cero o ms filas de datos de una tabla. Las
filas a suprimir son especificadas mediante una condicin de bsqueda.
La sentencia UPDATE modifica los valores de una o ms columnas en cero
o ms filas de una tabla. Las filas a actualizar son especificadas mediante
una condicin de bsqueda.
A diferencia de la sentencia SELECT, que puede operar sobre mltiples
tablas, las sentencias INSERT, DELETE y UPDATE funcionan solamente
sobre una nica tabla cada vez.

SQL

5.17 EJERCICIOS
1) EJERCICIO:
Se trata de una sencilla base de datos relacional para una pequea empresa de
distribucin. La base de datos almacena la informacin necesaria para implementar una
pequea aplicacin de procesamiento de pedidos.

los clientes que compran los productos de la empresa;

los pedidos remitidos por esos clientes;

los vendedores que venden los productos a los clientes; y

las oficinas de ventas donde trabajan los vendedores

Hay una tabla separada de datos para cada clase diferente de entidad. Las
peticiones de base de datos que se hace utilizando el lenguaje SQL se corresponde con
actividades del mundo real, tales como emisin, cancelacin y cambio de pedidos por
parte de los clientes, contratacin y despido de vendedores, etc.
a) Crear la base de datos.
b) Crear las 4 tablas.
c) Insertar datos en todas las tablas.
Tabla OFICINAS
OFICINA
22
11
12
13
21

CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles

REGION
Oeste
Este
Este
Este
Oeste

OBJETIVO
$300,000.00
$575,000.00
$800,000.00
$350,000.00
$725,000.00

VENTAS
$186,042.00
$692,637.00
$735,042.00
$367.911.00
$835,915.00

Tabla PEDIDOS
NUM_PE
DIDO
112961
113012
112989
113051
112968
113036
113045
112963
113013
113058
112997

FECHA_P
EDIDO
17-DIC-89
1-ENE-90
03-ENE-90
10-FEB-90
12-OCT-89
30-ENE-90
02-FEB-90
17-DIC-89
14-ENE-90
23-FEB-90
08-ENE-90

CLIE

REP

FAB

2117
2111
2101
2118
2102
2107
2112
2103
2118
2108
2124

106
105
106
108
101
110
108
105
108
109
107

REI
ACI
FEA
QSA
ACI
ACI
REI
ACI
BIC
FEA
BIC

SQL

PRODUC
TO
A244L
41003
114
XK47
41004
4100Z
A244L
41004
41003
112
41003

CANT

IMPORTE

7
35
6
4
34
9
10
28
1
10
1

$31,500.00
$3,745.00
$1,458.00
$1,420.00
$3,978.00
$22,500.00
$45,000.00
$3,276.00
$652.00
$1,480.00
$652.00

Pg.-113

112983
113024
113062
112979
113027
113007
113069
113034
112992
112975
113055
113048
112993
113065
113003
113049
112987
113057
113042

27-DIC-89
20-ENE-90
24-FEB-90
12-OCT-89
22-ENE-90
08-ENE-90

2103
2114
2124
2114
2103
2112
2109
2107
2118
2111
2108
2120
2106
2106
2108
2118
2103
2111
2113

02-MAR-90

29-ENE-90
04-NOV-89

12-OCT-89
15-FEB-90
10-FEB-90
04-ENE-89
27-FEB-90
25-ENE-90
10-FEB-90
31-DIC-89
18-FEB-90
02-FEB-90

105
108
107
102
105
108
107
110
108
103
101
102
102
102
109
108
105
103
101

ACI
QSA
FEA
ACI
ACI
IMM
IMM
REI
ACI
REI
ACI
IMM
REI
QSA
IMM
QSA
ACI
ACI
REI

41004
XK47
114
4100Z
41002
773C
775C
A245C
41002
A244G
4100X
779C
A245C
XK47
779C
XK47
4100Y
4100X
A244R

6
20
10
6
54
3
22
8
10
6
6
2
24
6
3
2
11
24
5

$702.00
$7,100.00
$2,430.00
$15,000.00
$4,104.00
$2,925.00
$1,350.00
$632.00
$760.00
$2,100.00
$150,.00
$3,750.00
$1,896.00
$2,130.00
$5,625.00
$776.00
$27,500.00
$600.00
$22,500.00

Tabla CLIENTES
NUM_CLIE
2111
2102
2103
2123
2107
2115
2101
2112
2121
2114
2124
2108
2117
2122
2120
2106
2119
2118
2113
2109
2105

EMPRESA
JCP inc.
First Corp.
Acme Mfg.
Carter & Sons
Ace International
Smithson Corp.
Jones Mfg.
Zetacorp
QMA Assoc.
Orion Corp.
Peter Brothers
Holm & Landis
J.P. Sinclair
Three-Way Lines
Rico Enterprises
Fred Lewis Corp.
Solomon Inc.
Midwest Systems
Ian & Schmidt
Chen Associates
AAA Investments

REP_CLIE
103
101
105
102
110
101
106
108
103
102
107
109
106
105
102
102
109
108
104
107
101

LIMITE-CREDITO
$50,000.00
$65,000.00
$50,000.00
$40,000.00
$35,000.00
$20,000.00
$65,000.00
$50,000.00
$45,000.00
$20,000.00
$40,000.00
$55,000.00
$35,000.00
$30,000.00
$50,000.00
$65,000.00
$25,000.00
$60,000.00
$20,000.00
$25,000.00
$45,000.00

Tabla REPVENTAS
NUM_EM
PL
105
109
102
106

Pg.-114

NOMBRE

EDAD

Bill Adams
Mary Jones
Sue Smith
Sam Clark

37
31
48
52

OFICINA_
REP
13
11
21
11

TITULO
Rep. ventas
Rep. ventas
Rep. ventas
Vp ventas

SQL

CONTRAT
O
1-ENE-88
12-OCT-9
10-DIC-86
14-JUN-88

DIRECTO
R
104
106
108
NULL

CUOTA

VENTAS

$350,000.00
$300,000.00
$350,000.00
$275,000.00

$367,911.00
$392,725.00
$474,050.00
$299,912.00

104
101
110
108
103
107

Bob Smith
Dan Roberts
Tom Snyder
Larry Fitch
Paul Cruz
Nancy
Angelli

33
45
41
62
29
49

12
12
NULL
21
12
22

Dir ventas
Rep. Ventas
Rep. Ventas
Dir ventas
Rep. Ventas
Rep. Ventas

19-MAY-87
20-OCT-86
13-ENE-90
12-OCT-89
01-MAR-87
14-NOV-87

106
104
101
106
104
108

$200,000.00
$300,000.00
NULL
$350,000.00
$275,000.00
$300,000.00

$142,594.00
$305,673.00
$75,985.00
$361,865.00
$286,775.00
$186,042.00

TABLA PRODUCTOS
ID_FAB
REI
ACI
QSA
BIC
IMM
ACI
ACI
BIC
IMM
QSA
REI
FEA
IMM
BIC
ACI
IMM
ACI
QSA
ACI
REI
IMM
ACI
FEA
IMM
REI

ID_PRODUCTO
2A45C
4100Y
XK47
41672
779C
4103
41004
41003
887P
XK48
2A44L
112
887H
41089
41001
775C
410Z
XK48A
41002
2A44R
773C
4100X
114
887X
2A44G

DESCRIPCIN
UNION TRINQUETE
DESMONTADOR
REDUCTOR
PLACA
ABRAZADERA 90
ARTICULO TIPO3
ARTICULO TIPO 4
TIRADOR
PERNO ABRAZADERA
REDUCTOR
BISAGRA IZQUIDA
CUBIERTA
SOPORTE ABRAZADERA
RETEN
ARTICULO TIPO 1
ABRAZADERA 500
MONTADOR
REDUCTOR
ARTICULO TIPO 2
BISAGRA DERECH
ABRAZADERA 300
AJUSTADOR
BANCADA MOTOR
RETN ABRAZADERA
PASADOR BISAGRA

SQL

PRECIO
79
2750
355
180
1875
107
117
652
250
134
4500
148
54
225
55
1425
2500
117
76
4500
975
25
243
475
350

EXISTENCIAS
210
25
38
0
9
207
139
3
24
203
12
115
223
78
277
5
28
37
167
12
28
37
15
32
14

Pg.-115

TEMA VI
CONSULTAS SIMPLES

6.1.

CLAUSULA SELECT

6.2.

CLAUSULA FROM

6.3.

RESULTADOS DE CONSULTAS

6.4.

CLAUSULA WHERE

6.5.

COMNDICIONES DE BUSQUEDA
6.5.1.
6.5.2.
6.5.3.
6.5.4.
6.5.5.
6.5.6.

Test de comparacin
Test de rango
Test de pertenencia a conjunto
Test de correspondencia con patrn
Test de valor nulo
Condiciones de bsqueda compuestas

6.6.

COLUMNAS CALCULADAS

6.7.

SELECCIN DE TODAS LAS COLUMNAS

6.8.

FILAS DUPLICADAS (DISTINCT)

6.9.

ORDENACION DE LOS RESULTADOS DE UNA CONSULTA

Pg.-116

SQL

6.10. REGLAS PARA PROCESAMIENTO DE CONSULTAS DE


TABLA UNICA
6.11. COMBINACION
CONSULTA

DE

LOS

RESULTADOS

DE

UNA

6.12. CONSULTAS DE RESUMEN, HAVING, GROUP BY


6.13. SINTAXIS DE LA ORDEN SELECT
6.14. RESUMEN
6.15. EJERCICIOS

SQL

Pg.-117

6.1.

CLAUSULA SELECT

La clusula SELECT que empieza cada sentencia SELECT especifica los tems
de datos a recuperar por la consulta. Los tems se especifican generalmente mediante una
lista de seleccin, una lista de tems de seleccin separados por comas. Cada tem de
seleccin de la lista genera una nica columna de resultados de consulta, en orden de
izquierda a derecha. Un tem de seleccin puede ser:
SELECT item1, item2,...

6.2.

Un nombre de columna, identificando una columna de la tabla designada en


la clusula FROM. Cuando un nombre de columna aparece como tem de
seleccin, SQL simplemente toma el valor de esa columna de cada fila de la
tabla de base de datos y lo coloca en la fila correspondiente de los
resultados de la consulta.
Una constante, especificando que el mismo valor constante va a aparecer en
todas las filas de los resultados de la consulta.
Una expresin SQL, indicando que SQL debe calcular el valor a colocar en
los resultados, segn el estilo especificado por la expresin.

CLAUSULA FROM

La clusula FROM consta de la palabra clave FROM, seguida de una lista de


especificaciones de tablas separadas por comas. Cada especificacin de tabla identifica
una tabla que contiene datos a recuperar por la consulta. Estas tablas se denominan
tablas fuente de la consulta (y de la sentencia SELECT), ya que constituyen la fuente de
todos los datos que aparecen en los resultados. Todas las consultas de este captulo
tienen una nica tabla fuente, y todas las clusulas FROM contienen un solo nombre de
tabla.

6.3.

RESULTADOS DE CONSULTAS

El resultado de una consulta SQL es siempre una tabla de datos, semejante a las
tablas de la base de datos. Si se escribe una sentencia SELECT utilizando SQL
interactivo, el DBMS visualizar los resultados de la consulta en forma tabular sobre la
pantalla de la computadora.

Pg.-118

SQL

Generalmente los resultados de la consulta formarn una tabla con varias


columnas y varias filas. Por ejemplo, esta consulta produce una tabla de tres columnas
(ya que pide tres tems de datos) y diez filas (ya que hay diez vendedores):
Lista los nombres, oficinas y fecha de contrato de todos los vendedores.
SELECT NOMBRE, OFICINA_REP, CONTRATO
FROM REPVENTAS
NOMBRE
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Tom Snyder
Larry Fitch
Paul Cruz
Nancy Angelli

OFICINA_REP
13
11
21
11
12
12
NULL
21
12
22

CONTRATO
12-FEB-88
12-OCT-89
10-DIC-86
14-JUN-88
19-MAY-87
20-OCT-86
13-ENE-90
12-OCT-89
01-MAR-87
14-NOV-88

Las consultas SQL ms sencillas solicitan columnas de datos de una nica tabla
en la base de datos.
Lista de la poblacin, regin y ventas de cada oficina.
SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS
CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles

REGION
Oeste
Este
Este

VENTAS
$186,042.00
$692,637.00
$735,042.00
$367,911.00
$835,915.00

Este
Oeste

La sentencio SELECT para consultas sencillas como sta slo incluye las dos
clusulas imprescindibles. Las clusula SELECT designa a las columnas solicitadas; la
clusula FROM designa a la tabla que las contiene.

SQL

Pg.-119

Conceptualmente, SQL procesa la consulta recorriendo la tabla nominada en la


clusula FROM, una fila cada vez. Por cada fila, SQL toma los valores de las columnas
solicitadas en la lista de seleccin y produce una nica fila de resultados. Los resultados
contienen por tanto una fila de datos por cada fila de la tabla.
Tabla OFICINAS
OFICINA
22
11
12
13
21

CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles

REGION
Oeste
Este
Este
Este
Oeste

OBJETIVO
$300,000.00
$575,000.00
$800,000.00
$350,000.00
$725,000.00

VENTAS
$186,042.00
$692,637.00
$735,042.00
$350,000.00
$835,915.00

Resultados de la consulta
CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles

6.4.

REGION
Oeste
Este
Este
Este
Oeste

VENTAS
$186,042.00
$692,637.00
$735,042.00
$350,000.00
$835,915.00

CLAUSULA WHERE

Las consultas SQL que recuperan todas las filas de una tabla son tiles para
inspeccin y elaboracin de informes sobre la base de datos, pero para poco ms.
Generalmente se desear seleccionar solamente parte de las filas de una tabla, y slo
incluirn esas filas en los resultados. La clusula WHERE se emplea para especificar las
filas que se desean recuperar. He aqu algunos ejemplos de consultas simples que utilizan
la clusula WHERE:
Muestra las oficinas en donde las ventas exceden del objetivo.
SELECT CIUDAD, VENTAS, OBJETIVO
FROM OFICINAS
WHERE VENTAS > OBJETIVO

Pg.-120

SQL

CIUDAD
New York
Atlanta
Los Angeles

VENTAS
$692,637.00
$367,911.00
$835,915.00

OBJETIVO
$575,000.00
$350,000.00
$725,000.00

Muestra los empleados dirigidos por Bob Smith (empleado 104).


SELECT NOMBRE, VENTAS
FROM REPVENTAS
WHERE DIRECTOR = 104
NOMBRE
Bill Adams
Dan Roberts
Paul Cruz

VENTAS
$367,911.00
$305,673.00
$286,775.00

La clusula WHERE consta de la palabra clave WHERE seguida de una


condicin de bsqueda que especifica las filas a recuperar. En la consulta anterior, por
ejemplo, la condicin de bsqueda es DIRECTOR = 104. Conceptualmente, SQL
recorre cada fila de la Tabla REPVENTAS, una a una, y aplica la condicin de bsqueda
a la fila. Cuando aparece un nombre de columna en la condicin de bsqueda a la fila (tal
como la columna DIRECTOR en este ejemplo), SQL utiliza el valor de la columna en la
fila actual. Por cada fila, la condicin de bsqueda puede producir uno de los tres
resultados.

Si la condicin de bsqueda es TRUE (cierta), la fila se incluye en los


resultados de la consulta. Por ejemplo, la fila correspondiente a Bill Adams
tiene el valor DIRECTOR correcto, y por tanto se incluye.
Si la condicin de bsqueda es FALSE (falsa), la fila se excluye de los
resultados de la consulta.

SQL

Pg.-121

NOMBRE
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Bob Smith
Dan Roberts

DIRECTO
R
104
106
108
NULL
106
104

NOMBRE

VENTAS

Bill Adams $367,911.00


Dan Roberts $305,673.00
Paul Cruz $286,775.00

DIRECTOR =
104

TRUE

DIRECTOR = 106
FALSE
DIRECTOR =
NULL

Desconocido

Si la condicin de bsqueda tiene un valor NULL (desconocido), la fila se


excluye de los resultados de la consulta. Por ejemplo, la fila correspondiente
a Sam Clark tiene un valor NULL en la columna DIRECTOR, y por tanto se
excluye.

Bsicamente la condicin de bsqueda acta como un filtro para las filas de la


tabla. Las filas que satisfacen la condicin de bsqueda atraviesan el filtro y forman parte
de los resultados de la consulta. Las filas que no satisfacen la condicin de bsqueda son
atrapadas por el filtro y quedan excluidas de los resultados de la consulta.

6.5.

CONDICIONES DE BUSQUEDA

SQL ofrece un rico conjunto de condiciones de bsqueda que permite


especificar muchos tipos diferentes de consultas eficaz y naturalmente aqu se resumen
cinco condiciones bsicas de bsqueda (llamadas predicados en el estndar ANSI/ISO) y
posteriormente se describirn en otras secciones:

Pg.-122

Test de comparacin. Compara el valor de una expresin con el valor de


otra.
Test de rango. Examina si el valor de una expresin cae dentro de un rango
especificado de valores.
Test de pertenencia a conjunto. Comprueba si el valor de una expresin se
corresponde con uno de un conjunto de valores.

SQL

Test de correspondencia con patrn. Comprueba si el valor de una columna


que contiene datos de cadena de caracteres se corresponde a un patrn
especificado.
Test de valor nulo. Comprueba si una columna tiene un valor NULL
(desconocido).

6.5.1. Test de comparacin


La condicin de bsqueda ms utilizada en una consulta SQL es el test de
comparacin. En un test de comparacin, SQL calcula y compara los valores de dos
expresiones SQL por cada fila de datos. Las expresiones pueden ser tan simples como un
nombre de columna o una constante, o pueden ser expresiones aritmticas ms
complejas. He aqu algunos ejemplos de tests de comparacin tpicos:
Halla los vendedores contratados antes de 1988.
SELECT NOMBRE
FROM REPVENTAS
WHERE CONTRATO < 01-ENE-88
NOMBRE
Sue Smith
Bob Smith
Dan Roberts
Paul Cruz
Como operadores de comparacin se pueden utilizar: =, <>, <, <=, >, >=.
La comparacin de desigualdad se escribe como A<>B segn especificacin
SQL ANSI/ISO. Varias implementaciones SQL utilizan notaciones alternativas, tales
como A!=B. En algunos casos stas son formas alternativas.
Cuando SQL compara los valores de dos expresiones en el test de comparacin
se pueden producir tres resultados:

Si la comparacin es cierta, el test produce un resultado TRUE.


Si la comparacin es falsa, el test produce un resultado FALSE.
Si alguna de las dos expresiones produce un valor NULL, la comparacin
genera un resultado NULL.

SQL

Pg.-123

Recuperacin de una fila.


El test de comparacin ms habitual es el que comprueba si el valor de una
columna es igual a cierta constante. Cuando la columna es una clave primaria, el test
asla una sola fila de la tabla, produciendo una sola fila de resultados, como en este
ejemplo:
Recupera el nombre y el lmite de crdito del cliente nmero 2.107.
SELECT EMPRESA, LIMITE_CREDITO
FROM CLIENTES
WHERE NUM_CLIE = 2107
EMPRESA
Ace International

LIMITE_CREDITO
$35,000.00

Este tipo de consulta es el fundamento de los programas de recuperacin de


base de datos basadas en formularios. El usuario introduce el nmero de cliente en el
formulario, y el programa utiliza el nmero para construir y ejecutar una consulta. Luego
visualiza los datos recuperados en el formulario.
Consideraciones del valor NULL.
El comportamiento de los valores NULL en los tests de comparacin puede
revelar que algunas nociones obviamente ciertas referentes a consultas SQL no son, de
hecho, necesariamente ciertas. Por ejemplo, podra parecer que los resultados de estas
dos consultas:
Lista vendedores que superan sus cuotas.
SELECT NOMBRE
FROM REPVENTAS
WHERE VENTAS > CUOTA
NOMBRE
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Dan Roberts
Larry Fitch
Paul Cruz

Pg.-124

SQL

Lista los vendedores que estn por debajo o en su cuota.


SELECT NOMBRE
FROM REPVENTAS
WHERE VENTAS <= CUOTA
NOMBRE
Bob Smith
Nancy Angelli
Deberan incluir cada fila de la Tabla REPVENTAS, pero las consultas
producen siete y dos filas, respectivamente, haciendo un total de nueve filas, pero hay
diez filas en la Tabla REPVENTAS. La fila de Tom Snyder tiene un valor NULL en la
columna CUOTA, puesto que an no se le ha asignado una cuota. Esta fila no aparece en
ninguna de las consultas; desaparece en el test de comparacin.
Como muestra este ejemplo, es necesario considerar la gestin del valor NULL
cuando se especifica una condicin de bsqueda. En la lgica trivaluada de SQL, una
condicin de bsqueda puede producir un resultado TRUE, FALSE o NULL. Slo las
filas en donde la condicin de bsqueda genera un resultado TRUE se incluyen los
resultados de la consulta.
6.5.2. Test de rango
SQL proporciona una forma diferente de condicin de bsqueda con el test de
rango (BETWEEN). El test de rango comprueba si un valor de dato se encuentra entre
dos valores especificados. Implica el uso de tres expresiones SQL. La primera expresin
define el valor a comprobar; las expresiones segunda y tercera definen los extremos
superior e inferior del rango a comprobar. Los tipos de datos de las tres expresiones
deben ser comparables. Este ejemplo muestra un test de rango tpico:
SELECT NUM_PEDIDO, FECHA_PEDIDO, FAB, PRODUCTO, IMPORTE
FROM PEDIDOS
WHERE FECHA_PEDIDO BETWEEN 01-OCT-89 AND 31-DIC-89

SQL

Pg.-125

NUM_PEDIDO
112961
112968
112963
112983
112979
112992
112975
112987

FECHA_PEDIDO
17-DIC-89
12-OCT-89
17-DIC-89
27-DIC-89
12-OCT-89
04-NOV-89
12-OCT-89
31-DIC-89

FAB
REI
ACI
ACI
ACI
ACI
ACI
REI
ACI

PRODUCTO
IMPORTE
A244L
$31,500.00
41004
$ 3,978.00
41004
$ 3,276.00
41004
$ 702.00
41002
$15,000.00
41002
$ 760.00
A244G
$ 2,100.00
4100Y
$27,500.00

El test BETWEEN incluye los puntos extremos del rango, por lo que los
pedidos remitidos el 1 de octubre o el 31 de diciembre se incluyen en los resultados de la
consulta.
La versin negada del test de rango (NOT BETWEEN) comprueba los valores
que caen fuera del rango, como en este ejemplo:
Lista los vendedores cuyas ventas no estn entre el 80 y el 120 por 100 de su cuota:
SELECT NOMBRE, VENTAS, CUOTA
FROM REPVENTAS
WHERE VENTAS NOT BETWEEN (0.8 * CUOTA) AND (1.2 * CUOTA)
NOMBRE
Mary Jones
Sue Smith
Bob Smith
Nancy Angelli

VENTAS
$392,725.00
$474,050.00
$142,594.00
$186,042.00

CUOTA
$300,000.00
$350,000.00
$200,000.00
$300,000.00

La expresin de test especificada en el test BETWEEN puede ser cualquier


expresin vlida, pero en la prctica generalmente es tan slo un nombre de columna,
como en los ejemplos anteriores.

Pg.-126

Si la expresin de test produce un valor NULL, o si ambas expresiones


definitorias del rango producen valores NULL, el test BETWEEN devuelve
un resultado NULL.
Si la expresin que define el extremo inferior del rango produce un valor
NULL, el test BETWEEN devuelve FALSE si el valor de test es superior al
lmite superior, y NULL en caso contrario.

SQL

Si la expresin que define el extremo superior del rango produce un valor


NULL, el test BETWEEN devuelve FALSE si el valor de test es menor que
el lmite inferior, y NULL en caso contrario.

Merece la pena advertir que el test BETWEEN no aade realmente potencia


expresiva a SQL, ya que puede ser expresado mediante dos tests de comparacin. El test
de rango:
A BETWEEN B AND C
Es completamente equivalente a:
(A >= B) AND (A <= C)
6.5.3. Test de pertenencia a conjunto
Examina si un valor de dato coincide con uno de una lista de valores objetivo.
Lista los vendedores que trabajan en New York, Atlanta o Denver.
SELECT NOMBRE, CUOTA, VENTAS
FROM REPVENTAS
WHERE OFICINA_REP IN (11, 13, 22)
NOMBRE
Bill Adams
Mary Jones
Sam Clark
Nancy Angelli

CUOTA
$350,000.00
$300,000.00
$275,000.00
$300,000.00

VENTAS
$367,911.00
$392,725.00
$299,912.00
$186,042.00

Se puede comprobar si el valor del dato no corresponde a ninguno de los


valores objetivos utilizando la forma NOT IN del test de pertenencia a conjunto. La
expresin de test en un test IN puede ser cualquier expresin SQL, pero generalmente es
tan slo un nombre de columna, como en los ejemplos precedentes, Si la expresin de
test produce un valor NULL, el test In devuelve NULL. Todos los elementos en la lista
de valores objetivo deben tener el mismo tipo de datos, y ese tipo debe ser comparable al
tipo de dato de la expresin de test.

SQL

Pg.-127

Al igual que el test BETWEEN, el test IN no aade potencia expresiva a SQL,


ya que la condicin de bsqueda
X IN (A, B, C)
Es completamente equivalente a:
(X = A) OR (X = B) OR (X= C)
6.5.4. Test de correspondencia con patrn
Se puede utilizar un test de comparacin simple para recuperar las filas en
donde el contenido de una consulta de texto se corresponde con un cierto texto
particular.
Sin embargo, se podra olvidar fcilmente si el nombre de la empresa era
Smith, Smithson o Smithsonian. El test de correspondencia con patrn de SQL
puede ser utilizado para recuperar los datos sobre la base de una correspondencia parcial
del nombre de cliente.
El test de correspondencia con patrn (LIKE), comprueba si el valor de datos
de una columna se ajusta a un patrn especificado. El patrn es una cadena que puede
incluir uno o ms caracteres comodines. Estos caracteres se interpretan de una manera
especial.
Caracteres comodines.
El carcter comodn signo de porcentaje (%) se corresponde con cualquier
secuencia de cero o ms caracteres.
Muestra el lmite de crdito de Smithson Corp.
SELECT EMPRESA, LIMITE_CREDITO
FROM CLIENTES
WHERE EMPRESA LIKE Smith% Corp.
La palabra clave LIKE dice a SQL que compare la columna NOMBRE con el
patrn Smith% Corp.. Cualquiera de los nombres siguientes se ajustaran al patrn:
Smith Corp., Smithson Corp., Smithsen Corp., Smithsonian Corp.

Pg.-128

SQL

El carcter comodn subrayado (_) se corresponde con cualquier carcter


simple. Si se est seguro que el nombre de la empresa es o bien Smithson o bien
Smithsen, por ejemplo, se puede utilizar esta consulta:
SELECT EMPRESA, LIMITE_CREDITO
FROM CLIENTES
WHERE EMPRESA LIKE Smiths_n Corp.
Los caracteres comodines pueden aparecer en cualquier lugar de la cadena
patrn, y puede haber varios caracteres comodines dentro de una misma cadena.
Se pueden localizar cadenas que no se ajusten a un patrn utilizando el formato
NOT LIKE del test de correspondencia de patrones. El test LIKE debe aplicarse a una
columna con un tipo de datos cadena. Si el valor del dato en la columna es NULL, el test
LIKE devuelve un resultado NULL.
Caracteres escape *.
Uno de los problemas de la correspondencia con patrones en cadenas es cmo
hacer corresponder los propios caracteres comodines como caracteres literales. Para
comprobar la presencia de un carcter tanto por ciento en una columna de datos de
texto, por ejemplo, no se puede simplemente incluir el signo del tanto por cien en el
patrn, ya que SQL lo tratara como un comodn.
El estndar SQL especifica una manera de comparar literalmente caracteres
comodines, utilizando un carcter escape especial. Cuando el carcter escape aparece en
el patrn, el carcter que le sigue inmediatamente se trata como un carcter literal en
lugar de cmo un carcter comodn. El carcter escapado puede ser uno de los dos
caracteres comodines, o el propio carcter de escape, que ha tomado ahora un
significado especial dentro del patrn.
Halla los productos cuyo id comience con las cuatro letras A%BC.
SELECT NUM_PEDIDO, PRODUCTO
FROM PEDIDOS
WHERE PRODUCTO LIKE A$%BC% ESCAPE $
El primer signo de porcentaje en el patrn, que sigue a un carcter escape, es
tratado como un signo literal; el segundo funciona como un comodn.

SQL

Pg.-129

6.5.5. Test de valor nulo


Los valores NULL crean una lgica trivaluada para las condiciones de bsqueda
en SQL. Para una fila determinada, el resultado de una condicin de bsqueda puede ser
TRUE o FALSE, o puede ser NULL debido a que una de las columnas utilizadas en la
evaluacin de la condicin de bsqueda contiene un valor NULL:
A veces es til comprobar explcitamente los valores NULL en una condicin de
bsqueda y gestionarlos directamente. SQL proporciona un test especial de valor nulo
(NULL).
Halla el vendedor que an no tiene asignada una oficina.
SELECT NOMBRE
FROM REPVENTAS
WHERE OFICINA_REP IS NULL
La forma negada del test de valor nulo (IS NOT NULL) encuentra las filas que
no contiene un valor NULL:
Lista los vendedores a los que se les ha asignado una oficina.
SELECT NOMBRE
FROM REPVENTAS
WHERE OFICINA_REP IS NOT NULL
A diferencia de las condiciones de bsqueda descritas anteriormente, el test de
valor nulo no puede producir un resultado NULL. Ser siempre TRUE o FALSE.
6.5.6. Condiciones de bsqueda compuestas
Las condiciones de bsqueda simples, descritas en las secciones precedentes
devuelven un valor TRUE, FALSE o NULL cuando se aplican a una fila de datos.
Utilizando las reglas de la lgica, se pueden combinar estas condiciones de
bsqueda SQL simples para formar otras ms complejas.
La palabra clave OR se utiliza para combinar dos condiciones de bsqueda
cuando una o la otra (o ambas) deban ser ciertas.

Pg.-130

SQL

Halla los vendedores que estn por debajo de la cuota o con ventas inferiores a
$300.000.
SELECT NOMBRE, CUOTA, VENTAS
FROM REPVENTAS
WHERE VENTAS < CUOTA
OR VENTAS < 300000.00
Tambin se puede utilizar la palabra clave AND para combinar dos condiciones
de bsqueda que deban ser ciertas simultneamente:
SELECT NOMBRE, CUOTA, VENTAS
FROM REPVENTAS
WHERE VENTAS < CUOTA
AND VENTAS < 300000.00
Finalmente, se puede utilizar la palabra clave NOT para seleccionar filas en
donde la condicin de bsqueda es falsa:
Halla todos los vendedores que estn por debajo de la cuota, pero cuyas ventas no son
inferiores a $150.000.
SELECT NOMBRE, CUOTA, VENTAS
FROM REPVENTAS
WHERE VENTAS < CUOTA
AND NOT VENTAS < 150000.00
Utilizando las palabras clave AND, OR y NOT y los parntesis para agrupar los
criterios de bsqueda, se pueden construir criterios de bsqueda muy complejos.
Cuando se combinan ms de dos condiciones de bsqueda con AND, OR y
NOT, el estndar especifica que NOT tiene la precedencia ms alta, seguido de AND y
por ltimo OR. Para asegurar la portabilidad, es siempre una buena idea utilizar
parntesis y suprimir cualquier posible ambigedad.

6.6.

COLUMNAS CALCULADAS

Adems de las columnas cuyos valores provienen directamente de la base de


datos, una consulta SQL puede incluir columnas calculadas cuyos valores se calculan a
partir de los valores de los datos almacenados. Para solicitar una columna calculada, se
especifica una expresin SQL en la lista de seleccin. Las expresiones SQL pueden
contener sumas, restas, multiplicaciones y divisiones.
Tambin se pueden utilizar parntesis para construir expresiones ms complejas.
Naturalmente las columnas referenciadas en una expresin aritmtica deben tener un tipo
numrico. Si se intenta sumar, restar, multiplicar o dividir columnas que contienen datos

SQL

Pg.-131

de texto, SQL reportar un error.


Esta consulta muestra una columna calculada simple:
Lista la ciudad, la regin y el importe por encima o por debajo del objetivo para cada
oficina.
SELECT CIUDAD, REGION, (VENTAS-OBJETIVO)
FROM OFICINAS
CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles

REGION
Oeste
Este
Este

(VENTAS-OBJETIVOS)
-$113,958.00
$117,637.00
-$64,958.00
$17,911.00
$110,915.00

Este
Oeste

Para procesar la consulta, SQL examina las oficinas, generando una fila de
resultados por cada fila de la Tabla OFICINAS. Las dos primeras columnas de resultados
provienen directamente de la Tabla OFICINAS. La tercera columna de los resultados se
calcula, fila a fila, utilizando los valores de datos de la fila actual de la Tabla OFICINAS.
Muchos productos SQL disponen de operaciones aritmticas adicionales,
operaciones de cadenas de caracteres y funciones internas que pueden ser utilizadas en
expresiones SQL. Estas pueden aparecer en expresiones de la lista de seleccin.
Lista el nombre, el mes y el ao de contrato para cada vendedor.
SELECT NOMBRE, MONTH(CONTRATO), YEAR(CONTRATO)
FROM REPVENTAS
Tambin se pueden utilizar constantes SQL por s mismas como tems en una
lista de seleccin. Esto puede ser til para producir resultados que sean ms fciles de
leer e interpretar.
Lista las ventas para cada ciudad.
SELECT CIUDAD, tiene ventas de, VENTAS
FROM OFICINAS

Pg.-132

SQL

CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles

TIENE VENTAS DE
tiene ventas de
tiene ventas de
tiene ventas de
tiene ventas de
tiene ventas de

VENTAS
$186,042.00
$692,637.00
$735,042.00
$367,911.00
$835,915.00

Los resultados de la consulta parecen consistir en una frase distinta por cada
oficina, pero realmente es una tabla de tres columnas. Las columnas primera y tercera
contienen valores procedentes de la Tabla OFICINAS. La columna siempre contiene la
misma cadena de texto de quince caracteres.

6.7.

SELECCIN DE TODAS LAS COLUMNAS

A veces es conveniente visualizar el contenido de todas las columnas de una


tabla. Esto puede ser particularmente til cuando uno va a utilizar por primera vez una
base de datos y desea obtener una rpida comprensin de su estructura y de los datos
que contiene. Por conveniencia, SQL permite utilizar un asterisco (*) en lugar de la lista
de seleccin como abreviatura de todas las columnas.
Muestra todos los datos de la Tabla OFICINAS.
SELECT *
FROM OFICINAS
El resultado de la consulta contiene las seis columnas de la Tabla OFICINAS,
en el mismo orden de izquierda a derecha que tienen en la tabla.
La seleccin de todas las columnas es muy adecuada cuando se est utilizando
el SQL interactivo de forma casual. Debera evitarse en SQL programado, ya que
cambios en la estructura de la base de datos pueden hacer que un programa falle.

6.8.

FILAS DUPLICADAS (DINSTINCT)

Si una consulta incluye la clave primaria de una tabla en su lista de seleccin,


entonces cada fila de resultados ser nica (ya que la clave primaria tienen un valor
diferente en cada fila). Si no se incluye la clave primaria en los resultados, pueden
producirse filas duplicadas. Por ejemplo, supongamos que se hace la siguiente peticin:

SQL

Pg.-133

Lista los nmeros de empleado de todos los directores de oficinas de ventas.


SELECT DIR
FROM OFICINAS
DIR
108
106
104
105
108
Los resultados tienen cinco filas (uno por cada oficina), pero dos de ellas son
duplicados exactos la una de la otra. Porque Larry Fitch dirige las oficinas tanto de Los
ngeles como de Denver y su nmero de empleado (108) aparece en ambas filas de la
Tabla OFICINAS. Estos resultados no son probablemente lo que se pretende cuiando se
hace la consulta. Si hubiera cuatro directores diferentes, cabra esperar que slo
aparecieran en los resultados cuatro nmeros de empleado.
Se pueden eliminar las filas duplicadas de los resultados de la consulta
insertando la palabra clave DISTINCT en la sentencia SELECT justo antes de la lista de
seleccin. He aqu una versin de la consulta anterior que produce los resultados
deseados:
Lista los nmeros de empleado de todos los directores de oficinas de ventas.
SELECT DISTINCT DIR
FROM OFICINAS
Conceptualmente, SQL efecta esta consulta generando primero un conjunto
completo de resultados (cinco filas) y eliminando luego las filas que son duplicados
exactos de alguna otra para formar los resultados finales, La palabra clave DISTINCT
puede ser especificada con independencia de los contenidos de la lista SELECT.
Tambin se puede especificar la palabra clave ALL para indicar explcitamente
que las filas duplicadas sean incluidas, pero es innecesario ya que este es el
comportamiento por omisin.

6.9.

ORDENACION DE LOS RESULTADOS DE UNA CONSULTA

Al igual que las filas de una tabla en la base de datos, las filas de los resultados
de una consulta no estn dispuestas en ningn orden particular. Se puede pedir a SQL
que ordene los resultados de una consulta incluyendo la clusula ORDER BY en la
sentencia SELECT. La clusula ORDER BY consta de las palabras claves ORDER BY,
seguidas de una lista de especificaciones de ordenacin separadas por comas. Por
Pg.-134

SQL

ejemplo, los resultados de esta consulta estn ordenados en dos columnas, REGION y
CIUDAD.
Muestra las ventas de cada oficina, ordenadas en orden alfabtico por regin y dentro de
cada regin por ciudad.
SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS
ORDER BY REGION, CIUDAD
La primera especificacin de ordenacin (REGION) es la clave de la ordenacin
mayor, las que le sigan (CIUDAD, en este caso) son progresivamente claves de
ordenacin menores, utilizadas para desempatar cuando dos filas de resultados tienen
los mismos valores para las claves mayores. Utilizando la clusula ORDER BY se puede
solicitar la ordenacin en secuencia ascendente o descendente, y se puede ordenar con
respecto a cualquier elemento en la lista de seleccin de la consulta.
Por omisin, SQL ordena los datos en secuencia ascendente. Para solicitar
ordenacin en secuencia descendente, se incluye la palabra clave DESC en la
especificacin de ordenacin, como en este ejemplo:
Lista las oficinas, clasificadas en orden descendente de ventas, de modo que las oficinas
con mayores aparezcan en primer lugar.
SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS
ORDER BY VENTAS DESC
CIUDAD
Los Angeles
Chicago
New York
Atlanta
Denver

REGION
Oeste
Este
Este

VENTAS
$835,915.00
$735,042.00
$692,637.00
$367,911.00
$186,042.00

Este
Oeste

Tambin se puede utilizar la palabra clave ASC para especificar el orden


ascendente, pero puesto que sta es la secuencia de ordenacin por omisin, la palabra
clave se suele omitir.
Si la columna de resultados de la consulta utilizada para ordenacin es una
columna calculada, no tiene nombre de columna que se pueda emplear en una
especificacin de ordenacin. En este caso, debe especificarse un nmero de columna en
lugar de un nombre, como en este ejemplo.
Lista las oficinas, clasificadas en orden descendente de rendimiento de ventas de modo
que las oficinas con mejor rendimiento aparezcan primero.
SELECT CIUDAD, REGION, (VENTAS-OBJETIVO)

SQL

Pg.-135

FROM OFICINAS
ORDER BY 3 DESC
Estos resultados estn ordenados por la tercera columna, que es la diferencia
calculada entre VENTAS y OBJETIVO para cada oficina.

6.10. REGLAS PARA PROCESAMIENTO DE CONSULTAS DE


TABLA UNICA
Las consultas de tabla nica son generalmente sencillas, y normalmente es fcil
entender el significado de una consulta tan slo leyendo la sentencia SELECT.
Para generar los resultados de una consulta correspondiente a una sentencia
SELECT:
1) Comenzar con la tabla designada en la clusula FROM.
2) Si hay clusula WHERE, aplicar su condicin de bsqueda a cada fila de la
tabla, reteniendo aquellas filas para las cuales la condicin de bsqueda es
TRUE, y descartando aqullas para las cules es FALSE o NULL.
3) Para cada fila restante, calcular el valor de cada elemento en la lista de
seleccin para producir una nica fila de resultados. Por cada referencia de
columna, utilizar el valor de la columna en la fila actual.
4) Si se especifica SELECT DISTINCT, eliminar las filas duplicadas de los
resultados que se hubieran producido.
5) Si hay una clusula ORDER BY, ordenar los resultados de la consulta segn
se especifiquen.
Las filas generadas por este procedimiento forman los resultados de la consulta.

Pg.-136

SQL

6.11. COMBINACION
CONSULTA

DE

LOS

RESULTADOS

DE

UNA

Ocasionalmente, es conveniente combinar los resultados de dos o ms consultas


en una nica tabla de resultados totales. SQL permite esta capacidad gracias a la
caracterstica UNION de la sentencia SELECT.
Lista todos los productos en donde el precio del producto exceda de $2.000 o en donde
ms de $30.000 del producto hayan sido incluidos en un solo pedido.
La operacin UNION produce una nica tabla de resultados que combina las
filas de la primera consulta con las filas de los resultados de la segunda consulta. La
sentencia SELECT que especifica la operacin UNION tiene el siguiente aspecto:
SELECT ID_FAB, ID_PRODUCTO
FROM PRODUCTOS
WHERE PRECIO >2000.00
UNION
SELECT DISTINCT FAB, PRODUCTO
FROM PEDIDOS
WHERE IMPORTE >30000.00
Hay varias restricciones sobre las tablas que pueden combinarse con una
operacin UNION:

Ambas tablas deben contener el mismo nmero de columnas.


El tipo de datos de cada columna en la primera tabla debe ser el mismo que
el tipo de datos de la columna correspondiente en la segunda tabla.
Ninguna de las dos tablas puede estar ordenadas con la clusula ORDER
BY. Sin embargo, los resultados combinados pueden ser ordenados, segn
se describe en la seccin siguiente.

Los nombres de columna de las dos consultas combinadas mediante una


UNION no tienen que ser idnticos. En el ejemplo anterior, la primera tabla de
resultados tena columnas de nombre ID_FAB e ID_PRODUCTO, mientras que la
segunda tabla de resultados tena columnas de nombres FAB y PRODUCTOS. Puesto
que las columnas de las dos tablas pueden tener nombres diferentes, las columnas de los
resultados producidos por la operacin UNION estn sin designar.
Solamente permite nombres de columna o una especificacin de todas las
columnas (SELECT *) en la lista de seleccin, y prohbe las expresiones en la lista de
seleccin.
Por omisin, la operacin UNION elimina las filas duplicadas como parte de su
procesamiento. Por tanto, el grupo combinado de resultados contiene una sola fila para
el producto REI-a244l;
SQL

Pg.-137

Lista todos los productos en donde el precio del producto exceda de $2.000 o en donde
ms de $30.0000 del producto hayan sido incluidos en un solo pedido.
SELECT ID_FAB, ID_PRODUCTO
FROM PRODUCTOS
WHERE PRECIO >2000.00
UNION
SELECT DISTINCT FAB, PRODUCTO
FROM PEDIDOS
WHERE IMPORTE >30000.00
ACI
REI
ACI

4100Y
A244L
4100Z
REI
IMM
REI
REI

A244R
775C
A244L
A244R

La eliminacin de filas duplicadas en los resultados de la consulta es un proceso


que consume mucho tiempo, especialmente si los resultados contienen un gran nmero
de filas. Si se sabe, en base a las consultas individuales implicadas, que la operacin
UNION no puede producir filas duplicadas, se debera utilizar especficamente la
operacin UNION ALL, ya que la consulta se ejecutar mucho ms rpidamente.
Uniones y ordenacin *
La clusula ORDER BY no puede aparecer en ninguna de las dos sentencias
SELECT combinadas por una operacin UNION. No tendra mucho sentido ordenar los
dos conjuntos de resultados de ninguna manera, ya que stos se dirigen directamente a la
operacin UNION y nunca son visibles al usuario. Sin embargo, el conjunto combinado
de los resultados de la consulta producidos por la operacin UNION puede ser ordenado
especificando una clusula ORDER BY despus de la segunda sentencia SELECT. Ya
que las columnas producidas por la operacin UNION no tienen nombres, la clusula
ORDER BY debe especificar las columnas por nmero.
He aqu la misma consulta de productos con los resultados ordenados por
fabricante y nmero de producto:
Lista todos los productos en donde el precio del producto supera a $2.000 o en donde
ms de $30.0000 del producto hayan sido incluidos en un solo pedido, clasificados por
fabricante y nmero de producto.
SELECT ID_FAB, ID_PRODUCTO
FROM PRODUCTOS
WHERE PRECIO >2000.00
UNION

Pg.-138

SQL

SELECT DISTINCT FAB, PRODUCTO


FROM PEDIDOS
WHERE IMPORTE >30000.00
ORDER BY 1, 2
ACI
ACI
IMM
REI
REI

4100Y
4100Z
775C
A244L
A244R

Uniones mltiples *.
La operacin UNION puede ser utilizada repetidamente para combinar tres o
ms conjuntos de resultados. La unin de la TABLA B y la TABLA C en la figura
produce una nica tabla combinada. Esta tabla se combina luego con la TABLA A en otra
operacin UNION. La consulta de la figura se escribe de este modo:
SELECT *
FROM A
UNION (SELECT *
FROM B
UNION
SELECT *
FROM C)
Tabla B
Bill
Sue
Julia
Harry
Tabla C
Mary
George
Bill
Harry

UNION

Tabla A
Bill
Mary
George
Fred
Bill
Sue
Julia
Harry
Mary
George

UNION

Resultados
de la consulta
Bill
Mary
George
Fred
Sue
Julia
Harry

Los parntesis que aparecen en la consulta indican qu UNION debera ser


realizada en primer lugar. De hecho, si todas las uniones de la sentencia eliminan filas
duplicadas, o si todas ellas retienen filas duplicadas, el orden en que se efectan no tienen
importancia. Estas tres expresiones son equivalentes:
A UNION (B UNION C)
(A UNION B) UNION C

SQL

Pg.-139

(A UNION C) UNION B
Sin embargo, si las uniones implican una mezcla de UNION y UNION ALL, el
orden de la evaluacin si importa. Si esta expresin:
A UNION ALL B UNION C
Se interpreta como:
A UNION ALL (B UNION C)
Entonces se producen diez filas de resultados (seis de la UNION interna, ms cuatro filas
de la TABLA A). Sin embargo, si se interpreta como obtendr 7 filas de resultado (quita
los repetidos):
(A UNION ALL B) UNION C

6.12. CONSULTAS DE RESUMEN, HAVING, GROUP BY


SQL permite resumir datos de la base de datos mediante un conjunto de
funciones de columna. Una funcin de columna SQL acepta una columna entera de
datos como argumento y produce un nico dato que resume la columna. Las funciones
de columna ofrecen diferentes tipos de datos resumen:

SUM() calcula el total de una columna.


AVG() calcula el valor promedio de una columna.
MIN() encuentra el valor ms pequeo de una columna.
MAX() encuentra el valor mayor de una columna.
COUNT() cuenta el nmero de valores de una columna.
COUNT(*) cuenta las filas de una consulta.

El argumento de una funcin columna puede ser un solo nombre de columna o


puede ser una expresin SQL.
Clculo del total de una columna (SUM)
La funcin columna SUM() calcula la suma de una columna de valores de
datos. Los datos de la columna deben tener un tipo numrico (entero, decimal, coma
flotante o monetario). El resultado de la funcin SUM() tiene el mismo tipo de datos
bsico que los datos de la columna, pero el resultado puede tener una precisin superior.
Cules son las cuotas y ventas totales para todos los vendedores?
SELECT SUM(CUOTA), SUM(VENTAS)
FROM REPVENTAS

Pg.-140

SQL

SUM(CUOTA)
$2,700,000.00

SUM(VENTAS)
$2,893,352.00

Clculo del promedio de una columna


La funcin de columna AVG() calcula el promedio de una columna de valores
de datos. Al igual que una funcin SUM(), los datos de la columna deben tener un tipo
numrico. Ya que la funcin AVG() suma los valores de la columna y luego lo divide por
el nmero de valores, su resultado puede tener un tipo de dato diferente al de los valores
de columna.
Por ejemplo, si se aplica la funcin AVG() a una columna de enteros, el
resultado ser un nmero decimal o un nmero de coma flotante, dependiendo del
producto DBMS concreto que se est utilizando.
Calcula el precio medio de los productos del fabricante ACI.
SELECT AVG(PRECIO)
FROM PRODUCTOS
WHERE ID_FAB = ACI
AVG(PRECIO)
$804.29
Determinacin de valores extremos (MIN y MAX()
Las funciones de columna MIN() Y MAX() determinan los valores menor y
mayor de una columna, respectivamente. Los datos de la columna pueden contener
informacin numrica, de cadena o de fecha/hora. El resultado de la funcin MIN() y
MAX() tiene exactamente el mismo tipo de dato que los datos de la columna.
Cules son las cuotas asignadas mnima y mxima?
SELECT MIN(CUOTA), MAX(CUOTA)
FROM REPVENTAS
MIN(CUOTA)
$200,000.00

MAX(CUOTA)
$350,000.00

Cul es la fecha de pedido ms antigua en la base de datos?


SELECT MIN(FECHA_PEDIDO)
FROM PEDIDOS
MIN(FECHA_PEDIDO)
04-ENE-89
SQL

Pg.-141

Cuando las funciones de columnas MIN() y MAX() se aplican a datos


numricos, SQL compara los nmeros en orden algebraico (los nmeros negativos
grandes son menores que los nmeros negativos pequeos, los cules son menores que
cero, el cual a su vez es menor que todos los nmeros positivos). Las fechas se
comparan secuencialmente (las fechas ms antiguas son ms pequeas que las fechas ms
recientes).
Cuando se utiliza MIN() YMAX() con datos de cadenas, la comparacin de las
cadenas depende del conjunto de caracteres que est siendo utilizado. En una
computadora personal o en una minicomputadora los dgitos se encuentran delante de las
letras en la secuencia de ordenacin, y todos los caracteres maysculas se encuentran
delante de todos los caracteres minsculas.
Cuenta de valores de datos (COUNT)
La funcin de columna COUNT() cuenta el nmero de valores de datos que hay
en una columna. Los datos de la columna pueden ser de cualquier tipo. La funcin
COUNT() siempre devuelve un entero, independientemente del tipo de datos de la
columna.
Cuntos clientes hay?
SELECT COUNT(NUM_CLIE)
FROM CLIENTES
COUNT(NUM_CLIE)
21
Cuntos vendedores superan su cuota?
SELECT COUNT(NOMBRE)
FROM REPVENTAS
WHERE VENTAS > CUOTA
COUNT(NOMBRE)
7
Cuntos pedidos de ms de $25.000 hay en los registros?
SELECT COUNT (IMPORTE)
FROM PEDIDOS
WHERE IMPORTE > 25000.00
COUNT(IMPORTE)

Pg.-142

SQL

4
Obsrvese que la funcin COUNT() ignora los valores de los datos de la
columna; simplemente cuenta cuntos datos hay. En consecuencia, no importa realmente
qu columna se especifica como argumento de la funcin COUNT().
SQL permite una funcin de columna especial COUNT(*) que cuenta filas en
lugar de valores de datos. He aqu la misma consulta, reescrita una vez ms para utilizar
la funcin COUNT (*):
SELECT COUNT(*)
FROM PEDIDOS
WHERE IMPORTE > 25000.00
COUNT (*)
4
Si se piensa en la funcin COUNT(*) como en una funcin cuenta filas, la
consulta resulta ms fcil de leer. En la prctica, se utiliza casi siempre la funcin
COUNT(*) en lugar de la funcin COUNT() para contar filas.
Valores NULL y funciones de columna
Las funciones de columna SUM(), AVG(), MIN(), MAX() y COUNT() aceptan
cada una de ellas una columna de valores de datos como argumento y producen un
nico valor como resultado. Qu sucede si uno o ms de los valores de la columna es un
valor NULL? El estndar SQL ANSI/ISO especifica que los valores NULL de la
columna sean ignorados por las funciones de la columna.
Esta consulta muestra como la funcin de columna COUNT() ignora los valores
NULL de una columna:
SELECT COUNT(*), COUNT (VENTAS), COUNT(CUOTA)
FROM REPVENTAS
COUNT(*)
10

COUNT(VENTAS)
10

COUNT(CUOTA)
9

La tabla REPVENTAS contiene diez filas, por lo que COUNT(*) devuelve una
cuenta de diez. La columna VENTAS contiene diez valores no NULL, por lo que la
funcin COUNT(VENTAS) tambin devuelve una cuenta de diez. La columna CUOTA
es NULL para el vendedor ms reciente. LA funcin COUNT(CUOTA) ignora este valor
NULL y devuelve una cuenta de nueve. Debido a estas anomalas, la funcin COUNT(*)
es utilizada casi siempre en lugar de la funcin COUNT(), a menos que especficamente,
se desee excluir del total los valores NULL de una columna particular.
Ignorar los valores NULL tiene poco impacto en las funciones de columna
MIN() y MAX().

SQL

Pg.-143

SELECT SUM(VENTAS), SUM(CUOTA),


(SUM(VENTAS) SUM(CUOTA)), SUM(VENTAS-CUOTA)
FROM REPVENTAS
SUM(VENTAS)
CUOTA)
$2,893.532.00

SUM(CUOTA)

(SUM(VENTAS) SUM(CUOTA))

$2,700,000.00

$193,532.00

SUM (VENTAS$117,547.00

Sera de esperar que las dos expresiones:


(SUM(VENTAS) SUM(CUOTA) Y SUM(VENTAS-CUOTA)
en la lista de seleccin produjeran resultados idnticos, pero el ejemplo muestra que no
es as. El vendedor con un valor NULL en la columna CUOTA es de nuevo la razn. La
expresin:
SUM(VENTAS)
totaliza las ventas para los diez vendedores, mientras que la expresin:
SUM(CUOTA)
Totaliza solamente los nueve valores de cuota no NULL. La expresin:
SUM(VENTAS) SUM(CUOTA)
calcula la diferencia de estos dos importes. Sin embargo, la funcin de columna:
SUM(VENTAS-CUOTA)
Tiene un valor de argumento no NULL para slo nueve de los diez vendedores. En la fila
con un valor de cuota NULL, la resta produce un NULL, que es ignorado por la funcin
SUM(). Por tanto, las ventas del vendedor sin cuota, que estn incluidas en el clculo
previo, se excluyen de este clculo.

Si todos los datos de una columna son NULL, las funciones de columna
SUM(), AVG(), MIN(), y MAX() devuelven un valor NULL; la funcin
COUNT() devuelve un valor de cero.
Si no hay datos en la columna (es decir, la columna est vaca), las funciones
de columna SUM(), AVG(), MIN() y MAX() devuelven un valor cero.
La funcin COUNT(*) cuenta filas, y no depende de la presencia o ausencia
de valores NULL en la columna.

Eliminacin de filas duplicadas (DISTINCT)


Recurdese que se puede especificar la palabra clave DISTINCT al comienzo de
Pg.-144

SQL

la lista de seleccin para eliminar las filas duplicadas del resultado de la consulta.
Tambin se puede pedir a SQL que elimine valores duplicados de una columna antes de
aplicarle una funcin de columna. Para eliminar valores duplicados, la palabra clave
DISTINCT se incluye delante del argumento de la funcin de columna, inmediatamente
despus del parntesis abierto.
Cuntos ttulos diferentes tienen los vendedores?
SELECT COUNT (DISTINCT TITULO)
FROM REPVENTAS
COUNT (DISTINCT TITULO)
3

Cuando se utiliza la palabra clave DISTINCT, el argumento de la funcin


columna debe ser un simple nombre de columna; no puede ser una expresin. El estndar
no permite el uso de la palabra clave DISTINCT con las funciones de columna MIN() y
MAX(). DISTINCT no puede ser especificado con la funcin COUNT(*).
La palabra clave DISTINCT slo se puede especificar una vez en una consulta.
Si aparece en l argumento de una funcin de columna, no puede aparecer en ninguna
otra. Si se especifica delante de la lista de seleccin, no puede aparecer en ninguna
funcin de columna.
Consultas agrupadas (Clusula GROUP BY)
Las consultas resumen descritas hasta ahora son, como los totales al final de un
informe. Condensan todos los datos detallados del informe en una nica fila resumen de
datos.
Cul es el tamao medio de pedido?
SELECT AVG(IMPORTE)
FROM PEDIDOS
AVG(IMPORTE)
$8,256.37
Cul es el pedido medio de cada vendedor?
SELECT REP, AVG(IMPORTE)
FROM PEDIDOS
GROUP BY REP

SQL

Pg.-145

REP
101
102
103
105
106
107
108
110

AVG(IMPORTE)
$8,876.00
$5,694.00
$1,350.00
$7,685.40
$16,479.00
$11,477.33
$3,552.50
$11,566.00

La primera consulta es una consulta resumen simple como la de los ejemplos


anteriores. La segunda consulta produce varias filas resumen, una fila por cada grupo,
resumiendo los pedidos aceptados por un solo vendedor. Conceptualmente, SQL lleva a
cabo la consulta del modo siguiente:
1. SQL divide los pedidos en grupos de pedidos, un grupo por cada vendedor.
Dentro de cada grupo, todos los pedidos tienen el mismo valor en la
columna REP.
2. Por cada grupo, SQL calcula el valor medio de la columna IMPORTE para
todas las filas del grupo, y genera una nica fila resumen de resultados. La
fila contiene el valor de la columna REP del grupo y el pedido medio
calculado.
Una consulta que incluya la clusula GROUP BY se denomina consulta
agrupada, ya que agrupa los datos de las tablas fuentes y produce una nica fila resumen
por cada grupo de filas. Las columnas indicadas en la clusula GROUP BY se denominan
columnas de agrupacin de la consulta ya que son las que determinan cmo se dividen
las filas en grupos.
Mltiple columnas de agrupacin
SQL puede agrupar resultados de consulta basndose en contenidos de dos o
ms columnas. Por ejemplo, supongamos que se desea agrupar los pedidos por vendedor
y por cliente. Esta consulta agrupa los datos basndose en ambos criterios:
Calcula los pedidos totales por cada cliente y por cada vendedor.
SELECT REP, CLIE, SUM(IMPORTE)
FROM PEDIDOS
GROUP BY REP, CLIE
REP
101
101
101

Pg.-146

CLIE
2102
2108
2113

SUM(IMPORTE)
$3,978.00
$ 150.00
$22,500.00

SQL

102
102
102
103
105
105

2106
2114
2120
2111
2103
2111

$4,026.00
$15,000.00
$3,750.00
$2,750.00
$35,582.00
$3,745.00

Las ordenes de agrupacin deben agruparse por los campos que no son
funciones de columna en la lista de campos.
La clusula COMPUTE calcula subtotales y sub-subtotales como se muestra en
este ejemplo:
Calcula los pedidos totales para cada cliente de cada vendedor, ordenados por vendedor,
y dentro de cada vendedor por cliente.
SELECT REP, CLIE, IMPORTE
FROM PEDIDOS
ORDER BY REP, CLIE
COMPUTE SUM(IMPORTE) BY REP, CLIE
COMPUTE SUM(IMPORTE), AVG(IMPORTE) BY REP
REP
101

CLIE
2102

IMPORTE
$3,978.00
sum
-------

101

2108
sum
-------

101

2113
sum
------sum
------avg
-------

102
102

2106
2106
sum
-------

-----------$3,978.00
$150.00
-----------$150.00
$22,500.00
-----------$22,500.00
-----------$26,628.00
-----------$8,876.00
$2,130.00
$1,896.00
-----------$4,026.00

SQL

Pg.-147

102

2114

$15,000.00
sum
-------

102

2120
sum
------sum
------avg
-------

-----------$15,000.00
$3,750.00
-----------$3,750.00
-----------$22,776.00
-----------$5,694.00

Restricciones en consultas agrupadas


Las columnas de agrupacin deben ser columnas efectivas de las tablas
designadas en la clusula FROM de la consulta. No se pueden agrupar las filas basndose
en el valor de una expresin calculada.
Tambin hay restricciones sobre los elementos que pueden aparecer en la lista
de seleccin de una consulta agrupada. Todos los elementos de la lista de seleccin
deben tener un nico valor por cada grupo de filas. Bsicamente, esto significa que un
elemento de seleccin en una consulta agrupada puede ser:

Una constante
Una funcin de columna
Una columna de agrupacin, que por definicin tiene el mismo valor en
todas las filas del grupo
Una expresin que afecte a combinaciones de los anteriores

En la prctica, una consulta agrupada incluir siempre una columna de


agrupacin y una funcin de columna en su lista de seleccin.
Valores NULL en columnas de agrupacin
Un valor NULL presenta un problema especial cuando aparece en una columna
de agrupacin. Si el valor de la columna es desconocido, en qu grupo debera
colocarse la fila? En la clusula WHERE, cuando se comparan dos valores NULL
diferentes, el resultado es NULL (no TRUE), es decir, los dos valores NULL no se
consideran iguales. Aplicando el mismo convenio a la clusula GROUP BY se forzara a
SQL a colocar cada fila con una columna de agrupacin NULL en un grupo aparte.
En la prctica, esta regla se demuestra que es demasiado rgida. En vez de ello,
el estndar SQL ANSI/ISO considera que dos valores NULL son iguales a efectos de la
clusula GROUP BY. Si dos filas tienen NULL en las mismas columnas de agrupacin

Pg.-148

SQL

no NULL, se agrupan dentro del mismo grupo de filas.


SELECT PELO, OJOS, COUNT(*)
FROM REPVENTAS
GROUP BY PELO, OJOS
NOMBRE
Cindy
Louise
Harry
Samantha
Joanne
George
Mary
Paula
Kevin
Joel
Susan
Marie

PELO
Castao
NULL
NULL
NULL
NULL
Castao
Castao
Castao
Castao
Castao
Rubio
Rubio

OJOS
Azules
Azules
Azules
NULL
NULL
NULL
NULL
NULL
NULL
Negros
Azules
Azules

Condiciones de bsqueda de grupos (clusula HAVING)


Al igual que la clusula WHERE puede ser utilizada para seleccionar y rechazar
filas individuales que participan en una consulta, la clusula HAVING puede ser utilizada
para seleccionar y rechazar grupos de filas. El formato de la clusula HAVING es
anlogo al de la clusula WHERE, consistiendo en la palabra clave HAVING seguida de
una condicin de bsqueda.
Cul es el tamao de pedido promedio para cada vendedor cuyos pedidos totalizan ms
de $30.000?
SELECT REP, AVG(IMPORTE)
FROM PEDIDOS
GROUP BY REP
HAVING SUM(IMPORTE) > 30000.00
REP
105
106
107
108

AVG(IMPORTE)
$7,865.40
$16,479.00
$11,477.33
$8,376.14

La clusula GROUP BY dispone primero de los pedidos en grupos por


vendedor. La clusula HAVING elimina entonces los grupos en donde el total de los
pedidos no excede de $30.000. Finalmente, la clusula SELECT calcula el tamao de
pedido medio para cada uno de los grupos restantes y genera los resultados de la
SQL

Pg.-149

consulta.
Las condiciones de bsqueda que se pueden especificar en la clusula HAVING
son las mismas de la clusula WHERE.
Por cada oficina con dos o ms personas, calcular la cuota total y las ventas totales para
todos los vendedores que trabajan en la oficina.
SELECT CIUDAD, SUM(CUOTA), SUM(REPVENTAS.VENTAS)
FROM OFICINAS, REPVENTAS
WHERE OFICINA = OFICINA_REP
GROUP BY CIUDAD
hay una oficina por ciudad
HAVING COUNT(*) >= 2

CIUDAD
Chicago
Los Angeles
New York

SUM(CUOTA)
$775,000.00
$700,000.00
$575,000.00

SUM(REPVENTAS.VENTAS)
$735,042.00
$835,915.00
$692,637.00

SQL gestiona esta consulta del modo siguiente:


1. Compone las Tablas OFICINAS y REPVENTAS para hallar la ciudad en
donde trabaja cada vendedor.
2. Agrupa las filas resultantes por oficina.
3. Elimina los grupos con dos o menos filas, stas representan oficinas que no
satisfacen el criterio de la clusula HAVING.
4. Calcula la cuota total y las ventas totales para cada grupo.
Muestra el precio, las existencias y la cantidad total de los pedidos de cada producto
para los cuales la cantidad total pedida es superior al 75 por 100 de las existencias.
SELECT DESCRIPCION, PRECIO, EXISTENCIAS, SUM(CANT)
FROM PRODUCTOS, PEDIDOS
WHERE FAB = ID_FAB
AND PRODUCTO = ID_PRODUCTO
GROUP BY ID_FAB, ID_PRODUCTO, DESCRIPCION, PRECIO, EXISTENCIAS
HAVING SUM(CANT) > (0.75 * EXISTENCIAS)
ORDER BY EXISTENCIAS DESC
DESCRIPCION
Reductor
Ajustador
Bancada motor
Bisagra Dcha.
Riostra 1-Tm
Pg.-150

PRECIO
$355.00
$25.00
$243.00
$4,500.00
$1,425.00

EXISTENCIAS
38
37
15
12
5
SQL

SUM(CANT)
32
30
16
15
22

Para procesar esta consulta, SQL efecta conceptualmente los siguientes pasos:
1. Compone las Tablas PRODUCTOS y PEDIDOS para obtener la
descripcin, precio y existencias de cada producto pedido.
2. Agrupa las filas resultantes por fabricante e id de producto.
3. Elimina los grupos en donde la cantidad pedida es menor al 75% de las
existencias.
4. Calcula la cantidad total pedida para cada grupo.
5. Genera una fila resumen de resultados por cada grupo.
6. Ordena los resultados para que los productos con el mayor valor de
existencias aparezcan en primer lugar.
Restricciones en condiciones de bsqueda de grupos
La clusula HAVING se utiliza para incluir o excluir grupos de filas de los
resultados de la consulta, por lo que la condicin de bsqueda que especifica debe ser
aplicable al grupo en su totalidad en lugar de a filas individuales. Esto significa que un
elemento que aparezca dentro de la condicin de bsqueda en una clusula HAVING
puede ser:

Una constante
Una funcin de columna, que produzca un nico valor resumen de las filas
del grupo
Una columna de agrupacin, que por definicin tiene el mismo valor en
todas las filas del grupo
Una expresin que afecte a combinaciones de los anteriores

En la prctica, la condicin de bsqueda de la clusula HAVING incluir


siempre al menos una funcin de columna. Si no lo hiciera, la condicin de bsqueda
podra expresarse con la clusula WHERE y aplicarse a filas individuales. El modo ms
fcil de averiguar si una condicin de bsqueda pertenece a la clusula WHERE o a la
clusula HAVING es recordar cmo se aplican ambas clusulas:

La clusula WHERE se aplica a filas individuales, por lo que las expresiones


que contiene deben ser calculables para filas individuales.
La clusula HAVING se aplica a grupos de filas, por lo que las expresiones
que contengan deben ser calculables para un grupo de filas.

Valores NULL y condiciones de bsqueda de grupos


Al igual que la condicin de bsqueda de la clusula WHERE, la condicin de
bsqueda de la clusula HAVING puede producir uno de los tres resultados siguientes:

SQL

Pg.-151

Si la condicin de bsqueda es TRUE, se retiene el grupo de filas y


contribuye con una fila resumen a los resultados de la consulta.
Si la condicin de bsqueda es FALSE, el grupo de filas se descarta y no
contribuye con una fila resumen a los resultados de la consulta.
Si la condicin de bsqueda es NULL, el grupo de filas se descarta y no
contribuye con una fila resumen a los resultados de la consulta.

HAVING sin GROUP BY


La clusula HAVING se utiliza casi siempre juntamente con la clusula GROUP
BY, pero la sintaxis de la sentencia SELECT no lo precisa. Si una clusula HAVING
aparece sin una clusula GROUP BY, SQL considera el conjunto entero de resultados
detallados como un nico grupo. En otras palabras, las funciones de columna de la
clusula HAVING se aplican a un solo y nico grupo para determinar si el grupo est
incluido o excluido de los resultados, y ese grupo est formado por todas las filas. El uso
de una clusula HAVING sin una clusula correspondiente GROUP BY casi nunca se ve
en la prctica.

6.13. SINTAXIS DE LA ORDEN SELECT


La Figura muestra el formato completo de la sentencia SELECT, que consta de
seis clusulas. Las clusulas SELECT y FROM de la sentencia son necesarias. Las cuatro
clusulas restantes (where, order, group y having) son opcionales. Se incluyen en la
sentencia SELECT solamente cuando se desean utilizar las funciones que proporcionan.
La funcin de cada clusula esta resumida a continuacin:

La clusula SELECT lista los datos a recuperar por la sentencia SELECT.


Los tems pueden ser columnas de la base de datos o columnas a calcular
por SQL cuando efecte la consulta.
La clusula FROM lista las tablas que contienen los datos a recuperar por la
consulta.

SELECT

ALL
DISTINCT

FROM

tem seleccionado
,
*

especificacin-de-tabla
,

WHERE condicin de bsqueda


GROUP BY

columna-de-agrupacin
,

HAVING condicin-de-bsqueda
ORDER BY

Pg.-152

especificacin-de-ordenacin
,

La clusula WHERE dice a SQL que incluya slo ciertas filas de datos en

SQL

los resultados de la consulta.

La clusula GROUP BY especifica una consulta resumen. En vez de


producir una fila de resultados por cada fila de datos de la base de datos,
una consulta resumen agrupa todas las filas similares y luego produce una
fila resumen de resultados para cada grupo.
La clusula HAVING dice a SQL que incluya slo ciertos grupos
producidos por la clusula GROUP BY en los resultados de la consulta. Al
igual que la clusula WHERE, utiliza una condicin de bsqueda para
especificar los grupos deseados.
La clusula ORDER BY ordena los resultados de la consulta en base a los
datos de una o ms columnas.

6.14. RESUMEN

La sentencia SELECT se utiliza para expresar una consulta SQL. Toda


sentencia SELECT produce una tabla de resultados que contienen una o
ms columnas y cero o ms filas.
La clusula FROM especifica la(s) tabla(s) que contiene(n) los datos a
recuperar por una consulta.
La clusula SELECT especifica la(s) columna(s) de datos a incluir en los
resultados de la consulta, que pueden ser columnas de datos de la base de
datos o columnas calculadas.
La clusula WHERE selecciona las filas a incluir en los resultados aplicando
una condicin de bsqueda a las filas de la base de datos.
Una condicin de bsqueda puede seleccionar filas mediante comparacin
de valores, mediante comparacin de un valor con un rango o un grupo de
valores, por correspondencia con un patrn de cadena o por comprobacin
de valores NULL.
Las condiciones de bsqueda simples pueden combinarse mediante AND,
OR y NOT para formar condiciones de bsqueda ms complejas.
La clusula ORDER BY especifica que los resultados de la consulta deben
ser ordenados en sentido ascendente o descendente, basndose en los
valores de una o ms columnas.
La operacin UNION puede ser utilizada dentro de una sentencia SELECT
para combinar dos o ms conjuntos de resultados y formar un nico

SQL

Pg.-153

conjunto.

Las consultas resumen utilizan funciones de columna SQL para condensar


una columna de valores en un nico valor que resuma la columna.
Las funciones de columna pueden calcular el promedio, suma, el valor
mnimo y mximo de una columna, contar el nmero de valores de datos de
una columna o contar el nmero de filas de los resultados de la consulta.
Una consulta resumen sin una clusula GROUP BY genera una nica fila de
resultados, resumiendo todas las filas de una tablas o de un conjunto
compuestos de tablas.
Una consulta resumen con una clusula GROUP BY genera mltiples filas
de resultados.

6.15. EJERCICIOS
1. Muestra el nombre, las ventas y la cuota del empleado nmero 105.
2. Lista las oficinas cuyas ventas estn por debajo del 80 por 100 del objetivo.
Mostrar la ciudad, ventas y el objetivo.
3. Lista las oficinas no dirigidas por el empleado nmero 108. Mostrar la
ciudad y n de empleado.
4. Hallar los pedidos cuyo importe es superior a 20.000 e inferior a 29.999.
Mostrar el nmero de pedido e importe.
5. Hallar los pedidos remitidos un jueves en enero de 1990. Mostrar el nmero
de pedido, fecha de pedido e importe.
6. Hallar todos los pedidos obtenidos por cuatro vendedores especficos (elegir
4 que ya tengis). Mostrar el nmero de pedido, representante e importe.
7. Buscar el nombre de las empresas cuyo nombre empiezan en Smiths,
acaba la palabra en n y en el centro hay una letra desconocida. Por detrs,
el nombre puede tener: Corp o Inc.
8. Hallar todos los nombres de vendedores que cumplan alguna de las 3
siguientes opciones:
A. Trabajan en Denver, New York o Chicago.
B. No tienen director y fueron contratados a partir de Junio de
1988.
C. Sus ventas estn por encima de la cuota, pero tienen ventas de

Pg.-154

SQL

600.000 o menos.
9. Por cada producto mostrar el Identificador del producto, su descripcin, el
inventario (existencias por el precio).
10. Mostrar cada vendedor con su cuota elevada en un 3 por 100 de sus ventas
anuales. Adems, mostrar el nombre de vendedor y su cuota actual.
11. Listar las oficinas, clasificadas en orden alfabtico por regin, y dentro de
cada regin por orden descendente de rendimiento de ventas (ventas menos
objetivo). Por cada oficina se mostrar la ciudad, regin y el rendimiento de
ventas.
12. Calcular el rendimiento de la cuota promedio de los vendedores. Dar la
orden pertinente.
13. Calcular el importe medio de los pedidos realizados por el cliente Acme
Mfg.
14. Dar la orden que calcule el mejor rendimiento de ventas de todos los
vendedores.
15. Listar el rango de cuotas asignadas en cada oficina. Mostrar la oficina, el
rango superior e inferior.
16. Mostrar el nmero de vendedores asignados en cada oficina.
17. Mostrar los diferentes clientes que son atendidos por cada vendedor.

SQL

Pg.-155

TEMA VII
CONSULTAS MULTIPLES
7.1

CONSULTA DE VARIAS TABLAS

7.2. COMPOSICIONES CON CRITERIOS DE SELECCIN DE


FILA
7.3.

MULTIPLES COLUMNAS DE EMPAREJAMIENTO

7.4.

CONSULTAS DE TRES O MAS TABLAS

7.5.

OTRAS EQUICOMPOSICIONES

7.6

COMPOSICION BASADAS EN DESIGUALDAD

7.7 CONSIDERACIONES
MULTITABLA

DE

SQL

PARA

7.7.1 Nombres de columna cualificados


7.7.2. Selecciones de todas las columnas
7.7.3. Alias de tablas
7.7.4. Autocomposiciones

7.8.

LA ESTRUCTURA DE UNA COMPOSICION


7.8.1. Multiplicacin de tablas
7.8.2. Reglas para procesamiento de consultas multitabla

Pg.-156

SQL

CONSULTAS

7.9.

COMPOSICIONES EXTERNAS, INTERNA Y COMPLETA

7.10 RESUMEN
7.11. EJERCICIOS

SQL

Pg.-157

7.1.

CONSULTA DE VARIAS TABLAS

Muchas consultas tiles solicitan datos procedentes de dos o ms tablas de la


base de datos. Por ejemplo, estas peticiones de datos para la base de datos ejemplo
extraen los datos de dos, tres o cuatro tablas:

Lista los vendedores y las oficinas en donde trabajan (Tablas REPVENTAS


y OFICINAS).
Lista los pedidos remitidos la ltima semana, mostrando el importe del
pedido, el nombre del cliente que lo orden y el nombre del producto
solicitado (tablas PEDIDOS, CLIENTES y REPVENTAS).

SQL permite recuperar datos que corresponden a estas peticiones mediante


consultas multitabla que componen (join) datos procedentes de dos o ms tablas.
Para comprender mejor las facilidades que SQL proporciona para consultas
multitabla lo mejor es comenzar con una peticin simple que combina datos de dos tablas
diferentes:
Lista todos los pedidos, mostrando el nmero de pedido y su importe, y el
nombre y el balance contable del cliente que los solicit.
Los cuatro datos especficos solicitados estn evidentemente almacenados en
dos tablas diferentes:

La tabla PEDIDOS contiene el nmero de pedido y el importe de cada


pedido, pero no tiene los nombres de cliente ni los lmites de crdito.
La Tabla CLIENTES contiene los nombres de cliente y sus balances pero le
falta la informacin referente a los pedidos.

Existe, sin embargo, un enlace entre estas dos tablas. En cada fila de la Tabla
PEDIDOS, la columna CLIE contiene el nmero del cliente que orden el pedido, el cual
se corresponde con el valor en la columna NUM_CLIE de una de las filas de la Tabla
CLIENTES. Evidentemente, la sentencia SELECT que gestiona la peticin debe utilizar
de algn modo este enlace entre tablas para generar sus resultados.
Antes de examinar la sentencia SELECT correspondiente a la consulta, es
instructivo imaginar cmo podramos gestionar manualmente la peticin, utilizando lpiz
y papel.
1. Comenzar escribiendo los nombres de las cuatro columnas para los
resultados de la consulta. Luego pasar a la Tabla PEDIDOS y comenzar con
el primer pedido.
2. Recorrer la fila para hallar el nmero de pedido (112.961) y el importe
($31,500.00) y copiar ambos valores en la primera fila de resultados de la
consulta.

Pg.-158

SQL

3. Recorrer la fila para hallar el nmero de cliente que remiti el pedido


(2.117), y pasar a la Tabla CLIENTES para hallar el nmero de cliente
2.117 buscndolo en la columna NUM_CLIE.
4. Recorrer la fila de la Tabla CLIENTES para hallar el nombre del cliente
(J.p. Sinclair) y su lmite de crdito ($35,000.00), y copiarlos a la tabla de
resultados.
5. Ya se ha generado una fila de resultados de la consulta. Se regresa a la Tabla
PEDIDOS y se contina con la fila siguiente. El proceso se repite,
comenzando por el paso 2, hasta que se agotan los pedidos.
Naturalmente sta no es la nica manera de generar los resultados de la
consulta, pero independientemente de cmo se haga, dos cosas sern ciertas:

Cada fila de resultados de la consulta extraer sus datos de un par


especfico de filas, una de la Tabla PEDIDOS y otra de la Tabla CLIENTES.
El par de filas en cuestin se determinar haciendo coincidir los contenidos
de las columnas correspondientes de las tablas.

COMPOSICIONES SIMPLES (EQUICOMPOSICIONES)


El proceso de formar parejas de filas haciendo coincidir los contenidos de las
columnas relacionadas se denomina componer las tablas. La tabla resultante (que
contiene datos de las dos tablas originales) se denomina una composicin entre las dos
tablas. (una composicin basada en una coincidencia exacta entre dos columnas se
denomina ms precisamente una equicomposicin.
Las composiciones son el fundamento del procesamiento e consultas multitabla
en SQL. Todos los datos de una base de datos relacional estn almacenados en sus
columnas con valores explcitos, de modo que todas las relaciones posibles entre tablas
pueden formarse comparando los contenidos de las columnas relacionadas.
Lista todos los pedidos mostrando su nmero, importe, nmero de cliente y el lmite de
crdito del cliente.
SELECT NUM_PEDIDO, IMPORTE, EMPRESA, LIMITE_CREDITO
FROM PEDIDOS, CLIENTES
WHERE CLIE = NUM_CLIE
Esta tiene el mismo aspecto que las consultas del captulo anterior, con dos
caractersticas novedosas. Primero, la clusula FROM lista dos tablas en lugar de una
sola. En segundo lugar, la condicin de bsqueda:
CLIE = NUM_CLIE
Compara columnas de dos tablas diferentes. A estas dos columnas las denominamos las
columnas de emparejamiento para las dos tablas. Como todas las condiciones de

SQL

Pg.-159

bsqueda, sta restringe las filas que aparecen en los resultados de la consulta. Puesto
que sta es una consulta de dos tablas, la condicin de bsqueda restringe las parejas de
filas que generan los resultados. Realmente captura el espritu de la correspondencia
manual de las columnas muy bien, diciendo:
Genera resultados slo para los pares de filas en los que el nmero de clientes
(CLIE) en la Tabla PEDIDOS coincide con el nmero de cliente (NUM_CLIE) en la
Tabla CLIENTES.
La sentencia SELECT no dice nada acerca de cmo SQL debera ejecutar la
consulta. No hay mencin de comenzar con los pedidos o comenzar con los clientes.
En lugar de ello, la consulta dice a SQL qu resultados deberan aparecer, y deja a SQL
que decida cmo generarlos.
Consultas padre/hijo
Las consultas multitabla ms comunes implican a dos tablas que tienen una
relacin natural padre/hijo. La consulta referente a pedidos y clientes de la seccin
precedente es un ejemplo de tal tipo de consulta. Cada pedido (hijo) tiene un cliente
asociado (padre), y cada cliente (padre) puede tener muchos pedidos asociados (hijos).
Los pares de filas que generan los resultados de la consulta son combinaciones de fila
pdre/hijo.
Se puede recordar que las claves ajenas y las claves primarias crean relaciones
padre/hijo en una base de datos SQL. La tabla que contiene la clave ajena es el hijo en la
relacin; la tabla con la clave primaria es el padre. Para ejercitar la relacin padre/hijo en
una consulta debe especificarse una condicin de bsqueda que compare la clave ajena y
la clave primaria. Lista cada uno de los vendedores y la ciudad y regin en donde
trabajan.
SELECT NOMBRE, CIUDAD, REGION
FROM REPVENTAS, OFICINAS
WHERE OFICINA_REP = OFICINA
NOMBRE
Mary Jones
Sam Clark
Bob Smith
Paul Cruz
Dan Roberts
Bill Adams
Sue Smith
Larry Fitch
Nancy Angelli

CIUDAD
New York
New York
Chicago
Chicago
Chicago
Atlanta
Los Angeles
Los Angeles
Denver

Tabla OFICINAS
OFICIN
CIUDAD
A
22
Denver
Pg.-160

REGION
Este
Este
Este
Este
Este
Este
Oeste
Oeste
Oeste
REGION

OBJETIVO

VENTAS

Oeste

$300,000.00

$186,042.0

SQL

11

New York

Este

$575,000.00

12

Chicago

Este

$800,000.00

13

Atlanta

Este

$350,000.00

21

Los Angeles

Oeste

$725,000.00

Tabla REPVENTAS
NUM_EMP
NOMBRE
L
105
Bill Adams
109
Mary Jones
102
Sue Smith
106
Sam Clark
104
Bob Smith
101
Dan Roberts
110
Tom Snyder
108
Larry Fitch
103
Paul Cruz
107
Nancy Angelli

ED OFIC
_REP
37
13
31
11
48
21
52
11
33
12
45
12
41 NULL
62
21
29
12
49
22

TITULO

0
$692,637.0
0
$735,042.0
0
$350,000.0
0
$835,915.0
0

Resultados de la consulta
NOMBR CIUDAD REGION
E

Rep Ventas
Rep Ventas
Rep Ventas
VP Ventas
Dir Ventas
Rep Ventas
Rep Ventas
Dir Ventas
Rep Ventas
Rep Ventas

La Tabla REPVENTAS (hijo) contiene PFICINA_REP, una clave ajena para la


Tabla OFICINAS (padre). Esta relacin se utiliza para hallar la fila OFICINA correcta
para cada vendedor, de modo que pueda incluirse la ciudad y regin correctas en los
resultados de la consulta.
He aqu otra consulta que referencia las mismas dos tablas, pero con los papeles
de padre e hijo invertidos.
Lista las oficinas y los nombres y ttulos de sus directores.
SELECT CIUDAD, NOMBRE, TITULO
FROM OFICINAS, REPVENTAS
WHERE DIR = NUM_EMPL
CIUDAD
Chicago
Atlanta
New York
Denver
Los Angeles

NOMBRE
Bob Smith
Bill Adams
Sam Clark
Larry Fitch
Larry Fitch

TITULO
Dir Ventas
Rep Ventas
VP Ventas
Dir Ventas
Dir Ventas

La Tabla OFICINAS (hijo) contiene DIR, una clave ajena para la Tabla
REPVENTAS (padre). Esta relacin se utiliza para hallar la fila REPVENTAS correcta
para cada vendedor, de modo que puedan incluirse el nombre y el ttulo correctos del
director en los resultados de la consulta.

SQL

Pg.-161

7.2. COMPOSICIONES CON CRITERIOS DE SELECCIN DE


FILA
La condicin de bsqueda que especifica las columnas de emparejamiento en
una consulta multitabla puede combinarse con otras condiciones de bsqueda para
restringir an ms los contenidos de los resultados. Supongamos que se desea volver a
ejecutar la consulta anterior, mostrando nicamente las oficinas con mayores objetivos de
ventas.
Lista las oficinas con un objetivo superior a $600.000 y su director.
SELECT CIUDAD, NOMBRE, TITULO
FROM OFICINAS, REPVENTAS
WHERE DIR = NUM_EMPL
AND OBJETIVO > 600,000.00
CIUDAD
Chicago

NOMBRE
Bob Smith

TITULO
Dir Ventas

Con la condicin de bsqueda adicional, las filas que aparecen en los resultados
estn an ms restringidas. El primer test (DIR = NUM_EMPL) selecciona solamente
pares de filas OFICINAS y REPVENTAS que tienen la adecuada relacin padre/hijo; el
segundo test selecciona adicionalmente slo aquellos pares de filas en donde la oficina
est por encima del objetivo.

7.3.

MULTIPLES COLUMNAS DE EMPAREJAMIENTO

La Tabla PEDIDOS y la Tabla PRODUCTOS de la base de datos ejemplo estn


relacionadas por un par de claves ajena/primaria. Las columnas FAB y PRODUCTO de
la Tabla PEDIDOS forman juntas una clave ajena para la Tabla PRODUCTOS,
respectivamente. Para componer las tablas basndose en esta relacin padre/hijo, deben
especificarse ambos pares de columnas de emparejamiento, tal como se muestra en este
ejemplo:
Lista los pedidos, mostrando los importes y las descripciones del producto.
SELECT NUM_PEDIDO, IMPORTE, DESCRIPCION
FROM PEDIDOS, PRODUCTOS
WHERE FAB = ID_FAB
AND PRODUCTO = ID_PRODUCTO
NUM_PEDIDO
113027
112992
113012
112968

Pg.-162

IMPORTE
$4,104.00
$760.00
$3,745.00
$3,978.00

DESCRIPCION
Artculo Tipo 2
Artculo Tipo 2
Artculo Tipo 3
Artculo Tipo 4

SQL

112963
112983
113055
113057

$3,276.00
$702.00
$150.00
$600.00

Artculo Tipo 4
Artculo Tipo 4
Ajustador
Ajustador

La condicin de bsqueda en la consulta dice a SQL que los pares de filas


relacionados en las Tablas PEDIDOS y PRODUCTOS son aqullas en las que ambos
pares de columnas coincidentes contienen los mismos valores.

7.4.

CONSULTAS DE TRES O MAS TABLAS

SQL puede combinar datos de tres o ms tablas utilizando las mismas tcnicas
bsicas utilizadas para las consultas de dos tablas. He aqu un sencillo ejemplo de una
composicin con tres tablas:
Lista los pedidos superiores a $25.000, incluyendo el nombre del vendedor que tom el
pedido y el nombre del cliente que lo solicit.
SELECT NUM_PEDIDO, IMPORTE, EMPRESA, NOMBRE
FROM PEDIDOS, CLIENTES, REPVENTAS
WHERE CLIE = NUM_CLIE
AND REP = NUM_EMPL
AND IMPORTE > 25000.00
NUM_PEDIDO
112987
113069
113045
112961

IMPORTE
$27,500.00
$31,350.00
$45,000.00
$31,500.00

EMPRESA
Acme Mfg.
Chen Associates
Zetacorp
J. P. Sinclair

NOMBRE
Bill Adams
Nancy Angelli
Larry Fitch
Sam Clark

Esta consulta utiliza dos claves de la Tabla PEDIDOS. La columna CLIE es una
clave ajena para la Tabla CLIENTES, que enlaza cada pedido con el cliente que lo
remiti. La columna REP es una clave ajena para la Tabla REPVENTAS, que liga cada
pedido con el vendedor que lo acept.
Tabla CLIENTES

Tabla REPVENTAS

NUM_CLIE

EMPRESA

REP_CLIE

2111
2102
2103
.
.

JCP inc.
First Corp.
Acme Mfg.
.
.

103
101
105
.
.

LIMITE-CREDITO
$50,000.00
$65,000.00
$50,000.00
.
.

NUM_E
MPL
105
109
102
.
.

NOMBRE

ED

OFIC_REP

Bill Adams
Mary Jones
Sue Smith
.
.

37
31
48
.
.

13
11
21
.
.

Tabla PEDIDOS
NUM_PEDIDO
112961

FECHA_PED
12/17/1989

CLIE
2117

REP
106

DIR
REI

...
...

SQL

IMPORTE
$31,500.00

Pg.-163

113012
112989
.
.

01/11/1990
01/03/1990
.
.

2111
2101
.
.

105
106
.
.

ACI
FEA
.
.

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

$3,745.00
$1,458.00
.
.

Resultados de la consulta
NUM_PEDIDO

IMPORTE

EMPRESA

NOMBRE

No es extrao encontrar consultas de tres o incluso cuatro tablas en


aplicaciones SQL de produccin.

7.5.

OTRAS EQUICOMPOSICIONES

La inmensa mayora de las consultas multitabla se basan en relaciones


padre/hijo, pero SQL no exige que las columnas de emparejamiento estn relacionadas
como clave primaria y clave ajena. Cualquier par de columnas de dos tablas pueden
servir como columnas de emparejamiento, siempre que tengan tipos de datos
comparables. He aqu un ejemplo de una columna que utiliza un par de fechas como
columnas de emparejamiento:
Halla todos los pedidos recibidos en los das en que un nuevo vendedor fue contratado.
SELECT NUM_PEDIDO, IMPORTE, FECHA_PEDIDO, NOMBRE
FROM PEDIDOS, REPVENTAS
WHERE FECHA_PEDIDO = CONTRATO
NUM_PEDIDO
112968
112979
112975
112968
112979
112975

IMPORTE
$3,978.00
$15,000.00
$2,100.00
$3,978.00
$15,000.00
$2,100.00

FECHA_PEDIDO
12-OCT-89
12-OCT-89
12-OCT-89
12-OCT-89
12-OCT-89
12-OCT-89

NOMBRE
Mary Jones
Mary Jones
Mary Jones
Larry Fitch
Larry Fitch
Larry Fitch

Los resultados de esta consulta provienen de los pares de filas de las Tablas
PEDIDOS y REPVENTAS, en donde el valor en la columna FECH_PEDIDO coincide
con el valor en la columna CONTRATO para el vendedor. Ninguna de estas columnas es
una clave ajena o una clave primaria, y la relacin entre los pares de filas es ciertamente
una relacin extraa, la nica cosa que los pedidos y vendedores correspondientes tienen
en comn es que resultan tener las mismas fechas.
Tabla REPVENTAS
NUM_EMP
NOMBRE
L
105
Bill Adams
109
Mary Jones
102
Sue Smith
106
Sam Clark
104
Bob Smith

Pg.-164

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

CONTRAT
O
02/12/1988
10/12/1989
12/10/1986
06/14/1988
05/19/1987

SQL

NUM_PEDID
O
113051
112968
113036
113062
112979

FECHA_P
EDIDO
02/10/1990
10/12/1989
01/30/1990
02/24/1990
10/12/1989

CLIE
2118
2102
2107
2124
2114

101
110
108
103
107

Dan Roberts
Tom Snyder
Larry Fitch
Paul Cruz
Nancy Angelli

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

10/20/1986
01/13/1990
10/12/1989
03/01/1987
11/14/1989

113027
112992
112975
113055
.

01/22/1990
11/04/1989
10/12/1989
02/15/1990
.

2103
2118
2111
2108
.

Las columnas de emparejamiento como las de este ejemplo generan una relacin
de muchos a muchos entre las dos tablas. Puede haber muchos pedidos que compartan
una nica fecha de contrato del vendedor, y ms de un vendedor puede haber sido
contratado en la fecha de pedidos diferentes (112.968, 112.975 y 112.979) fueron
recibidos el 12 de octubre de 1989, y dos vendedores diferentes (Larry Fitch y Mary
Jones) fueron contratados el mismo da. Los tres pedidos y los dos vendedores producen
seis filas de resultados de la consulta.
Esta relacin de muchos a muchos es diferente de la relacin de uno a muchos
creada por columnas de emparejamiento clave primaria/clave ajena. La situacin puede
resumirse del siguiente modo:

Las composiciones que asocian claves primarias a claves ajenas siempre


crean relaciones padre/hijo de uno a muchos.
En general, las composiciones sobre las columnas de emparejamiento
arbitrarias generan relaciones de muchos a muchos.

Estas dos situaciones diferentes no tienen nada que evr con cmo se escriba la
sentencia SELECT que expresa la composicin.

7.6.

COMPOSICIONES BASADAS EN DESIGUALDAD

El trmino composicin (join) se aplica a cualquier consulta que combina


datos de dos tablas mediante comparacin de los valores en una pareja de columnas de
tablas.
Lista todas las combinaciones de vendedores y oficinas en donde la cuota del vendedor
es superior al objetivo de la oficina.
SELECT NOMBRE, CUOTA, CIUDAD, OBJETIVO
FROM REPVENTAS, OFICINAS
WHERE CUOTA > OBJETIVO
NOMBRE
Bill Adams
Sue Smith
Larry Fitch

CUOTA
$350,000.00
$350,000.00
$350,000.00

CIUDAD
Denver
Denver
Denver

OBJETIVO
$300,000.00
$300,000.00
$300,000.00

Como en todas las consultas de dos tablas, cada fila de resultados proviene de
un par de filas, en este caso de las Tablas REPVENTAS y OFICINAS. La condicin de
bsqueda:
SQL

Pg.-165

CUOTA > OBJETIVO


Selecciona pares de filas en donde la columna CUOTA de la fila REPVENTAS excede a
la columna OBJETIVO de la fila OFICINAS. Observe que los pares de filas
REPVENTAS y OFICINAS estn relacionadas nicamente de este modo; no se requiere
especficamente que la fila REPVENTAS represente a alguien que trabaje en la oficina
representada por la fila OFICINAS. El ejemplo es un poco extremado, e ilustra por qu
las composiciones basadas en desigualdades no son muy comunes.

7.7. CONSIDERACIONES
MULTITABLA

SQL

PARA

CONSULTAS

Algunas consultas multitabla no pueden ser expresadas sin las caractersticas


adicionales del lenguaje SQL descritas en las secciones siguientes. Especficamente:

Los nombres de columna cualificados son necesarios a veces en consultas


multitabla para eliminar referencias de columna ambiguas.
Las selecciones de todas las columnas (SELECT *) tienen un significado
especial para las consultas multitabla.
Las autocomposiciones pueden ser utilizadas para crear una consulta
multitabla que relaciona una tabla consigo misma.
Los alias de tablas pueden ser utilizadas en la clusula FROM para
simplificar nombres de columna cualificados y permitir referencias de
columna no ambiguas en autocomposiciones.

7.7.1. Nombres de columna cualificados


La base de datos ejemplo incluye varias instancias en donde dos tablas
contienen columnas con el mismo nombre. La Tabla OFICINAS y la Tabla
REPVENTAS, por ejemplo, tienen ambas una columna de nombre VENTAS. La
columna de la Tabla OFICINAS contiene las ventas anuales hasta la fecha para cada
oficina; la de la Tabla REPVENTAS contiene las ventas anuales hasta la fecha de cada
vendedor. Normalmente, no hay confusin entre ambas columnas, ya que la clusula
FROM determina cul de ellas es la adecuada en una consulta determinada, como en
estos ejemplos:
Muestra las ciudades en donde las ventas superan al objetivo.
SELECT CIUDAD, VENTAS
FROM OFICINAS
WHERE VENTAS > OBJETIVO
Sin embargo, he aqu una consulta en donde los nombres duplicados provocan
un problema:

Pg.-166

SQL

Muestra el nombre, las ventas y la oficina de cada vendedor.


SELECT NOMBRE, VENTAS, CIUDAD
FROM REPVENTAS, OFICINAS
WHERE OFICINA_REP = OFICINA
Error: Nombre de columna ambiguo VENTAS
Aunque la descripcin textual de la consulta implica que se desea la columna
VENTAS de la tabla REPVENTAS, la consulta SQL es ambigua. Para eliminar la
ambigedad, debe utilizarse un nombre de columna cualificado para identificar la
columna. Un nombre de columna cualificado especifica el nombre de una columna y la
tabla que contiene a la columna. Los nombres cualificados de las dos columnas VENTAS
en base de datos ejemplo son:
OFICINAS, VENTAS y REPVENTAS.VENTAS
Un nombre de columna cualificado puede ser utilizado en una sentencia
SELECT en cualquier lugar en donde se permite un nombre de columna. La tabla
especificada en el nombre de columna cualificado, debe, naturalmente, corresponder a
una de las tablas especificadas en la lista FROM. He aqu una versin corregida de la
consulta anterior que utiliza un nombre de columna cualificado:
Muestra el nombre, las ventas y la oficina de cada vendedor.
SELECT NOMBRE, REPVENTAS.VENTAS, CIUDAD
FROM REPVENTAS, OFICINAS
WHERE OFICINA_REP = OFICINA
Utilizar nombres de columnas cualificados en una consulta multitabla es siempre
una buena medida. La desventaja, naturalmente, es que hacen que el texto de la consulta
sea mayor.
7.7.2. Selecciones de todas las columnas
SELECT * puede ser utilizado para seleccionar todas las columnas de la tabla
designada en la clusula FROM. En una consulta multitabla, el asterisco selecciona todas
las columnas de todas las tablas listadas en la clusula FROM. La siguiente consulta, por
ejemplo, producira 15 columnas de resultados, las 9 columnas de la Tabla REPVENTAS
seguidas de las 6 columnas de la Tabla OFICINAS:
Informa sobre todos los vendedores y todas las oficinas en las que trabajan.
SELECT *
FROM REPVENTAS, OFICINAS
WHERE OFICINA_REP = OFICINA

SQL

Pg.-167

Obviamente, la forma SELECT * de una consulta resulta ser mucho menos


prctica cuando hay dos, tres o ms tablas en la clusula FROM.
En la siguiente consulta, el tem de seleccin REPVENTAS.* se expande a una
lista que contiene nicamente las columnas halladas en la Tabla REPVENTAS:
Informa acerca de todos los vendedores y los lugares en los que trabajan.
SELECT REPVENTAS.*, CIUDAD, REGION
FROM REPVENTAS, OFICINAS
WHERE OFICINA_REP = OFICINA
La consulta producira once columnas de resultados, las nueve columnas de la
Tabla REPVENTAS, seguidas de las dos columnas explcitamente solicitadas de la Tabla
OFICINAS.
7.7.3. Alias de tablas
Si una consulta se refiere a la tabla de otro usuario, o si el nombre de una tabla
es muy largo, puede ser tedioso escribir el nombre de la tabla como cualificador de una
columna. Esta consulta, que referencia a la tabla CUMPLEAOS propiedad del usuario
SAM:
Lista los nombres, cuotas y cumpleaos de los vendedores.
SELECT REPVENTAS, NOMBRE, CUOTA, SAM.CUMPLEAOS_FECHA
FROM REPVENTAS, SAM.CUMPLEAOS
WHERE REPVENTAS.NOMBRE = SAM.CUMPLEAOS.NOMBRE
Resulta ms fcil de leer y escribir cuando se utilizan los alias S y B para las dos tablas:
Lista los nombres, cuotas y cumpleaos de los vendedores.
SELECT S.NOMBRE, S.CUOTA, B.FECHA
FROM REPVENTAS S, SAM.CUMPLEAOS B
WHERE S.NOMBRE = B.NOMBRE
La clusula tiene dos funciones importantes:

Pg.-168

La clusula FROM identifica todas las tablas que contribuyen con datos a
los resultados de la consulta. Las columnas referenciadas en la sentencia
SELECT deben provenir de una de las tablas designadas en la clusula
FROM.
La clusula FROM determina la marca que se utiliza para identificar la tabla
en referencias de columna cualificadas dentro de la sentencia SELECT. Si se
especifica un alias, ste pasa a ser la marca de la tabla; en caso contrario se

SQL

utiliza como marca el nombre de la tabla, tal como aparece en la clusula


FROM.
La nica exigencia para las marcas de tablas en la clusula FROM es que todas
las marcas de una clusula FROM determinada deben ser distintas unas de otras.
7.7.4. Autocomposiciones (una tabla consigo misma)
Algunas consultas multitabla afectan a una relacin que una tabla tiene consigo
misma. Por ejemplo, supongamos que se desea listar los nombres de todos los
vendedores y sus directores. Cada vendedor aparece como una fila en la Tabla
REPVENTAS, y la columna DIRECTOR contiene el nmero de empleado del director
del vendedor. Parecera que la columna DIRECTOR debera ser una clave ajena para la
tabla que contiene datos referentes a los directores. En efecto as es, se trata de una clave
ajena para la propia tabla REPVENTAS.
Si se tratara de expresar esta consulta como cualquier otra consulta de dos
tablas implicando una coincidencia clave ajena/clave primaria, aparecera tal como esta:
SELECT NOMBRE, NOMBRE
FROM REPVENTAS, REPVENTAS
WHERE DIRECTOR = NUM_EMPL
Esta sentencia SELECT es ilegal debido a la referencia duplicada a la Tabla
REPVENTAS en la clusula FROM. Tambin podra intentarse eliminar la
segundareferencia a la Tabla REPVENTAS.
SELECT NOMBRE, NOMBRE
FROM REPVENTAS
WHERE DIRECTOR = NUM_EMPL
Esta consulta es legal, pero no har lo que se desea que haga. Es una consulta
monotabla, por lo que SQL recorre la Tabla REPVENTAS fila a fila, aplicando la
condicin de bsqueda.
DIRECTOR = NUM_EMPL
Las filas que satisfacen esta condicin son aqullas en donde las dos columnas
tienen el mismo valor, es decir, las filas en donde un vendedor es su propio director. No
existen tales filas, por lo que la consulta no producira resultados.
Para comprender cmo resuelve SQL este problema, imagnate que hubiera dos
copias idnticas de la Tabla REPVENTAS, una llamada EMPS, que contuviera los
empleados, y otra llamada DIRS, que contuviera los directores. La columna DIRECTOR
de la Tabla EMPS sera entonces una clave ajena para la Tabla DIRS, y la siguiente

SQL

Pg.-169

consulta funcionara:
Lista los nombres de los vendedores y sus directores.
SELECT EMPS.NOMBRE, DIRS.NOMBRE
FROM EMPS, DIRS
WHERE EMPS.DIRECTOR = DIRS.NUM_EMPL
Puesto que las columnas de las dos tablas tienen nombres idnticos, todas las
referencias de columnas estn cualificadas.
SQL utiliza exactamente esta estrategia de tabla duplicada imaginaria para
componer una tabla consigo misma. En lugar de duplicar realmente el contenido de la
tabla. SQL simplemente permite referirse a ella mediante un nombre diferente, llamado
un alias de tabla. He aqu la misma consulta, escrita utilizando los alias EMPS y DIRS
para la Tabla REPVENTAS.
Lista los nombres de los vendedores y sus directores.
SELECT EMPS.NOMBRE, DIRS.NOMBRE
FROM REPVENTAS EMPS, REPVENTAS DIRS
WHERE EMPS.DIRECTOR = DIRS.NUM_EMPL
EMPS.NOMBRE
Tom Snyder
Bill Adams
Dan Roberts
Paul Cruz
Mary Jones
Bob Smith
Larry Fitch
Sue Smith
Nancy Angelli

DIRS.NOMBRE
Dan Roberts
Bob Smith
Bob Smith
Bob Smith
Sam Clark
Sam Clark
Sam Clark
Larry Fitch
Larry Fitch

La clusula FROM asigna un alias copia de la tabla REPVENTAS


especificando el nombre del alias inmediatamente despus del nombre real de la tabla.
Como muestra el ejemplo, cuando una clusula FROM contiene un alias, el alias debe ser
utilizado para identificar la tabla en referencias de columna cualificadas.
Lista los vendedores con una cuota superior a la de sus directores.
SELECT REPVENTAS, NOMBRE, REPVENTAS.CUOTA, DIRS.CUOTA
FROM REPVENTAS, REPVENTAS DIRS
WHERE REPVENTAS.DIRECTOR = DIRS.NUM_EMPL
AND REPVENTAS.CUOTA > DIRS.CUOTA

Pg.-170

SQL

7.8.

LA ESTRUCTURA DE UNA COMPOSICION

Cuando se componen muchas tablas o cuando las condiciones de bsqueda


resultan complejas, sin embargo, es muy difcil tan slo mirando una sentencia SELECT
imaginar lo que significa. Por esta razn, es muy til definir ms cuidadosamente lo que
es una composicin y qu resultados se producen con una sentencia SELECT
determinada.
7.8.1. Multiplicacin de tablas
Una composicin es un caso especial de una combinacin ms general de datos
procedentes de dos tablas, conocida como el producto cartesiano de dos tablas. El
producto de dos tablas es otra tabla (la tabla producto); que consta de todos los pares
posibles de filas de las dos tablas. Las columnas de la tabla producto son todas las
columnas de la primera tabla, seguidas de todas las columnas de la segunda tabla.
Si se especifica una consulta de dos Tablas sin una clusula WHERE, SQL
produce el producto de las dos tablas como resultado. Por ejemplo, esta consulta:
Muestra todas las combinaciones posibles de vendedores y ciudades.
SELECT NOMBRE, CIUDAD
FROM REPVENTAS, OFICINAS
Producira el producto de las Tablas REPVENTAS y OFICINAS, mostrando todos los
pares posibles vendedor/ciudad. Habra 50 filas de resultados (5 oficinas * 10 vendedores
= 50 combinaciones).
Tabla CHICAS
NOMBRE CIUDAD
Mary
Boston
Susan
Chicago
Betty
Chicago

PRODUCT
O
NOMBRE
Sam
James

CIUDAD
Chicago
Dallas

NOMBRE CIUDA NOMBRE. CIUDAD.


.CHICAS D.CHIC CHICOS CHICOS
AS
Mary
Boston
Sam
Chicago
Susan
Chicago
Sam
Chicago
Betty
Chicago
Sam
Chicago
Mary
Boston
James
Dallas
Susan
Chicago
James
Dallas
Betty
Chicago
James
Dallas

SQL

Pg.-171

7.8.2. Reglas para procesamiento de consultas multitabla


Las reglas definen el significado de cualquier sentencia SELECT multitabla
especificando un procesamiento que siempre genera el conjunto correcto de resultados
de la consulta. Para generar los resultados de una consulta con una sentencia SELECT:
1. Si la sentencia es una UNION de sentencias SELECT, aplicar los pasos 2
hasta 5 a cada una de las sentencias para generar sus resultados individuales.
2. Formar el producto de las tablas indicadas en la clusula FROM. Si la
clusula FROM designa una sola tabla, el producto es esa tabla.
3. Si hay una clusula WHERE, aplicar su condicin de bsqueda a cada fila
de la tabla producto reteniendo aquellas filas para las cuales la condicin de
bsqueda es TRUE (y descartando aquellas para las cuales es FALSE O
NULL).
4. Para cada fila restante, calcular el valor de cada elemento en la lista de
seleccin para producir una nica fila de resultados. Por cada referencia de
columna, utilizar el valor de la columna en la fila actual.
5. Si se especifica SELECT DISTINCT, eliminar las filas duplicadas de los
resultados que se hubieran producido.
6. Si la sentencia es una UNION de sentencia SELECT, mezclar los resultados
de consulta para las sentencias individuales en una nica tabla de resultados.
Eliminar las filas duplicadas a menos que se haya especificado UNION ALL:
7. Si hay una clusula ORDER BY, ordenar la formacin de los resultados de
la consulta.
Las filas generadas por este procedimiento forman los resultados de la consulta.
Para ver cmo funciona el procedimiento, considrese esta consulta:
Lista el nombre de la empresa y todos los pedidos para el nmero de cliente 2.103.
SELECT EMPRESA, NUM_PEDIDO, IMPORTE
FROM CLIENTES, PEDIDOS
WHERE NUM_CLIE = CLIE
AND NUM_CLIE = 2103
ORDER BY NUM_PEDIDO

Pg.-172

SQL

EMPRESA
Acme Mfg.
Acme Mfg.
Acme Mfg.
Acme Mfg.

NUM_PEDIDO
112963
112983
112987
113027

IMPORTE
$3,276.00
$702.00
$27,500.00
$4,104.00

Siguiendo los pasos:


1. La clusula FROM genera todas las combinaciones posibles de filas de la
Tabla CLIENTES (21 filas) y de la Tabla PEDIDOS (30 filas), produciendo
una Tabla PRODUCTO de 630 filas.
2. La clusula WHERE selecciona nicamente aquellas filas de la Tabla
PRODUCTO en donde los nmeros de cliente coinciden (NUM_CLIE =
CLIE) y el nmero de cliente es el especificado (NUM_CLIE = 2103).
Solamente se seleccionan cuatro filas; las otras 626 se eliminan.
3. La clusula SELECT extrae las tres columnas solicitadas (EMPRESA,
NUM_PEDIDO e IMPORTE_RED) de cada fila que queda de la Tabla
PRODUCTO para generar cuatro filas de resultados detallados.
4. La clusula ORDER BY ordena las cuatro filas por la columna
NUM_PEDIDO para generar el resultado final.

7.9.

COMPOSICIONES EXTERNAS, INTERNA Y COMPLETA

La operacin de composicin SQL combina informacin procedente de dos


tablas mediante la formacin de pares de filas relacionadas en las dos tablas. Los pares
de filas que componen la tabla compuesta son aqullos en los que las columnas asociadas
en cada una de las dos tablas tienen el mismo valor. Si una de las filas de una tabla no se
empareja en este proceso, la composicin puede producir resultados inesperados, como
muestran estas consultas:
Lista los vendedores y las oficinas en que trabajan:
SELECT NOMBRE, OFICINA_REP
FROM REPVENTAS
NOMBRE
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Tom Snyder
Larry Fitch
Paul Cruz

OFICINA_REP
13
11
21
11
12
12
NULL
21
12
SQL

Pg.-173

Nancy Angelli

22

Lista los vendedores y las ciudades en que trabajan.


SELECT NOMBRE, CIUDAD
FROM REPVENTAS, OFICINAS
WHERE OFICINA_REP = OFICINA
NOMBRE
Mary Jones
Sam Clark
Bob Smith
Paul Cruz
Dan Roberts
Bill Adams
Sue Smith
Larry Fitch
Nancy Angelli

CIUDAD
New York
New York
Chicago
Chicago
Chicago
Atlanta
Los Angeles
Los Angeles
Denver

Aparentemente, sera de esperar que estas dos consultas produjeran el mismo


nmero de filas, pero la primera lista diez vendedores, y la segunda slo nueve. Por
qu? Porque Tom Snyder est actualmente sin asignar y tiene un valor NULL en la
columna OFICINAS__REP (que es la columna de emparejamiento para la composicin).
Este valor NULL no se corresponde con ninguno de los nmeros de oficina en la Tabla
OFICINAS, por lo que la oficina de Tom en la Tabla REPVENTAS est sin emparejar.
Como resultado, desaparece de la composicin. La composicin SQL estndar tiene
por tanto el potencial de perder informacin si las tablas que se componen contienen filas
sin emparejar.
Lista los vendedores y las ciudades en que trabajan.
SELECT NOMBRE, CIUDAD
FROM REPVENTAS, OFICINAS
WHERE OFICINA_REP * = OFICINA
NOMBRE
Tom Snyder
Mary Jones
Sam Clark
Bob Smith
Paul Cruz
Dan Roberts
Bill Adams
Sue Smith
Larry Fitch
Nancy Angelli

Pg.-174

CIUDAD
NULL
New York
New York
Chicago
Chicago
Chicago
Atlanta
Los Angeles
Los Angeles
Denver

SQL

Estos resultados se generan utilizando un tipo diferente de operacin de


composicin, llamada composicin externa (indicada por la notacin * en la clusula
WHERE). La composicin externa es una extensin de la composicin estndar descrita
con anterioridad, la cual a veces se denomina composicin interna.
Tabla CHICAS
NOMBRE CIUDAD
Mary
Boston
Nancy
NULL
Susan
Chicago
Betty
Chicago
Anne
Denver

COMPOSICIO
N
INTERNA
Filas sin emparejar

Tabla CHICOS
NOMBRE CIUDAD
John
Boston
Henry
Boston
George
NULL
Sam
Chicago
James
Dallas

Filas sin
emparejar

Tabla de composicin externa


NOMBRE. CIUDAD. NOMBRE. CIUDAD.
CHICAS CHICAS CHICOS CHICOS
Mary
Boston
John
Boston
Mary
Boston
Henry
Boston
Susan
Chicago
Sam
Chicago
Betty
Chicago
Sam
Chicago
Anne
Denver
NULL
NULL
Nancy
NULL
NULL
NULL
NULL
NULL
James
Dallas
NULL
NULL
George
NULL

La Tabla CHICAS lista cinco chicas y las ciudades en donde viven; la Tabla
CHICOS lista cinco chicos y las ciudades en donde viven. Para encontrar las parejas
chico/chica que viven en la misma ciudad, se podra utilizar esta consulta, que forma la
composicin interna de las dos tablas:
Lista los chicos y chicas que viven en la misma ciudad.
SELECT *
FROM CHICAS, CHICOS
WHERE CHICAS.CIUDAD = CHICOS.CIUDAD
La composicin interna produce cuatro filas de resultados de la consulta.
Obsrvese que dos de las chicas (Anne y Nancy) y dos de los chicos (James y George)
no estn presentados en los resultados. Estas filas no pueden emparejarse con ninguna
fila de la otra tabla, por tanto faltan en los resultados de la composicin interna. Dos de
las filas sin emparejar (Anne y James) tienen valores vlidos en sus columnas CIUDAD,
pero no coinciden con ninguna de las ciudades de la tabla opuesta. Las otras dos filas sin
emparejar (Nancy y George) tienen valores NULL en sus columnas CIUDAD, y por las
reglas de gestin de NULL, en SQL, el valor NULL no coincide con ningn otro valor
(ni siquiera con otro valor NULL).
Supngase que se desea listar los pares chico/chica que comparten las mismas
ciudades, incluyendo los chicos y chicas desemparejados. La composicin externa de las
Tablas CHICAS y CHICOS produce exactamente este resultado. He aqu la sentencia
SQL

Pg.-175

SQL que produce la composicin externa:


Lista las chicas y chicos de la misma ciudad, incluyendo las chicas y chicos
desemparejados.
SELECT *
FROM CHICAS, CHICOS
WHERE CHICAS.CIUDAD *=* CHICOS.CIUDAD
CHICAS.NOMBRE
Mary
Mary
Susan
Betty
Anne
Nancy
NULL
NULL

CHICAS.CIUDAD
Boston
Boston
Chicago
Chicago
Denver
NULL
NULL
NULL

CHICOS.NOMBRE
John
Henry
Sam
Sam
NULL
NULL
James
GEORGE

CHICOS.CIUDAD
Boston
Boston
Chicago
Chicago
NULL
NULL
NULL
NULL

1. Comenzar con la composicin interna de las dos tablas, utilizando columnas


de emparejamiento del modo normal.
2. Por cada fila de la primera tabla que no haya correspondido a ninguna fila de
la segunda tabla, aadir una fila a los resultados, utilizando los valores de las
columnas de la primera tabla, y suponiendo un valor NULL, para todas las
columnas de la segunda tabla.
3. Por cada fila de la segunda tabla que no haya correspondido a ninguna de la
primera tabla, aadir una fila a los resultados, utilizando los valores de las
columnas de la segunda tabla, y suponiendo un valor NULL para todas las
columnas de la primera tabla.
4. La tabla resultante es la composicin externa de las dos tablas.
Composiciones externas izquierda y derecha
Tcnicamente, la composicin externa producida por la consulta anterior se
denomina composicin externa completa de las dos Tablas. Ambas tablas son tratadas
simtricamente en la composicin externa completa. Hay otras dos composiciones
externas bien definidas que no tratan a las dos tablas simtricamente.
Lista las chicas y chicos de la misma ciudad y las chicas desemparejadas.
SELECT *
FROM CHICAS, CHICOS
WHERE CHICAS.CIUDAD *= CHICOS.CIUDAD
CHICAS.NOMBRE
Mary
Mary
Susan
Betty

Pg.-176

CHICAS.CIUDAD
Boston
Boston
Chicago
Chicago

CHICOS.NOMBRE
John
Henry
Sam
Sam

SQL

CHICOS.CIUDAD
Boston
Boston
Chicago
Chicago

Anne
Nancy

Denver
NULL

NULL
NULL

NULL
NULL

La consulta produce seis filas de resultados, mostrando los pares chico/chica


emparejados y las chicas desemparejadas. Los chicos desemparejados faltan en el
resultado. Este tipo de SELECT es una composicin externa izquierda.
Lista las chicas y chicos de la misma ciudad y las chicos desemparejadas.
SELECT *
FROM CHICAS, CHICOS
WHERE CHICAS.CIUDAD =* CHICOS.CIUDAD
CHICAS.NOMBRE
Mary
Mary
Susan
Betty
NULL
NULL

CHICAS.CIUDAD
Boston
Boston
Chicago
Chicago
NULL
NULL

CHICOS.NOMBRE
John
Henry
Sam
Sam
James
George

CHICOS.CIUDAD
Boston
Boston
Chicago
Chicago
Dallas
NULL

Esta consulta tambin produce seis filas de resultados, mostrando los pares
chico/chica coincidentes y los chicos no coincidentes. Esta vez las chicas desemparejadas
faltan en el resultado. Este tipo de SELECT es una composicin externa derecha.
En la prctica, las composiciones externa izquierda y derecha son ms tiles que
la composicin externa total, especialmente en composiciones que afectan a
emparejamientos clave ajena/clave primaria. En tal composicin, la columna de clave
ajena puede contener valores NULL, produciendo filas no emparejadas de la tabla hijo
(la tabla que contiene la clave ajena). Una composicin externa simtrica incluir estas
filas hijo no emparejadas en los resultados de la consulta, sin incluir adems las filas
padre no emparejadas.

SQL

Pg.-177

Una composicin externa puede utilizarse con cualquiera de los operadores de


comparacin. Por ejemplo, una composicin externa izquierda utilizando una
comparacin mayor o igual que (>=) producira un test de comparacin como ste:
WHERE COL1 *>= COL2

7.10. RESUMEN
Este captulo describe cmo gestiona SQL las consultas que combinan los datos
de dos o ms tablas:

En una consulta multitabla, las tablas que contienen los datos son
designadas en la clusula FROM.
Cada fila de resultados es una combinacin de datos procedentes de una
nica fila en cada una de las tablas, y es la nica fila que extrae sus datos de
esa combinacin particular.
Las consultas multitabla ms habituales utilizan las relaciones padre/hijo
creadas por las claves primarias y claves ajenas.
En general, las composiciones pueden construirse comparando cualquier
par(es) de columnas de las dos tablas compuestas, utilizando un test de
desigualdad o cualquier otro test de comparacin.
Una composicin puede ser considerada como el producto de dos tablas del
cual se han suprimido algunas de las filas.
Una tabla puede componerse consigo misma; las autocomposiciones
requieren el uso de alias.
Las composiciones externas amplan la composicin estndar (interna)
reteniendo las filas no emparejadas de las tablas compuestas en los
resultados de la consulta.

7.11. EJERCICIOS
1. Lista los pedidos superiores a 25.000, mostrando el nombre del cliente que
remiti el pedido y el nombre del vendedor asignado a ese cliente, nmero
de pedido e importe.

Pg.-178

SQL

TEMA VIII
SUBCONSULTAS
8.1.

INTRODUCCION

8.2.

SUBCONSULTAS DE LA CLAUSULA WHERE


8.2.1. Referencias externas
8.2.2. Condiciones de bsqueda en subconsultas
8.2.2.1. Test de comparacin subconsultas
8.2.2.2. Test de pertenencia a conjunto (IN)
8.2.2.3. Test de existencia (EXISTS)
8.2.2.4. Test cuantificados (ANY y ALL)

8.3.

SUBCONSULTAS EN LA CLAUSULA HAVING

8.4.

RESUMEN

8.5.

RESUMEN FINAL. CONSULTAS SQL

8.6.

EJERCICIOS

SQL

Pg.-179

Notas

Pg.-180

SQL

8.1.

INTRODUCCION

La caracterstica de subconsulta de SQL permite utilizar los resultados de una


consulta como parte de otra. La caracterstica de subconsulta es menos conocida que la
caracterstica de composicin de SQL, pero juega un papel importante por tres razones:

Una sentencia SQL con una subconsulta es frecuentemente el modo ms


natural de expresar una consulta, ya que se asemeja ms a la descripcin de
la consulta en lenguaje natural.
Las subconsultas hacen ms fcil la escritura de sentencias SELECT, ya que
permiten descomponer una consulta en partes (la consulta y sus
subconsultas) y luego recomponer las partes.
Hay algunas consultas que no pueden ser expresadas en el lenguaje SQL si
utilizar una subconsulta.

Utilizacin de subconsultas
Una subconsulta es una consulta que aparece dentro de la clusula WHERE o
HAVING de otra sentencia SQL. Las subconsultas proporcionan un modo eficaz y
natural de gestionar peticiones de consultas que se expresan en trminos de los
resultados de otras consultas. He aqu un ejemplo de tal tipo de peticin.
Lista las oficinas en donde el objetivo de ventas de la oficina exceden a la suma
de las cuotas de los vendedores individuales.
La peticin solicita una lista de oficinas de la Tabla OFICINAS, en donde el
valor de la columna OBJETIVO satisface cierta condicin. Parece razonable que la
sentencia SELECT que expresa la consulta debera ser semejante a sta:
SELECT CIUDAD
FROM OFICINAS
WHERE OBJETIVO > ???
El valor ??? necesita ser sustituido, y debera ser igual a la suma de las
cuotas de los vendedores asignados a la oficina de cuestin. Cmo se puede especificar
ese valor en la consulta? Se sabe que la suma de las cuotas para una oficina especfica
(digamos, la oficina nmero 21) puede ser obtenida con esta consulta:
SELECT SUM(CUOTA)
FROM REPVENTAS
WHERE OFICINA_REP = 21
Pero cmo se pueden poner los resultados de esta consulta en la consulta
primera sustituyendo a los signos de interrogacin? Parecera razonable comenzar con la
primera consulta y reemplazar los ??? con la segunda consulta. Del modo siguiente:

SQL

Pg.-181

SELECT CIUDAD
FROM OFICINAS
WHERE OBJETIVO > (SELECT SUM(CUOTA)
FROM REPVENTAS
WHERE OFICINA_REP = OFICINA)
De hecho, sta es una consulta SQL correctamente construida. Por cada oficina,
la consulta interna (la subconsulta) calcula la suma de las cuotas para los vendedores
que trabajan en esa oficina. La consulta externa (la consulta principal) compara el
objetivo de la oficina con el total calculado y decide si aadir la oficina a los resultados
de la consulta principal. Trabajando conjuntamente, la consulta principal y la subconsulta
expresan la peticin original y recuperan los datos solicitados de la base de datos.
Las subconsultas SQL aparecen siempre como parte de la clusula WHERE o la
clusula HAVING. En la clusula WHERE, ayudan a seleccionar las filas individuales
que aparecen en los resultados de la consulta. En la clusula HAVING, ayudan a
seleccionar los grupos de filas que aparecen en los resultados de la consulta.
Como es una subconsulta:

8.2.

Una subconsulta debe producir una nica columna de datos como resultado.
Esto significa que una subconsulta siempre tiene un nico elemento de
seleccin en su clusula SELECT.
La clusula ORDER BY no puede ser especificada en una subconsulta. Los
resultados de la subconsulta se utilizan internamente por parte de la consulta
principal y nunca son visibles al usuario, por lo que tiene poco sentido
ordenarlas de algn modo.
Una subconsulta no puede ser la UNION de varias sentencia SELECT
diferentes; slo se permite una nica sentencia SELECT.
Los nombres de columna que aparecen en una subconsulta pueden referirse
a columnas de tablas de la consulta principal.

SUBCONSULTAS DE LA CLAUSULA WHERE

Las subconsultas suelen ser utilizadas principalmente en la clusula WHERE de


una sentencia SQL. Cuando aparece una subconsulta en la clusula WHERE, sta
funciona como parte del proceso de seleccin de filas.
Lista las oficinas en donde el objetivo de ventas de la oficina excede a la suma de las
cuotas de los vendedores individuales.
SELECT CIUDAD
FROM OFICINAS
WHERE OBJETIVO > (SELECT SUM(CUOTA)
FROM REPVENTAS
Pg.-182

SQL

WHERE OFICINA_REP = OFICINA)


La consulta principal extrae sus datos de la Tabla OFICINAS, y la clusula
WHERE selecciona qu oficinas sern incluidas en los resultados de la consulta. SQL
recorre las filas de la Tabla OFICINAS una a una, aplicndoles el test establecido en la
clusula WHERE. La clusula WHERE compara el valor de la columna OBJETIVO de
la fila actual con el valor producido por la subconsulta. Para examinar el valor
OBJETUVO, SQL lleva a cabo la subconsulta, determinando la suma de las cuotas para
los vendedores de la oficina actual. La subconsulta produce un nmero, y la clusula
WHERE compara el nmero con el valor OBJETIVO, seleccionando o rechazando la
oficina actual en base a la comparacin.
Tabla OFICINAS
OFI
CIUDAD
C
22
Denver

Subconsulta
...
...

11

New York

...

12

Chicago

...

13

Atlanta

...

21

Los Angeles

...

OBJETIV
O
$300,000.0
0
$575,000.0
0
$800,000.0
0
$350,000.0
0
$725,000.0
0

Tabla REPVENTAS

SELECT
SUM(CUOTA)
WHERE
OFICINA_REP =
22

>
?

Tabla REPVENTAS
SELECT
SUM(CUOTA)
WHERE
OFICINA_REP =
21

>
?

SQL

Pg.-183

8.2.1. Referencias externas


Dentro del cuerpo de una subconsulta, con frecuencia es necesario referirse al
valor de una columna en la fila actual de la consulta principal. Considrese una vez
ms la consulta del apartado anterior.
Lista las oficinas en donde el objetivo de ventas de la oficina excede a la suma de las
cuotas de los vendedores individuales.
SELECT CIUDAD
FROM OFICINAS
WHERE OBJETIVO > (SELECT SUM(CUOTA)
FROM REPVENTAS
WHERE OFICNA_REP = OFICINA)
El papel de la subconsulta en esta sentencia SELECT es calcular la cuota total
para los vendedores que trabajan en una oficina particular, especficamente, la oficina que
actualmente est siendo examinada por la clusula WHERE de la consulta principal. La
subconsulta lo lleva a cabo explorando la Tabla REPVENTAS. Pero obsrvese que la
columna OFICINA en la clusula WHERE de la subconsulta no se refiere a una columna
de la Tabla REPVENTAS; se refiere a una columna de la Tabla OFICINAS, que forma
parte de la consulta principal. Conforme SQL recorre cada fila de la Tabla OFICINAS,
utiliza el valor OFICINA de la fila actual cuando lleva a cabo la subconsulta.
La columna OFICINA en esta subconsulta es un ejemplo de referencia externa.
Una referencia externa es un nombre de columna que no se refiere a ninguna de las tablas
designadas en la clusula FROM de la subconsulta en la cual aparece el nombre de la
columna. En vez de ello, el nombre de columna se refiere a una columna de una tabla
especificada en la Tabla FROM de la consulta principal.
8.2.2. Condiciones de bsqueda en subconsultas
Una subconsulta forma parte de una condicin de bsqueda en la clusula
WHERE o HAVING. SQL ofrece estas condiciones de bsqueda en subconsultas,
adems de las descritas en otro tema anterior.

Pg.-184

Test de comparacin subconsulta. Compara el valor de una expresin con


un valor nico producido por una subconsulta. Este test se asemeja al test
de comparacin simple.
Test de pertenencia a conjunto subconsulta. Comprueba si el valor de una
expresin coincide con uno del conjunto de valores producido por una
subconsulta. Este test se asemeja al test de pertenencia a conjunto simple.
Test de existencia. Examina si una subconsulta produce alguna fila de
resultados.
Test de comparacin cuantificada. Compara el valor de una expresin con
cada uno del conjunto de valores producido por una subconsulta.

SQL

8.2.2.1. Test de comparacin subconsulta (=, <>, <, <=, >, >=)
El test de comparacin subconsulta es una forma modificada del test de
comparacin simple. Compara el valor de una expresin producido por una subconsulta,
y devuelve un resultado TRUE si la comparacin es cierta. Este test se utiliza para
comparar un valor de la fila que est siendo examinada con un valor nico producido por
una subconsulta, como en este ejemplo:
Lista los vendedores cuyas cuotas son iguales o superiores al objetivo de la oficina
de ventas de Atlanta.
SELECT NOMBRE
FROM REPVENTAS
WHERE CUOTA >= (SELECT OBJETIVO
FROM OFICINAS
WHERE CIUDAD = Atlanta)
La subconsulta del ejemplo recupera el objetivo de ventas de la oficina de
Atlanta. El valor se utiliza entonces para seleccionar los vendedores cuyas cuotas son
superiores o iguales al objetivo.
El test de comparacin subconsulta ofrece los mismos seis operadores de
comparacin (=, <>, <, <=, >, >=) disponibles con el test de comparacin simple. La
subconsulta especificada en este test debe producir una nica fila de resultados. Si la
subconsulta produce mltiples filas, la comparacin no tiene sentido y SQL informa de
una condicin de error. Si la subconsulta no produce filas o produce un valor NULL, el
test de comparacin devuelve NULL.
Lista todos los productos del fabricante ACI para los cuales las existencias superan a las
existencias del producto ACI-41004.
SELECT DESCRIPCION, EXISTENCIAS
FROM PRODUCTOS
WHERE ID_FAB = ACI
AND EXISTENCIAS > (SELECT EXISTENCIAS
FROM PRODUCTOS
WHERE ID_FAB = ACI
AND ID_PRODUCTO = 41004)
DESCRIPCION
Artculo Tipo 3
Artculo Tipo 1
Artculo Tipo 2

EXISTENCIAS
207
277
167

Obsrvese que el test de comparacin subconsulta permite una


subconsulta nicamente en el lado derecho del operador de comparacin. Esta

SQL

Pg.-185

composicin:
A < (subconsulta)
Est permitida, pero esta comparacin:
(subconsulta) > A
no est permitida.
8.2.2.2. Test de pertenencia a conjunto (IN)
El test de pertenencia a conjunto subconsulta (IN) es una forma
modificada del test de pertenencia a conjunto simple. Compara un nico valor de datos
con una columna de valores producida por una subconsulta y devuelve un resultado
TRUE si el valor coincide con uno de los valores de la columna.
Lista los vendedores que no trabajan en oficinas dirigidas por Larry Fitch (empleado
108).
SELECT NOMBRE
FROM REPVENTAS
WHERE OFICINA_REP NOT IN (SELECT OFICINA
FROM OFICINAS
WHERE DIR = 108)
NOMBRE
Bill Adams
Mary Jones
Sam Clark
Bob Smith
Dan Roberts
Paul Cruz

expresin-de-test

IN

subconsulta

NOT
La subconsulta produce una columna de valores, y la clusula WHERE de
la consulta principal, comprueba si un valor de una fila de la consulta principal coincide
con uno de los valores de la columna.
8.2.2.3. Test de existencia (EXISTS)
El test de existencia (EXISTS) comprueba si una subconsulta produce

Pg.-186

SQL

alguna fila de resultados. No hay test de comparacin simple que se asemeja al test de
existencia; solamente se utiliza con subconsultas.
He aqu un ejemplo de una peticin que se puede expresar sencillamente
utilizando un test de existencia:
Lista los productos para los cuales se ha recibido un pedido de $25.000
o ms. La peticin podra ser fcilmente expresada tambin de esta forma:
Lista los productos para los cuales existe al menos un pedido en la Tabla
PEDIDOS a) que se refiere al producto en cuestin y b) que tiene un importe de al
menos $25.000.
La sentencia SELECT utilizada para recuperar la lista solicitada de
productos se asemeja a la peticin as expresada:
SELECT DISTINCT DESCRIPCION
FROM PRODUCTOS
WHERE EXISTS (SELECT NUM_PEDIDO
FROM PEDIDOS
WHERE PRODUCTO = ID_PRODUCTO
AND FAB = ID_FAB
AND IMPORTE >= 25,000.00)
DESCRIPCION
500-1b Brace
Left Hinge
Right Hinge
Widget Remover
Conceptualmente, SQL procesa esta consulta recorriendo la Tabla
PRODUCTOS y efectuando la subconsulta para cada producto. La subconsulta produce
para una columna que contiene los nmeros de pedidos de aquellos pedidos del producto
actual que superan $25,000.00. Si hay alguno de tales pedidos (es decir, si la columna
no est vaca), el test EXISTS es TRUE. Si la subconsulta no produce filas, el test
EXISTS es FALSE. El test EXISTS no puede producir un valor NULL.
Se puede invertir la lgica del test EXISTS utilizando la forma NOT
EXISTS. En este caso, el test es TRUE si la subconsulta no produce filas, y FALSE en
caso contrario.
Se puede observar, que la condicin de bsqueda EXISTS no utiliza
realmente los resultados de la subconsulta. Simplemente comprueba si la bsqueda
produce algn resultado. Por esta razn, SQL suaviza la regla de que las subconsultas
deben devolver una nica columna de datos, y permite utilizar la forma SELECT * en la
subconsulta de un test EXISTS. La subconsulta podra por tanto haber sido escrita:
Lista los productos para los cuales se ha recibido un pedido de $25.000 o ms.

SQL

Pg.-187

SELECT DESCRIPCION
FROM PRODUCTOS
WHERE EXISTS (SELECT *
FROM PEDIDOS
WHERE PRODUCTO = ID_PRODUCTO
AND FAB = ID_FAB
AND IMPORTE >= 25000.00)
En la prctica, la subconsulta en un test EXISTS se escribe siempre utilizando la
notacin SELECT *.
Obsrvese que la subconsulta incluye una referencia externa a una columna de la tabla de
la consulta principal. En la prctica, la subconsulta de un test EXISTS siempre contienen
una referencia externa que enlaza la subconsulta a la fila que actualmente est siendo
examinada por la consulta principal.
8.2.2.4. Test cuantificados (ANY y ALL)
La versin subconsulta del test IN comprueba si un valor de dato es igual
a algn valor en una columna de los resultados de la subconsulta. SQL proporciona dos
test cuantificados, ANY y ALL, que extienden esta nocin a otros operadores de
comparacin, tales como mayor que (>) y menor que (<). Ambos tests comparan un
valor de dato con la columna de valores producidos por una subconsulta.
expresin-de-test

=
<>
<
<=
>
>=

ANY
ALL

subconsulta

El Test ANY *. El test ANY se utiliza conjuntamente con uno de los seis
operadores de comparacin SQL (=, <>, <, <=, >, >=) para comparar un nico valor de
test con una columna de valores producidos por una subconsulta. Para efectuar el test,
SQL utiliza el operador de comparacin especificado para comparar el valor de test con
cada valor de datos de la columna, uno cada vez.
Si alguna de las comparaciones individuales producen un resultado
TRUE, el test ANY devuelve un resultado TRUE.
Lista los vendedores que han aceptado un pedido que represente ms del 10 por 100 de
su cuota.
SELECT NOMBRE
FROM REPVENTAS
WHERE (0.1 * CUOTA) < ANY (SELECT IMPORTE

Pg.-188

SQL

FROM PEDIDOS
WHERE REP = NUM_EMPL)
NOMBRE
Sam Clark
Larry Fitch
Nancy Angelli
Conceptualmente, la consulta principal examina cada fila de la Tabla
REPVENTAS, una a una. La subconsulta encuentra todos los pedidos aceptados por el
vendedor actual y devuelve una columna que contiene el importe de esos pedidos. La
clusula WHERE de la consulta principal calcula entonces el diez por ciento de la cuota
del vendedor actual y la utiliza como valor del test, comparndolo con todos los
importes de pedidos producidos por la subconsulta. Si hay algn importe que exceda al
valor de test calculado, el test < ANY devuelve TRUE y el vendedor queda incluido en
los resultados de la consulta. Si no, el vendedor no se incluye en los result6ados de la
consulta.
Si la subconsulta produce una columna vaca de resultados, el test
ANY devuelve FALSE.

Si el test de comparacin es TRUE para al menos uno de los valores


de datos en la columna, entonces la condicin de bsqueda ANY
devuelve FALSE.
Si el test de comparacin es FALSE para todos de los valores de datos
de la columna, entonces la condicin de bsqueda ANY devuelve
FALSE.
Si el test de comparacin no es TRUE para ningn valor de datos en
la columna, pero es NULL para uno o ms de los valores, entonces la
condicin de bsqueda ANY devuelve NULL. En esta situacin, no se
puede concluir si existe un valor producido por la subconsulta para el
cual el test de comparacin sea cierto; puede haberlo o no,
dependiendo de los valores correctos de los datos NULL
(desconocido).

El operador de comparacin ANY puede ser engaoso al utilizarlo en la


prctica, especialmente junto con el operador de comparacin desigualdad (<>). He aqu
un ejemplo que expone el problema:
Lista los nombres y edades de todas las personas en el equipo de ventas que no dirigen
una oficina.
SELECT NOMBRE, EDAD
FROM REPVENTAS
WHERE NUM_EMPL <> ANY (SELECT DIR

SQL

Pg.-189

FROM OFICINAS)
La subconsulta:
SELECT DIR
FROM OFICINAS
Produce obviamente los nmeros de empleados que son directores, y por tanto la
consulta parece decir;
Halla los vendedores que no son directores de ninguna oficina.
Pero esto no es lo que la consulta dice. Lo que dice en realidad es:
Halla cada uno de los vendedores que, para alguna oficina, no es el director de esa
oficina.
Naturalmente para cualquier vendedor, es posible hallar alguna oficina en
donde ese vendedor no es el director. Los resultados de la consulta incluiran a todos los
vendedores, y por tanto fallara en responder a la cuestin que le fue propuesta. La
consulta correcta es:

SELECT NOMBRE, EDAD


FROM REPVENTAS
WHERE NOT (NUM_EMPL = ANY (SELECT DIR
FROM OFICINAS)
Siempre se puede transformar una consulta con un test ANY en una
consulta con un test EXISTS trasladando la comparacin al interior de la condicin de
bsqueda de la subconsulta. He aqu una forma alternativa de la consulta, utilizando el
test EXISTS.
SELECT NOMBRE, EDAD
FROM REPVENTAS
WHERE NOT EXISTS (SELECT *
FROM OFICINAS
WHERE NUM_EMPL = DIR)
El test ALL *. Al igual que el test ANY, el test ALL se utiliza
conjuntamente con uno de los seis operadores de comparacin SQL (=, <>, <, <=, >,
>=) para comparar un nico valor de test con una columna de valores de datos
producidos por una subconsulta. Para efectuar el test, SQL utiliza el operador de
comparacin especificado para comparar el valor de test con todos y cada uno de los
valores de datos de la columna. Si todas las comparaciones individuales producen un

Pg.-190

SQL

resultado TRUE, el test ALL devuelve un resultado TRUE.


Lista las oficinas y sus objetivos en donde todos los vendedores tienen ventas que
superan el 50 por 100 del objetivo de la oficina.
SELECT CIUDAD, OBJETIVO
FROM OFICINAS
WHERE (0.50 * OBJETIVO) < ALL(SELECT VENTAS
FROM REPVENTAS
WHERE OFICINA_REP = OFICINA)
CIUDAD
Denver
New York
Atlanta

OBJETIVO
$300,000.00
$575,000.00
$350,000.00

Conceptualmente, la consulta principal examina cada fila de la Tabla


OFICINAS, una a una. La subconsulta encuentra todos los vendedores que trabajan en la
oficina actual y devuelve una columna que contiene las ventas correspondientes a cada
vendedor. La clusula WHERE de la consulta principal calcula entonces el 50% del
objetivo de la oficina y lo utiliza como valor de test, comparndolo con todos los valores
de ventas producidos por la subconsulta. Si todos los valores de ventas exceden a valor
de test calculado, el test < ALL devuelve >TRUE y la oficina se incluye en los resultados
de la consulta. Si no, la oficina no se incluye en los resultados de la consulta.

Si la consulta produce una columna vaca de resultados, el test ALL


devuelve TRUE.
Si el test de comparacin es TRUE para todos y cada uno de los
valores de datos en la columna, entonces la condicin de bsqueda
ALL devuelve TRUE.
Si el test de comparacin es FALSE para algn valor de dato en la
columna entonces la condicin de bsqueda ALL devuelve FALSE.
Si el test de comparacin no es FALSE para ningn valor de datos en
la columna, pero es NULL para uno o ms de los valores, entonces la
condicin de bsqueda ALL devuelve NULL.

Los errores sutiles que pueden ocurrir con el test ANY cuando se combina
con el operador de comparacin desigualdad (<>) tambin ocurren con el test ALL.
Como con el test ANY, el test ALL siempre puede convertirse a un test EXISTS
equivalente mediante el traslado de la comparacin al interior de la subconsulta.

8.3.

SUBCONSULTAS EN LA CLAUSULA HAVING


SQL

Pg.-191

Aunque las subconsultas suelen encontrarse sobre todo en la clusula WHERE,


tambin pueden utilizarse en la clusula HAVING de una consulta. Cuando una
subconsulta aparece en la clusula HAVING, funciona como parte de la seleccin de
grupo de filas efectuada por la clusula HAVING. Consideremos esta consulta con una
subconsulta:
Lista los vendedores cuyo tamao de pedido medio para productos fabricados por ACI
es superior al tamao de pedido medio global.
SELECT NOMBRE, AVG(IMPORTE)
FROM REPVENTAS, PEDIDOS
WHERE NUM_EMPL = REP
AND FAB = ACI
GROUP BY NOMBRE
HAVING AVG(IMPORTE) > (SELECT AVG(IMPORTE)
FROM PEDIDOS)
NOMBRE
Sue Smith
Tom Snyder

AVG(IMPORTE)
$15,000.00
$22,500.00

La subconsulta calcula el tamao de pedido medio global. Se trata de una


sencilla subconsulta que contiene referencias externas, por lo que SQL puede calcular el
promedio una vez y utilizarlo luego repetidamente en la clusula HAVING. La consulta
general recorre la Tabla PEDIDOS, hallando todos los pedidos de productos ACI, y los
agrupa por vendedor. La clusula HAVING comprueba entonces cada grupo de filas para
ver si el tamao de pedido medio de ese grupo es superior al promedio de todos los
pedidos, calculado con antelacin. Si es as, el grupo de filas es retenido; si no, el grupo
de filas es descartado. Finalmente, la clusula SELECT produce una fila resumen por
cada grupo, mostrando el nombre del vendedor y el tamao de pedido medio para cada
uno.

8.4.

RESUMEN

Pg.-192

Una subconsulta es una consulta dentro de una consulta. Las subconsultas


aparecen dentro de una de las condiciones de bsqueda subconsulta en la
clusula WHERE o HAVING.
Cuando aparece una subconsulta en la clusula WHERE, los resultados de
la subconsulta se utilizan para seleccionar las filas individuales que
contribuyen a los datos de los resultados de la consulta principal.
Cuando una subconsulta aparece en la clusula HAVING, los resultados de
la subconsulta se utilizan para seleccionar los grupos de filas que
contribuyen con datos a los resultados de la consulta.
SQL

8.5.

La forma subconsulta del test de comparacin utiliza uno de los operadores


de comparacin simple para comparar un valor de test con el valor nico
devuelto por una subconsulta.
La forma subconsulta del test de pertenencia a conjunto (IN) compara el
valor de test con el conjunto de valores devuelto por una subconsulta.
El test de existencia (EXISTS) comprueba si una subconsulta devuelve
algn valor.
Los tests cuantificados (ANY y ALL) utilizan uno de los operadores de
comparacin simple para comparar un valor de test con todos los valores
devueltos por una subconsulta, comprobando si la comparacin resulta
cierta para alguno o todos los valores.
Una subconsulta puede incluir una referencia externa a una tabla de
cualquiera de las consultas que la contienen, enlazando la subconsulta con la
fila actual de esa consulta.

RESUMEN FINAL. CONSULTAS SQL

Las clusulas de las sentencias SELECT proporcionan un conjunto potente y


flexible de caractersticas para recuperar datos de la base de datos. Cada clusula juega
un papel especfico en la recuperacin de datos:

La clusula FROM especifica las tablas fuente que contribuyen con datos a
los resultados de la consulta. Todos los nombres de columna en el cuerpo de
l sentencia SELECT deben identificar sin ambigedad a una columna de una
tabla fuente en una consulta externa.
La clusula WHERE, si est presente, selecciona combinaciones
individuales de filas procedentes de las tablas fuente que participan en los
resultados de la consulta. Las subconsultas en la clusula WHERE se
evalan para cada fila individual.
La clusula GROUP BY, si est presente, agrupa las filas individuales
seleccionadas por la clusula WHERE en grupos de filas.
La clusula HAVING, si est presente, selecciona grupos de filas que
participan en los resultados de la consulta. Las subconsultas de la clusula
HAVING se evalan para cada grupo de filas.
La clusula SELECT determina qu valores de datos aparecen realmente
como columnas en los resultados finales.

SQL

Pg.-193

8.6.

La palabra clave DISTINCT, si est presente, elimina filas duplicadas de los


resultados de la consulta.
El operador UNION, si est presente, mezcla los resultados producidos por
las sentencias SELECT individuales en un nico conjunto de resultados de
la consulta.
La clusula ORDER BY, si est presente, ordena los resultados finales
basndose en una o ms columnas.

EJERCICIOS
1. Lista todos los clientes atendidos por Bill Adams.
2. Lista los vendedores que trabajan en oficinas que superen su objetivo.
3. Lista los oficinas en donde haya un vendedor cuya cuota represente ms del
55 por 100 del objetivo de la oficina.
4. Lista los nombres y edades de los vendedores que tienen cuotas por encima
del promedio (de cuotas).
5. Lista los clientes cuyos vendedores estn asignados a oficinas de la regin
de ventas Este.
6. Lista los vendedores que tienen ms de 40 aos y que dirigen a un vendedor
cuyas ventas estn por encima de la cuota.

Pg.-194

SQL

SQL

Pg.-195

TEMA IX
VISTAS
9.1.

INTRODUCCION

9.2.

CREACION DE UNA VISTA (CREATE VIEW)


9.2.1. Vistas horizontales
9.2.2. Vistas verticales
9.2.3. Vistas con subconjuntos fila/columna
9.2.4. Vistas agrupadas
9.2.5. Vistas compuestas

9.3.

ACTUALIZACION DE UNA VISTA

9.4. ACTUALIZACIONES DE VISTAS EN PRODUCTOS SQL


COMERCIALES
9.5. COMPROBACION DE ACTUALIZACIONES DE VISTAS
(CHECK OPTION)
9.6.

ELIMINACION DE UNA VISTA (DROP VIEW)

9.7.

RESUMEN

Pg.-196

SQL

Notas

SQL

Pg.-197

9.1.

INTRODUCCION

Las tablas de una base de datos definen la estructura y organizacin de sus


datos. Sin embargo, SQL tambin permite mirar los datos almacenados de otros modos
mediante la definicin de vistas alternativas de datos. Una vista es una consulta SQL que
est permanentemente almacenada en la base de datos y a la que se le asigna un nombre.
Los resultados de una consulta almacenada son visibles a travs de la vista y SQL
permite acceder a estos resultados como si fueran, de hecho, una tabla real en la base
de datos.
Las vistas son parte importante de SQL, por varias razones:

Las vistas permiten acomodar el aspecto de una base de datos de modo que
diferentes usuarios la vean desde diferentes perspectivas.
Las vistas permiten restringir acceso a los datos, permitiendo que diferentes
usuarios slo vean ciertas filas o ciertas columnas de una tabla.
Las vistas simplifican el acceso a la base de datos mediante la presentacin
de la estructura de los datos almacenados del modo que sea ms natural a
cada usuario.

Qu es una vista?
Una vista es una tabla virtual en la base de datos cuyos contenidos estn
definidos por una consulta. Para el usuario de la base de datos, la vista aparece igual que
una tabla real, con un conjunto de columnas designadas y filas de datos. Pero a diferencia
de una tabla real, una vista no existe en la base de datos como conjunto almacenado de
valores. En su lugar, las filas y columnas de datos visibles a travs de la vista son los
resultados producidos por la consulta que define la vista. SQL crea la ilusin de la vista
dndole a sta un nombre semejante a un nombre de tabla y almacenando la definicin de
la vista en la base de datos.
Cmo maneja el DBMS las vistas
Cuando el DBMS encuentra una referencia a una vista en una sentencia SQL,
determina la definicin de la vista almacenada en la base de datos.
Para vistas sencillas, el DBMS puede construir cada fila de las vistas sobre la
marcha, extrayendo los datos para la fila de las tablas fuente. Para vistas ms complejas,
el DBMS debe materializar realmente la vista; es decir, el DBMS debe llevar a cabo
efectivamente la consulta que define la vista y almacenar sus resultados en una temporal.
El DBMS confirma las peticiones de acceso a la vista a partir de esta tabla temporal y
descarta la tabla cuando ya no es necesaria.

Pg.-198

SQL

Ventajas de las vistas

Seguridad. Cada usuario puede obtener permiso para acceder a la base de


datos nicamente a travs de un pequeo conjunto de vistas que contienen
los datos especficos que el usuario est autorizado a ver, restringiendo as
el acceso del usuario a los datos almacenados.
Simplicidad de consulta. Una vista puede extraer datos de varias tablas
diferentes y presentarlos como una nica tabla, haciendo que consultas
multitabla se formulen como consultas de una sola tabla con respecto a la
vista.
Simplicidad estructurada. Las vistas pueden dar a un usuario una visin
personalizada de la estructura de la base de datos presentando sta como
un conjunto de tablas virtuales que tienen sentido para ese usuario.
Aislamiento frente al cambio. Una vista puede presentar una imagen
consistente inalterada de la estructura de la base de datos incluso si las
tablas fuentes subyacentes se dividen, reestructuran o cambian de nombre.
Integridad de datos. Si se accede a los datos y se introducen a travs de una
vista, el DBMS puede comprobar automticamente los datos para
asegurarse que satisfacen restricciones de integridad especificadas.

Desventajas de las vistas

9.2.

Rendimiento. Las vistas crean la apariencia de una tabla, pero el DBMS


debe traducir las consultas con respecto a la vista en consultas con respecto
a las tablas fuente subyacentes.
Restricciones de actualizacin. Cuando un usuario trata de actualizar filas
de una vista, el DBMS debe traducir la peticin a una actualizacin sobre las
filas de las tablas fuente subyacentes.

CREACION DE UNA VISTA (CREATE VIEW)

La sentencia CREATE VIEW se utiliza para crear una vista. La sentencia asigna
un nombre a la vista y especifica la consulta que define la vista. Para crear la vista con
xito es preciso tener permiso para acceder a todas las tablas referenciadas en la
consulta. Solamente se especifican los nombres de las columnas; el tipo de datos, la
longitud y las otras caractersticas de cada columna se deducen de la definicin de las
columnas en las tablas fuente. Si la lista de nombres de columnas se omite de la sentencia
CREATE VIEW, cada columna de la vista adopta el nombre de la columna
correspondiente de la consulta. La lista de nombres de columnas debe ser especificada si
la consulta incluye columnas calculadas o si produce dos columnas con nombres
idnticos.

SQL

Pg.-199

Aunque todas las vistas se crean del mismo modo en la prctica se utilizan
diferentes tipos de vistas para propsitos diferentes.
9.2.1. Vistas horizontales
Un uso comn de las vistas es restringir el acceso de un usuario a las filas
seleccionadas de una tabla. Por ejemplo, puede ser deseable que un director de ventas
solamente vea filas de REPVENTAS correspondientes a los vendedores de la regin
propia del director. Para lograr esto, se pueden definir dos vistas, del modo siguiente:
Crea una vista que muestre a los vendedores de la regin Este.
CREATE VIEW REPESTE AS
SELECT *
FROM REPVENTAS
WHERE OFICINA_REP IN (11, 12, 13)
Ahora se puede dar a cada director de ventas permiso para acceder a la vista
REPESTE negndoles el permiso para acceder a la propia Tabla REPVENTAS.
Una vista horizontal divide horizontalmente la tabla fuente para crear la vista.
Todas las columnas de la tabla fuente participan en la vista, pero slo algunas de sus filas
son visibles a travs de la vista. Las vistas horizontales son adecuadas cuando la tabla
fuente contiene datos que relacionan a varias organizaciones o usuarios. Proporcionan
una tabla privada para cada usuario, compuesta nicamente de las filas necesarias para
ese usuario.
Define una vista que contiene nicamente las oficinas de la regin Este.
CREATE VIEW OFICINASESTE AS
SELECT *
FROM OFICINAS
WHERE REGION = Este
Define una vista para Sue Smith (empleada nmero 102) que contiene solamente los
pedidos remitidos por clientes asignados a ella.
CREATE VIEW PEDIDOSSUE AS
SELECT *
FROM PEDIDOS
WHERE CLIE IN (SELECT NUM_CLIE
FROM CLIENTES
WHERE NUM_CLIE = 2102)
En cada uno de estos ejemplos, la vista se deriva de una nica tabla fuente. La
vista se define mediante una consulta SELECT * y por tanto tiene exactamente las

Pg.-200

SQL

mismas columnas que la tabla fuente. La clusula WHERE determina qu filas de la tabla
fuente son visibles en la vista.
9.2.2. Vistas verticales
Otro uso habitual de las vistas es restringir el acceso de un usuario a slo ciertas
columnas de una tabla. Por ejemplo, en nuestra base de datos, el departamento de
procesamiento de pedidos puede necesitar acceder al nmero de empleado, su nombre y
la asignacin de oficina. Sin embargo, no hay necesidad de que el personal de
procesamiento de pedidos vea las ventas actuales del vendedor o su cuota. Esta vista
selectiva de la Tabla REPVENTAS puede ser construida con la vista siguiente:
Crea una vista mostrando informacin seleccionada de cada vendedor.
CREATE VIEW INFOREP AS
SELECT NUM_EMPL, NOMBRE, OFICINA_REP
FROM REPVENTAS
Dando al personal de procesamiento de pedidos acceso a esta vista y
denegndole acceso a la propia Tabla REPVENTAS, el acceso a datos de cuotas y
ventas especficoa se restringe efectivamente.
Una vista como INFOREP se denomina con frecuencia vista vertical. Una vista
vertical divide la tabla fuente verticalmente para crear la vista. Las vistas verticales
suelen encontrarse all donde los datos almacenados en una tabla son utilizados por
varios usuarios o grupos de usuarios. Proporcionan una tabla privada a cada usuario,
compuesta nicamente de las columnas necesarias a ese usuario.
Define una vista de la Tabla OFICINAS para el personal de procesamiento de pedidos
que incluye la ciudad, el nmero de oficina y regin.
CREATE VIEW INFOOFICINA AS
SELECT OFICINA, CIUDAD, REGION
FROM OFICINAS
En cada uno de estos ejemplos, la vista se deriva de una tabla fuente nica. La
lista de seleccin en la definicin de la vista determina qu columnas de la tabla fuente
son visibles en la lista. Puesto que se trata de vistas verticales, cada fila de la tabla fuente
est representada en la vista y la definicin no incluye una clusula WHERE.

9.2.3. Vistas con subconjuntos fila/columna


Es bastante habitual definir una vista que divida una tabla fuente tanto por la
dimensin horizontal como por la vertical, como en este ejemplo:

SQL

Pg.-201

Define una vista que contiene el nmero de cliente, el nombre de empresa y el lmite de
crdito de todos los clientes asignados a Bill Adams (empleado nmero 105)
CREATE VIEW CLIEBILL AS
SELECT NUM_CLIE, EMPRESA, LIMITE_CREDITO
FROM CLIENTES
WHERE REP_CLIE = 105
Los datos visibles a travs de esta vista son un subconjunto fila/columna de la
Tabla CLIENTES. Slo las columnas explcitamente designadas en la lista de seleccin
de la vista y las filas que satisfacen la condicin de bsqueda son visibles a travs de la
vista.
9.2.4. Vistas agrupadas
La consulta especificada en una definicin de vista puede incluir una clusula
GROUP BY. Este tipo de vista se denomina vista agrupada, ya que los datos visibles a
travs de ella son el resultado de una consulta agrupada. Las vistas agrupadas efectan la
misma funcin que las consultas agrupadas; agrupan filas relacionadas de datos y
producen una fila de resultados de consulta para cada grupo, resumiendo los datos de
ese grupo.
Define una vista que contiene datos de pedidos sumarios para cada vendedor.
CREATE VIEW PED_POR_REP (QUIEN, CUANTOS, TOTAL, INF, SUP, MEDIO) AS
SELECT REP, COUNT(*), SUM(IMPORTE), MIN(IMPORTE), MAX(IMPORTE),
AVG(IMPORTE)
FROM PEDIDOS
GROUP BY REP

La definicin de una vista agrupada siempre incluir una lista de nombres de


columna. La lista asigna nombres a las columnas de la vista agrupada que se derivan en
funciones de columna, tales como SUM() y MIN(). Tambin puede especificar un
nombre modificado para una columna de agrupacin. En este ejemplo, la columna REP
de la Tabla PEDIDOS pasa a ser la columna QUIEN en la vista PED_POR_REP.
Una vez que se define esta vista agrupada, puede ser utilizada para simplificar
consultas. Por ejemplo, esta consulta genera un sencillo informe que resume los pedidos
de cada vendedor:
Muestra el nombre, los nmeros de pedido, el importe total de pedidos y el pedido medio
para cada vendedor.
SELECT NOMBRE, CUANTOS, TOTAL, MEDIO
FROM REPVENTAS, PED_POR_REP
WHERE QUIEN = NUM_EMPL
Pg.-202

SQL

ORDER BY TOTAL DESC


A diferencia de una vista horizontal o vertical, las filas en una vista agrupada no
tienen una correspondencia una a una con las filas de la tabla fuente. Una vista agrupada
no es nicamente un filtro de su tabla fuente que oculta ciertas filas y columnas. Es un
resumen de las tablas fuente y, por tanto, se requiere una sustancial cantidad de
procesamiento del DBMS para mantener la ilusin de una tabla virtual para vistas
agrupadas.
Las vistas agrupadas pueden ser utilizadas en consultas igual que cualquier otra
vista ms sencilla. Sin embargo, una vista agrupada no puede ser actualizada. La razn
debera ser obvia a partir del ejemplo.
Puesto que cada fila de la vista agrupada corresponde a un grupo de filas de la
tabla fuente y, puesto que las columnas de la vista agrupada contienen generalmente
datos calculados, no hay manera de trasladar una peticin de actualizacin a una
actualizacin de las filas de la tabla fuente. Las vistas agrupadas funcionan por tanto
como vistas de slo lectura, que pueden participar en consultas, pero en
actualizaciones.
Las vistas agrupadas estn tambin sujetas a las restricciones SQL sobre
funciones de columna animadas. Las funciones de columna animadas, tales como:
MIN(MIN(A))
No son legales en expresiones SQL. Aunque la vista agrupada oculta las funciones de
columna de su lista de seleccin al usuario, el DBMS sigue conocindolas y fuerza la
restriccin. Por ejemplo:
Para cada oficina de ventas, muestra el rango de los tamaos medios de pedido para
todos los vendedores que trabajan en la oficina.
SELECT OFICINA_REP, MIN(MEDIO), MAX(MEDIO)
FROM REPVENTAS, PED_POR_REP
WHERE NUM_EMPL = QUIEN
GROUP BY OFICINA_REP

SQL

Pg.-203

La consulta que se est pidiendo pero que no funciona es:


SELECT OFICINA_REP, MIN(AVG(IMPORTE)), MAX(AVG(IMPORTE))
FROM REPVENTAS, PEDIDOS
WHERE NUM_EMPL = REP
GROUP BY REP
GROUP BY OFICINA_REP

Esta consulta es ilegal a causa del doble GROUP BY y de las funciones de


columna anidadas. Desgraciadamente, como muestra este ejemplo, una sentencia
SELECT agrupada perfectamente razonable puede, de hecho, producir un error si una de
sus tablas fuente resulta ser una vista agrupada. No hay manera de anticipar esta
situacin; debe comprenderse la causa del error cuando SQL informa de l.
9.2.5. Vistas compuestas
Una de las razones ms frecuentes para utilizar vistas compuestas es simplificar
las consultas multitabla. Especificando una consulta de dos o tres tablas en la definicin
de vista, se puede crear una vista compuesta que extrae sus datos de dos o tres tablas
diferentes y presenta los resultados de la consulta como una nica tabla virtual. Una vez
definida la vista, con frecuencia se puede utilizar una consulta simple de una sola tabla
con respecto a la vista para peticiones que en caso contrario requeriran una composicin
de dos o tres tablas.
Por ejemplo, supongamos que Sam Clark, el vicepresidente de ventas, efecta
con frecuencia consulta sobre la Tabla PEDIDOS de la base de datos ejemplo. Sin
embargo, Sam no quisiera trabajar con nmeros de clientes y empleado. En vez de ello,
le gustara poder utilizar una versin de la Tabla PEDIDOS que tenga nombres en vez de
nmeros. He aqu una vista que satisface las necesidades de Sam:
Crea una vista de la Tabla PEDIDOS con nombres en vez de nmeros.
CREATE VIEW INFO_PEDIDO (NUM_PEDIDO, EMPRESA, NOMBRE_REP, IMPORTE)
AS
SELECT NUM_PEDIDO, EMPRESA, NOMBRE, IMPORTE
FROM PEDIDOS, CLIENTES, REPVENTAS
WHERE CLIE = NUM_CLIE

AND REP = NUM_EMPL


Esta vista est definida mediante una composicin de tres tablas. Como con la
vista agrupada, el procesamiento necesario para crear la ilusin de una tabla virtual para
esta vista es considerable. Cada fila de la vista se deriva de una combinacin de una fila
de la Tabla PEDIDOS, una de la fila de la Tabla CLIENTES y una fila de la Tabla
REPVENTAS.
Aunque tiene una definicin relativamente compleja, esta vista puede
proporcionar algunos beneficios reales.
Muestra los pedidos actuales totales para cada empresa y para cada vendedor.

Pg.-204

SQL

SELECT NOMBRE_REP, EMPRESA, SUM(IMPORTE)


FROM INFO_PEDIDO
GROUP BY NOMBRE_REP, EMPRESA
Esta consulta es una sentencia SELECT de una sola tabla, que es
considerablemente ms simple que la sentencia SELECT de tres tablas para las tablas
fuente:
SELECT NOMBRE, EMPRESA, SUM(IMPORTE)
FROM REPVENTAS, PEDIDOS, CLIENTES
WHERE REP = NUM_EMPL

AND CLIE = NUM_CLIE


GROUP BY NOMBRE, EMPRESA
Anlogamente, es fcil generar un informe de los mayores pedidos, mostrando
quin los remiti y quin los recibi, con esta consulta sobre la vista:
Mostrar los pedidos cuyo importe sea superior a 2000000:
SELECT EMPRESA, IMPORTE, NOMBRE_REP
FROM INFO_PEDIDO
WHERE IMPORTE > 20000.00
ORDER BY IMPORTE DESC
La vista hace mucho ms fcil examinar lo que sucede en la consulta que si
fuera expresada como la composicin equivalente de tres tablas. Naturalmente, el DBMS
debe trabajar igual de duro para generar los resultados de la consulta en la consulta de
una tabla con respecto a la vista que si generara los resultados para la consulta
equivalente de tres tablas. De hecho, el DBMS debe efectuar un poco ms de trabajo
para manejar la consulta con respecto a la vista. Sin embargo, para el usuario humano de
la base de datos es mucho ms fcil escribir y comprender la consulta de una nica tabla
que referencia a la vista.

9.3.

ACTUALIZACION DE UNA VISTA

Crea una vista que muestre los vendedores de la regin Este.


CREATE VIEW REPESTE AS
SELECT *
FROM REPVENTAS
WHERE OFICINA_REP IN (11, 12, 13)
Se trata de una vista horizontal directa, deducida de una tabla fuente nica.
Tiene sentido hablar de insertar una fila en esta vista; significa que la nueva fila debera
ser insertada en la Tabla REPVENTAS subyacente a partir de la cual se deriv la vista.
Tambin tiene sentido suprimir una fila de la vista REPESTE; esto eliminara la fila
correspondiente de la Tabla REPVENTAS. Finalmente, actualizar una fila de la vista

SQL

Pg.-205

REPESTE tambin tiene sentido; actualizara la fila correspondiente de la Tabla


REPVENTAS. En cada caso la accin puede ser realizada con respecto a la fila
correspondiente de la tabla fuente, preservando la integridad tanto de la tabla fuente
como de la vista.
Define una vista que contiene datos de pedidos sumarios para cada vendedor.
CREATE VIEW PED_POR_REP (QUIEN, CUANTOS, TOTAL, INF, SUP, MEDIO) AS
SELECT REP, COUNT(*), SUM(IMPORTE), MIN(IMPORTE), MAX(IMPORTE),
AVG(IMPORTE)
FROM PEDIDOS
GROUP BY REP

No existe una correspondencia una a una entre las filas de estas vistas y las filas
de la Tabla PEDIDOS subyacente, por lo cual no tiene sentido hablar de insertar,
suprimir o actualizar filas de esta vista. La vista PED_POR_REP no es actualizable; es
una vista de slo lectura.
La vista REPESTE y la vista PED_POR_REP son dos ejemplos extremos en
trminos de la complejidad de sus definiciones. Hay vistas ms complejas que REPESTE
donde sigue teniendo sentido actualizar la vista, y hay vistas menos complejas que
PED_POR_REP en donde las actualizaciones no tienen sentido. De hecho, determinar
qu vistas y cules pueden ser actualizadas no ha sido un importante problema de
investigacin en base de datos relacional a lo largo de los aos.
Una vista puede ser actualizada si la consulta que la define satisface todas estas
restricciones:

Pg.-206

No debe especificarse DISTINCT, es decir, las filas duplicadas no deben ser


eliminadas de los resultados de la consulta.
La clusula FROM debe especificar solamente una tabla actualizable; es
decir, la vista debe tener una nica tabla fuente para la cual el usuario tiene
los privilegios requeridos.
Cada elemento de seleccin debe ser una referencia de columna simple; la
lista de seleccin no puede contener expresiones, columnas calculadas o
funciones de columna.
La clusula WHERE no debe incluir una subconsulta; slo pueden aparecer
condiciones de bsqueda simples fila a fila.

SQL

La consulta no debe incluir una clusula GROUP BY o HAVING.

Para que una vista sea actualizable, el DBMS debe ser capaz de relacionar
cualquier fila de la vista con su fila fuente en la tabla fuente. Anlogamente, el DBMS
debe ser capaz de relacionar cada columna individual a actualizar con su columna fuente
en la tabla fuente.
Si la vista satisface esta comprobacin, es posible definir operaciones INSERT,
DELETE y UPDATE significativas para la vista en trminos de la(s) tabla(s) fuente.

9.4. ACTUALIZACIONES DE VISTAS EN PRODUCTOS SQL


COMERCIALES
Hay muchas vistas que pueden ser actualizadas tericamente y que no satisfacen
todas las restricciones.
Crea una vista mostrando las ventas, cuota y la diferencia entre ambas para cada
vendedor.
CREATE VIEW RENDVENTAS (NUM_EMPL, VENTAS, CUOTA, DIFE) AS
SELECT NUM_EMPL, VENTAS, CUOTA, (VENTAS - CUOTA)
FROM REPVENTAS
El estndar SQL1 no permite actualizaciones de esta vista, ya que su cuarta
columna es una columna calculada. Sin embargo, cada fila de esta vista puede ser
relacionada con una fila nica en la tabla fuente (REPVENTAS). Por esta razn DB (y
otras varias implementaciones SQL comerciales) permitirn operaciones DELETE
dentro de esta vista.
DB2 permite operaciones UPDATE sobre las columnas NUM_EMPL,
VENTAS, y CUOTA, ya que se derivan directamente de la tabla fuente. nicamente la
columna DIFE no puede ser actualizada. DB2 no permite la sentencia INSERT para la
vista, ya que insertar un valor para la columna DIFE no tendra significado.
Las reglas especficas que determinan si una vista puede ser actualizada o no
varan de un producto DBMS a otro, y suelen estar bastante detalladas.
El mejor modo de determinar la posibilidad de actualizacin de las vistas en un
DBMS particular es consultar la gua de usuario o experimentar con diferentes tipos de
vistas.

SQL

Pg.-207

9.5. COMPROBACION DE ACTUALIZACIONES DE VISTAS


(CHECK OPTION)
Si una vista se define mediante una consulta que incluye una clusula WHERE,
slo las filas que satisfacen la condicin de bsqueda son visibles en la vista. Otras filas
pueden estar presentes en la tabla fuente de la cual se deriva a la vista, pero no son
visibles a travs de la vista. Por ejemplo, la vista REPESTE descrita anteriormente en
este captulo slo contiene las filas de la Tabla REPVENTAS con valores especficos en
la columna OFICINA_REP.
Crea una vista que muestre los vendedores de la regin Este.
CREATE VIEW REPESTE AS
SELECT *
FROM REPVENTAS
WHERE OFICINA_REP IN (11, 12, 13)
Esta es una vista actualizable y para la mayora de las implementaciones SQL
comerciales. Se puede aadir un nuevo vendedor con esta sentencia INSERT.
INSERT INTO REPESTE (NUM_EMPL, NOMBRE, OFICINA_REP, EDAD,
VENTAS)
VALUES (113, Jake Kimball, 11, 43, 0.00)
El DBMS aadir la nueva fila a la Tabla REPVENTAS subyacente y la fila ser
visible a travs de la vista REPESTE. Pero consideremos qu ocurre cuando se aade un
nuevo vendedor con esta sentencia INSERT.
INSERT INTO REPESTE (NUM_EMPL, NOMBRE, OFICINA_REP, EDAD,
VENTAS)
VALUES (114, Fred Roberts, 21, 47, 0.00)
Esta es una sentencia SQL perfectamente legal y el DBMS la insertar en la
Tabla REPVENTAS. Sin embargo, la fila recin insertada no satisface la condicin de
bsqueda para la vista. Su valor de OFICINA_REP (21) especifica la oficina de Los
Angeles, que est en la regin Oeste. Como resultado, si se efecta esta consulta
inmediatamente despus de la sentencia INSERT.
SELECT NUM_EMPL, NOMBRE, OFICINA_REP
FROM REPESTE

Pg.-208

SQL

La fila recin aadida no aparecer en la vista. Lo mismo ocurre si se cambia la


asignacin de oficina para uno de los vendedores actualmente en la vista. Esta sentencia
UPDATE:
UPDATE REPESTE
SET OFICINA_REP = 21
WHERE NUM_EMPL = 104
Modifica una de las columnas para la fila de Bob Smith e inmediatamente hace que
desaparezca de la vista. Naturalmente ambas filas desaparecidas aparecen en una
consulta con respecto a la tabla subyacente.
SELECT NUM_EMPL, NOMBRE, OFICINA_REP
FROM REPVENTAS
NUM_EMPL
105
109
102
106
104
101
110
108
103
107
114

NOMBRE
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Tom Snyder
Larry Fitch
Paul Cruz
Nancy Angelli
Fred Roberts

OFICINA_REP
13
11
21
11
21
12
NULL
21
12
22
21

El hecho de que las filas desaparezcan de la vista como resultado de una


sentencia INSERT o UPDATE es desconcertante, como poco. Probablemente es desear
que el DBMS detecte e impida este tipo de INSERT o UPDATE sobre la vista. SQL
permite especificar este tipo de comprobacin de integridad para vistas mediante la
creacin de la vista con una opcin de comprobacin. La opcin de comprobacin se
especifica en la sentencia CREATE VIEW, como se muestra en esta definicin de la vista
REPESTE:
CREATE VIEW REPESTE AS
SELECT *
FROM REPVENTAS
WHERE OFICINA_REP IN (11, 12, 13)
WITH CHECK OPTION

SQL

Pg.-209

Cuando se solicita la opcin de comprobacin para una vista, SQL comprueba


automticamente cada operacin INSERT y cada operacin UPDATE sobre la vista para
asegurarse que las filas resultantes satisfagan el criterio de bsqueda de la definicin de la
vista. Si una fila insertada o modificada no satisficiera la condicin, la sentencia INSERT
o UPDATE fallara y la operacin no se llevara a cabo.

9.6.

ELIMINACION DE UNA VISTA

Debido a que las vistas se comportan como tablas, y una vista no puede tener el
mismo nombre que una tabla, muchos productos DBMS utilizan la sentencia DROP
TABLE para eliminar vistas. Otras implementaciones SQL proporcionan la sentencia
DROP VIEW:

9.7.

RESUMEN

Pg.-210

Una vista es una tabla virtual definida mediante una consulta. La vista
`parece contener filas y columnas de datos, al igual que una tabla real,
pero los datos visibles a travs de la vista son, de hecho, los resultados de la
consulta.
Una vista puede ser un subconjunto simple fila/columna de una nica tabla,
puede sumarizar una tabla (una vista agrupada) o puede extraer sus datos de
dos o ms tablas (una vista compuesta).
Una vista puede ser referenciada como una tabla real en una sentencia
SELECT, INSERT, DELETE o UPDATE. Sin embargo, las vistas ms
complejas no pueden ser actualizadas; son vistas de slo lectura.
Las vistas suelen utilizarse para simplificar la estructura aparente de una
base de datos, para simplificar consultas y para proteger ciertas filas y/o
columnas frente a acceso no autorizado.

SQL

También podría gustarte