Sei sulla pagina 1di 47

14748 - Bases de Datos Biblioteconoma.

2003-2004

Tema 5: Lenguajes de Consulta. SQL.

TEMA 5: Lenguajes de consulta. SQL.


1. Introduccin
Bsicamente, podemos decir que un lenguaje de consulta es un lenguaje usado por el usuario para
solicitar informacin a la base de datos. En el tema anterior, se ha comentado que Codd propuso dos
lenguajes formales para representar consultas de una forma concisa, sin embargo, los sistemas de
bases de datos comerciales necesitan un lenguaje de consultas ms cmodo para el usuario. En este
tema veremos el lenguaje comercial que mayor influencia tiene, el SQL.
En el tema 1 (punto 3.3. Lenguajes de la base de datos) vimos que la interaccin con la base de
datos se realiza a travs de lenguajes; el lenguaje de definicin de datos (DDL o LDD) y el lenguaje
de manipulacin de datos (DML o LMD, dentro del cual contemplbamos el lenguaje de consulta
como la parte del LMD que permita recuperar informacin).
Aunque a menudo se diga que el SQL es un lenguaje de consulta, es necesario recordar que esto
no es exactamente cierto dado que contiene muchas otras capacidades adems de la de consultar la
base de datos, como son; la definicin de la propia estructura de los datos, la manipulacin de
dichos datos y la especificacin de las ligaduras de seguridad.
El lenguaje estructurado de consultas SQL (Structured Query Language) es un lenguaje combinado
de manipulacin y definicin de datos, y que permite expresar diversas operaciones con los datos
almacenados en las bases de datos relacionales.
El SQL fue desarrollado a principios de los aos 70 en E.E.U.U por I.B.M. cuando, despus de que
su empleado Codd publicara su artculo sobre las Bases de Datos Relacionales, I.B.M. decidi
desarrollar el primer prototipo de BDR llamado System R que utilizaba un lenguaje llamado
SEQUEL (que posteriormente fue el SQL).
El Instituto Nacional Americano de Normalizacin (ANSI, American National Standards Institute)
adopt el lenguaje SQL como estndar, publicando y desarrollando unas especificaciones. En 1986,
la Organizacin Internacional de Normalizacin (ISO, International Standards Organization) acept
estas normas y se les denomin SQL-86. Esto no significa que todos los productos sigan
estrictamente esta norma, principalmente porque el estndar no cubre todas las necesidades
planteadas. Este es el motivo por el que, en 1989, se public una norma extendida para el SQL
denominada SQL-89. Actualmente los sistemas de bases de datos son en general compatibles, al
menos, con las caractersticas del SQL-89. La versin actual de la norma SQL ANSI/ISO es la
norma SQL-92. Se debe tener en cuenta que algunas implementaciones de SQL pueden ser solo
compatibles con SQL-89 y no con SQL-92.
Como ya se ha dicho, SQL es tanto un LDD como LMD por lo que existen dos tipos de sentencias:

Sentencias de definicin de datos (Data Definition Language) que proporcionan las rdenes para
definir o modificar esquemas de relacin, eliminar relaciones y crear ndices. Algunos ejemplos
de sentencias son las de tipo CREATE y DROP.

Sentencias de manipulacin de datos (Data Manipulation Language) que nos permiten realizar
consultas y mantener los datos es decir; insertar, suprimir o modificar los datos. Comienzan con
las siguientes palabras del lenguaje: SELECT, INSERT, UPDATE y DELETE.

En este tema vamos a realizar una descripcin del lenguaje SQL aunque omitiremos algunas partes
referentes al LDD (creacin de permisos, seguridad y control de transacciones) debido a la
brevedad del curso.
1

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

A continuacin se muestra el ejemplo de base de datos relacional con el que vamos a trabajar
durante todo el tema y en base al cual mostraremos los diferentes ejemplos de sentencias SQL.
OFICINAS
oficina
ciudad
region
dir
objetivo
ventas

CLIENTES

REPVENTAS

PRODUCTOS

num_empl
nombre
edad
oficina_rep
titulo
contrato
director
cuota
ventas

id_fab
id_producto
descripcion
precio
existencias

num_clie
empresa
rep_clie
limite_credito

OFICINA
22
11
12
13
21

CIUDAD
Toledo
Valencia
Barcelona
Alicante
Madrid

REGION
Centro
Este
Este
Este
Centro

DIR OBJETIVO VENTAS


108
27.500
34.432
106
52.500
40.063
104
70.000
29.328
105
30.000
39.327
108
60.000
81.309

PEDIDOS
num_pedido
fecha_pedido
clie
rep
fab
producto
cant
importe

La relacin OFICINAS almacena datos


acerca de cada una de las cinco oficinas
de ventas incluyendo la ciudad en donde
est localizada la oficina, la regin de
ventas a la que pertenece, etc.

La relacin CLIENTES almacena datos acerca de cada cliente, tales como el nombre de la empresa,
el lmite de crdito y el vendedor que atiende al cliente.
NUM_CLIE
2111
2102
2103
2123
2107
2115
2101
2112
2121
2114
2124
2108
2117
2122
2120
2106
2119
2118
2113
2109
2105

EMPRESA
REP_CLIE LIMITE_CREDITO
EVBE S.A.
103
50.000
Exclusivas del Este S.L.
101
65.000
Pino S.L.
105
50.000
Hnos. Martinez S.A.
102
40.000
Distribuciones Sur S.A.
110
35.000
AFS S.A.
101
20.000
Exclusivas Soriano S.A.
106
65.000
Lopez Asociados S.L.
108
50.000
Hernandez & hijos S.L.
103
45.000
Componentes Fernandez S.A.
102
20.000
Domingo S.L.
107
40.000
Zapater Importaciones S.A.
109
55.000
Hnos. Ramon S.L.
106
35.000
JPF S.L.
105
30.000
Distribuciones Montiel S.L.
102
50.000
Construcciones Leon S.A.
102
65.000
Martinez & Garcia S.L.
109
25.000
Exclusivas Norte S.A.
108
60.000
Importaciones Martin S.L.
104
20.000
Roda & Castedo S.L.
103
25.000
MALB S.A.
101
45.000

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

La relacin PEDIDOS lleva la cuenta de cada pedido remitido por un cliente, identificando al
vendedor que acept el pedido, el producto solicitado, la cantidad y el importe del pedido, etc. Por
simplicidad, cada pedido atae a un solo producto.
NUM_PEDIDO
112961
113012
112989
113051
112968
110036
113045
112963
113013
113058
112997
112983
113024
113062
112979
113027
113007
113069
113034
112992
112975
113055
113048
112993
113065
113003
113049
112987
113057
113042
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
41003
41004
41003
887P
XK48
2A44L
112
887H
41089
41001
775C
4100Z
XK48A
41002
2A44R
773C
4100X
114
887X
2A44G

FECHA_PEDIDO
17/12/1999
11/01/2000
03/01/2000
10/02/2000
12/10/1999
30/01/2000
02/02/2000
17/12/1999
14/01/2000
23/02/2000
08/01/2000
27/12/1999
20/01/2000
24/02/2000
12/10/1999
22/02/2000
08/01/2000
02/03/2000
29/01/2000
04/11/1999
12/10/1999
15/02/2000
10/02/2000
04/01/2000
27/02/2000
25/01/2000
10/02/2000
31/12/1999
18/02/2000
02/02/2000

CLIE
2117
2111
2101
2118
2102
2107
2112
2103
2118
2108
2124
2103
2114
2124
2114
2103
2112
2109
2107
2118
2111
2108
2120
2106
2106
2108
2118
2103
2111
2113

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

FAB
REI
ACI
FEA
QSA
ACI
ACI
REI
ACI
BIC
FEA
BIC
ACI
QSA
FEA
ACI
ACI
IMM
IMM
REI
ACI
REI
ACI
IMM
REI
QSA
IMM
QSA
ACI
ACI
REI

PRODUCTO CANT IMPORTE


2A44L
7
31.500
41003
35
3.745
114
6
1.458
XK47
4
1.420
41004
34
3.978
4100Z
9
22.500
2A44R
10
45.000
41004
28
3.276
41003
1
652
112
10
1.480
41003
1
652
41004
6
702
XK47
20
7.100
114
10
2.430
4100Z
6
15.000
41002
54
4.104
773C
3
2.825
775C
22
31.350
2A45C
8
632
41002
10
760
2A44G
6
2.100
4100X
6
150
779C
2
3.750
2A45C
24
1.896
XK47
6
2.130
779C
3
5.625
XK47
2
776
4100Y
11
27.500
4100X
24
600
2A44R
5
22.500

DESCRIPCION PRECIO EXISTENCIAS


V Stago Trinquete
79
210
Extractor
2.750
25
Reductor
355
38
Plate
180
0
Riostra 2-Tm
1.875
9
Artculo Tipo 3
107
207
Artculo Tipo 4
117
139
Manivela
652
3
Perno Riostra
250
24
Reductor
134
203
Bisagra Izqda.
4.500
12
Cubierta
148
115
Soporte Riostra
54
223
Reten
225
78
Artculo Tipo 1
55
277
Riostra 1-Tm
1.425
5
Montador
2.500
28
Reductor
117
37
Artculo Tipo 2
76
167
Bisagra Dcha.
4.500
12
Riostra 1/2-Tm
975
28
Ajustador
25
37
Bancada Motor
243
15
Retenedor Riostra
475
32
Pasador Bisagra
350
14

La relacin PRODUCTOS
almacena datos acerca de cada
producto disponible para venta,
tal como el fabricante, el
nmero del producto, su
descripcin y su precio.

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

La relacin REPVENTAS almacena el nmero de empleado, el nombre, la edad, las ventas anuales
hasta la fecha y otros datos referentes a cada vendedor.
NUM_EMPL
106
104
105
109
108
102
101
110
103
107

NOMBRE
EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA
Jose Maldonado
52
11 VP Ventas
14/06/1998
NULL 25.000
Carlos Martinez
33
12 Dir. Ventas
19/05/1997
106 17.500
Belen Aguirre
37
13 Dir. Ventas
12/02/1998
104 30.000
Maria Garcia
31
11 Rep. Ventas
12/10/1999
106 27.500
Lorenzo Fernandez
62
21 Dir. Ventas
12/10/1999
106 30.000
Soledad Martinez
48
21 Rep. Ventas
10/12/1996
108 30.000
Daniel Gutierrez
45
12 Rep. Ventas
20/10/1996
104 27.500
Antonio Valle
41
NULL Rep. Ventas
13/01/2000
101 NULL
Pedro Cruz
29
12 Rep. Ventas
01/03/1997
104 25.000
Natalia Martin
49
22 Rep. Ventas
14/11/1998
108 27.500

VENTAS
32.958
0
39.327
7.105
58.533
22.776
26.628
23.123
2.700
34.432

2. Tipos de dominios en SQL


En SQL tenemos diferentes tipos de dominios predefinidos sobre los que se definen los datos.
Veamos algunos de ellos:
2.1.

CHAR y VARCHAR

Los tipos CHAR y VARCHAR se usan para definir cadenas de texto genricas, y puede contener
caracteres con cualquier valor ASCII. El nmero mximo de caracteres que admiten es 255. La
diferencia entre ambos es que mientras CHAR proporciona un tamao fijo para una cadena,
VARCHAR admite una cantidad variable de caracteres.
La sintaxis para este tipo es CHAR(n) o VARCHAR(n), donde n indica la longitud. Sus contenidos
se especifican entre comillas simples. Ejemplo: Hola, 09-MAR-98, Jackie, s.
2.2.

INTEGER

Sus valores son nmeros enteros, positivos o negativos. Normalmente, con este tipo se pueden
definir todos los nmeros enteros entre 2147483648 y 2147483647, aunque en realidad los lmites
vienen definidos por la mquina.
2.3.

FLOAT

Sus valores representan nmeros en coma flotante, es decir, nmeros positivos o negativos que
pueden tener decimales.
La sintaxis para este tipo es FLOAT(n), donde n es la precisin que como mnimo se desea que
tenga el nmero.
2.4.

DATE

Se usa para almacenar informacin de una fecha. Son validas todas las fechas del calendario
gregoriano, empezando en el da 1 de Enero del ao 1 y terminando el 31 de Diciembre del ao
9999, ambos inclusive. Se representa en formato da, mes y ao (dd/mm/aaaa).
2.5.

TIME

Representa una hora determinada con precisin de segundos (HH:MM:SS).


2.6.

NULL

No se trata de un tipo de datos concreto. Es ms bien un valor que indica la ausencia de cualquier
valor. Por ejemplo, en una columna de tipo numrico el valor nulo no es lo mismo que el valor cero,
o en una columna de tipo alfanumrico, el nulo no es lo mismo que blanco o que el valor vaco
(longitud cero). Para comparar valores con NULL slo podremos usar los operadores IS NULL o IS
NOT NULL.

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

3. Consultas simples
Una consulta en SQL consta bsicamente de dos clusulas obligatorias (SELECT y FROM) a las
que se le pueden aadir opcionalmente otras cuatro clusulas (WHERE, GROUP BY, HAVING y
ORDER BY).

3.1.

Las clusulas SELECT / FROM

La clusula SELECT que inicia cada sentencia especifica la lista de atributos de los datos que
queremos recuperar en la consulta. Corresponde con la operacin de proyeccin del lgebra
relacional.
Para especificar la lista de elementos seleccionados podemos escribir cualquiera de los elementos
siguientes teniendo en cuenta que, si hay ms de uno, estarn separados por comas.

El nombre de una columna, que har referencia a un atributo de la tabla que especifiquemos en
la clusula FROM. Ms adelante veremos que, en determinadas ocasiones, al tener ms de una
tabla en la clusula FROM necesitaremos adems especificar el nombre de la tabla a la que
pertenece dicho atributo escrito de la siguiente forma: mi_tabla.atributo_seleccionado

El valor *, para indicar que se desea informacin de todas las columnas que forman la tabla.

Una constante, especificando que el valor constante va a aparecer en todas las filas de los
resultados de la consulta.

O una expresin SQL, indicando que SQL debe calcular el valor a colocar en los resultados
segn el estilo especificado por la expresin, por ejemplo: AVG .Esto lo veremos ms adelante.

La clusula FROM es la que indica sobre que tabla/s se desea recuperar informacin. Si hay ms
de una, se separan los nombres de las tablas por comas (y esto correspondera al producto cartesiano
del lgebra relacional).
El resultado de una consulta SQL es siempre una tabla de datos, semejante a las tablas de base de
datos. Generalmente los resultados de la consulta formarn una tabla con varias columnas y filas.
Por ejemplo, si queremos saber el listado de los
nombres, oficinas y fechas de contrato de todos los
vendedores, la consulta sera:
SELECT nombre, oficina_rep, contrato FROM
repventas ;

Dando como resultado una tabla de tres columnas


(hemos seleccionado 3 atributos) y diez filas (ya que
hay diez vendedores) que es la tabla de la derecha.

NOMBRE
OFICINA_REP CONTRATO
Jose Maldonado
11
14/06/1998
Carlos Martinez
12
19/05/1997
Belen Aguirre
13
12/02/1998
Maria Garcia
11
12/10/1999
Lorenzo Fernandez
21
12/10/1999
Soledad Martinez
21
10/12/1996
Daniel Gutierrez
12
20/10/1996
Antonio Valle
NULL
13/01/2000
Pedro Cruz
12
01/03/1997
Natalia Martin
22
14/11/1998

Sin embargo, si pedimos El nombre, cuota y ventas del empleado nmero 107, la consulta
produce una nica fila, ya que slo hay un vendedor que tenga el nmero de empleado solicitado.
SELECT nombre, cuota, ventas FROM repventas WHERE num_empl=107 ;
NOMBRE
Natalia Martin

CUOTA
27500

VENTAS
34432

En algunos casos los resultados de la consulta pueden ser un nico valor, como en el caso de pedir
el promedio de ventas de los vendedores:
SELECT AVG(ventas) FROM repventas ;

AVG (ventas)
24758.20

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

E incluso en otros puede producir cero filas de resultados. Por ejemplo si realizamos la consulta el
nombre y fecha de contrato de cualquier vendedor con ventas superiores a 75000:
SELECT nombre, contrato FROM repventas WHERE ventas>75000 ;
NOMBRE

CONTRATO

An en esta situacin, el resultado sigue siendo una tabla. Se trata de una tabla vaca con dos
columnas y cero filas.
Por otra parte, hay que tener en cuenta que la clusula SELECT nos va a mostrar tantas filas como
datos respondan a la consulta. Si la 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 tiene un valor
diferente en cada fila). Si no se incluye la clave primaria en los resultados pueden producirse filas
duplicadas. Por ejemplo, supongamos que pedimos La lista de las regiones en que se encuentran
las oficinas:
SELECT region FROM oficinas ;

Los resultados tienen cinco filas (uno por oficina), pero observamos que hay filas
duplicadas dado que las regiones se repiten. Probablemente, estos resultados no son
los que uno pretenda con la consulta, es decir, si existen tan solo dos regiones
diferentes cabra esperar que aparecieran solo las dos regiones.

REGION
Centro
Este
Este
Este
Centro

Se pueden eliminar filas duplicadas de los resultados de la consulta insertando la palabra clave
DISTINCT en la sentencia SELECT, justo antes de la lista de seleccin. Veamos la consulta anterior
modificada:
REGION
Este
Centro

SELECT DISTINCT region 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. Si se omite la palabra DISTINCT, SQL no elimina filas duplicadas.
Tambin se puede especificar la palabra clave ALL para indicar que las filas duplicadas sean
mostradas, pero es innecesario ya que ste es el comportamiento por defecto.
Veamos algunos ejemplos muy sencillos usando las clusulas SELECT / FROM:
Lista de la poblacin, regin y ventas de cada oficina de ventas:
SELECT ciudad, region, ventas FROM oficinas ;

Lista de la ciudad, regin y el resultado de ventas


para cada oficina:
SELECT ciudad, region, (ventas-objetivo) FROM
oficinas;

Resultado de elevar la cuota de ventas un 3%


a cada vendedor:
SELECT nombre, cuota,
(cuota+(0.03*ventas)) FROM repventas ;

CIUDAD
Toledo
Valencia
Barcelona
Alicante
Madrid

CIUDAD
Toledo
Valencia
Barcelona
Alicante
Madrid

REGION VENTAS
Centro
34.432
Este
40.063
Este
29.328
Este
39.327
Centro
81.309

REGION VENTAS-OBJETIVO
Centro
6.932
Este
-12.437
Este
-40.672
Este
9.327
Centro
21.309

NOMBRE
CUOTA CUOTA+(.03*VENTAS)
Jose Maldonado
25.000
25.988,74
Carlos Martinez
17.500
17.500,00
Belen Aguirre
30.000
31.179,81
Maria Garcia
27.500
27.713,15
Lorenzo Fernandez 30.000
31.755,99
Soledad Martinez
30.000
30.683,28
Daniel Gutierrez
27.500
28.298,84
Antonio Valle
NULL
NULL
Pedro Cruz
25.000
25.081,00
Natalia Martin
27.500
28.532,96
6

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Valor del inventario de cada ID_FAB ID_PRODUCTO DESCRIPCION EXISTENCIAS*PRECIO


producto:
REI
2A45C
V Stago Trinquete
16.590
SELECT id_fab, id_producto,
descripcion, (existencias*precio)
FROM productos ;

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

Mes y ao de contrato de cada vendedor:


