Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
2003-2004
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
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
PEDIDOS
num_pedido
fecha_pedido
clie
rep
fab
producto
cant
importe
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
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
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.
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
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
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.
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.
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 ;
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
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
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
ACI
QSA
BIC
IMM
ACI
ACI
BIC
IMM
QSA
REI
FEA
IMM
BIC
ACI
IMM
ACI
QSA
ACI
REI
IMM
ACI
FEA
IMM
REI
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
OFICINA
22
11
12
13
21
CIUDAD
Toledo
Valencia
Barcelona
Alicante
Madrid
REGION
Centro
Este
Este
Este
Centro
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:
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.
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) ;
REGION
Este
Este
Este
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
NOMBRE
Carlos Martinez
Maria Garcia
Soledad Martinez
Daniel Gutierrez
Pedro Cruz
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
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
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).
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 ($).
NOMBRE
Antonio Valle
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
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
3.3.
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
3.4.
Madrid
Alicante
Toledo
Valencia
Barcelona
Centro
Este
Centro
Este
Este
21.309
9.327
6.932
-12.437
-40.672
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
12
IMM 775C
REI 2A44L
REI 2A44R
ACI
ACI
IMM
REI
REI
4100Y
4100Z
775C
2A44L
2A44R
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
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
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 ;
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
15
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 ;
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 ;
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
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
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
40.063
19/05/1997
106
17.500
12
29.328
12/02/1998
104
30.000 39.327
13
Alicante
39.327
12/10/1999
106
27.500 7.105
11
Valencia
40.063
12/10/1999
106
30.000 58.533
21
81.309
10/12/1995
108
30.000 22.776
21
81.309
20/10/1996
104
27.500 26.628
12
29.328
01/03/1997
104
25.000 2.700
12
29.328
14/11/1998
108
27.500 34.432
22
Toledo
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 ;
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
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 ;
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;
5.1.
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
5.2.
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 ;
5.3.
AVG(PRECIO)
804,29
AVG(IMPORTE)
8.895,50
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 ;
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
5.4.
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
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
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.
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 ;
20
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
5.7.
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
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.
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
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.
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
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
22
5.9.
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
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
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 ;
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
6.1.
Veamos con ejemplos las condiciones de bsqueda que ofrece SQL para las subconsultas:
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) ;
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
25
NOMBRE
Lista de los vendedores que trabajan en oficinas que superan su objetivo de
Belen
Aguirre
ventas.
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
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.
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
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.
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.
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.1.
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) ;
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) ;
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
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
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
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);
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.
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
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
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
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 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
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
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
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
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
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.
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
EMPRESA
La tabla CLIENTES quedara NUM_CLIE
2111
EVBE
S.A.
entonces:
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
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 ;
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
NUM_CLIE
2111
2102
2103
2123
2107
2115
2101
2112
2121
2114
2124
2108
2117
2122
2120
2106
2119
2118
2113
2109
2105
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
NOMBRE
Jose Maldonado
Carlos Martinez
Belen Aguirre
Maria Garcia
Lorenzo Fernandez
Soledad Martinez
Daniel Gutierrez
Antonio Valle
Pedro Cruz
Natalia Martin
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) ;
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
2102
2103
2123
2107
2115
2101
2112
2121
2114
2124
2108
2117
2122
2120
2106
2119
2118
2113
2109
2105
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.1.
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.
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.
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.
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
8.3.
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:
Hay que tener en cuenta que esto podremos hacerlo as solo si se trata de una columna que no es
clave primaria.
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
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
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
OFICINA
11
12
13
CIUDAD
Valencia
Barcelona
Alicante
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
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
NUM_EMPL
106
104
105
109
108
102
101
110
103
107
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
41
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 ;
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
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.
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
(#)
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);