SELECT nombre, MONTH(contrato),
YEAR(contrato) FROM repventas ;

Lista de ventas para cada ciudad:


CIUDAD
Toledo
Valencia
Barcelona
Alicante
Madrid

tiene ventas de VENTAS


tiene ventas de
34.432
tiene ventas de
40.063
tiene ventas de
29.328
tiene ventas de
39.327
tiene ventas de
81.309

Todos los datos de la tabla oficinas:


SELECT * FROM oficinas ;

3.2.

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

Extractor
Reductor
Plate
Riostra 2-Tm
Artculo Tipo 3
Artculo Tipo 4
Manivela
Perno Riostra
Reductor
Bisagra Izqda.
Cubierta
Soporte Riostra
Reten
Artculo Tipo 1
Riostra 1-Tm
Montador
Reductor
Artculo Tipo 2
Bisagra Dcha.
Riostra 1/2-Tm
Ajustador
Bancada Motor
Retenedor Riostra
Pasador Bisagra

68.750
13.490
0
16.875
22.149
16.263
1.956
6.000
27.202
54.000
17.020
12.042
17.550
15.235
7.125
14.000
4.329
12.692
54.000
27.300
925
3.645
15.200
4.900

NOMBRE
MONTH(contrato) YEAR(contrato)
Jose Maldonado
6
1998
Carlos Martinez
5
1997
Belen Aguirre
2
1998
Maria Garcia
10
1999
Lorenzo Fernandez
10
1999
Soledad Martinez
12
1996
Daniel Gutierrez
10
1996
Antonio Valle
1
2000
Pedro Cruz
3
1997
Natalia Martin
11
1998

SELECT ciudad, tiene ventas de, ventas FROM oficinas ;

OFICINA
22
11
12
13
21

CIUDAD
Toledo
Valencia
Barcelona
Alicante
Madrid

REGION
Centro
Este
Este
Este
Centro

DIR OBJETIVO VENTAS


108
27.500
34.432
106
52.500
40.063
104
70.000
29.328
105
30.000
39.327
108
60.000
81.309

La clusula WHERE

Generalmente se desea seleccionar solo algunas de las tuplas de una tabla, aquellas que, por
ejemplo, cumplan unas determinadas condiciones (al igual que el operador restriccin o seleccin
del lgebra relacional). La clusula WHERE se emplea para especificar las condiciones que nos
restringen a un determinado nmero de filas, las que se desean recuperar.
Por ejemplo, veamos la consulta decir las oficinas donde las ventas exceden al objetivo:

14748 - Bases de Datos Biblioteconoma. 2003-2004

SELECT ciudad, ventas, objetivo FROM oficinas WHERE


ventas>objetivo ;

O listar el nombre, ventas y cuota del empleado nmero 105:


SELECT nombre, ventas, cuota FROM repventas WHERE
num_empl=105 ;

Tema 5: Lenguajes de Consulta. SQL.


CIUDAD VENTAS OBJETIVO
Toledo
34.432
27.500
Alicante
39.327
30.000
Madrid
81.309
60.000
NOMBRE VENTAS CUOTA
Belen Aguirre
39.327 30.000

O decir qu empleados estn dirigidos por el empleado nmero 104:


SELECT nombre, ventas FROM repventas WHERE director=104 ;

NOMBRE
VENTAS
Belen Aguirre
39.327
Daniel Gutierrez
26.628
Pedro Cruz
2.700

En la clusula WHERE indicamos la condicin de bsqueda que especifica las filas a recuperar.
Conceptualmente, SQL recorre cada fila de la tabla seleccionada, una a una, y aplica la condicin
de bsqueda produciendo uno de los siguientes resultados:
Si la condicin de bsqueda es cierta, la fila se incluye en los resultados de la consulta.
Si la condicin de bsqueda es falsa, la fila se excluye de los resultados de la consulta.
Si la condicin de bsqueda tiene un valor NULL (desconocido), la fila se excluye de los
resultados de la consulta.
Para restringir los resultados de una bsqueda, el SQL ofrece un variado conjunto de condiciones de
bsqueda que nos van a permitir especificar muchos tipos diferentes de consultas. Las condiciones
de bsqueda son cinco segn el estndar ANSI/ISO:
Condiciones de comparacin. Compara el valor de una expresin con el valor de otra.
Condiciones de rango. Examina si el valor de una expresin cae dentro de un rango especificado
de valores.
Condiciones de pertenencia a un conjunto. Comprueba si el valor de una expresin se
corresponde con alguno de los valores especificados en conjunto determinado de valores.
Condiciones de correspondencia con patrn. Comprueba si el valor de una columna, que
contiene datos de cadena de caracteres, se corresponde con un patrn especificado.
Condiciones de valor nulo. Comprueba si una columna tiene un valor NULL (desconocido).
Veamos como se expresan estas condiciones en SQL.

Condiciones de comparacin (=, <>, <, <=, >, >=)


La condicin de bsqueda ms comn utilizada en una consulta SQL es la 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. Hay seis modos de comparar dos expresiones (=, <>, <, <=, >, >=).
Veamos algunos ejemplos:
Lista de los vendedores contratados antes de 1998:
SELECT nombre FROM repventas WHERE contrato<01/01/1998 ;

NOMBRE
Carlos Martinez
Soledad Martinez
Daniel Gutierrez
Pedro Cruz

Lista de las oficinas cuyas ventas estn por debajo del 75% del objetivo:
SELECT ciudad, ventas, objetivo FROM oficinas WHERE
ventas<(0.75*objetivo) ;

CIUDAD VENTAS OBJETIVO


Barcelona
29.328
70.000

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.


CIUDAD
Valencia
Barcelona
Alicante

Lista de las oficinas que no se encuentran en la regin Centro:


SELECT ciudad, region FROM oficinas WHERE region<>Centro ;

REGION
Este
Este
Este

La condicin de comparacin ms habitual es la que comprueba si el valor de una columna es igual


a cierta constante. Cuando la columna es clave primaria, la condicin asla una sola fila de la tabla
produciendo una sola fila de resultados, como por ejemplo el caso de Seleccionar el nombre y
lmite de crdito del cliente nmero 2107:
SELECT empresa, limite_credito FROM clientes
WHERE num_clie=2107 ;

EMPRESA
LIMITE_CREDITO
Distribuciones Sur S.A.
35.000

Recordemos que SQL trata el valor NULL como valor desconocido, por lo que si tratamos de hacer
una comparacin con un valor nulo, esa tupla no ser devuelta en la consulta. Por ejemplo:
Lista de vendedores que superan sus cuotas:

NOMBRE
Jose Maldonado
Belen Aguirre
Lorenzo Fernandez
Natalia Martin

SELECT nombre FROM repventas WHERE ventas>cuota ;

Lista de vendedores que no superan sus cuotas:

NOMBRE
Carlos Martinez
Maria Garcia
Soledad Martinez
Daniel Gutierrez
Pedro Cruz

SELECT nombre FROM repventas WHERE


ventas<=cuota ;

Condiciones de rango (BETWEEN)


La condicin BETWEEN de SQL comprueba si el valor del dato se encuentra entre dos valores
especificados, incluyendo en el resultado los valores de los extremos. Veamos algunos ejemplos:
Mostrar la relacin de pedidos entre NUM_PEDIDO FECHA_PEDIDO PRODUCTO IMPORTE
112961
17/12/1999
2A44L
31500
dos fechas:
SELECT num_pedido, fecha_pedido,
producto, importe FROM pedidos
WHERE fecha_pedido BETWEEN
01/10/1999 AND 31/12/1999 ;

Pedidos que caen en un determinado


rango de importe:
NUM_PEDIDO IMPORTE
110036
22.500
112987
27.500
113042
22.500

112968
112963
112983
112979
112992
112975
112987

12/10/1999
17/12/1999
27/12/1999
12/10/1999
04/11/1999
12/10/1999
31/12/1999

41004
41004
41004
4100Z
41002
2A44G
4100Y

3.978
3.276
702
15.000
760
2.100
27500

SELECT num_pedido, importe FROM pedidos WHERE importe


BETWEEN 20000.00 AND 29999.99 ;

La versin negada del test de rango, NOT BETWEEN, comprueba los valores que caen fuera del
rango. Por ejemplo:
Lista de vendedores cuyas ventas no estn entre el 75 y el
NOMBRE
Carlos
Martinez
150% de su cuota:
SELECT nombre, ventas, cuota FROM repventas WHERE
ventas NOT BETWEEN (0.75*cuota) AND (1.50*cuota) ;

VENTAS CUOTA
0 17.500
Maria Garcia
7.105 27.500
Lorenzo Fernadez
58.533 30.000
Pedro Cruz
2.700 25.000

Es necesario sealar que la condicin BETWEEN no aade potencia expresiva a SQL, pues A
BETWEEN B AND C puede ser expresado como (A>=B) AND (A<=C).
9

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Condiciones de pertenencia a un conjunto (IN)


La condicin IN examina si un valor de un dato coincide con uno de una lista de valores dados.
Veamos un par de ejemplos:
Pedidos obtenidos por cuatro vendedores especficos:
SELECT num_pedido, rep, importe FROM pedidos WHERE rep IN
(101,103,107,109) ;

Lista de los vendedores de las oficinas 11, 13 y 22:


NOMBRE
CUOTA VENTAS
Jose Maldonado 25.000
32.958
Belen Aguirre
30.000
39.327
Maria Garcia
27.500
7.105
Natalia Martin
27.500
34.432

NUM_PEDIDO REP IMPORTE


112968
101
3.978
113058
109
1.480
112997
107
652
113062
107
2.430
113069
107
31.350
112975
103
2.100
113055
101
150
113003
109
5.625
113057
103
600
113042
101
22.500

SELECT nombre, cuota, ventas FROM repventas WHERE


oficina_rep IN (11,13,22) ;

Al igual que la condicin BETWEEN, la condicin IN no aade potencia expresiva a SQL, ya que
la condicin de bsqueda X IN (A,B,C) es equivalente a (X=A) OR (X=B) OR (X=C).

Condiciones de correspondencia con un patrn (LIKE)


Se puede utilizar una condicin de comparacin simple para recuperar las filas en donde el
contenido de una columna de texto se corresponde con un cierto texto particular. Por ejemplo, la
siguiente consulta lmite de crdito de la empresa AFS S.A. recupera la fila de la tabla clientes
para el caso de conocer el nombre de la empresa.
SELECT empresa, limite_credito FROM clientes WHERE
empresa=AFS S.A. ;

EMPRESA LIMITE_CREDITO
AFS S.A.
20.000

Sin embargo, uno puede olvidar fcilmente el nombre exacto de la empresa, por ejemplo. La
condicin de correspondencia con un patrn (LIKE) comprueba si el valor de un dato de una
columna se ajusta a un patrn dado. El patrn es una cadena que puede incluir uno o ms caracteres
comodines. Estos caracteres comodines son el signo de porcentaje (%) y el subrayado (_).
El carcter comodn signo de porcentaje (%) se corresponde con cualquier secuencia de cero o ms
caracteres. El carcter comodn subrayado (_) se corresponde con un nico carcter cualquiera.
As por ejemplo, podemos consultar todos los vendedores apellidados Martinez de la siguiente
forma:
SELECT num_empl,nombre FROM repventas WHERE nombre
LIKE % Martinez ;

NUM_EMPL
NOMBRE
104
Carlos Martinez
102
Soledad Martinez

Uno de los problemas de la correspondencia con patrones de cadenas es cmo hacer corresponder
los propios caracteres comodines como caracteres literales. Para comprobar la presencia de un
carcter comodn en una cadena se precede de un carcter de escape que hace que el carcter que le
sigue inmediatamente se trate como un literal en lugar de cmo un carcter comodn. El carcter
escape en SQL es un signo de dlar ($).

Condiciones de valor nulo (IS NULL / IS NOT NULL)


En algunas ocasiones es til comprobar explcitamente los valores NULL en una condicin de
bsqueda y manejarlos directamente. SQL proporciona una condicin especial de valor nulo para
tratar este caso (IS NULL). Veamos algunos ejemplos:
10

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Decir que vendedores an no tienen asignada una oficina:

NOMBRE
Antonio Valle

SELECT nombre FROM repventas WHERE oficina_rep IS NULL ;


NOMBRE

La forma IS NOT NULL encuentra las filas que no contienen un valor NULL. Jose Maldonado
Por ejemplo:
Carlos Martinez
Belen Aguirre
Maria Garcia
Lorenzo Fernandez
Soledad Martinez
Daniel Gutierrez
Pedro Cruz
Natalia Martin

Listar los vendedores que tienen asignada una oficina:


SELECT nombre FROM repventas WHERE oficina_rep IS NOT NULL ;

Operadores para las bsquedas (AND / OR / NOT)


Cuando queremos realizar bsquedas teniendo en cuenta ms de un criterio, tendremos que
combinar las condiciones de bsqueda mediante los operadores AND u OR.
El operador AND se utiliza para combinar dos condiciones de bsqueda que deban ser ciertas
simultneamente. Por ejemplo, decir los vendedores que estn por debajo de la cuota y con ventas
inferiores a 20000:
NOMBRE
CUOTA VENTAS
SELECT nombre, cuotas, ventas FROM repventas WHERE
ventas<cuota AND ventas<20000.00 ;

Carlos Martinez
Maria Garcia
Pedro Cruz

17.500
27.500
25.000

0
7.105
2.700

El operador OR se utiliza para combinar dos condiciones de bsqueda cuando una u otra (o ambas)
deban ser ciertas. Por ejemplo, decir los vendedores que estn por debajo de la cuota o con ventas
inferiores a 30000:
NOMBRE
CUOTA VENTAS
SELECT nombre, cuota, ventas FROM repventas WHERE
ventas<cuota OR ventas<30000.00 ;

Carlos Martinez
Maria Garcia
Soledad Martinez
Daniel Gutierrez
Antonio Valle
Pedro Cruz

17.500
27.500
30.000
27.500
NULL
25.000

0
7.105
22.776
26.628
23.123
2.700

Por ltimo, se puede utilizar el operador NOT para seleccionar filas en donde la condicin de
bsqueda es falsa. Por ejemplo, decir los vendedores que estn por debajo de la cuota y con
ventas no superiores a 5000:
SELECT nombre, cuota, ventas FROM repventas WHERE
ventas<cuota AND NOT ventas>5000.00 ;

NOMBRE
CUOTA VENTAS
Carlos Martinez 17.500
0
Pedro Cruz
25.000
2.700

Utilizando las palabras AND, OR y NOT y los parntesis para agrupar los criterios de bsqueda, se
pueden construir criterios de bsqueda muy complejos. Por ejemplo:
Listar los vendedores con ventas inferiores a la cuota y con edad mayor de 45 aos o con ventas
inferiores a 5000:
SELECT nombre, edad FROM repventas WHERE
(ventas<cuota AND edad>45) OR ventas<5000.00 ;

NOMBRE
EDAD
Carlos Martinez
33
Soledad Martinez
48
Pedro Cruz
29

11

14748 - Bases de Datos Biblioteconoma. 2003-2004

3.3.

Tema 5: Lenguajes de Consulta. SQL.

La clusula ORDER BY

La clusula ORDER BY sirve para perdir a SQL que ordene los resultados de una consulta segn
unos criterios que se especifiquen (dado que los resultados de una consulta no estn dispuestos en
ningn orden particular). Si tenemos ms de un criterio de ordenacin, se escribirn separados por
comas. Por ejemplo, si queremos saber:
Las ventas de cada oficina, ordenadas en orden alfabtico por
regin y dentro de cada regin por ciudad (deberemos ordenar la
consulta por regin y ciudad):
SELECT ciudad, region, ventas FROM oficinas
ORDER BY region, ciudad ;

CIUDAD
Madrid
Toledo
Alicante
Barcelona
Valencia

REGION VENTAS
Centro
81.309
Centro
34.432
Este
39.327
Este
29.328
Este
40.063

En este caso, la primera especificacin de ordenacin (regin) es la clave de ordenacin mayor; las
que le sigan (ciudad) son progresivamente claves de ordenacin menores, utilizadas para
desempatar cuando dos filas de resultados tienen los mismos valores para las claves mayores.
Por omisin, SQL ordena los datos de forma ascendente, aunque tambin se puede especificar
poniendo la palabra ASC. Para solicitar la ordenacin en secuencia descendente se incluye la
palabra clave DESC en la especificacin de ordenacin, como en este ejemplo:
Lista de las oficinas clasificadas en orden descendente de ventas:
SELECT ciudad, region, ventas FROM oficinas
ORDER BY ventas DESC ;

CIUDAD
Madrid
Valencia
Alicante
Toledo
Barcelona

REGION VENTAS
Centro
81.309
Este
40.063
Este
39.327
Centro
34.432
Este
29.328

Si la columna de resultados de la consulta (que se utiliza 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 o bien darle un
nombre a la columna mediante la palabra clave AS. Veamos ambos casos con el siguiente ejemplo:
Lista de las oficinas clasificadas en orden descendente de
CIUDAD REGION VENTAS
rendimiento de ventas:
SELECT ciudad, region, (ventas-objetivo) FROM oficinas
ORDER BY 3 DESC ;
SELECT ciudad, region, (ventas-objetivo) AS ventas FROM
oficinas ORDER BY ventas DESC ;

3.4.

Madrid
Alicante
Toledo
Valencia
Barcelona

Centro
Este
Centro
Este
Este

21.309
9.327
6.932
-12.437
-40.672

La clusula UNION y la clusula INTERSECT

Estas clusulas sirven para combinar resultados de dos o ms consultas en una nica tabla de
resultados totales. En el estndar ANSI de SQL esta capacidad est soportada gracias a la clusula
UNION que devuelve como resultado todas las tuplas que estaban en una u otra consulta. Fuera del
estndar podemos encontrar tambin la clusula INTERSECT.
Por ejemplo, supongamos que queremos resolver la peticin: Lista todos los productos en donde el
precio del producto exceda de 2000 o en donde ms de 30000 del producto hayan sido ordenados
en un solo pedido.
ID_FAB ID_PRODUCTO
4100Y
2A44L
ACI
4100Z
REI
2A44R

La primera parte de la peticin puede satisfacerse con la consulta, ACI


productos cuyo precio excede de 2000:
REI
SELECT id_fab, id_producto FROM productos WHERE precio>2000 ;

12

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Anlogamente, la segunda parte de la peticin puede satisfacerse con la


FAB PRODUCTO
consulta, productos de los cuales se ha hecho un pedido mayor de 30000:
SELECT DISTINCT fab, producto FROM pedidos WHERE importe>30000 ;

IMM 775C
REI 2A44L
REI 2A44R

La unin de ambas consultas nos dar como resultado la consulta original, y se


realiza de la siguiente forma:
ID_FAB ID_PRODUCTO
SELECT id_fab, id_producto FROM productos WHERE precio>2000
UNION SELECT DISTINCT fab, producto FROM pedidos WHERE
importe>30000 ;

ACI
ACI
IMM
REI
REI

4100Y
4100Z
775C
2A44L
2A44R

Para poder realizar una unin existen varias restricciones:


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 en la
columna correspondiente en la segunda tabla.
Ninguna de las dos tablas puede estar ordenadas con la clusula ORDER BY.
Puede observarse que la UNION combina las filas de los dos conjuntos de resultados eliminando
por defecto las filas duplicadas. Si se desean mantener las filas duplicadas en una operacin
UNION, se puede especificar la palabra clave ALL a continuacin de la palabra UNION. Por
ejemplo, veamos el resultado de la unin de las consultas anteriores conservando las filas repetidas:
SELECT id_fab, id_producto FROM productos WHERE precio>2000
UNION ALL
SELECT DISTINCT fab, producto FROM pedidos WHERE
importe>30000 ;

ID_FAB
ACI
REI
ACI
REI
IMM
REI
REI

ID_PRODUCTO
4100Y
2A44L
4100Z
2A44R
775C
2A44L
2A44R

Como hemos dicho, las sentencias SELECT combinadas no pueden estar ordenadas. Sin embargo,
el resultado de la UNION puede ordenarse mediante una clusula ORDER BY que ordene el
resultado. Por ejemplo, la consulta anterior puede ordenarse por la identificacin del producto:
(SELECT id_fab, id_producto FROM productos WHERE precio>2000)
UNION
(SELECT DISTINCT fab, producto FROM pedidos WHERE
importe>30000) ORDER BY 2 ;

ID_FAB
REI
REI
ACI
ACI
IMM

ID_PRODUCTO
2A44L
2A44R
4100Y
4100Z
775C

La clusula INTERSECT nos permite combinar resultados de varias consultas devolviendo como
resultado aquellas tuplas que pertenecen a todas las consultas. Como ya hemos comentado, esta
clusula no es estndar pero se le aplican las mismas consideraciones que a la UNION excepto en
que no elimina los duplicados. Por ejemplo, supongamos que queremos la lista todos los
productos en donde el precio del producto exceda de 2000 pero en donde ms de 30000 del
producto hayan sido ordenados en un solo pedido. En este caso, deberemos juntar las dos
consultas mediante la clusula INTERSECT de la siguiente forma:
SELECT id_fab, id_producto FROM productos WHERE precio>2000

INTERSECT
SELECT DISTINCT fab, producto FROM pedidos WHERE
importe>30000 ;

ID_FAB ID_PRODUCTO
REI
2A44L
REI
2A44R

13

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

4. Consultas multitabla (composiciones)


Muchas consultas tiles solicitan datos procedentes de dos o ms tablas en la base de datos. SQL
permite recuperar datos que responden a estas peticiones mediante consultas multitabla que
componen (join) datos procedentes de dos o ms tablas. Por ejemplo, si queremos formular la
consulta listar todos los pedidos, mostrando su nmero, importe, nombre del cliente y el lmite de
crdito del cliente, nos damos cuenta de que los cuatro datos estn almacenados en dos tablas:
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 no la informacin
referente a los pedidos.
Sin embargo, existe 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.
En SQL, al proceso de formar parejas de filas haciendo coincidir los contenidos de las columnas
relacionadas se denomina componer (joining) las tablas. La tabla resultante se denomina
composicin entre las tablas. Las composiciones son el fundamento del procesamiento de consultas
multitabla en SQL. Todos los datos de la base relacional estn almacenados en sus columnas con
valores explcitos, de modo que todas las relaciones posibles entre tablas puedan formarse
comparando los contenidos de las columnas relacionadas.
Teniendo en cuenta lo anterior, la consulta planteada se realizara de la siguiente forma:

SELECT num_pedido,
importe, empresa,
limite_credito FROM
pedidos, clientes WHERE
clie=num_clie ;

NUM_PEDIDO IMPORTE
EMPRESA
LIMITE_CREDITO
112961
31.500 Hnos. Ramon S.L.
35.000
113012
3.745 EVBE S.A.
50.000
112989
1.458 Exclusivas Soriano S.A.
65.000
113051
1.420 Exclusivas Norte S.A.
60.000
112968
3.978 Exclusivas del Este S.L.
65.000
110036
22.500 Distribuciones Sur S.A.
35.000
113045
45.000 Lopez Asociados S.L.
50.000
112963
3.276 Pino S.L.
50.000
113013
652 Exclusivas Norte S.A.
60.000
113058
1.480 Zapater Importaciones S.A.
55.000
112997
652 Domingo S.L.
40.000
112983
702 Pino S.L.
50.000
113024
7.100 Componentes Fernandez S.A.
20.000
113062
2.430 Domingo S.L.
40.000
112979
15.000 Componentes Fernandez S.A.
20.000
113027
4.104 Pino S.L.
50.000
113007
2.825 Lopez Asociados S.L.
50.000
113069
31.350 Roda & Castedo S.L.
25.000
113034
632 Distribuciones Sur S.A.
35.000
112992
760 Exclusivas Norte S.A.
60.000
112975
2.100 EVBE S.A.
50.000
113055
150 Zapater Importaciones S.A.
55.000
113048
3.750 Distribuciones Montiel S.L.
50.000
112993
1.896 Construcciones Leon S.A.
65.000
113065
2.130 Construcciones Leon S.A.
65.000
113003
5.625 Zapater Importaciones S.A.
55.000
113049
776 Exclusivas Norte S.A.
60.000
112987
27.500 Pino S.L.
50.000
113057
600 EVBE S.A.
50.000
113042
22.500 Importaciones Martin S.L.
20.000
14

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Las consultas multitabla ms comunes implican a dos tablas que tienen una relacin entre ellas a
travs de clave ajena y clave primaria. En el ejemplo que acabamos de ver, cada pedido tiene un
cliente asociado y cada cliente puede tener muchos pedidos asociados. Los pares de filas que
generan los resultados de la consulta son combinaciones del cliente con sus pedidos.
Aunque este sea el tipo de consulta multitabla ms habitual, no es el nico. A continuacin
veremos, a travs de ejemplos, distintas consultas multitabla comentando los aspectos relevantes.
Dar la lista de los vendedores y la ciudad y regin donde
trabajan:
SELECT nombre, ciudad, region FROM repventas, oficinas
WHERE oficina_rep=oficina ;

Como puede observarse, SQL no requiere que las columnas


de emparejamiento sean incluidas en los resultados de la
consulta multitabla. Normalmente se omiten pues las claves
primarias y las claves ajenas suelen ser nmeros de
identificacin difciles de recordar y poco descriptivos.

NOMBRE
Jose Maldonado
Carlos Martinez
Belen Aguirre
Maria Garcia
Lorenzo Fernandez
Soledad Martinez
Daniel Gutierrez
Pedro Cruz
Natalia Martin

CIUDAD
Valencia
Barcelona
Alicante
Valencia
Madrid
Madrid
Barcelona
Barcelona
Toledo

REGION
Este
Este
Este
Este
Centro
Centro
Este
Este
Centro

Lista de los vendedores de las oficinas con objetivo igual o superior a 60000, dando la ciudad y
regin donde trabajan:
SELECT nombre, ciudad, region FROM repventas, oficinas
WHERE oficina_rep=oficina AND objetivo>=60000 ;

NOMBRE
Carlos Martinez
Lorenzo Fernandez
Soledad Martinez
Daniel Gutierrez
Pedro Cruz

CIUDAD
Barcelona
Madrid
Madrid
Barcelona
Barcelona

REGION
Este
Centro
Centro
Este
Este

Aqu se ha combinado la condicin de bsqueda que


especifica las columnas de emparejamiento en una consulta
multitabla con otra condicin de bsqueda, restringiendo an ms los contenidos de los resultados.
Listar todos los pedidos, mostrando los importes y las descripciones del producto.
NUM_PEDIDO IMPORTE DESCRIPCION
112961
31.500 Bisagra Izqda.
113012
3.745 Articulo Tipo 3
112989
1.458 Bancada Motor
113051
1.420 Reductor
112968
3.978 Articulo Tipo 4
110036
22.500 Montador
113045
45.000 Bisagra Dcha.
112963
3.276 Articulo Tipo 4
113013
652 Manivela
113058
1.480 Cubierta
112997
652 Manivela
112983
702 Articulo Tipo 4
113024
7.100 Reductor
113062
2.430 Bancada Motor
112979
15.000 Montador
113027
4.104 Articulo Tipo 2
113007
2.825 Riostra 1/2-Tm
113069
31.350 Riostra 1-Tm
113034
632 V Stago Trinquete
112992
760 Articulo Tipo 2
112975
2.100 Pasador Bisagra
113055
150 Ajustador
113048
3.750 Riostra 2-Tm
112993
1.896 V Stago Trinquete
113065
2.130 Reductor
113003
5.625 Risotra 2-Tm
113049
776 Reductor
112987
27.500 Extractor
113057
600 Ajustador
113042
22.500 Bisagra Dcha.

SELECT num_pedido, importe, descripcion FROM


pedidos, productos WHERE fab=id_fab AND
producto=id_producto ;

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, que se
emparejan
con
las
columnas
ID_FAB
e
ID_PRODUCTO, respectivamente. Por tanto, para
componer las tablas deben especificarse ambos pares
de columnas de emparejamiento.

Este tipo de composiciones son menos habituales y se


encuentran generalmente en consultas que afectan a
claves ajenas compuestas.

15

14748 - Bases de Datos Biblioteconoma. 2003-2004

Lista de los pedidos superiores


a 25000, incluyendo el nombre
del vendedor que tom el
pedido y el nombre del cliente
que lo solicit.

Tema 5: Lenguajes de Consulta. SQL.

NUM_PEDIDO IMPORTE
EMPRESA
112961
31.500 Hnos. Ramon S.L.
113045
45.000 Lopez Asociados S.L.
113069
31.350 Roda & Castedo S.L.
112987
27.500 Pino S.L.

NOMBRE
Jose Maldonado
Lorenzo Fernandez
Natalia Martin
Belen Aguirre

SELECT num_pedido, importe, empresa, nombre FROM pedidos, clientes, repventas WHERE
clie=num_clie AND rep=num_empl AND importe>25000 ;

SQL puede combinar datos de tres o ms tablas utilizando las mismas tcnicas bsicas utilizadas
para las consultas de dos tablas. Esta consulta utiliza dos claves ajenas 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 enlaza cada
pedido con el vendedor que lo acept.
Lista de los pedidos superiores a
25000, incluyendo el nombre del
cliente que remiti el pedido y el
nombre del vendedor asignado a
ese cliente.

NUM_PEDIDO IMPORTE
EMPRESA
112961
31.500 Hnos. Ramon S.L.
113045
45.000 Lopez Asociados S.L.
113069
31.350 Roda & Castedo S.L.
112987
27.500 Pino S.L.

NOMBRE
Jose Maldonado
Lorenzo Fernandez
Pedro Cruz
Belen Aguirre

SELECT num_pedido, importe, empresa, nombre FROM pedidos, clientes, repventas WHERE
clie=num_clie AND rep_clie=num_empl AND importe>25000 ;

Lista de los pedidos NUM_PEDIDO IMPORTE


superiores a 25000, 112961
31.500
incluyendo el nombre del 113045
45.000
31.350
cliente que remiti el 113069
112987
27.500
pedido, el vendedor
asociado al cliente y la oficina donde trabaja.

EMPRESA
Hnos. Ramon S.L.
Lopez Asociados S.L.
Roda & Castedo S.L.
Pino S.L.

NOMBRE
Jose Maldonado
Lorenzo Fernandez
Pedro Cruz
Belen Aguirre

CIUDAD
Valencia
Madrid
Barcelona
Alicante

SELECT num_pedido, importe, empresa, nombre, ciudad FROM pedidos, clientes, repventas,
oficinas WHERE clie=num_clie AND rep_clie=num_empl AND oficina_rep=oficina AND
importe>25000 ;

Ver los pedidos recibidos en los NUM_PEDIDO IMPORTE FECHA_PEDIDO


NOMBRE
das en que un vendedor fue 112968
3.978 12/10/1999
Maria Garcia
contratado.
112979
15.000 12/10/1999
Maria Garcia
SELECT num_pedido, importe,
fecha_pedido, nombre FROM
pedidos, repventas WHERE
fecha_pedido=contrato ;

112975
112968
112979
112975

2.100
3.978
15.000
2.100

12/10/1999
12/10/1999
12/10/1999
12/10/1999

Maria Garcia
Lorenzo Fernandez
Lorenzo Fernandez
Lorenzo Fernandez

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 de columnas de emparejamiento,
siempre que tengan tipos de datos comparables, tal y como se ha mostrado en este ejemplo.
Lista los vendedores y oficinas donde la cuota del vendedor es superior al 50% del objetivo de la
oficina.
NOMBRE CUOTA CIUDAD OBJETIVO
SELECT nombre, cuota, ciudad, objetivo FROM
repventas, oficinas WHERE oficina_rep=oficina AND
cuota>(0.5*objetivo) ;

Belen Aguirre
Maria Garcia
Natalia Martin

30.000 Alicante
27.500 Valencia
27.500 Toledo

30.000
52.500
27.500

Cuando en una consulta multitabla tengamos nombres de columnas duplicados ser necesario
eliminar la ambigedad. Para ello debe utilizarse un nombre de columna cualificado para identificar
la columna. El nombre de columna cualificado se construye con el nombre de la tabla y el nombre
de la columna separados por un punto: nombre_tabla.atributo_columna.
16

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Lista del nombre, las ventas y la oficina de cada vendedor.

NOMBRE
VENTAS CIUDAD
Jose Maldonado
32.958 Valencia
Carlos Martinez
0 Barcelona
Belen Aguirre
39.327 Alicante
Maria Garcia
7.105 Valencia
Lorenzo Fernandez
58.533 Madrid
Soledad Martinez
22.776 Madrid
Daniel Gutierrez
26.628 Barcelona
Pedro Cruz
2.700 Barcelona
Natalia Martin
34.432 Toledo

SELECT nombre, repventas.ventas, ciudad FROM repventas,


oficinas WHERE oficina_rep=oficina ;

En este ejemplo, los nombres cualificados de las dos columnas


VENTAS son OFICINAS.VENTAS y REPVENTAS.VENTAS,
esto es, el nombre de la tabla seguido por el nombre de la
columna.

Utilizar nombres de columna cualificados en una consulta multitabla es siempre una buena medida.
La desventaja es que hacen que el texto de la consulta sea mayor.
Informe sobre todos los vendedores y las oficinas en que trabajan.
SELECT * FROM repventas, oficinas WHERE oficina_rep=oficina ;
NUM_EMPL NOMBRE EDAD OFICINA_REPTITULO CONTRATODIRECTORCUOTAVENTASOFICINA CIUDAD REGION DIROBJETIVOVENTAS

106
104
105
109
108
102
101
103
107

Jose
Maldonado
Carlos
Martinez
Belen
Aguirre
Maria
Garcia
Lorenzo
Fernandez
Soledad
Martinez
Daniel
Gutierrez

52

11

33

12

37

13

31

11

62

21

48

21

45

12

Pedro Cruz 29

12

Natalia
Martin

49

22

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

14/06/1998

NULL

25.000 32.958

11

Valencia

Este 106 52.500

40.063

19/05/1997

106

17.500

12

Barcelona Este 104 70.000

29.328

12/02/1998

104

30.000 39.327

13

Alicante

Este 105 30.000

39.327

12/10/1999

106

27.500 7.105

11

Valencia

Este 106 52.500

40.063

12/10/1999

106

30.000 58.533

21

Madrid Centro 108 60.000

81.309

10/12/1995

108

30.000 22.776

21

Madrid Centro 108 60.000

81.309

20/10/1996

104

27.500 26.628

12

Barcelona Este 104 70.000

29.328

01/03/1997

104

25.000 2.700

12

Barcelona Este 104 70.000

29.328

14/11/1998

108

27.500 34.432

22

Toledo

Centro 108 27.500

34.432

En una consulta multitabla, el asterisco selecciona todas las columnas de todas las tablas listadas en
la clusula FROM.
La ltima consideracin que nos queda en este apartado de consultas multitabla es que, en
ocasiones, nos interesan consultas que 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. Por ello, la columna DIRECTOR es 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:
SELECT nombre, nombre FROM repventas, repventas WHERE director=num_empl ;

aparecera un error del tipo Referencia duplicada a la tabla repventas.


Frente a esto, podramos pensar que la solucin est en eliminar la segunda
NOMBRE NOMBRE
referencia a la tabla REPVENTAS, haciendo:
SELECT nombre, nombre FROM repventas WHERE director=num_empl ;

pero de esta forma, lo que obtendramos es una tabla vaca, pues la condicin director=num_empl
se aplica fila a fila, buscando empleados que sean sus propios directores, no existiendo tales filas.
Para resolver el problema, imaginemos que SQL tuviera dos copias idnticas de la tabla
REPVENTAS, una llamada EMPS, que contuviera los empleados, y otra llamada DIRS, que
17

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

contuviera los directores. Entonces la columna director de la tabla EMPS sera una clave ajena para
la tabla DIRS y la consulta se realizara como:
SELECT emps.nombre, dirs.nombre FROM emps, dirs WHERE emps.director=dirs.num_empl ;

SQL realmente no tiene dos tablas diferentes, pero es capaz de asignar a una tabla un nombre
diferente, llamado alias de tabla y esto se hace usando la palabra AS.
La clusula FROM asigna una alias a cada copia de la tabla REPVENTAS especificando el
nombre del alias detrs del nombre real de la tabla y precedido por AS. Cuando la clusula FROM
contiene un alias, el alias debe ser utilizado para identificar la tabla en las referencias de las
columnas. Por tanto, la consulta escrita utilizando los alias EMPS y DIRS para la tabla
REPVENTAS sera:
Lista de los nombres de los vendedores y sus directores.
SELECT emps.nombre, dirs.nombre FROM repventas AS emps,
repventas AS dirs WHERE emps.director=dirs.num_empl ;

En este ejemplo no sera realmente necesario utilizar dos alias,


uno para cada tabla de la consulta, podramos haber usado solo
uno, quedando la consulta como:
SELECT repventas.nombre, dirs.nombre FROM repventas,
repventas dirs WHERE repventas.director=dirs.num_empl ;

Lista de los vendedores con una cuota superior a la de su


director.
SELECT repventas.nombre, repventas.cuota, dirs.cuota FROM
repventas, repventas AS dirs WHERE
repventas.director=dirs.num_empl AND
repventas.cuota>dirs.cuota ;

NOMBRE
Carlos Martinez
Belen Aguirre
Maria Garcia
Lorenzo Fernandez
Soledad Martinez
Daniel Gutierrez
Antonio Valle
Pedro Cruz
Natalia Martin

NOMBRE
Jose Maldonado
Carlos Martinez
Jose Maldonado
Jose Maldonado
Lorenzo Fernandez
Carlos Martinez
Daniel Gutierrez
Carlos Martinez
Lorenzo Fernandez

NOMBRE
CUOTA CUOTA
Belen Aguirre
30.000 17.500
Maria Garcia
27.500 25.000
Lorenzo Fernandez 30.000 25.000
Daniel Gutierrez
27.500 17.500
Pedro Cruz
25.000 17.500

Los alias de las tablas son imprescindibles en consultas donde se relaciona una tabla consigo misma
pero pueden utilizarse alias en cualquier consulta. As por ejemplo, la consulta:
SELECT nombre, repventas.ventas, ciudad FROM repventas, oficinas WHERE oficina_rep=oficina;

puede escribirse como:


SELECT r.nombre, r.ventas, ciudad FROM repventas AS r, oficinas WHERE r.oficina_rep=oficina ;

5. Consultas sumarias y funciones de agregacin


Muchas peticiones de informacin no requieren el nivel de detalle proporcionado por las consultas
SQL. Por ejemplo, podemos solicitar de la base de datos:
Cul es la cuota total para todos los vendedores?
Cules son las cuotas mnima y mxima?
Cuntos vendedores han superado su cuota?
Cul es el tamao del pedido medio para cada oficina?
SQL soporta estas peticiones mediante un conjunto de funciones de agregacin. Una funcin de
agregacin SQL acepta una columna entera de datos como argumento y produce un nico dato que
sumariza la columna. SQL ofrece seis funciones de agregacin diferentes:
SUM( nombre_columna ) calcula el total de una columna.
AVG( nombre_columna ) calcula el valor promedio de una columna.
MIN( nombre_columna ) encuentra el valor ms pequeo en una columna.
MAX( nombre_columna ) encuentra el valor mayor en una columna.
COUNT( nombre_columna ) cuenta el nmero de valores en una columna.
COUNT(*) cuenta las filas de resultados de la consulta.
18

14748 - Bases de Datos Biblioteconoma. 2003-2004

5.1.

Tema 5: Lenguajes de Consulta. SQL.

Clculo del total de una columna (SUM)

La funcin SUM() calcula la suma de una columna de valores de datos. Los datos de la columna
deben tener un tipo numrico (entero o coma flotante). El resultado de la funcin SUM() tiene el
mismo tipo de dato bsico que los datos de la columna, pero el resultado puede tener una precisin
superior. Veamos algunos ejemplos que utilizan la funcin SUM():
Cuotas y ventas totales.

SUM(CUOTA) SUM(VENTAS)
240.000
247.582

SELECT SUM(cuota), SUM(ventas) FROM repventas ;

Total de pedidos aceptados por el empleado Belen Aguirre.


SUM(IMPORTE)
39.327

SELECT SUM(importe) FROM pedidos, repventas WHERE


nombre=Belen Aguirre AND rep=num_empl ;

5.2.

Clculo del promedio de una columna (AVG)

La funcin AVG() calcula el promedio de los valores que toman los datos de una columna. Al igual
que en la funcin SUM(), los datos de la columna deben tener tipo numrico. El resultado de la
funcin AVG() puede tener un tipo de datos diferente al de los valores de la columna. Por ejemplo,
si se aplica AVG() a una columna de enteros, el resultado ser un nmero un nmero con
decimales. Veamos algunos ejemplos de uso de la funcin de columna AVG():
Precio promedio de los productos del fabricante ACI.
SELECT AVG(precio) FROM productos WHERE id_fab=ACI ;

Precio medio del pedido ordenado por el cliente 2103.


SELECT AVG(importe) FROM pedidos WHERE clie=2103 ;

5.3.

AVG(PRECIO)
804,29
AVG(IMPORTE)
8.895,50

Determinacin de los valores extremos (MIN y MAX)

Las funciones 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. Veamos algunos ejemplos:
Cuotas mnima y mxima asignadas a los vendedores.
SELECT MIN(cuota), MAX(cuota) FROM repventas ;

Fecha del pedido ms antiguo en la base de datos.


SELECT MIN(fecha_pedido) FROM pedidos ;

Mejor rendimiento de todos los vendedores.


SELECT MAX(100*ventas/cuota) FROM repventas ;
Primer y ltimo vendedor por orden alfabtico.

MIN(CUOTA) MAX(CUOTA)
17.500
30.000
MIN(FECHA_PEDIDO)
12/10/1999
MAX(100*VENTAS/CUOTA)
195
MIN(NOMBRE) MAX(NOMBRE)
Antonio Valle
Soledad Martinez

SELECT MIN(nombre), MAX(nombre) FROM repventas ;

5.4.

Cuenta de valores de datos (COUNT)

La funcin 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() devuelve siempre un entero,
independientemente del tipo de datos de la columna. Algunos ejemplos son:
Decir el nmero de clientes.
SELECT COUNT(num_clie) FROM clientes ;

COUNT(NUM_CLIE)
21
19

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Nmero de vendedores que superan su cuota.


SELECT COUNT(nombre) FROM repventas WHERE ventas>cuota ;
Nmero de pedidos de ms de 25000.
SELECT COUNT(importe) FROM pedidos WHERE importe>25000 ;

COUNT(NOMBRE)
4
COUNT(IMPORTE)
4

Debemos resaltar que la funcin COUNT() ignora los valores de los datos en la columna,
simplemente cuenta cuntos datos hay. Por lo tanto, en realidad no importa qu columna se
especifica como argumento de la funcin COUNT(). Esta es la razn por la que SQL soporta una
funcin de columna especial, COUNT(*) que cuenta filas en lugar de valores de datos. As, la
ltima consulta podra haberse escrito como:
Nmero de pedidos de ms de 25000.
SELECT COUNT(*) FROM pedidos WHERE importe>25000 ;

5.5.

COUNT(*)
4

Funciones de agregacin en la lista de seleccin

Las consultas simples con una funcin de agregacin en una lista de seleccin son fciles de
entender, pero no lo es tanto cuando la lista de seleccin incluye varias funciones de agregacin.
Uno de los mejores modos de imaginar las consultas sumarias y las funciones de agregacin es
pensar en el procesamiento de la consulta dividido en dos pasos. Primero, imaginamos cmo
funcionara la consulta sin las funciones de agregacin, produciendo muchas filas de resultados de
consulta detallados. Luego imaginamos a SQL aplicando las funciones de agregacin a los
resultados de consulta detallados, produciendo una sola fila sumaria. Por ejemplo, si queremos ver
diversos porcentajes de la base de datos hacemos primero:
SELECT importe, importe, 100*importe/limite_credito,100*importe/cuota FROM pedidos,
clientes, repventas WHERE clie=num_clie AND rep=num_empl ;
y a continuacin se aplican sobre los resultados las funciones de agregacin:
SELECT AVG(importe), SUM(importe), AVG(100*importe/limite_credito), AVG(100*importe/cuota)
FROM pedidos, clientes, repventas WHERE clie=num_clie AND rep=num_empl ;
AVG(IMPORTE) SUM(IMPORTE) AVG(100*IMPORTE/LIMITE_CREDITO) AVG(100*IMPORTE/CUOTA)
8.253,03
247.591
24.10
27,86

Una funcin agregacin puede aparecer, en la lista de seleccin, en cualquier lugar en el que puede
aparecer un nombre de columna. Sin embargo, el argumento de una funcin de agregacin no puede
contener a otra funcin de agregacin y tambin es ilegal mezclar funciones de agregacin y
nombres normales de columnas en una lista de seleccin, pues la consulta carece de sentido, ya que
un nombre de columna genera una tabla de resultados con cierto nmero de filas y una funcin de
agregacin genera una columna de una fila con los resultados sumarios.

5.6.

Valores NULL y funciones de columna

Las funciones de agregacin 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. Sin
embargo, dicha columna puede contener valores NULL. En tal caso, los valores NULL son
ignorados por las funciones de agregacin. Veamos un ejemplo:
Ejemplo de funciones de columna con valores NULL.
SELECT COUNT(*), COUNT(ventas), COUNT(cuota)
FROM repventas ;

COUNT(*) COUNT(VENTAS) COUNT(CUOTA)


10
10
9

20

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

La tabla REPVENTAS contiene diez filas, por lo que COUNT(*) devuelve diez. Las columnas
VENTAS contienen diez valores no NULL, por lo que la funcin COUNT(ventas) devuelve
tambin diez. Sin embargo, la columna CUOTA es NULL para un vendedor, por lo cual la funcin
COUNT(cuota) ignora ese valor de NULL y devuelve el valor nueve.
El que las funciones MIN() y MAX() ignoren los valores NULL carece de importancia, sin embargo
para las funciones SUM() y AVG() puede producir sutiles problemas. Supongamos la siguiente
consulta:
Uso de la funcin SUM con valores NULL.
SELECT SUM(ventas), SUM(cuota), SUM(ventas)-SUM(cuota), SUM(ventas-cuota) FROM
repventas ;
SUM(VENTAS) SUM(CUOTA) SUM(VENTAS)-SUM(CUOTA) SUM(VENTAS-CUOTA)
247.582
240.000
7.582
-15.541

Como se observa, la expresin SUM(ventas)-SUM(cuota) funciona correctamente, mientras que la


expresin SUM(ventas-cuota) proporciona un resultado aparentemente incorrecto. Esto es as pues
existe un valor NULL en la columna CUOTA. Entonces, SUM(ventas)-SUM(cuota) realiza la resta
entre la suma de los diez valores de ventas y la suma de los nueve valores de cuota, mientras que
SUM(ventas-cuota) realiza primero la resta, con lo cual solo aparecen nueve valores vlidos (pues
la resta de un nmero menos NULL produce NULL), con lo cual solo se suman nueve restas.

5.7.

Eliminacin de filas duplicadas (DISTINCT)

Al igual que en la seleccin de una lista, se puede pedir a SQL que elimine valores duplicados de
una columna antes de aplicarle la funcin de agregacin. Para eliminar valores duplicados, la
palabra clave DISTINCT se incluye delante del argumento de la funcin de columna,
inmediatamente despus del parntesis abierto. Veamos algunos ejemplos:
Nmero de ttulos diferentes de los vendedores.
SELECT COUNT(DISTINCT titulo) FROM repventas ;

COUNT(DISTINCT TITULO)
3

Nmero de oficinas con vendedores que superan sus cuotas.


SELECT COUNT(DISTINCT oficina_rep) FROM repventas
WHERE ventas>cuota ;

COUNT(DISTINCT OFICINA_REP)
4

La palabra clave DISTINCT puede usarse con las funciones de agregacin COUNT(), SUM() y
AVG() (con MAX y MIN no tiene sentido). Cuando se usa la palabra clave DISTINCT el
argumento de la funcin agregacin debe ser un nombre de columna nico, no puede ser una
expresin; adems, la palabra clave DISTINCT slo puede aparecer una vez en una consulta.

5.8.

Consultas agrupadas (clusula GROUP BY)

Las consultas sumarias descritas hasta ahora son como los totales al final de un informe, condensan
todos los datos detallados del informe en una nica fila sumaria de datos. Sin embargo, en algunos
casos es til obtener subtotales. La clusula GROUP BY proporciona esta capacidad.
Veamos un ejemplo:
Tamao medio de los pedidos para cada vendedor.
SELECT rep, AVG(importe) FROM pedidos GROUP BY rep ;
SQL lleva a cabo la consulta de la siguiente forma:

REP AVG(IMPORTE)
101
8.876,00
102
5.694,00
103
1.350,00
105
7.865,40
106
16.479,00
107
11.477,33
108
8.361,86
109
3.552,50
110
11.566,00

21

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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 sumario de resultados.

Veamos algunos ejemplos:


Rango de cuotas asignadas a cada oficina.
SELECT oficina_rep, MIN(cuota), MAX(cuota)
FROM repventas GROUP BY oficina_rep ;
Nmero de vendedores asignados a cada oficina.

OFICINA_REP MIN(CUOTA) MAX(CUOTA)


NULL
NULL
NULL
11
25.000
27.500
12
17.500
27.500
13
30.000
30.000
21
30.000
30.000
22
27.500
27.500

SELECT oficina_rep, COUNT(*) FROM repventas GROUP BY


oficina_rep ;
COUNT(DISTINCT NUM_CLIE)
3
4
3
1
2
2
1
2
2
1

REP_CLIE
101
102
103
104
105
106
107
108
109
110

OFICINA_REP COUNT(*)
NULL
1
11
2
12
3
13
1
21
2
22
1

Nmero de clientes diferentes atendidos por cada


vendedor.
SELECT COUNT(DISTINCT num_clie), rep_clie
FROM clientes GROUP BY rep_clie ;

SQL tambin puede agrupar resultados de consulta en base a


contenidos de dos o ms columnas. Por ejemplo:
Pedidos totales por cliente y vendedor.
SELECT rep, clie, SUM(importe) FROM pedidos GROUP BY rep,
clie ;
Una limitacin de las consultas agrupadas es que SQL ignora la
informacin referente a las claves primarias y ajenas cuando analiza
la validez de una consulta agrupada. Por ello, la consulta:
Pedidos totales por cada vendedor.
SELECT num_empl, nombre, SUM(importe) FROM pedidos,
repventas WHERE rep=num_empl GROUP BY num_empl ;

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

CLIE SUM(IMPORTE)
2102
3.978
2108
150
2113
22.500
2106
4.026
2114
15.000
2120
3.750
2111
2.700
2103
35.582
2111
3.745
2101
1.458
2117
31.500
2109
31.350
2124
3.082
2112
47.825
2114
7.100
2118
3.608
2108
7.105
2107
23.132

da como resultado un error del tipo : La columna nombre no es una expresin GROUP BY.
NUM_EMPL
101
102
103
105
106
107
108
109
110

NOMBRE
SUM(IMPORTE)
Daniel Gutierrez
26.628
Soledad Martinez
22.776
Pedro Cruz
2.700
Belen Aguirre
39.327
Jose Maldonado
32.958
Natalia Martin
34.432
Lorenzo Fernandez
58.533
Maria Garcia
7.105
Antonio Valle
23.132

La consulta tiene perfecto sentido, ya que la


agrupacin por el nmero de empleado del
vendedor es, en efecto, igual que la agrupacin
sobre el nombre del vendedor. No obstante, SQL
requiere que las columnas de SELECT estn
especificadas como columna de agrupacin, por
ello el problema se corrige sencillamente
realizando la consulta de la forma siguiente:

SELECT num_empl, nombre, SUM(importe) FROM pedidos, repventas WHERE rep=num_empl


GROUP BY num_empl, nombre ;

22

14748 - Bases de Datos Biblioteconoma. 2003-2004

5.9.

Tema 5: Lenguajes de Consulta. SQL.

Condiciones de bsqueda en 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 la condicin de bsqueda. Por tanto, la
clusula HAVING especifica una condicin de bsqueda por grupos. Veamos algunos ejemplos:
Tamao de pedido promedio por vendedor para vendedores con pedidos REP AVG(IMPORTE)
totales de ms de 30000.
105
7.865,40
SELECT rep, AVG(importe) FROM pedidos GROUP BY rep HAVING
SUM(importe)>30000 ;

106
107
108

16.479,00
11.477,33
8.361,86

SQL efecta la consulta de la siguiente forma:


1. La clusula GROUP BY dispone los pedidos en grupos por vendedor.
2. La clusula HAVING elimina entonces los grupos donde el total de pedidos no excede de 30000.
3. Finalmente la clusula SELECT calcula el tamao de pedido medio para cada uno de los grupos
restantes y genera los resultados de la consulta.
Cuota total y ventas totales para todos los vendedores de una oficina en oficinas con dos o ms
personas.
SELECT ciudad, sum(cuota),
sum(repventas.ventas) FROM oficinas,
repventas WHERE oficina=oficina_rep GROUP
BY ciudad HAVING COUNT(*)>=2 ;

CIUDAD SUM(CUOTA) SUM(REPVENTAS.VENTAS)


Barcelona
70.000
29.328
Madrid
60.000
81.309
Valencia
52.500
40.063

En este caso el proceso que realiza SQL es el siguiente:


1. Compone las tablas OFICINAS y REPVENTAS para hallar la ciudad donde trabaja cada
vendedor.
2. Agrupa las filas resultantes por oficina.
3. Elimina los grupos con menos de dos filas.
4. Calcula la cuota total y las ventas totales para cada grupo.
Precio, existencias y cantidad total de los pedidos de cada producto para los cuales la cantidad
total pedida es superior al 75% 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 PRECIO EXISTENCIAS SUM(CANT)


Reductor
355
38
32
Ajustador
25
37
30
Bancada Motor
243
15
16
Bisagra Dcha.
4.500
12
15
Riostra 1-Tm
1.425
5
22

Para procesar esta consulta, SQL efecta conceptualmente los siguientes pasos:
1. Agrupa las filas resultantes por fabricante y por identificador de producto.
2. Elimina los grupos en donde la cantidad pedida (el total de la columna CANT para todos los
pedidos del grupo) es menos del 75% de las existencias.
3. Calcula la cantidad total pedida para cada grupo.
4. Genera una fila sumaria de resultados por cada grupo.
5. Ordena los resultados para que los productos con el mayor valor de existencias aparezcan en
primer lugar.
En esta consulta, las columnas DESCRIPCION, PRECIO y EXISTENCIAS aparecen especificadas
como columnas de agrupacin nicamente porque aparecen en la lista de seleccin. Realmente no
contribuyen en nada al proceso de agrupacin, ya que ID_FAB e ID_PRODUCTO especifican
completamente una nica fila en la tabla PRODUCTOS, haciendo automticamente que las otras
tres columnas tengan un nico valor por grupo.
23

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

6. Subconsultas y subconsultas anidadas


La caracterstica de subconsulta de SQL permite utilizar los resultados de una consulta como parte
de otra. La capacidad de utilizar una consulta dentro de otra fue la razn original para la palabra
estructurada en el nombre Lenguaje de Consultas Estructuradas (Structured Query LanguageSQL). Esta caracterstica 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 estrechamente 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 recomponerlas.
Hay algunas consultas que no pueden ser expresadas en el lenguaje SQL sin utilizar una
subconsulta.
Una subconsulta es una consulta que aparece dentro de la clusula WHERE o HAVING de otra
sentencia SQL. Por ejemplo, analicemos la peticin: Lista las oficinas en donde las ventas de la
oficina son inferiores al 50% de la suma de las cuotas de los vendedores de la oficina. La peticin
solicita una lista de oficinas de la tabla OFICINAS, en donde el valor de la columna VENTAS
satisface cierta condicin. Parece razonable que la sentencia SELECT que expresa la consulta deba
ser semejante a esta:
SELECT ciudad FROM oficinas WHERE ventas<??? ;

donde el valor ??? equivaldra a el 50% de la suma de las cuotas de los vendedores asignados a
la oficina en cuestin. Sabemos que la menor de las cuotas para una oficina especfica puede
obtenerse como:
SELECT 0.5*SUM(cuota) FROM repventas WHERE oficina_rep=XX ;

donde XX representa el nmero de oficina.


Parece entonces razonable comenzar con la primera consulta y reemplazar los ??? con la segunda
consulta del modo siguiente:
SELECT ciudad FROM oficinas WHERE ventas<(SELECT 0.5*SUM(cuota) FROM repventas
WHERE oficina_rep=oficina) ;

Las subconsultas SQL dentro de 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.
Veamos algunas consideraciones a tener en cuenta:
Una subconsulta debe producir una nica columna de datos como resultados. Esto significa que
una subconsulta siempre tiene un nico elemento de seleccin de la 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 carece de sentido ordenarlos.
Una subconsulta no puede ser la UNION de varias sentencias SELECT diferentes; slo se
permite una nica SELECT.
Los nombre de columna que aparecen en una subconsulta pueden referirse a columnas de tablas
en la consulta principal.
24

14748 - Bases de Datos Biblioteconoma. 2003-2004

6.1.

Tema 5: Lenguajes de Consulta. SQL.

Subconsultas en la clusula WHERE

Veamos con ejemplos las condiciones de bsqueda que ofrece SQL para las subconsultas:

Condiciones de comparacin en la subconsulta (=, <>, <, <=, >, >=)


La comparacin en la subconsulta es una forma modificada de la comparacin simple. Compara el
valor de una expresin con un valor nico producido por una subconsulta, y devuelve un resultado
TRUE si la comparacin es cierta.
Ciudades con ventas inferiores al 50% de la suma de las cuotas de los vendedores asignados a
dicha ciudad.
SELECT ciudad FROM oficinas WHERE ventas<(SELECT 0.5*SUM(cuota)
FROM repventas WHERE oficina_rep=oficina) ;

CIUDAD
Barcelona

Conceptualmente, SQL lleva a cabo la consulta de la siguiente forma: 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. Para ello SQL recorre las filas de la tabla OFICINAS una a una,
aplicndoles la condicin de la clusula WHERE. La clusula WHERE compara el valor de la
columna VENTAS de la fila actual con el valor producido por la subconsulta. Para examinar el
valor VENTAS, 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 VENTAS, seleccionando o rechazando la oficina actual en base a la
comparacin.
Dentro del cuerpo de una subconsulta, con frecuencia es necesario referirse al valor de una columna
en la fila actual de la consulta principal, tal y como sucede en la consulta anterior. En estos casos,
la columna de la consulta principal que se utiliza en la subconsulta se conoce como 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.
Lista los vendedores con cuota igual o superior al objetivo de Alicante.
SELECT nombre FROM repventas WHERE cuota>=(SELECT objetivo FROM
oficinas WHERE ciudad=Alicante) ;

Lista de los clientes atendidos por Belen Aguirre.


SELECT empresa FROM clientes WHERE rep_clie=(SELECT num_empl FROM
repventas WHERE nombre=Belen Aguirre) ;

NOMBRE
Belen Aguirre
Lorenzo Fernandez
Soledad Martinez
EMPRESA
Pino S.L.
JPF S.L.

Lista de 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 EXISTENCIAS
Articulo Tipo 1
277
Articulo Tipo 2
167
Articulo Tipo 3
207

Condicin de pertenencia a un conjunto ( IN )


La condicin de pertenencia a un conjunto subconsulta (IN) es una forma modificada de la
condicin de pertenencia a conjunto simple. Comprueba si el valor de una expresin coincide con
uno del conjunto de valores producido por una subconsulta y devuelve un resultado TRUE si el
valor coincide.

25

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

NOMBRE
Lista de los vendedores que trabajan en oficinas que superan su objetivo de
Belen
Aguirre
ventas.

SELECT nombre FROM repventas WHERE oficina_rep IN (SELECT oficina


FROM oficinas WHERE ventas>objetivo) ;

Lorenzo Fernandez
Soledad Martinez
Natalia Martin

Lista de empleados que tienen todos sus clientes con lmite de crdito igual o superior a 50000.
NOMBRE
Lorenzo Fernandez

SELECT nombre FROM repventas WHERE num_empl NOT IN (SELECT


rep_clie FROM clientes WHERE limite_credito<50000) ;

Lista de los clientes que han remitido pedidos del fabricante ACI con productos que empiezan
por 4100 entre Enero y Junio del 2000.
EMPRESA
SELECT empresa FROM clientes WHERE num_clie IN (SELECT
DISTINCT clie FROM pedidos WHERE fab=ACI AND producto LIKE
4100% AND fecha_pedido BETWEEN 01/01/2000 AND 30/06/2000) ;

EVBE S.A.
Pino S.L.
Distribuciones Sur S.A.
Zapater Importaciones S.A.

Condicin de existencia (EXISTS)


La condicin de existencia (EXISTS) comprueba si una subconsulta produce alguna fila de
resultados. Devuelve TRUE si la subconsulta produce filas o FALSE si no las produce. Esta
condicin solo se utiliza con subconsultas.
Lista de productos para los cuales se ha recibido un pedido mayor o igual a
25000.
SELECT DISTINCT descripcion FROM productos WHERE EXISTS (SELECT
num_pedido FROM pedidos WHERE fab=id_fab AND producto=id_producto AND
importe>=25000) ;

DESCRIPCION
Bisagra Dcha.
Bisagra Izqda.
Extractor
Riostra 1-Tm

Lista de los clientes asignados a Soledad Martinez y que no han remitido ningn pedido
superior a 3000.
SELECT empresa FROM clientes WHERE rep_clie=(SELECT num_empl
FROM repventas WHERE nombre=Soledad Martinez) AND NOT EXISTS
(SELECT * FROM pedidos WHERE clie=num_clie AND importe>3000) ;

EMPRESA
Hnos. Martinez S.A.
Construcciones Leon S.A.

Oficinas donde la cuota de un vendedor representa ms del 55% del objetivo de la oficina.
SELECT ciudad FROM oficinas WHERE EXISTS (SELECT * FROM repventas
WHERE oficina_rep=oficina AND cuota>(0.55*objetivo)) ;

CIUDAD
Toledo
Alicante

Como la condicin de bsqueda EXISTS no utiliza realmente los resultados de la subconsulta, es


posible relajar la regla de que las subconsultas deben devolver una nica columna de datos y
permitir utilizar la forma SELECT * en la subconsulta de un test EXISTS.

Condiciones de comparacin cuantificadas ( >ANY / >SOME / >ALL )


Las condiciones de comparacin cuantificada comparan el valor de una expresin con cada uno de
los valores del conjunto producido por una subconsulta. Las condiciones de comparacin que se
pueden utilizar son cualquiera de los seis operadores de comparacin de SQL (=, <>, <, <=, >, >=).
Las versiones antiguas de SQL solo contemplaban la condicin ANY, posteriormente se cambi por
SOME para evitar la ambigedad de la palabra en ingls, pero ambas sirven para lo mismo.
Si usamos la condicin SOME o ANY junto con algn operadores de comparacin y alguna de las
comparaciones individuales produce un resultado TRUE, entonces el resultado global es TRUE.
Si usamos la condicin ALL junto con algn operadores de comparacin, para que el resultado
global sea cierto (TRUE) ser necesario que cada una de las comparaciones individuales produzcan
un TRUE.
26

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Lista de los vendedores que han aceptado un pedido que representa ms de su


NOMBRE
cuota.
Jose Maldonado
SELECT nombre FROM repventas WHERE cuota<ANY (SELECT importe
FROM pedidos WHERE rep=num_empl) ;

Lorenzo Fernandez
Natalia Martin

Lista de las oficinas y sus objetivos en donde todos los vendedores tienen ventas que igualan o
superan el objetivo de la oficina.
SELECT ciudad, objetivo FROM oficinas WHERE objetivo<ALL (SELECT
ventas FROM repventas WHERE oficina_rep=oficina) ;

6.2.

CIUDAD OBJETIVO
Toledo
27.500
Alicante
30.000

Subconsultas anidadas

Todas las consultas descritas hasta ahora han sido consultas de dos niveles, afectando a la
consulta principal y a una subconsulta. Del mismo modo que se puede utilizar una subconsulta
dentro de una consulta principal, se puede utilizar una subconsulta dentro de otra subconsulta. Esto
se puede extender hasta el nivel de subconsulta que se desee. Veamos un ejemplo:
EMPRESA
Lista de clientes cuyos vendedores estn asignados a oficinas de la
Hnos. Martinez S.A.
regin de ventas Centro.
Lopez Asociados S.L.

SELECT empresa FROM clientes WHERE rep_clie IN (SELECT


num_empl FROM repventas WHERE oficina_rep IN (SELECT oficina
FROM oficinas WHERE region=Centro)) ;

Componentes Fernandez S.A.


Domingo S.L.
Distribuciones Montiel S.L.
Construcciones Leon S.A.
Exclusivas Norte S.A.

En este ejemplo, la subconsulta ms interna produce una columna que contiene los nmeros de
oficina de las oficinas de la regin Centro. La siguiente subconsulta produce una columna que
contiene los nmeros de empleado de los vendedores que trabajan en las oficinas seleccionadas.
Finalmente la consulta externa encuentra los clientes cuyos vendedores tienen uno de los nmeros
de empleado seleccionados.

6.3.

Subconsultas en la clusula HAVING

Cuando una subconsulta aparece en la clusula HAVING funciona como parte de la seleccin de
grupo de filas efectuada por la clusula HAVING. Consideremos la siguiente consulta:
Lista de 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
AVG(IMPORTE)
Antonio Valle
22.500,00
Soledad Martinez
15.000,00

La consulta funciona calculando en primer lugar el tamao de pedido medio global. Luego la
clusula HAVING comprueba cada grupo de filas para ver si el tamao medio pedido de ese grupo
es superior al promedio de todos los pedidos. Si es as, el grupo de filas es retenido; si no, el grupo
de filas es descartado. Finalmente la clusula SELECT produce una fila sumaria por cada grupo,
mostrando el nombre del vendedor y el tamao de pedido medio para cada uno.

7. Modificacin de los datos de la B.D. en SQL


SQL es un lenguaje completo de manipulacin de datos que no solo se utiliza para consultas, sino
tambin para insertar, borrar y actualizar los datos de la base de datos. Las clusulas que emplea
SQL para modificar los datos de una base de datos:
INSERT, que aade nuevas filas de datos a una tabla.
DELETE, que elimina filas de datos de una tabla.
UPDATE, que actualiza (cambia) datos existentes en la base de datos.
27

14748 - Bases de Datos Biblioteconoma. 2003-2004

7.1.

Tema 5: Lenguajes de Consulta. SQL.

Insercin de datos en la base de datos ( INSERT INTO )

En general, podemos aadir nuevas filas de datos a una base de datos de dos formas:
Una sentencia INSERT de una fila que aade una nica nueva fila de datos a una tabla. La
estructura es: INSERT INTO nombre_de_la_tabla(atributos) VALUES (,,) donde la
clusula INTO especifica la tabla que recibe la nueva fila y la clusula VALUE especifica los
valores de datos que la nueva fila contendr.
Una sentencia INSERT multifila, que extrae filas de datos de otra parte de la base y las aade a
una tabla. La estructura es: INSERT INTO nombre_de_la_tabla SELECT FROM . En este
caso, 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
especificada en la sentencia.
Veamos unos ejemplos de cmo realizar esto:
Supongamos que en nuestra base de datos ejemplo, se acaba de contratar a un nuevo vendedor
con los siguientes datos:
Nombre:
Enrique Jordan
Edad:
36
Nmero de empleado:
111
Ttulo:
Director de ventas
Alicante (nmero de oficina 13)
La sentencia INSERT que aade Oficina:
25 de Julio de 2000.
el nuevo vendedor a la base de Fecha de contrato:
Cuota:
An no asignada.
datos es:
Ventas anuales hasta la fecha: 0
INSERT INTO repventas(nombre, edad, num_empl, ventas, titulo, contrato, oficina_rep)
VALUES(Enrique Jordan, 36, 111, 0, Dir. Ventas, 25/07/2000, 13) ;

Quedando la tabla REPVENTAS de la siguiente forma despus de incluir el nuevo empleado:


NUM_EMPL
106
104
105
109
108
102
101
110
103
107
111

NOMBRE
EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS
Jose Maldonado
52
11 VP Ventas 14/06/1998
NULL 25.000
32.958
Carlos Martinez
33
12 Dir. Ventas 19/05/1997
106 17.500
0
Belen Aguirre
37
13 Dir. Ventas 12/02/1998
104 30.000
39.327
Maria Garcia
31
11 Rep. Ventas 12/10/1999
106 27.500
7.105
Lorenzo Fernandez
62
21 Dir. Ventas 12/10/1999
106 30.000
58.533
Soledad Martinez
48
21 Rep. Ventas 10/12/1996
108 30.000
22.776
Daniel Gutierrez
45
12 Rep. Ventas 20/10/1996
104 27.500
26.628
Antonio Valle
41
NULL Rep. Ventas 13/01/2000
101 NULL
23.123
Pedro Cruz
29
12 Rep. Ventas 01/03/1997
104 25.000
2.700
Natalia Martin
49
22 Rep. Ventas 14/11/1998
108 27.500
34.432
Enrique Jordan
36
13 Dir. Ventas 25/07/2000
NULL NULL
0

Supongamos ahora que el nuevo representante recibe su primer pedido, de Corporacion Oeste
S.A., un nuevo cliente que tiene asignado el nmero de cliente 2126. El pedido es de 20 "Articulo
Tipo 4" ACI-41004 por un precio total de 2.340 y le ha sido asignado el nmero de pedido
113069.
Las sentencias INSERT que aaden el nuevo cliente y pedido a la base de datos son:
INSERT INTO clientes(empresa, num_clie, limite_credito, rep_clie)
VALUES (Corporacion Oeste S.A., 2126, 15000, 111) ;
INSERT INTO pedidos(importe, fab, producto, cant, fecha_pedido, num_pedido, clie, rep)
VALUES (2340, ACI, 41004, 20, CURRENT DATE, 113070, 2126, 111) ;

Quedando las tablas de la siguiente forma:


28

14748 - Bases de Datos Biblioteconoma. 2003-2004

La tabla CLIENTES:

La tabla PEDIDOS:

NUM_CLIE
2111
2102
2103
2123
2107
2115
2101
2112
2121
2114
2124
2108
2117
2122
2120
2106
2119
2118
2113
2109
2105
2126
NUM_PEDIDO
112961
113012
112989
113051
112968
110036
113045
112963
113013
113058
112997
112983
113024
113062
112979
113027
113007
113069
113034
112992
112975
113055
113048
112993
113065
113003
113049
112987
113057
113042
113070

Tema 5: Lenguajes de Consulta. SQL.

EMPRESA
REP_CLIE LIMITE_CREDITO
EVBE S.A.
103
50.000
Exclusivas del Este S.L.
101
65.000
Pino S.L.
105
50.000
Hnos. Martinez S.A.
102
40.000
Distribuciones Sur S.A.
110
35.000
AFS S.A.
101
20.000
Exclusivas Soriano S.A.
106
65.000
Lopez Asociados S.L.
108
50.000
Hernandez & hijos S.L.
103
45.000
Componentes Fernandez S.A.
102
20.000
Domingo S.L.
107
40.000
Zapater Importaciones S.A.
109
55.000
Hnos. Ramon S.L.
106
35.000
JPF S.L.
105
30.000
Distribuciones Montiel S.L.
102
50.000
Construcciones Leon S.A.
102
65.000
Martinez & Garcia S.L.
109
25.000
Exclusivas Norte S.A.
108
60.000
Importaciones Martin S.L.
104
20.000
Roda & Castedo S.L.
103
25.000
MALB S.A.
101
45.000
Corporacion Oeste S.A.
111
15.000

FECHA_PEDIDO
17/12/1999
11/01/2000
03/01/2000
10/02/2000
12/10/1999
30/01/2000
02/02/2000
17/12/1999
14/01/2000
23/02/2000
08/01/2000
27/12/1999
20/01/2000
24/02/2000
12/10/1999
22/02/2000
08/01/2000
02/03/2000
29/01/2000
04/11/1999
12/10/1999
15/02/2000
10/02/2000
04/01/2000
27/02/2000
25/01/2000
10/02/2000
31/12/1999
18/02/2000
02/02/2000
22/10/2000

CLIE
2117
2111
2101
2118
2102
2107
2112
2103
2118
2108
2124
2103
2114
2124
2114
2103
2112
2109
2107
2118
2111
2108
2120
2106
2106
2108
2118
2103
2111
2113
2126

REP
106
105
106
108
101
110
108
105
108
109
107
105
108
107
102
105
108
107
110
108
103
101
102
102
102
109
108
105
103
101
111

FAB
REI
ACI
FEA
QSA
ACI
ACI
REI
ACI
BIC
FEA
BIC
ACI
QSA
FEA
ACI
ACI
IMM
IMM
REI
ACI
REI
ACI
IMM
REI
QSA
IMM
QSA
ACI
ACI
REI
ACI

PRODUCTO CANT IMPORTE


2A44L
7
31.500
41003
35
3.745
114
6
1.458
XK47
4
1.420
41004
34
3.978
4100Z
9
22.500
2A44R
10
45.000
41004
28
3.276
41003
1
652
112
10
1.480
41003
1
652
41004
6
702
XK47
20
7.100
114
10
2.430
4100Z
6
15.000
41002
54
4.104
773C
3
2.825
775C
22
31.350
2A45C
8
632
41002
10
760
2A44G
6
2.100
4100X
6
150
779C
2
3.750
2A45C
24
1.896
XK47
6
2.130
779C
3
5.625
XK47
2
776
4100Y
11
27.500
4100X
24
600
2A44R
5
22.500
41004
20
2.340

Conviene resaltar el hecho de que existe una sentencia CURRENT DATE que permite introducir el
da actual sin necesidad de introducirlo como fecha. Adems, SQL automticamente asigna un valor
NULL a cualquier columna cuyo nombre falte de la lista, aunque es posible especificar de forma
explcita que una columna tiene valor NULL. As, cuando hemos introducido el nuevo vendedor
podramos haberlo realizado como:
29

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

INSERT INTO repventas(nombre, edad, num_empl, ventas, titulo, director, cuota, contrato,
oficina_rep) VALUES(Enrique Jordan, 36, 111, 0, Dir. Ventas, NULL, NULL, 25/07/2000, 13) ;

Adems, 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, en
secuencia de izquierda a derecha. Esta es la misma secuencia de columnas generadas por SQL
cuando se utiliza una consulta SELECT *. Utilizando esta forma, la sentencia INSERT anterior
podra escribirse como:
INSERT INTO repventas VALUES(111,Enrique Jordan,36,13,Dir. Ventas,25/07/2000,NULL,NULL,0);

Supongamos que se desea copiar, a partir de la tabla


PEDIDOS, el nmero de pedido, la fecha y el importe
de todos los pedidos remitidos con anterioridad al 1
de Enero de 2000, en otra tabla llamada
ANTPEDIDOS.

NUM_PEDIDO FECHA_PEDIDO IMPORTE


112961
17/12/1999
31.500
112968
12/10/1999
3.978
112963
17/12/1999
3.276
112983
27/12/1999
702
112979
12/10/1999
15.000
112992
04/11/1999
760
112975
12/10/1999
2.100
112987
31/12/1999
27.500

INSERT INTO antpedidos(num_pedido, fecha_pedido,


importe) SELECT num_pedido, fecha_pedido, importe
FROM pedidos WHERE fecha_pedido<01/01/2000 ;

El estndar SQL especifica varias restricciones sobre la consulta que aparece dentro de la sentencia
INSERT multifila:
La consulta no puede contener una clusula ORDER BY.
La consulta no puede ser la UNION de varias sentencias SELECT diferentes.
La tabla destino de la sentencia INSERT no puede aparecer en la clusula FROM de la consulta
o de ninguna subconsulta que sta contenga.
Adems, los resultados de la consulta deben contener el mismo nmero de columnas que la lista de
columnas de la sentencia INSERT (o de la tabla destino entera, si se ha omitido la lista de
columnas), y los tipos de datos deben ser compatibles columna a columna.

7.2.

Borrado de datos de la base de datos ( DELETE FROM )

La unidad ms pequea de datos que puede ser suprimida de una base de datos relacional es una
nica fila. La sentencia DELETE elimina filas seleccionadas de datos de una nica tabla y su
estructura es: DELETE FROM nombre_de_la_tabla WHERE La clusula FROM especifica la
tabla destino que contiene las filas. La clusula WHERE especifica qu filas de la tabla deben a ser
suprimidas.
Supongamos que Corporacion Oeste S.A. (nmero de cliente 2126) decide cancelar todos los
pedidos. Podemos eliminar sus pedidos de la tabla PEDIDOS mediante la sentencia:
DELETE FROM pedidos WHERE clie=2126 ;

Si ahora Enrique Jordan, el nuevo vendedor, decide abandonar la empresa con los clientes que
posee, las sentencias DELETE que eliminan sus clientes y su fila de la tabla REPVENTAS son:
DELETE FROM clientes WHERE rep_clie=111 ;
DELETE FROM repventas WHERE nombre=Enrique Jordan ;
Tabla REPVENTAS despus de eliminar el vendedor Enrique Jordan
NUM_EMPL

106
104
105
109
108
102
101
110
103
107

NOMBRE

Jose Maldonado
Carlos Martinez
Belen Aguirre
Maria Garcia
Lorenzo Fernandez
Soledad Martinez
Daniel Gutierrez
Antonio Valle
Pedro Cruz
Natalia Martin

EDAD OFICINA_REP

52
33
37
31
62
48
45
41
29
49

11
12
13
11
21
21
12
NULL
12
22

TITULO

CONTRATO

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

14/06/1998
19/05/1997
12/02/1998
12/10/1999
12/10/1999
10/12/1996
20/10/1996
13/01/2000
01/03/1997
14/11/1998

DIRECTOR CUOTA VENTAS

NULL
106
104
106
106
108
104
101
104
108

25.000
17.500
30.000
27.500
30.000
30.000
27.500
NULL
25.000
27.500

32.958
0
39.327
7.105
58.533
22.776
26.628
23.123
2.700
34.432
30

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

NUM_PEDIDO FECHA_PEDIDO CLIE REP

La tabla PEDIDOS despus


de eliminar los pedidos del
cliente 2126 quedara:

NUM_CLIE

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

112961
113012
112989
113051
112968
110036
113045
112963
113013
113058
112997
112983
113024
113062
112979
113027
113007
113069
113034
112992
112975
113055
113048
112993
113065
113003
113049
112987
113057
113042

EMPRESA

EVBE S.A.
Exclusivas del Este S.L.
Pino S.L.
Hnos. Martinez S.A.
Distribuciones Sur S.A.
AFS S.A.
Exclusivas Soriano S.A.
Lopez Asociados S.L.
Hernandez & hijos S.L.
Componentes Fernandez S.A.
Domingo S.L.
Zapater Importaciones S.A.
Hnos. Ramon S.L.
JPF S.L.
Distribuciones Montiel S.L.
Construcciones Leon S.A.
Martinez & Garcia S.L.
Exclusivas Norte S.A.
Importaciones Martin S.L.
Roda & Castedo S.L.
MALB S.A.

17/12/1999
11/01/2000
03/01/2000
10/02/2000
12/10/1999
30/01/2000
02/02/2000
17/12/1999
14/01/2000
23/02/2000
08/01/2000
27/12/1999
20/01/2000
24/02/2000
12/10/1999
22/02/2000
08/01/2000
02/03/2000
29/01/2000
04/11/1999
12/10/1999
15/02/2000
10/02/2000
04/01/2000
27/02/2000
25/01/2000
10/02/2000
31/12/1999
18/02/2000
02/02/2000

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

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

FAB

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

PRODUCTO CANT IMPORTE

2A44L
41003
114
XK47
41004
4100Z
2A44R
41004
41003
112
41003
41004
XK47
114
4100Z
41002
773C
775C
2A45C
41002
2A44G
4100X
779C
2A45C
XK47
779C
XK47
4100Y
4100X
2A44R

7
35
6
4
34
9
10
28
1
10
1
6
20
10
6
54
3
22
8
10
6
6
2
24
6
3
2
11
24
5

31.500
3.745
1.458
1.420
3.978
22.500
45.000
3.276
652
1.480
652
702
7.100
2.430
15.000
4.104
2.825
31.350
632
760
2.100
150
3.750
1.896
2.130
5.625
776
27.500
600
22.500

REP_CLIE LIMITE_CREDITO

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

50.000
65.000
50.000
40.000
35.000
20.000
65.000
50.000
45.000
20.000
40.000
55.000
35.000
30.000
50.000
65.000
25.000
60.000
20.000
25.000
45.000

La tabla CLIENTES despus de


eliminar
los
clientes
del
representante 111.

Eliminar los pedidos remitidos antes del 15 de Noviembre de 1999:


La clusula WHERE puede seleccionar varias filas de una tabla SQL y eliminar todas las filas
seleccionadas. La sentencia sera:
DELETE FROM pedidos WHERE fecha_pedido<15/11/1999 ;
31

14748 - Bases de Datos Biblioteconoma. 2003-2004

La tabla pedidos
quedara:

NUM_PEDIDO
112961
113012
112989
113051
110036
113045
112963
113013
113058
112997
112983
113024
113062
113027
113007
113069
113034
113055
113048
112993
113065
113003
113049
112987
113057
113042

FECHA_PEDIDO
17/12/1999
11/01/2000
03/01/2000
10/02/2000
30/01/2000
02/02/2000
17/12/1999
14/01/2000
23/02/2000
08/01/2000
27/12/1999
20/01/2000
24/02/2000
22/02/2000
08/01/2000
02/03/2000
29/01/2000
15/02/2000
10/02/2000
04/01/2000
27/02/2000
25/01/2000
10/02/2000
31/12/1999
18/02/2000
02/02/2000

Tema 5: Lenguajes de Consulta. SQL.


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

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

FAB
REI
ACI
FEA
QSA
ACI
REI
ACI
BIC
FEA
BIC
ACI
QSA
FEA
ACI
IMM
IMM
REI
ACI
IMM
REI
QSA
IMM
QSA
ACI
ACI
REI

PRODUCTO CANT IMPORTE


2A44L
7
31.500
41003
35
3.745
114
6
1.458
XK47
4
1.420
4100Z
9
22.500
2A44R
10
45.000
41004
28
3.276
41003
1
652
112
10
1.480
41003
1
652
41004
6
702
XK47
20
7.100
114
10
2.430
41002
54
4.104
773C
3
2.825
775C
22
31.350
2A45C
8
632
4100X
6
150
779C
2
3.750
2A45C
24
1.896
XK47
6
2.130
779C
3
5.625
XK47
2
776
4100Y
11
27.500
4100X
24
600
2A44R
5
22.500

Eliminar todos los pedidos:


DELETE FROM pedidos ;

La clusula WHERE de la 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
pero, aunque esto 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.
Suprimir todos los pedidos aceptados por Soledad Martinez.
En este caso la seleccin de las filas no se puede hacer en base a una nica tabla sino que debe
efectuarse en base a datos contenidos en otras tablas. Aqu, sin saber el nmero de empleado de
Soledad Martinez no se pueden determinar los pedidos a eliminar consultando nicamente la tabla
PEDIDOS. Entonces, se podra pensar en hallar todos los pedidos utilizando una consulta de dos
tablas como la siguiente:
SELECT num_pedido, importe FROM pedidos, repventas WHERE
rep=num_empl AND nombre=Soledad Martinez ;

NUM_PEDIDO IMPORTE
112979
15.000
113048
3.750
112993
1.896
113065
2.130

Pero no es posible utilizar una composicin en una sentencia DELETE. El modo de manejar esta
peticin es con una de las condiciones de bsqueda subconsulta. Por ejemplo:
DELETE FROM pedidos WHERE rep=(SELECT num_empl FROM repventas WHERE
nombre=Soledad Martinez) ;

Que nos permitira borrar las cuatro filas de pedidos aceptados por Soledad Martinez.
La tabla quedara entonces de la siguiente forma:

32

14748 - Bases de Datos Biblioteconoma. 2003-2004


NUM_PEDIDO
112961
113012
112989
113051
112968
110036
113045
112963
113013
113058
112997
112983
113024
113062
113027
113007
113069
113034
112992
112975
113055
113003
113049
112987
113057
113042
113070

FECHA_PEDIDO
17/12/1999
11/01/2000
03/01/2000
10/02/2000
12/10/1999
30/01/2000
02/02/2000
17/12/1999
14/01/2000
23/02/2000
08/01/2000
27/12/1999
20/01/2000
24/02/2000
22/02/2000
08/01/2000
02/03/2000
29/01/2000
04/11/1999
12/10/1999
15/02/2000
25/01/2000
10/02/2000
31/12/1999
18/02/2000
02/02/2000
22/10/1999

CLIE
2117
2111
2101
2118
2102
2107
2112
2103
2118
2108
2124
2103
2114
2124
2103
2112
2109
2107
2118
2111
2108
2108
2118
2103
2111
2113
2126

Tema 5: Lenguajes de Consulta. SQL.


REP
106
105
106
108
101
110
108
105
108
109
107
105
108
107
105
108
107
110
108
103
101
109
108
105
103
101
111

FAB
REI
ACI
FEA
QSA
ACI
ACI
REI
ACI
BIC
FEA
BIC
ACI
QSA
FEA
ACI
IMM
IMM
REI
ACI
REI
ACI
IMM
QSA
ACI
ACI
REI
ACI

PRODUCTO CANT IMPORTE


2A44L
7
31.500
41003
35
3.745
114
6
1.458
XK47
4
1.420
41004
34
3.978
4100Z
9
22.500
2A44R
10
45.000
41004
28
3.276
41003
1
652
112
10
1.480
41003
1
652
41004
6
702
XK47
20
7.100
114
10
2.430
41002
54
4.104
773C
3
2.825
775C
22
31.350
2A45C
8
632
41002
10
760
2A44G
6
2.100
4100X
6
150
779C
3
5.625
XK47
2
776
4100Y
11
27.500
4100X
24
600
2A44R
5
22.500
41004
20
2.340

Suprimir los clientes atendidos por vendedores cuyas ventas son inferiores al 80% de su cuota.
DELETE FROM clientes WHERE rep_clie IN (SELECT num_empl FROM repventas WHERE
ventas<(0.8*cuota)) ;

Suprimir los vendedores cuyo total de pedidos actual es menor que el 2% de sus cuotas.
DELETE FROM repventas WHERE (0.02*cuota) <(SELECT SUM(importe) FROM pedidos
WHERE rep=num_empl) ;

Suprimir los clientes que no han realizado pedidos desde el 10 de Noviembre de 1999.
DELETE FROM clientes WHERE NOT EXISTS (SELECT * FROM pedidos WHERE clie=num_clie
AND fecha_pedido<10/11/1999) ;

7.3.

Actualizacin de datos de la base de datos ( UPDATE SET )

La unidad ms pequea de datos que puede modificarse en una base de datos es una nica columna
de una nica fila. La sentencia UPDATE modifica los valores de una o ms columnas en las filas
seleccionadas de una nica tabla. La tabla destino a actualizar se indica en la sentencia y la clusula
SET especifica que columnas se van a actualizar y calcula los nuevos valores (pero estos no pueden
ser el resultado de funciones de agregacin ni subconsultas). Adicionalmente podemos introducir la
clusula WHERE para seleccionar un determinado conjunto de filas de la tabla a modificar. La
estructura es: UPDATE nombre_de_la_tabla SET atributo WHERE
Veamos, mediante ejemplos, como acta esta sentencia UPDATE:
Modificar el lmite de crdito que tiene la empresa Pino S.L. y asignarle como vendedor
representante el 109:
UPDATE clientes SET limite_credito=60000, rep_clie=109 WHERE empresa=Pino S.L. ;
33

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

EMPRESA
La tabla CLIENTES quedara NUM_CLIE
2111
EVBE
S.A.
entonces:

Como vemos 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.

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

REP_CLIE LIMITE_CREDITO
103
50.000
Exclusivas del Este S.L.
101
65.000
Pino S.L.
109
60.000
Hnos. Martinez S.A.
102
40.000
Distribuciones Sur S.A.
110
35.000
AFS S.A.
101
20.000
Exclusivas Soriano S.A.
106
65.000
Lopez Asociados S.L.
108
50.000
Hernandez & hijos S.L.
103
45.000
Componentes Fernandez S.A.
102
20.000
Domingo S.L.
107
40.000
Zapater Importaciones S.A.
109
55.000
Hnos. Ramon S.L.
106
35.000
JPF S.L.
105
30.000
Distribuciones Montiel S.L.
102
50.000
Construcciones Leon S.A.
102
65.000
Martinez & Garcia S.L.
109
25.000
Exclusivas Norte S.A.
108
60.000
Importaciones Martin S.L.
104
20.000
Roda & Castedo S.L.
103
25.000
MALB S.A.
101
45.000

Reducir la cuota de los representantes de ventas de la oficina nmero 12 en un 10% y


cambiarles de oficina para que pasen a ser miembros de la oficina 11:
UPDATE repventas SET oficina_rep=11, cuota=0.9*cuota WHERE oficina_rep=12 ;

En este caso, la sentencia UPDATE actualiza varias filas de una vez ya que 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. El resultado de esta accin ser:
NUM_EMPL
106
104
105
109
108
102
101
110
103
107

NOMBRE
EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS
Jose Maldonado
52
11 VP Ventas
14/06/1998
NULL 25.000
32.958
Carlos Martinez
33
11 Dir. Ventas
19/05/1997
106 15.750
0
Belen Aguirre
37
13 Dir. Ventas
12/02/1998
104 30.000
39.327
Maria Garcia
31
11 Rep. Ventas
12/10/1999
106 27.500
7.105
Lorenzo Fernandez
62
21 Dir. Ventas
12/10/1999
106 30.000
58.533
Soledad Martinez
48
21 Rep. Ventas
10/12/1996
108 30.000
22.776
Daniel Gutierrez
45
11 Rep. Ventas
20/10/1996
104 24.750
26.628
Antonio Valle
41
NULL Rep. Ventas
13/01/2000
101 NULL
23.123
Pedro Cruz
29
11 Rep. Ventas
01/03/1997
104 22.500
2.700
Natalia Martin
49
22 Rep. Ventas
14/11/1998
108 27.500
34.432

Asignar una cuota de 30.000 a los vendedores que no tengan asignada ya una cuota:
UPDATE repventas SET cuota=30000 WHERE cuota IS NULL ;

La tabla REPVENTAS, despus de modificarla, quedar de la siguiente forma:


NUM_EMPL
106
104
105
109
108
102
101
110
103
107

NOMBRE
EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS
Jose Maldonado
52
11 VP Ventas
14/06/1998
NULL 25.000
32.958
Carlos Martinez
33
12 Dir. Ventas
19/05/1997
106 17.500
0
Belen Aguirre
37
13 Dir. Ventas
12/02/1998
104 30.000
39.327
Maria Garcia
31
11 Rep. Ventas
12/10/1999
106 27.500
7.105
Lorenzo Fernandez
62
21 Dir. Ventas
12/10/1999
106 30.000
58.533
Soledad Martinez
48
21 Rep. Ventas
10/12/1996
108 30.000
22.776
Daniel Gutierrez
45
12 Rep. Ventas
20/10/1996
104 27.500
26.628
Antonio Valle
41
NULL Rep. Ventas
13/01/2000
101 30.000
23.123
Pedro Cruz
29
12 Rep. Ventas
01/03/1997
104 25.000
2.700
Natalia Martin
49
22 Rep. Ventas
14/11/1998
108 27.500
34.432

34

14748 - Bases de Datos Biblioteconoma. 2003-2004

Ha habido una confusin y


los clientes de los empleados
105, 106 y 107 fueron en
realidad atendidos por el
empleado
nmero
102.
Modificar esta informacin
en la B.D.:
UPDATE clientes SET
rep_clie=102 WHERE rep_clie
IN (105, 106, 107) ;

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

Tema 5: Lenguajes de Consulta. SQL.


EMPRESA
REP_CLIE LIMITE_CREDITO
EVBE S.A.
103
50.000
Exclusivas del Este S.L.
101
65.000
Pino S.L.
102
50.000
Hnos. Martinez S.A.
102
40.000
Distribuciones Sur S.A.
110
35.000
AFS S.A.
101
20.000
Exclusivas Soriano S.A.
102
65.000
Lopez Asociados S.L.
108
50.000
Hernandez & hijos S.L.
103
45.000
Componentes Fernandez S.A.
102
20.000
Domingo S.L.
102
40.000
Zapater Importaciones S.A.
109
55.000
Hnos. Ramon S.L.
102
35.000
JPF S.L.
102
30.000
Distribuciones Montiel S.L.
102
50.000
Construcciones Leon S.A.
102
65.000
Martinez & Garcia S.L.
109
25.000
Exclusivas Norte S.A.
108
60.000
Importaciones Martin S.L.
104
20.000
Roda & Castedo S.L.
103
25.000
MALB S.A.
101
45.000

Actualizar la B.D. para que aquellas oficinas que tenan un objetivo inferior a 40000 pasen a
tenerlo y adems le cambiaremos sus ventas por el valor que tenan antes como objetivo:
UPDATE oficinas SET objetivo=40000, ventas=objetivo WHERE objetivo<40000 ;

Antes de la actualizacin, las oficinas de Toledo y Alicante tenan unos objetivos de 27.500 y
30.000 respectivamente, despus de la actualizacin sus ventas son 27.500 y 30.000
respectivamente y no 40.000. La tabla queda entonces:
Esto es as porque el SQL calcula los valores
de las columnas sobre los datos que hay antes
de aplicar ninguna de las partes de la
modificacin.

OFICINA
22
11
12
13
21

CIUDAD
Toledo
Valencia
Barcelona
Alicante
Madrid

REGION
Centro
Este
Este
Este
Centro

DIR OBJETIVO VENTAS


108
40.000
27.500
106
52.500
40.063
104
70.000
29.328
105
40.000
30.000
108
60.000
81.309

Aumentar la cuota de todos los representantes de ventas en un 5%:


UPDATE repventas SET cuota=1.05*cuota ;
NUM_EMPL
106
104
105
109
108
102
101
110
103
107

NOMBRE
Jose Maldonado
Carlos Martinez
Belen Aguirre
Maria Garcia
Lorenzo Fernandez
Soledad Martinez
Daniel Gutierrez
Antonio Valle
Pedro Cruz
Natalia Martin

EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS


52
11 VP Ventas
14/06/1998
NULL 26.250
32.958
33
12 Dir. Ventas
19/05/1997
106 18.375
0
37
13 Dir. Ventas
12/02/1998
104 31.500
39.327
31
11 Rep. Ventas
12/10/1999
106 28.875
7.105
62
21 Dir. Ventas
12/10/1999
106 31.500
58.533
48
21 Rep. Ventas
10/12/1996
108 31.500
22.776
45
12 Rep. Ventas
20/10/1996
104 28.875
26.628
41
NULL Rep. Ventas
13/01/2000
101 NULL
23.123
29
12 Rep. Ventas
01/03/1997
104 26.250
2.700
49
22 Rep. Ventas
14/11/1998
108 28.875
34.432

Aumentar en 5000 el lmite de crdito de cualquier cliente que haya remitido un pedido de ms
de 25000.
UPDATE clientes SET limite_credito=limite_credito+5000 WHERE num_clie IN (SELECT
DISTINCT clie FROM pedidos WHERE importe>25000) ;

La tabla de CLIENTES quedar entonces de la siguiente forma:


35

14748 - Bases de Datos Biblioteconoma. 2003-2004


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

Tema 5: Lenguajes de Consulta. SQL.

EMPRESA
REP_CLIE LIMITE_CREDITO
EVBE S.A.
103
50.000
Exclusivas del Este S.L.
101
65.000
Pino S.L.
105
55.000
Hnos. Martinez S.A.
102
40.000
Distribuciones Sur S.A.
110
35.000
AFS S.A.
101
20.000
Exclusivas Soriano S.A.
106
65.000
Lopez Asociados S.L.
108
55.000
Hernandez & hijos S.L.
103
45.000
Componentes Fernandez S.A.
102
20.000
Domingo S.L.
107
40.000
Zapater Importaciones S.A.
109
55.000
Hnos. Ramon S.L.
106
40.000
JPF S.L.
105
30.000
Distribuciones Montiel S.L.
102
50.000
Construcciones Leon S.A.
102
65.000
Martinez & Garcia S.L.
109
25.000
Exclusivas Norte S.A.
108
60.000
Importaciones Martin S.L.
104
20.000
Roda & Castedo S.L.
103
30.000
MALB S.A.
101
45.000

Queremos asignar todos los clientes, atendidos por los vendedores cuyas ventas son menores al
80% de sus cuotas, al NUM_CLIE
EMPRESA
REP_CLIE LIMITE_CREDITO
vendedor nmero 105:
2111
EVBE S.A.
105
50.000

UPDATE clientes SET


rep_clie=105 WHERE rep_clie
IN (SELECT num_empl FROM
repventas WHERE
ventas<(0.8*cuota) ;

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

Exclusivas del Este S.L.


Pino S.L.
Hnos. Martinez S.A.
Distribuciones Sur S.A.
AFS S.A.
Exclusivas Soriano S.A.
Lopez Asociados S.L.
Hernandez & hijos S.L.
Componentes Fernandez S.A.
Domingo S.L.
Zapater Importaciones S.A.
Hnos. Ramon S.L.
JPF S.L.
Distribuciones Montiel S.L.
Construcciones Leon S.A.
Martinez & Garcia S.L.
Exclusivas Norte S.A.
Importaciones Martin S.L.
Roda & Castedo S.L.
MALB S.A.

101
105
105
110
101
106
108
105
105
107
105
106
105
105
105
105
108
105
105
101

65.000
50.000
40.000
35.000
20.000
65.000
50.000
45.000
20.000
40.000
55.000
35.000
30.000
50.000
65.000
25.000
60.000
20.000
25.000
45.000

8. Creacin de la base de datos en SQL (LDD)


Hasta el momento hemos visto la parte del SQL referente al LMD. Veamos ahora cmo podemos
actuar sobre la propia estructura de la BD. Estos cambios son manejados por un conjunto de
sentencias SQL denominadas como lenguaje de definicin de datos. Estas sentencias permiten:
Definir y crear una nueva tabla.
Suprimir una tabla que ya no se necesita.
Cambiar la definicin de una tabla existente.
Definir una tabla virtual (o vista) de datos.
Establecer controles de seguridad para una base de datos. (Este parte no la veremos).
36

14748 - Bases de Datos Biblioteconoma. 2003-2004

8.1.

Tema 5: Lenguajes de Consulta. SQL.

Creacin de tablas en una base de datos ( CREATE TABLE )

La creacin de una tabla de la base de datos se realiza con la sentencia CREATE TABLE en la que
indicaremos cul es el esquema de la relacin, definiremos el dominio de los valores asociados a
cada atributo y le especificaremos las ligaduras de integridad que deben cumplir. Normalmente,
tambin se aaden los ndices que deben ser mantenidos en cada relacin as como informacin a
cerca de la seguridad y autorizacin de cada relacin, y la estructura de almacenamiento fsico en
disco, pero esta parte excede al nivel de este curso por lo que no la vamos a incluir.
Para ver las posibilidades que tenemos al crear una nueva tabla dividiremos el proceso en 3 partes:
1. Definicin de las columnas.
2. Definicin de la clave primaria y las claves ajenas (si las hay).
3. Especificar restricciones de los datos.

Definicin de las columnas


Despus de escribir la clusula CREATE TABLE nombre_de_la_tabla () y situado entre los
parntesis, debemos especificar las columnas que tendr la tabla (indicando su nombre y
caractersticas) y separadas por comas. El orden en que definamos las columnas nos va a determinar
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 las 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 dominio de los datos de la columna, que determina la clase de datos que la columna
almacena. (Son los especificados en el pto. 2 de este tema).
Si la columna no puede contener datos nulos, la clusula NOT NULL impide que aparezcan
valores NULL en la columna, en caso contrario se permiten los valores nulos en la columna.
Con esto, algunas sentencias de ejemplo (aunque incompletas) seran:
CREATE TABLE oficinas (oficina INTEGER NOT NULL, ciudad VARCHAR(15) NOT NULL, region
VARCHAR(10) NOT NULL, objetivo INTEGER, ventas INTEGER NOT NULL);
CREATE TABLE pedidos (num_pedido INTEGER NOT NULL, fecha_pedido DATE NOT NULL,
clie INTEGER NOT NULL, rep INTEGER, fab CHAR(3) NOT NULL, producto CHAR(5) NOT
NULL, cant INTEGER NOT NULL, importe INTEGER NOT NULL);

Definicin de la clave primaria y las claves ajenas


Adems de la definicin de las columnas de una tabla, debemos especificar cual o cuales forman la
clave primaria y si hay alguna que sea clave ajena, deberemos decir que columnas son y de que
tabla son clave primaria. Para esto usaremos las clusulas PRIMARY KEY y FOREING KEY.
Hay que tener en cuenta que, si especificamos que una columa es clave primaria, mediante la
clusula PRIMARY KEY, deberemos asegurar tambin que el valor de dicha columna sea nico y
que exista, por lo que deberemos haber especificado que la columna es NOT NULL. Veamos un
ejemplo:
CREATE TABLE pedidos (num_pedido INTEGER NOT NULL, fecha_pedido DATE NOT NULL,
clie INTEGER NOT NULL, rep INTEGER, fab CHAR(3) NOT NULL, producto CHAR(5) NOT
NULL, cant INTEGER NOT NULL, importe INTEGER NOT NULL, PRIMARY KEY (num_pedido),
FOREING KEY (clie) REFERENCES clients, FOREING KEY (rep) REFERENCES repventas,
FOREING KEY (fab, producto) REFERENCES productos);
37

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Cuando el gestor de la base de datos procesa la sentencia CREATE TABLE, compara cada
definicin de clave ajena con la definicin de la tabla a la que referencia, asegurndose que la clave
ajena y la clave primaria de la tabla referenciada concuerden 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. Si dos o ms tablas se referencian mutuamente, no se puede
definir la clave ajena de la tabla que se cree en primer lugar, ya que la tabla referenciada todava no
existe. En su lugar debe crearse la tabla sin definicin de clave ajena y aadirle la clave ajena
posteriormente utilizando la sentencia ALTER TABLE para modificar la estructura de la tabla.

Especificacin de restricciones de los datos


Adicionalmente, podemos aadir a nuestras columnas que los datos que contengan se encuentren
dentro de un rango establecido, o que pertenenzcan a un conjunto determinado, etc. Esto se realiza
aadiendo a la sentencia CREATE TABLE una clusula CHECK sobre la columna o columnas en
cuestin, indicando qu condicin sobre los datos se debe cumplir para poder despus insertar una
tupla en dicha tabla.
Supongamos que en la tabla de pedidos no permitiramos una cantidad de producto igual a cero,
entonces la sentencia para la creacin de la tabla sera:
CREATE TABLE pedidos (num_pedido INTEGER NOT NULL, fecha_pedido DATE NOT NULL,
clie INTEGER NOT NULL, rep INTEGER, fab CHAR(3) NOT NULL, producto CHAR(5) NOT
NULL, cant INTEGER NOT NULL, importe INTEGER NOT NULL, PRIMARY KEY (num_pedido),
FOREING KEY (clie) REFERENCES clients, FOREING KEY (rep) REFERENCES repventas,
FOREING KEY (fab, producto) REFERENCES productos, CHECK ( cant >0 ));

Como ejemplo adicional a la creacin de tablas, aunque no est relacionado con nuestra base de
datos de ejemplo, supongamos que queremos crear una tabla LIBRO para almacenar informacin
referente a los libros en una BD. Pongmonos en el caso en que existe un atributo que es el cdigo
de la editorial y que es clave ajena de una tabla llamada EDITORIAL, y supongamos que cabe la
posibilidad de que, si la editorial es una universidad, existe otro atributo el cdigo de universidad
que nos referenciara a la clave primaria de una tabla llamada UNIVERS. Supongamos adems, que
nos informan de que existe una exclusividad en la edicin de un libro por parte de una editorial o de
una universidad. Esta restriccin debe tenerse en cuenta a la hora de crear la tabla y para ello
usaremos la clusula CHECK. La forma de expresarlo sera:
CRATE TABLE libro ( Cod_libro CHAR(10), Titulo VARCHAR(100), Tipo_encuadernacion
VARCHAR(15), Cod_editorial CHAR(20), Cod_univers CHAR(20), PRIMARY KEY(Cod_libro),
FOREIGN KEY (Cod_editorial) REFERENCES Editorial, FOREIGN KEY (Cod_univers)
REFERENCES Univers, CHECK ( (Cod_editorial IS NULL AND Cod_univers IS NOT NULL) OR
(Cod_univers IS NULL AND Cod_editorial IS NOT NULL) );

Adicionalmente podramos aadir otros tipos de comprobaciones como por ejemplo, comprobar que
el tipo de encuadernacin del libro solo puede ser o normal o de bolsillo o rstica. Esto se hara
incluyendo en la tabla LIBRO la siguiente condicin: CHECK(Tipo_encuadernacion IN (normal,
de bolsillo, rustica)).

8.2.

Eliminacin de tablas de una base de datos ( DROP TABLE )

La eliminacin de una tabla de la base de datos se realiza con la sentencia DROP TABLE en la que
indicaremos el nombre de la tabla que deseamos quitar. Cuando se ejecuta una sentencia DROP
TABLE se borra la estructura de la tabla y todo su contenido.
Por ejemplo, eliminar la tabla clientes de la B.D.: DROP TABLE clientes;
38

14748 - Bases de Datos Biblioteconoma. 2003-2004

8.3.

Tema 5: Lenguajes de Consulta. SQL.

Modificacin de la definicin de una tabla ( ALTER TABLE )

La sentencia ALTER TABLE sirve para modificar la estructura, ya definida, de una tabla de la base
de datos. Se va a poder aadir nuevos atributos (columnas) a la tabla as como eliminarlos o
cambiar las restricciones de la tabla o aadirle ms. La estructura es:
ALTER TABLE nombre_de_la_tabla accion_a_llevar_a_cabo
Las acciones que podemos realizar sobre la tabla, ilustradas con ejemplos, son:

Aadir una columna


Para aadir una columna a nuestra tabla escribiremos, detrs del nombre de la tabla, la clusula
ADD seguida de la definicin de esa columna (usando las mismas caractersticas que para crear
tablas). Por ejemplo:
Aadir un nombre y un telfono de contacto a la tabla CLIENTES.
ALTER TABLE clientes ADD (nombre_contacto VARCHAR(30) , telefono_contacto CHAR(9));

Aadir una columna inventario mnimo a la tabla PRODUCTOS.


ALTER TABLE productos ADD cant_min INTEGER NOT NULL ;

Suprimir de una columna


Para eliminar una columna a nuestra tabla escribiremos, detrs del nombre de la tabla, la clusula
DROP seguida del nombre de la columna a eliminar. Por ejemplo:
Eliminar el nombre de contacto a la tabla CLIENTES.
ALTER TABLE clientes DROP nombre_contacto ;

Hay que tener en cuenta que esto podremos hacerlo as solo si se trata de una columna que no es
clave primaria.

9. Vistas en SQL (LDD)


En el caso del SQL, el sistema cuenta con dos mecanismos diferentes implicados en el
mantenimiento de la seguridad: el sistema de gestin de vistas, y el subsistema de autorizacin que
nos permitan asignar a los usuarios permisos de acceso a tablas y vistas de la base de datos. Como
ya se ha comentado anteriormente, nosotros slo veremos por encima el caso de las vistas.
En SQL, 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.
Las vistas proporcionan una variedad de beneficios, pudiendo resaltarse los siguientes:
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.
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.
39

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Simplicidad estructurada. Las vistas pueden dar a un usuario una visin "personalizada" de la
estructura que tiene la base de datos presentando est como un conjunto de tablas virtuales que
tienen sentido para ese usuario.
Aislamiento frente al cambio. Una vista representa una imagen consistente inalterada de la base
de datos, incluso si las tablas originales se dividen, reestructuran o cambian de nombre.
Integridad de datos. Si los datos se acceden y se introducen a travs de una vista, el gestor de la
base de datos puede comprobar automticamente los datos para asegurarse que satisfacen
restricciones de integridad especficas.

Sin embargo, las vistas presentan tambin una serie de desventajas al utilizarlas en lugar de una
tabla real. Estas desventajas son:
Rendimiento. Las vistas crean la apariencia de una tabla, pero el gestor de la base de datos debe
traducir las consultas con respecto a la vista en consultas con respecto a las tablas fuente
originales.
Restricciones de actualizacin. Cuando un usuario trata de actualizar filas de una vista, el
gestor de la base de datos debe traducir la peticin a una actualizacin sobre las filas de las
tablas fuente. Esto es posible para vistas sencillas, pero vistas complejas no pueden ser
actualizadas, son "de solo lectura".
Para crear una vista en SQL usaremos la sentencia:
CREATE VIEW nombre_de_la_tabla AS consulta ;
Opcionalmente se puede dar un nombre a cada columna de la vista recin creada pero, si se
especifica una lista de nombres de columnas, deben tener el mismo nmero de elementos que el
nmero de columnas producido por la consulta.
Y para borrar una vista usaremos la sentencia:
DROP VIEW nombre_de_la_tabla ;
Veamos algunos ejemplos de creacin de vistas:
Queremos que un director de ventas vea solamente las filas de la tabla REPVENTAS
correspondientes a los vendedores de la regin del director.
Para lograr esto se pueden definir dos vistas de forma que permita a cada director ver tan solo los
vendedores de su regin. Vamos a crear la vista con los vendedores de la zona Este y despus la
vista los vendedores de la zona Centro.
CREATE VIEW repeste AS SELECT * FROM repventas WHERE oficina_rep IN (11, 12, 13) ;
NUM_EMPL

106
104
105
109
101
103

NOMBRE

EDAD OFICINA_REP

Jose Maldonado
Carlos Martinez
Belen Aguirre
Maria Garcia
Daniel Gutierrez
Pedro Cruz

52
33
37
31
45
29

11
12
13
11
12
12

TITULO

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

CONTRATO DIRECTOR CUOTA VENTAS

14/06/1998
19/05/1997
12/02/1998
12/10/1999
20/10/1996
01/03/1997

NULL
106
104
106
104
104

25.000
17.500
30.000
27.500
27.500
25.000

32.958
0
39.327
7.105
26.628
2.700

CREATE VIEW repcentro AS SELECT * FROM repventas WHERE oficina_rep IN (21, 22) ;
NUM_EMPL

108
102
107

NOMBRE

EDAD OFICINA_REP

Lorenzo Fernandez 62
Soledad Martinez 48
Natalia Martin
49

TITULO

21 Dir. Ventas
21 Rep. Ventas
22 Rep. Ventas

CONTRATO DIRECTOR CUOTA VENTAS

12/10/1999
10/12/1996
14/11/1998

106
108
108

30.000
30.000
27.500

58.533
22.776
34.432

Creacin de una vista que contiene nicamente las oficinas de la regin Este:
40

14748 - Bases de Datos Biblioteconoma. 2003-2004

CREATE VIEW oficinaeste AS SELECT


* FROM oficinas WHERE region='Este' ;

Tema 5: Lenguajes de Consulta. SQL.

OFICINA
11
12
13

CIUDAD
Valencia
Barcelona
Alicante

REGION DIR OBJETIVO VENTAS


Este
106
52.500
40.063
Este
104
70.000
29.328
Este
105
30.000
39.327

Creacin de una vista para Soledad Martinez (empleada 102) que contiene solamente los
pedidos remitidos por clientes asignados a ella.
CREATE VIEW pedidossoledad AS SELECT * FROM pedidos WHERE clie IN (SELECT num_clie
FROM clientes WHERE rep_clie=102) ;
NUM_PEDIDO
113024
112979
113048
112993
113065

FECHA_PEDIDO
20/01/2000
12/10/1999
10/02/2000
04/01/2000
27/02/2000

CLIE
2114
2114
2120
2106
2106

REP
108
102
102
102
102

FAB
QSA
ACI
IMM
REI
QSA

PRODUCTO CANT IMPORTE


XK47
20
7.100
4100Z
6
15.000
779C
2
3.750
2A45C
24
1.896
XK47
6
2.130

Creacin de una vista que muestra aquellos clientes que tiene ms de 30.000 en pedidos.
CREATE VIEW clientesvip AS SELECT * FROM clientes WHERE 30000<(SELECT SUM(importe)
FROM pedidos WHERE clie=num_clie) ;
NUM_CLIE
2117
2112
2103
2109

EMPRESA
REP_CLIE LIMITE_CREDITO
Hnos. Ramon S.L.
106
35.000
Lopez Asociados S.L.
108
50.000
Pino S.L.
105
50.000
Roda & Castedo S.L.
103
25.000

Hacer que el departamento de procesamiento de

pedidos solo pueda acceder al nmero de


empleado, su nombre y la asignacin de oficina
de cada vendedor, pues es informacin
necesaria para procesar correctamente el
pedido, pero no hay necesidad de que acceda al
total de ventas realizadas o a la cuota.
CREATE VIEW inforep AS SELECT num_empl,
nombre, oficina_rep FROM repventas ;

NUM_EMPL
106
104
105
109
108
102
101
110
103
107

Creacin una vista de la tabla OFICINAS.


CREATE VIEW infooficina AS SELECT oficina, ciudad, region
FROM oficinas ;
EMPRESA
REP_CLIE
EVBE S.A.
103
Exclusivas del Este S.L.
101
Pino S.L.
105
Hermanos Martinez S.A.
102
Distribuciones Sur S.A.
110
AFS S.A.
101
Exclusivas Soriano S.A.
106
Lopez Asociados S.L.
108
Hernandez & hijos S.L.
103
Componentes Fernandez S.A.
102
Domingo S.L.
107
Zapater Importaciones S.A.
109
Hnos. Ramon S.L.
106
JPF S.L.
105
Distribuciones Montiel S.L.
102
Construcciones Leon S.A.
102
Martinez & Garcia S.L.
109
Exclusivas Norte S.A.
108
Ian & Shmidt
104
Roda & Castedo S.L.
103
MALB S.A.
101

NOMBRE
OFICINA_REP
Jose Maldonado
11
Carlos Martinez
12
Belen Aguirre
13
Maria Garcia
11
Lorenzo Fernandez
21
Soledad Martinez
21
Daniel Gutierrez
12
Antonio Valle
NULL
Pedro Cruz
12
Natalia Martin
22
OFICINA
22
11
12
13
21

CIUDAD
Toledo
Valencia
Barcelona
Alicante
Madrid

REGION
Centro
Este
Este
Este
Centro

Creacin de una vista de la tabla CLIENTES.


CREATE VIEW infoclie AS SELECT empresa, rep_clie FROM
clientes ;

41

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Creacin de una vista que contiene el nmero de cliente, el nombre de la empresa y el limite de
crdito para los clientes de Belen Aguirre (empleado nmero 105).
CREATE VIEW cliebill AS SELECT num_clie,
empresa, limite_credito FROM clientes WHERE
rep_clie=105 ;

Creacin de una vista que contiene datos


sumarios de los pedidos 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 ;
NOMBRE
Lorenzo Fernandez
Belen Aguirre
Natalia Martin
Jose Maldonado
Daniel Gutierrez
Antonio Valle
Soledad Martinez
Maria Garcia
Pedro Cruz

CUANTOS TOTAL MEDIO


7
58.633 8.376,14
5
39.327 7.865,40
3
34.432 11.477,33
2
32.958 16.479,00
3
26.628 8.876,00
2
23.132 11.566,00
4
22.776 5.694,00
2
7.105 3.552,50
2
2.700 1.350,00

NUM_CLIE EMPRESA LIMITE_CREDITO


2103
Pino S.L.
50.000
2122
JPF S.L.
30.000

QUIEN CUANTOS TOTAL INF SUP MEDIO


106
2 32.958 1.458 31.500 16.479,00
105
5 39.327 702 27.500 7.865,40
108
7 58.633 652 45.000 8.376,14
101
3 26.628 150 22.500 8.876,00
110
2 23.132 632 22.500 11.566,00
109
2
7.105 1.480 5.625 3.552,50
107
3 34.432 652 31.350 11.477,33
102
4 22.776 1.896 15.000 5.694,00
103
2
2.700 600 2.100 1.350,00

Datos sumarios de los vendedores obtenidos a


partir de la vista PED_POR_REP.
SELECT nombre, cuantos, total, medio FROM
repventas, ped_por_rep WHERE quien=num_empl
ORDER BY total DESC ;

Creacin de una vista de la tabla PEDIDOS con nombres en vez de cdigos.

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 ;

NUM_PEDIDO
112961
113012
112989
113051
112968
110036
113045
112963
113013
113058
112997
112983
113024
113062
112979
113027
113007
113069
113034
112992
112975
113055
113048
112993
113065
113003
113049
112987
113057
113042

EMPRESA
Hnos. Ramon S.L.
EVBE S.A.
Exclusivas Soriano S.A.
Exclusivas Norte S.A.
Exclusivas del Este S.L.
Distribuciones Sur S.A.
Lopez Asociados S.L.
Pino S.L.
Exclusivas Norte S.A.
Zapater Importaciones S.A.
Domingo S.L.
Pino S.L.
Componentes Fernandez S.A.
Domingo S.L.
Componentes Fernandez S.A.
Pino S.L.
Lopez Asociados S.L.
Roda & Castedo S.L.
Distribuciones Sur S.A.
Exclusivas Norte S.A.
EVBE S.A.
Zapater Importaciones S.A.
Distribuciones Montiel S.L.
Construcciones Leon S.A.
Construcciones Leon S.A.
Zapater Importaciones S.A.
Exclusivas Norte S.A.
Pino S.L.
EVBE S.A.
Importaciones Martin S.L.

NOMBRE_REP IMPORTE
Jose Maldonado
31.500
Belen Aguirre
3.745
Jose Maldonado
1.458
Lorenzo Fernandez
1.420
Daniel Gutierrez
3.978
Antonio Valle
22.500
Lorenzo Fernandez
45.000
Belen Aguirre
3.276
Lorenzo Fernandez
652
Maria Garcia
1.480
Natalia Martin
652
Belen Aguirre
702
Lorenzo Fernandez
7.100
Natalia Martin
2.430
Soledad Martinez
15.000
Belen Aguirre
4.104
Lorenzo Fernandez
2.825
Natalia Martin
31.350
Antonio Valle
632
Lorenzo Fernandez
760
Pedro Cruz
2.100
Daniel Gutierrez
150
Soledad Martinez
3.750
Soledad Martinez
1.896
Soledad Martinez
2.130
Maria Garcia
5.625
Lorenzo Fernandez
776
Belen Aguirre
27.500
Pedro Cruz
600
Daniel Gutierrez
22.500

42

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Mayores pedidos realizados, ordenados


EMPRESA
por importe.
Lopez Asociados S.L.
SELECT empresa, importe, nombre_rep
FROM info_pedido WHERE importe>20000
ORDER BY importe DESC ;

IMPORTE
45.000
Hnos. Ramon S.L.
31.500
Roda & Castedo S.L.
31.350
Pino S.L.
27.500
Distribuciones Sur S.A.
22.500
Importaciones Martin S.L.
22.500

NOMBRE_REP
Lorenzo Fernandez
Jose Maldonado
Natalia Martin
Belen Aguirre
Antonio Valle
Daniel Gutierrez

La vista hace mucho ms fcil de examinar lo que sucede en la consulta que si fuera expresada
como la composicin equivalente de tres tablas.

10. Ejercicio propuesto de consultas en SQL


Dado el siguiente diagrama de una base de datos y las relaciones mostradas a continuacin:
OFICINAS
DPTOFICINAS
codigo
oficina
departamento
telefono

oficina
ciudad
region

DEPARTAMENTOS
EMPLEADOS
num
nombre
edad
departamento
categoria
contrato

deptno
nombre
CATEGORIAS
categoria
titulo
salario
trienio

DPTOFICINAS
CODIGO OFICINA
100
11
101
11
102
11
103
11
104
11
105
12
106
12
107
12
108
13
109
21
110
21
111
21
112
22

EMPLEADOS
NUM
NOMBRE
EDAD DEPARTAMENTOCATEGORACONTRATO
1000 Antonio Gutierrez 45
100
1
12/01/1989
1001 Paloma Blanco
56
100
2
17/03/1992
1002 Antonio Pazos
52
100
3
14/03/1986
1003 Ana Garcia
27
101
2
23/10/1995
1004 Amparo Beltran 28
101
3
04/02/1998
1005 Enrique Gomez 36
101
3
05/07/2000
1006 Nieves Soler
25
105
2
13/03/1996
1007 Juan Jose Velasco 34
105
3
14/02/1997
1008 Isidro Perez
22
109
2
06/05/2000
1009 Ignacio Lopez
38
109
3
07/04/1990
1010 Vicente Salvador 29
109
3
08/07/1995
1011 Carmen Hernandez44
102
2
16/07/1990
1012 Juan Pons
50
102
4
14/04/1994
1013 Pedro Fernandez 23
102
4
16/09/1999
1014 Silvia Blasco
33
102
4
23/02/1992
1015 Jose Alegre
26
106
2
26/08/1997
1016 Cristina Prats
46
106
4
18/11/1984
1017 Carlos Gimenez 35
106
4
15/05/1995
1018 Maria Gonzalez 37
108
4
16/06/1996
1019 Manuel Torres
24
108
4
19/01/1998
1020 Jose Perez
28
110
2
22/03/1996
1021 Alejandro Martos 34
110
4
17/10/1994
1022 Veronica Muelas 25
110
4
05/07/1997
1023 Elena Lopez
29
112
4
09/07/1994
1024 Isabel Fernandez 22
112
4
12/10/2000
1025 Jose Mujica
49
103
2
04/09/1987
1026 Pedro Bledos
26
103
5
06/02/1998
1027 Pablo Costas
35
107
5
03/07/1995
1028 Ester Castro
27
111
2
18/07/1996
1029 Gregorio Mas
33
111
5
14/03/1997
1030 Jose Medina
34
104
2
14/06/1995
1031 Maria Utrillas
27
104
3
19/08/1997
1032 Marina Gilabert 24
104
3
01/12/1998

DEPARTAMENTO
1
2
3
4
5
2
3
4
3
2
3
4
3

TELEFONO
963.981.000
963.981.100
963.981.200
963.981.300
963.981.400
933.551.000
933.551.100
933.551.200
961.671.000
913.641.000
913.641.100
913.641.200
925.871.000

DEPARTAMENTOS
DEPTNO NOMBRE
1
Direccin
2
Administracin
3
Comercial
4
Almacn
5
Informtica

OFICINAS
OFICINA CIUDAD
11
Valencia
12
Barcelona
13
Alicante
21
Madrid
22
Toledo

CATEGORAS
CATEGORIA TITULO
1
Director
2
Jefe Seccin
3
Administrativo
4
Comercial
5
Empl. almacn

SALARIO
50.000
40.000
35.000
35.000
25.000

REGION
Este
Este
Este
Centro
Centro

TRIENIO
1.000
800
700
700
500

43

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Realizar las siguientes consultas en SQL:


1) Nombre y edad de los empleados.
2) Salario y trienios de cada categora si suponemos un aumento del 2%.
3) Fecha de contratacin de cada empleado.
4) Edades de los empleados.
5) Nmero de empleados que hay para cada una de las edades.
6) Edad media de los empleados por departamento.
7) Categoras profesionales que superan las 35.000 de salario.
8) Datos del empleado nmero 1014.
9) Empleados del departamento 106.
10) Empleados cuya contratacin se produjo en el ao 2000.
11) Empleados que no sean comerciales (cdigo de categora 4).
12) Empleados contratados entre los aos 1990 y 1994.
13) Categoras que tienen un salario inferior a 35.000 o superior a 40.000.
14) Empleados cuya categora es director o jefe de seccin (cdigos 1 y 2).
15) Empleados de nombre 'Jose'.
16) Empleados que pertenecen a la categora de administrativo (cdigo 3) y que tienen una edad
mayor de 35 aos.
17) Empleados que no pertenecen al departamento 110.
18) Nombre y edad de los empleados ordenados de menor a mayor edad.
19) Nombre y edad de los empleados ordenados por nombre de forma descendente.
20) Nombre del empleado y de la categora en el que trabaja.
21) Cdigo y telfonos de los departamentos de las oficinas de la regin 'Centro'.
22) Nombre del empleado y ciudad en la que trabaja.
23) Sueldo de cada empleado incluyendo trienios.
24) Nombre de los empleados y de sus jefes de seccin.
25) Suma del sueldo de los empleados, sin contar trienios.
26) Promedio del sueldo, sin contar trienios, de la oficina de 'Barcelona'.
27) Salarios mximo y mnimo de los empleados, incluyendo trienios(#).
28) Nmero de empleados que superan los 40 aos.
29) Nmero de edades diferentes que tienen los empleados.
30) Categora y suma de los sueldos de los empleados, contando trienios, de cada una de las
categoras.
31) Nombre y suma de los sueldos de los empleados, sin contar trienios, de cada oficina.
32) Titulo y suma de trienios de las categoras cuya suma supera las 10000
33) Nombre del departamento y nmero de empleados de los departamentos que tienen ms de 5
empleados.
34) Nombre y sueldo, sin contar trienios, de los empleados cuyos sueldos son inferiores a la
media de sueldos de la empresa.
35) Ttulo de las categoras donde existe un empleado con contrato anterior a 1990.
36) Nombre de los empleados que tiene un contrato ms antiguo que cualquier empleado del
departamento de 'Informtica'.
37) Ciudad y nmero de empleados de la oficina que tiene un nmero de empleados superior a la
media de la empresa.
38) Ao de contratacin de cada empleado.
39) Crear la tabla de empleados y de categoras suponiendo que todo empleado tiene un sueldo
superior a 5.000 ptas.
40) Aadirle a la tabla de empleados una nueva columna que sea la direccin del empleado.

(#)

El dinero recibido por los trienios se calcula en base a la frmula:


trienio*((fecha_actual-fecha_del_contrato)/(365*3))
44

14748 - Bases de Datos Biblioteconoma.

Solucin del ejercicio del Tema 5: Lenguajes de Consulta. SQL.

1) Nombre y edad de los empleados.


SELECT nombre, edad FROM empleados;
2) Salario y trienios de cada categora si suponemos un aumento del 2%.
SELECT categoria,1.02*salario,1.02*trienio FROM categoras;
3) Fecha de contratacin de cada empleado.
SELECT nombre, YEAR(contrato) FROM empleados;
4) Edades de los empleados.
SELECT DISTINCT edad FROM empleados;
5) Nmero de empleados que hay para cada una de las edades.
SELECT edad, COUNT(edad) FROM empleados GROUP BY edad; /* puede ser count(*) */
6) Edad media de los empleados por departamento.
SELECT departamento, AVG(edad) FROM empleados GROUP BY departamento;
7) Categoras profesionales que superan las 35.000 de salario.
SELECT * FROM categorias WHERE salario>35000;
8) Datos del empleado nmero 1014.
SELECT * FROM empleados WHERE num=1014;
9) Empleados del departamento 106.
SELECT * FROM empleados WHERE departamento=106;
10) Empleados cuya contratacin se produjo en el ao 2000.
SELECT * FROM empleados WHERE contrato>='01/01/2000' AND contrato<'31/12/2000';
11) Empleados que no sean comerciales (cdigo de categora 4).
SELECT * FROM empleados WHERE categoria<>4;
12) Empleados contratados entre los aos 1990 y 1994.
SELECT * FROM empleados WHERE contrato BETWEEN '01/01/1990' AND '31/12/1994';
13) Categoras que tienen un salario inferior a 35.000 o superior a 40.000.
SELECT * FROM categorias WHERE salario NOT BETWEEN 35000 AND 40000;
14) Empleados cuya categora es director o jefe de seccin (cdigos 1 y 2).
SELECT * FROM empleados WHERE categoria IN (1,2);
15) Empleados de nombre 'Jose'.
SELECT * FROM empleados WHERE nombre LIKE 'Jose %';
16) Empleados que pertenecen a la categora de administrativo (cdigo 3) y que tienen una edad mayor
de 35 aos.
SELECT * FROM empleados WHERE categoria=3 AND edad>35;
17) Empleados que no pertenecen al departamento 110.
SELECT * FROM empleados WHERE NOT departamento=110;
18) Nombre y edad de los empleados ordenados de menor a mayor edad.
SELECT nombre, edad FROM empleados ORDER BY edad; /* puede ponerse ASC */
19) Nombre y edad de los empleados ordenados por nombre de forma descendente.
SELECT nombre, edad FROM empleados ORDER BY nombre DESC;
20) Nombre del empleado y de la categora en la que trabaja.
SELECT nombre, titulo FROM empleados, categorias
WHERE empleados.categoria=categorias.categora;

14748 - Bases de Datos Biblioteconoma.

Solucin del ejercicio del Tema 5: Lenguajes de Consulta. SQL.

21) Cdigo y telfonos de los departamentos de las oficinas de la regin 'Centro'.


SELECT codigo, telefono FROM dptoficinas, oficinas
WHERE dptoficinas.oficina=oficinas.oficina AND region='Centro';
22) Nombre del empleado y ciudad en la que trabaja.
SELECT nombre, ciudad FROM empleados, dptoficinas, oficinas
WHERE empleados.departamento=codigo AND dptoficinas.oficina=oficinas.oficina;
23) Sueldo de cada empleado incluyendo trienios.
SELECT nombre, salario+trienio*((CURRENT DATE-contrato)/(365*3))
FROM empleados, categorias WHERE empleados.categoria=categorias.categora;
24) Nombre de los empleados y de sus jefes de seccin.
SELECT empl.nombre, jefe.nombre FROM empleados AS empl, empleados AS jefe
WHERE empl.departamento=jefe.departamento AND jefe.categoria=2 AND
empl.nombre<>jefe.nombre;
25) Suma del sueldo de los empleados, sin contar trienios.
SELECT SUM(salario) FROM empleados, categorias
WHERE empleados.categoria=categorias.categora;
26) Promedio del sueldo, sin contar trienios, de la oficina de 'Barcelona'.
SELECT AVG(salario) FROM empleados, categorias, dptoficinas, oficinas
WHERE empleados.categoria=categorias.categoria AND empleados.departamento=codigo
AND dptoficinas.oficina=oficinas.oficina AND ciudad='Barcelona';
27) Salarios mximo y mnimo de los empleados, incluyendo trienios.
SELECT MAX(salario+trienio*((CURRENT DATE-contrato)/(365*3))),
MIN(salario+trienio*((CURRENT DATE-contrato)/(365*3)))
FROM empleados, categorias WHERE empleados.categoria=categorias.categora;
28) Nmero de empleados que superan los 40 aos.
SELECT COUNT(*) FROM empleados WHERE edad>40;
29) Nmero de edades diferentes que tienen los empleados.
SELECT COUNT(DISTINCT edad) FROM empleados;
30) Categora y suma de los sueldos de los empleados, contando trienios, de cada una de las categoras.
SELECT empleados.categoria, SUM(salario+trienio*((CURRENT DATE-contrato)/(365*3)))
FROM empleados, categorias
WHERE empleados.categoria=categorias.categoria GROUP BY empleados.categora;
31) Nombre y suma de los sueldos de los empleados, sin contar trienios, de cada oficina.
SELECT ciudad, SUM(salario) FROM empleados, categorias, dptoficinas, oficinas
WHERE empleados.categoria=categorias.categoria AND empleados.departamento=codigo
AND dptoficinas.oficina=oficinas.oficina GROUP BY oficinas.oficina, ciudad;
32) Titulo y suma de trienios de las categoras cuya suma supera las 10000.
SELECT titulo, SUM(trienio*((CURRENT DATE-contrato)/(365*3)))
FROM empleados, categorias WHERE empleados.categoria=categorias.categoria
GROUP BY titulo HAVING SUM(trienio*((CURRENT DATE-contrato)/(365*3)))>10000;
33) Nombre del departamento y nmero de empleados de los departamentos que tienen ms de 5
empleados.
SELECT departamentos.nombre, COUNT(*) FROM empleados, dptoficinas, departamentos
WHERE empleados.departamento=codigo AND deptno=dptoficinas.departamento
GROUP BY departamentos.nombre HAVING COUNT(*)>5;

14748 - Bases de Datos Biblioteconoma.

Solucin del ejercicio del Tema 5: Lenguajes de Consulta. SQL.

34) Nombre y sueldo, sin contar trienios, de los empleados cuyos sueldos son inferiores a la media de
sueldos de la empresa.
SELECT nombre, salario FROM empleados, categorias
WHERE empleados.categoria=categorias.categoria AND salario< (SELECT AVG(salario)
FROM empleados, categorias WHERE empleados.categoria=categorias.categoria);
35) Ttulo de las categoras donde existe un empleado con contrato anterior a 1990.
SELECT titulo FROM categorias WHERE EXISTS (SELECT * FROM empleados
WHERE empleados.categoria=categorias.categoria AND
contrato<'01/01/1990');
36) Nombre de los empleados que tiene un contrato ms antiguo que cualquier empleado del
departamento de 'Informtica'.
SELECT nombre FROM empleados WHERE contrato<ALL ( SELECT contrato FROM
dptoficinas, departamentos WHERE empleados.departamento=codigo AND
dptoficinas.departamento=deptno AND departamentos.nombre='Informatica');
37) Ciudad y nmero de empleados de la oficina que tiene un nmero de empleados superior a la
media de la empresa.
SELECT ciudad, COUNT(*) FROM oficinas, dptoficinas, empleados
WHERE oficinas.oficina=dptoficinas.oficina AND codigo=empleados.departamento
GROUP BY ciudad HAVING COUNT(*)>
(SELECT COUNT(*)/(SELECT COUNT(*) FROM oficinas) FROM empleados);
38) Ao de contratacin de cada empleado.
SELECT nombre, YEAR(contrato) FROM empleados;
39) Crear la tabla de empleados y de categoras suponiendo que todo empleado tiene un sueldo
superior a 5.000 ptas.
CREATE TABLE categorias (categoria INTEGER NOT NULL, titulo VARCHAR(20), salario
FLOAT(5), trienio INTEGER, PRIMARY KEY (categoria), CHECK (salario > 5000));
CREATE TABLE empleados (num INTEGER NOT NULL, nombre VARCHAR(50), edad
INTEGER, departamento INTEGER NOT NULL, categoria INTEGER NOT NULL,
contrato DATE, PRIMARY KEY (num), FOREIGN KEY (departamento) REFERENCES
dptoficinas, FOREIGN KEY (categoria) REFERENCES (categorias));
40) Aadirle a la tabla de empleados una nueva columna que sea la direccin del empleado.
ALTER TABLE empleados ADD direccion VARCHAR(70);

Potrebbero piacerti anche