Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Consultas Multitablas PDF
Consultas Multitablas PDF
1. Introducción
Básicamente, podemos decir que un lenguaje de consulta es un lenguaje usado por el usuario para
solicitar información 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 más cómodo 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 interacción con la base de
datos se realiza a través de lenguajes; el lenguaje de definición de datos (DDL o LDD) y el lenguaje
de manipulación de datos (DML o LMD, dentro del cual contemplábamos el lenguaje de consulta
como la parte del LMD que permitía recuperar información).
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 además de la de consultar la
base de datos, como son; la definición de la propia estructura de los datos, la manipulación de
dichos datos y la especificación de las ligaduras de seguridad.
El SQL fue desarrollado a principios de los años 70 en E.E.U.U por I.B.M. cuando, después de que
su empleado Codd publicara su artículo 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).
Como ya se ha dicho, SQL es tanto un LDD como LMD por lo que existen dos tipos de sentencias:
• Sentencias de definición de datos (Data Definition Language) que proporcionan las órdenes para
definir o modificar esquemas de relación, eliminar relaciones y crear índices. Algunos ejemplos
de sentencias son las de tipo CREATE y DROP.
• Sentencias de manipulación 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 descripción del lenguaje SQL aunque omitiremos algunas partes
referentes al LDD (creación de permisos, seguridad y control de transacciones) debido a la
brevedad del curso.
1
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
A continuación 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 REPVENTAS PRODUCTOS
oficina num_empl id_fab
ciudad nombre id_producto
region edad descripcion
dir oficina_rep precio
objetivo titulo existencias
ventas contrato
director
cuota
ventas
CLIENTES PEDIDOS
num_clie num_pedido
empresa fecha_pedido
rep_clie clie
limite_credito rep
fab
producto
cant
importe
La relación CLIENTES almacena datos acerca de cada cliente, tales como el nombre de la empresa,
el límite de crédito y el vendedor que atiende al cliente.
2
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
La relación 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 atañe a un solo producto.
3
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
La relación REPVENTAS almacena el número de empleado, el nombre, la edad, las ventas anuales
hasta la fecha y otros datos referentes a cada vendedor.
NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS
106 Jose Maldonado 52 11 VP Ventas 14/06/1998 NULL 25.000 32.958
104 Carlos Martinez 33 12 Dir. Ventas 19/05/1997 106 17.500 0
105 Belen Aguirre 37 13 Dir. Ventas 12/02/1998 104 30.000 39.327
109 Maria Garcia 31 11 Rep. Ventas 12/10/1999 106 27.500 7.105
108 Lorenzo Fernandez 62 21 Dir. Ventas 12/10/1999 106 30.000 58.533
102 Soledad Martinez 48 21 Rep. Ventas 10/12/1996 108 30.000 22.776
101 Daniel Gutierrez 45 12 Rep. Ventas 20/10/1996 104 27.500 26.628
110 Antonio Valle 41 NULL Rep. Ventas 13/01/2000 101 NULL 23.123
103 Pedro Cruz 29 12 Rep. Ventas 01/03/1997 104 25.000 2.700
107 Natalia Martin 49 22 Rep. Ventas 14/11/1998 108 27.500 34.432
4
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
3. Consultas simples
Una consulta en SQL consta básicamente de dos cláusulas obligatorias (SELECT y FROM) a las
que se le pueden añadir opcionalmente otras cuatro cláusulas (WHERE, GROUP BY, HAVING y
ORDER BY).
Para especificar la lista de elementos seleccionados podemos escribir cualquiera de los elementos
siguientes teniendo en cuenta que, si hay más de uno, estarán separados por comas.
• El nombre de una columna, que hará referencia a un atributo de la tabla que especifiquemos en
la cláusula FROM. Más adelante veremos que, en determinadas ocasiones, al tener más de una
tabla en la cláusula FROM necesitaremos además 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 información 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 expresión SQL, indicando que SQL debe calcular el valor a colocar en los resultados
según el estilo especificado por la expresión, por ejemplo: AVG .Esto lo veremos más adelante.
La cláusula FROM es la que indica sobre que tabla/s se desea recuperar información. Si hay más
de una, se separan los nombres de las tablas por comas (y esto correspondería 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 formarán una tabla con varias columnas y filas.
Por ejemplo, si queremos saber ”el listado de los NOMBRE OFICINA_REP CONTRATO
nombres, oficinas y fechas de contrato de todos los Jose Maldonado 11 14/06/1998
vendedores”, la consulta sería: Carlos Martinez 12 19/05/1997
Belen Aguirre 13 12/02/1998
SELECT nombre, oficina_rep, contrato FROM Maria Garcia 11 12/10/1999
repventas ; Lorenzo Fernandez 21 12/10/1999
Soledad Martinez 21 10/12/1996
Daniel Gutierrez 12 20/10/1996
Dando como resultado una tabla de tres columnas Antonio Valle NULL 13/01/2000
(hemos seleccionado 3 atributos) y diez filas (ya que Pedro Cruz 12 01/03/1997
hay diez vendedores) que es la tabla de la derecha. Natalia Martin 22 14/11/1998
Sin embargo, si pedimos “El nombre, cuota y ventas del empleado número 107”, la consulta
produce una única fila, ya que sólo hay un vendedor que tenga el número de empleado solicitado.
SELECT nombre, cuota, ventas FROM repventas WHERE num_empl=107 ;
NOMBRE CUOTA VENTAS
Natalia Martin 27500 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”:
AVG (ventas)
SELECT AVG(ventas) FROM repventas ; 24758.20
5
14748 - Bases de Datos – Biblioteconomía. 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
Aún en esta situación, el resultado sigue siendo una tabla. Se trata de una tabla vacía con dos
columnas y cero filas.
Por otra parte, hay que tener en cuenta que la cláusula 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
selección, 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”:
REGION
SELECT region FROM oficinas ; Centro
Los resultados tienen cinco filas (uno por oficina), pero observamos que hay filas Este
Este
duplicadas dado que las regiones se repiten. Probablemente, estos resultados no son
Este
los que uno pretendía con la consulta, es decir, si existen tan solo dos regiones Centro
diferentes cabría esperar que aparecieran solo las dos regiones.
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 selección. Veamos la consulta anterior
modificada: REGION
Este
SELECT DISTINCT region FROM oficinas ;
Centro
Conceptualmente, SQL efectúa 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.
También 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 cláusulas SELECT / FROM:
CIUDAD REGION VENTAS
− Lista de la población, región y ventas de cada oficina de ventas: Toledo Centro 34.432
Valencia Este 40.063
SELECT ciudad, region, ventas FROM oficinas ; Barcelona Este 29.328
Alicante Este 39.327
Madrid Centro 81.309
CIUDAD REGION VENTAS-OBJETIVO
− Lista de la ciudad, región y el resultado de ventas
Toledo Centro 6.932
para cada oficina: Valencia Este -12.437
SELECT ciudad, region, (ventas-objetivo) FROM Barcelona Este -40.672
oficinas; Alicante Este 9.327
Madrid Centro 21.309
NOMBRE CUOTA CUOTA+(.03*VENTAS)
− Resultado de elevar la cuota de ventas un 3% Jose Maldonado 25.000 25.988,74
a cada vendedor: Carlos Martinez 17.500 17.500,00
Belen Aguirre 30.000 31.179,81
Maria Garcia 27.500 27.713,15
SELECT nombre, cuota,
Lorenzo Fernandez 30.000 31.755,99
(cuota+(0.03*ventas)) FROM repventas ; 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 – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Por ejemplo, veamos la consulta ”decir las oficinas donde las ventas exceden al objetivo”:
7
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
SELECT ciudad, ventas, objetivo FROM oficinas WHERE CIUDAD VENTAS OBJETIVO
ventas>objetivo ; Toledo 34.432 27.500
Alicante 39.327 30.000
Madrid 81.309 60.000
O “listar el nombre, ventas y cuota del empleado número 105”:
NOMBRE VENTAS CUOTA
SELECT nombre, ventas, cuota FROM repventas WHERE
Belen Aguirre 39.327 30.000
num_empl=105 ;
NOMBRE VENTAS
O decir “ qué empleados están dirigidos por el empleado número 104”: Belen Aguirre 39.327
Daniel Gutierrez 26.628
SELECT nombre, ventas FROM repventas WHERE director=104 ;
Pedro Cruz 2.700
En la cláusula WHERE indicamos la condición de búsqueda que especifica las filas a recuperar.
Conceptualmente, SQL recorre cada fila de la tabla seleccionada, una a una, y aplica la condición
de búsqueda produciendo uno de los siguientes resultados:
• Si la condición de búsqueda es cierta, la fila se incluye en los resultados de la consulta.
• Si la condición de búsqueda es falsa, la fila se excluye de los resultados de la consulta.
• Si la condición de búsqueda tiene un valor NULL (desconocido), la fila se excluye de los
resultados de la consulta.
Para restringir los resultados de una búsqueda, el SQL ofrece un variado conjunto de condiciones de
búsqueda que nos van a permitir especificar muchos tipos diferentes de consultas. Las condiciones
de búsqueda son cinco según el estándar ANSI/ISO:
• Condiciones de comparación. Compara el valor de una expresión con el valor de otra.
• Condiciones de rango. Examina si el valor de una expresión cae dentro de un rango especificado
de valores.
• Condiciones de pertenencia a un conjunto. Comprueba si el valor de una expresión se
corresponde con alguno de los valores especificados en conjunto determinado de valores.
• Condiciones de correspondencia con patrón. Comprueba si el valor de una columna, que
contiene datos de cadena de caracteres, se corresponde con un patrón especificado.
• Condiciones de valor nulo. Comprueba si una columna tiene un valor NULL (desconocido).
8
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
CIUDAD REGION
− Lista de las oficinas que no se encuentran en la región Centro: Valencia Este
Barcelona Este
SELECT ciudad, region FROM oficinas WHERE region<>’Centro’ ;
Alicante Este
La condición de comparación más habitual es la que comprueba si el valor de una columna es igual
a cierta constante. Cuando la columna es clave primaria, la condición aísla una sola fila de la tabla
produciendo una sola fila de resultados, como por ejemplo el caso de “Seleccionar el nombre y
límite de crédito del cliente número 2107”:
SELECT empresa, limite_credito FROM clientes EMPRESA LIMITE_CREDITO
WHERE num_clie=2107 ; Distribuciones Sur S.A. 35.000
Recordemos que SQL trata el valor NULL como valor desconocido, por lo que si tratamos de hacer
una comparación con un valor nulo, esa tupla no será devuelta en la consulta. Por ejemplo:
− Lista de vendedores que superan sus cuotas: NOMBRE
Jose Maldonado
SELECT nombre FROM repventas WHERE ventas>cuota ; Belen Aguirre
Lorenzo Fernandez
− Lista de vendedores que no superan sus cuotas: NOMBRE
Natalia Martin
Carlos Martinez
SELECT nombre FROM repventas WHERE Maria Garcia
ventas<=cuota ; Soledad Martinez
Daniel Gutierrez
Pedro Cruz
La versión negada del test de rango, NOT BETWEEN, comprueba los valores que caen fuera del
rango. Por ejemplo:
− Lista de vendedores cuyas ventas no están entre el 75 y el NOMBRE VENTAS CUOTA
150% de su cuota: Carlos Martinez 0 17.500
Maria Garcia 7.105 27.500
SELECT nombre, ventas, cuota FROM repventas WHERE Lorenzo Fernadez 58.533 30.000
ventas NOT BETWEEN (0.75*cuota) AND (1.50*cuota) ; Pedro Cruz 2.700 25.000
Es necesario señalar que la condición BETWEEN no añade potencia expresiva a SQL, pues A
BETWEEN B AND C puede ser expresado como (A>=B) AND (A<=C).
9
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Al igual que la condición BETWEEN, la condición IN no añade potencia expresiva a SQL, ya que
la condición de búsqueda X IN (A,B,C) es equivalente a (X=A) OR (X=B) OR (X=C).
Sin embargo, uno puede olvidar fácilmente el nombre exacto de la empresa, por ejemplo. La
condición de correspondencia con un patrón (LIKE) comprueba si el valor de un dato de una
columna se ajusta a un patrón dado. El patrón es una cadena que puede incluir uno o más caracteres
comodines. Estos caracteres comodines son el signo de porcentaje (%) y el subrayado (_).
El carácter comodín signo de porcentaje (%) se corresponde con cualquier secuencia de cero o más
caracteres. El carácter comodín subrayado (_) se corresponde con un único carácter cualquiera.
Así por ejemplo, podemos consultar “todos los vendedores apellidados Martinez” de la siguiente
forma:
NUM_EMPL NOMBRE
SELECT num_empl,nombre FROM repventas WHERE nombre 104 Carlos Martinez
LIKE ‘% Martinez’ ; 102 Soledad Martinez
Uno de los problemas de la correspondencia con patrones de cadenas es cómo hacer corresponder
los propios caracteres comodines como caracteres literales. Para comprobar la presencia de un
carácter comodín en una cadena se precede de un carácter de escape que hace que el carácter que le
sigue inmediatamente se trate como un literal en lugar de cómo un carácter comodín. El carácter
escape en SQL es un signo de dólar ($).
10
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
El operador AND se utiliza para combinar dos condiciones de búsqueda que deban ser ciertas
simultáneamente. Por ejemplo, “decir los vendedores que están por debajo de la cuota y con ventas
inferiores a 20000”: NOMBRE CUOTA VENTAS
Carlos Martinez 17.500 0
SELECT nombre, cuotas, ventas FROM repventas WHERE Maria Garcia 27.500 7.105
ventas<cuota AND ventas<20000.00 ; Pedro Cruz 25.000 2.700
El operador OR se utiliza para combinar dos condiciones de búsqueda cuando una u otra (o ambas)
deban ser ciertas. Por ejemplo, “decir los vendedores que están por debajo de la cuota o con ventas
inferiores a 30000”: NOMBRE CUOTA VENTAS
Carlos Martinez 17.500 0
Maria Garcia 27.500 7.105
SELECT nombre, cuota, ventas FROM repventas WHERE Soledad Martinez 30.000 22.776
ventas<cuota OR ventas<30000.00 ; Daniel Gutierrez 27.500 26.628
Antonio Valle NULL 23.123
Pedro Cruz 25.000 2.700
Por último, se puede utilizar el operador NOT para seleccionar filas en donde la condición de
búsqueda es falsa. Por ejemplo, “decir los vendedores que están por debajo de la cuota y con
ventas no superiores a 5000”:
NOMBRE CUOTA VENTAS
Carlos Martinez 17.500 0
SELECT nombre, cuota, ventas FROM repventas WHERE Pedro Cruz 25.000 2.700
ventas<cuota AND NOT ventas>5000.00 ;
Utilizando las palabras AND, OR y NOT y los paréntesis para agrupar los criterios de búsqueda, se
pueden construir criterios de búsqueda muy complejos. Por ejemplo:
− Listar los vendedores con ventas inferiores a la cuota y con edad mayor de 45 años o con ventas
inferiores a 5000:
11
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
− Las ventas de cada oficina, ordenadas en orden alfabético por CIUDAD REGION VENTAS
región y dentro de cada región por ciudad (deberemos ordenar la Madrid Centro 81.309
Toledo Centro 34.432
consulta por región y ciudad): Alicante Este 39.327
SELECT ciudad, region, ventas FROM oficinas Barcelona Este 29.328
Valencia Este 40.063
ORDER BY region, ciudad ;
En este caso, la primera especificación de ordenación (región) es la clave de ordenación mayor; las
que le sigan (ciudad) son progresivamente claves de ordenación menores, utilizadas para
“desempatar” cuando dos filas de resultados tienen los mismos valores para las claves mayores.
Por omisión, SQL ordena los datos de forma ascendente, aunque también se puede especificar
poniendo la palabra ASC. Para solicitar la ordenación en secuencia descendente se incluye la
palabra clave DESC en la especificación de ordenación, como en este ejemplo:
− Lista de las oficinas clasificadas en orden descendente de ventas: CIUDAD REGION VENTAS
Madrid Centro 81.309
Valencia Este 40.063
SELECT ciudad, region, ventas FROM oficinas
Alicante Este 39.327
ORDER BY ventas DESC ; Toledo Centro 34.432
Barcelona Este 29.328
Por ejemplo, supongamos que queremos resolver la petición: “Lista todos los productos en donde el
precio del producto exceda de 2000 o en donde más de 30000 del producto hayan sido ordenados
en un solo pedido”.
ID_FAB ID_PRODUCTO
La primera parte de la petición puede satisfacerse con la consulta, ACI 4100Y
“productos cuyo precio excede de 2000”: REI 2A44L
ACI 4100Z
SELECT id_fab, id_producto FROM productos WHERE precio>2000 ; REI 2A44R
12
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
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 operación
UNION, se puede especificar la palabra clave ALL a continuación de la palabra UNION. Por
ejemplo, veamos el resultado de la unión de las consultas anteriores conservando las filas repetidas:
ID_FAB ID_PRODUCTO
ACI 4100Y
SELECT id_fab, id_producto FROM productos WHERE precio>2000 REI 2A44L
UNION ALL ACI 4100Z
SELECT DISTINCT fab, producto FROM pedidos WHERE REI 2A44R
importe>30000 ; IMM 775C
REI 2A44L
REI 2A44R
Como hemos dicho, las sentencias SELECT combinadas no pueden estar ordenadas. Sin embargo,
el resultado de la UNION puede ordenarse mediante una cláusula ORDER BY que ordene el
resultado. Por ejemplo, la consulta anterior puede ordenarse por la identificación del producto:
ID_FAB ID_PRODUCTO
(SELECT id_fab, id_producto FROM productos WHERE precio>2000) REI 2A44L
UNION REI 2A44R
(SELECT DISTINCT fab, producto FROM pedidos WHERE ACI 4100Y
importe>30000) ORDER BY 2 ; ACI 4100Z
IMM 775C
La cláusula INTERSECT nos permite combinar resultados de varias consultas devolviendo como
resultado aquellas tuplas que pertenecen a todas las consultas. Como ya hemos comentado, esta
cláusula no es estándar 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 más de 30000 del
producto hayan sido ordenados en un solo pedido”. En este caso, deberemos juntar las dos
consultas mediante la cláusula INTERSECT de la siguiente forma:
13
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Muchas consultas útiles solicitan datos procedentes de dos o más 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 más tablas. Por ejemplo, si queremos formular la
consulta “listar todos los pedidos, mostrando su número, importe, nombre del cliente y el límite de
crédito del cliente”, nos damos cuenta de que los cuatro datos están almacenados en dos tablas:
• La tabla PEDIDOS contiene el número de pedido y el importe de cada pedido, pero no tiene los
nombres de cliente ni los límites de crédito.
• La tabla CLIENTES contiene los nombres de cliente y sus balances pero no la información
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 número 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
composición entre las tablas. Las composiciones son el fundamento del procesamiento de consultas
multitabla en SQL. Todos los datos de la base relacional están almacenados en sus columnas con
valores explícitos, de modo que todas las relaciones posibles entre tablas puedan formarse
comparando los contenidos de las columnas relacionadas.
14
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Las consultas multitabla más comunes implican a dos tablas que tienen una relación entre ellas a
través 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 más habitual, no es el único. A continuación
veremos, a través de ejemplos, distintas consultas multitabla comentando los aspectos relevantes.
− Dar la lista de los vendedores y la ciudad y región donde NOMBRE CIUDAD REGION
trabajan: Jose Maldonado Valencia Este
Carlos Martinez Barcelona Este
SELECT nombre, ciudad, region FROM repventas, oficinas
Belen Aguirre Alicante Este
WHERE oficina_rep=oficina ; Maria Garcia Valencia Este
Lorenzo Fernandez Madrid Centro
Como puede observarse, SQL no requiere que las columnas Soledad Martinez Madrid Centro
de emparejamiento sean incluidas en los resultados de la Daniel Gutierrez Barcelona Este
consulta multitabla. Normalmente se omiten pues las claves Pedro Cruz Barcelona Este
primarias y las claves ajenas suelen ser números de Natalia Martin Toledo Centro
identificación difíciles de recordar y poco descriptivos.
− Lista de los vendedores de las oficinas con objetivo igual o superior a 60000, dando la ciudad y
región donde trabajan:
NOMBRE CIUDAD REGION
SELECT nombre, ciudad, region FROM repventas, oficinas Carlos Martinez Barcelona Este
WHERE oficina_rep=oficina AND objetivo>=60000 ; Lorenzo Fernandez Madrid Centro
Soledad Martinez Madrid Centro
Aquí se ha combinado la condición de búsqueda que Daniel Gutierrez Barcelona Este
especifica las columnas de emparejamiento en una consulta Pedro Cruz Barcelona Este
multitabla con otra condición de búsqueda, restringiendo aún más los contenidos de los resultados.
− Listar todos los pedidos, mostrando los importes y las descripciones del producto.
NUM_PEDIDO IMPORTE DESCRIPCION
SELECT num_pedido, importe, descripcion FROM
112961 31.500 Bisagra Izqda.
113012 3.745 Articulo Tipo 3
pedidos, productos WHERE fab=id_fab AND
112989 1.458 Bancada Motor producto=id_producto ;
113051 1.420 Reductor
112968 3.978 Articulo Tipo 4 La tabla PEDIDOS y la tabla PRODUCTOS de la base
110036 22.500 Montador de datos ejemplo están relacionadas por un par de
113045 45.000 Bisagra Dcha. claves ajena/primaria. Las columnas FAB y
112963 3.276 Articulo Tipo 4
PRODUCTO de la tabla PEDIDOS forman juntas una
113013 652 Manivela
113058 1.480 Cubierta clave ajena para la tabla PRODUCTOS, que se
112997 652 Manivela emparejan con las columnas ID_FAB e
112983 702 Articulo Tipo 4 ID_PRODUCTO, respectivamente. Por tanto, para
113024 7.100 Reductor componer las tablas deben especificarse ambos pares
113062 2.430 Bancada Motor
de columnas de emparejamiento.
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 Este tipo de composiciones son menos habituales y se
112992 760 Articulo Tipo 2 encuentran generalmente en consultas que afectan a
112975 2.100 Pasador Bisagra claves ajenas compuestas.
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 15
113042 22.500 Bisagra Dcha.
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Cuando en una consulta multitabla tengamos nombres de columnas duplicados será necesario
eliminar la ambigüedad. 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 – Biblioteconomía. 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
SELECT nombre, repventas.ventas, ciudad FROM repventas, Carlos Martinez 0 Barcelona
oficinas WHERE oficina_rep=oficina ; Belen Aguirre 39.327 Alicante
Maria Garcia 7.105 Valencia
Lorenzo Fernandez 58.533 Madrid
En este ejemplo, los nombres cualificados de las dos columnas Soledad Martinez 22.776 Madrid
VENTAS son OFICINAS.VENTAS y REPVENTAS.VENTAS, Daniel Gutierrez 26.628 Barcelona
esto es, el nombre de la tabla seguido por el nombre de la Pedro Cruz 2.700 Barcelona
columna. 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
Jose VP
106 52 11 14/06/1998 NULL 25.000 32.958 11 Valencia Este 106 52.500 40.063
Maldonado Ventas
Carlos Dir.
104 33 12 19/05/1997 106 17.500 0 12 Barcelona Este 104 70.000 29.328
Martinez Ventas
Belen Dir.
105 37 13 12/02/1998 104 30.000 39.327 13 Alicante Este 105 30.000 39.327
Aguirre Ventas
Maria Rep.
109 31 11 12/10/1999 106 27.500 7.105 11 Valencia Este 106 52.500 40.063
Garcia Ventas
Lorenzo Dir.
108 62 21 12/10/1999 106 30.000 58.533 21 Madrid Centro 108 60.000 81.309
Fernandez Ventas
Soledad Rep.
102 48 21 10/12/1995 108 30.000 22.776 21 Madrid Centro 108 60.000 81.309
Martinez Ventas
Daniel Rep.
101 45 12 20/10/1996 104 27.500 26.628 12 Barcelona Este 104 70.000 29.328
Gutierrez Ventas
Rep.
103 Pedro Cruz 29 12 01/03/1997 104 25.000 2.700 12 Barcelona Este 104 70.000 29.328
Ventas
Natalia Rep.
107 49 22 14/11/1998 108 27.500 34.432 22 Toledo Centro 108 27.500 34.432
Martin Ventas
En una consulta multitabla, el asterisco selecciona todas las columnas de todas las tablas listadas en
la cláusula FROM.
La última consideración que nos queda en este apartado de consultas multitabla es que, en
ocasiones, nos interesan consultas que afectan a una relación 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 número 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 ;
aparecería un error del tipo “Referencia duplicada a la tabla ‘repventas’”.
Para resolver el problema, imaginemos que SQL tuviera dos copias idénticas de la tabla
REPVENTAS, una llamada EMPS, que contuviera los empleados, y otra llamada DIRS, que
17
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
contuviera los directores. Entonces la columna director de la tabla EMPS sería una clave ajena para
la tabla DIRS y la consulta se realizaría como:
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 cláusula FROM asigna una alias a cada “copia” de la tabla REPVENTAS especificando el
nombre del alias detrás del nombre real de la tabla y precedido por AS. Cuando la cláusula 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 sería:
− Lista de los nombres de los vendedores y sus directores. NOMBRE NOMBRE
SELECT emps.nombre, dirs.nombre FROM repventas AS emps, Carlos Martinez Jose Maldonado
Belen Aguirre Carlos Martinez
repventas AS dirs WHERE emps.director=dirs.num_empl ;
Maria Garcia Jose Maldonado
En este ejemplo no sería realmente necesario utilizar dos alias, Lorenzo Fernandez Jose Maldonado
uno para cada tabla de la consulta, podríamos haber usado solo Soledad Martinez Lorenzo Fernandez
Daniel Gutierrez Carlos Martinez
uno, quedando la consulta como: Antonio Valle Daniel Gutierrez
SELECT repventas.nombre, dirs.nombre FROM repventas, Pedro Cruz Carlos Martinez
repventas dirs WHERE repventas.director=dirs.num_empl ; Natalia Martin Lorenzo Fernandez
19
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Debemos resaltar que la función COUNT() ignora los valores de los datos en la columna,
simplemente cuenta cuántos datos hay. Por lo tanto, en realidad no importa qué columna se
especifica como argumento de la función COUNT(). Esta es la razón por la que SQL soporta una
función de columna especial, COUNT(*) que cuenta filas en lugar de valores de datos. Así, la
última consulta podría haberse escrito como:
− Número de pedidos de más de 25000. COUNT(*)
SELECT COUNT(*) FROM pedidos WHERE importe>25000 ; 4
Uno de los mejores modos de imaginar las consultas sumarias y las funciones de agregación es
pensar en el procesamiento de la consulta dividido en dos pasos. Primero, imaginamos cómo
funcionaría la consulta sin las funciones de agregación, produciendo muchas filas de resultados de
consulta detallados. Luego imaginamos a SQL aplicando las funciones de agregación 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 ;
Una función agregación puede aparecer, en la lista de selección, en cualquier lugar en el que puede
aparecer un nombre de columna. Sin embargo, el argumento de una función de agregación no puede
contener a otra función de agregación y también es ilegal mezclar funciones de agregación y
nombres normales de columnas en una lista de selección, pues la consulta carece de sentido, ya que
un nombre de columna genera una tabla de resultados con cierto número de filas y una función de
agregación genera una columna de una fila con los resultados sumarios.
20
14748 - Bases de Datos – Biblioteconomía. 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 función COUNT(ventas) devuelve
también diez. Sin embargo, la columna CUOTA es NULL para un vendedor, por lo cual la función
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 función 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
La palabra clave DISTINCT puede usarse con las funciones de agregación COUNT(), SUM() y
AVG() (con MAX y MIN no tiene sentido). Cuando se usa la palabra clave DISTINCT el
argumento de la función agregación debe ser un nombre de columna único, no puede ser una
expresión; además, la palabra clave DISTINCT sólo puede aparecer una vez en una consulta.
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.
OFICINA_REP MIN(CUOTA) MAX(CUOTA)
Veamos algunos ejemplos: NULL NULL NULL
− Rango de cuotas asignadas a cada oficina. 11 25.000 27.500
12 17.500 27.500
SELECT oficina_rep, MIN(cuota), MAX(cuota) 13 30.000 30.000
FROM repventas GROUP BY oficina_rep ; 21 30.000 30.000
22 27.500 27.500
− Número de vendedores asignados a cada oficina.
OFICINA_REP COUNT(*)
SELECT oficina_rep, COUNT(*) FROM repventas GROUP BY NULL 1
oficina_rep ; 11 2
12 3
COUNT(DISTINCT NUM_CLIE) REP_CLIE 13 1
3 101 21 2
4 102 22 1
3 103
1 104
2 105
− Número de clientes diferentes atendidos por cada
2 106 vendedor.
1 107 SELECT COUNT(DISTINCT num_clie), rep_clie
2 108 FROM clientes GROUP BY rep_clie ;
2 109
1 110 REP CLIE SUM(IMPORTE)
101 2102 3.978
SQL también puede agrupar resultados de consulta en base a 101 2108 150
contenidos de dos o más columnas. Por ejemplo: 101 2113 22.500
102 2106 4.026
− Pedidos totales por cliente y vendedor. 102 2114 15.000
SELECT rep, clie, SUM(importe) FROM pedidos GROUP BY rep, 102 2120 3.750
103 2111 2.700
clie ; 105 2103 35.582
105 2111 3.745
106 2101 1.458
Una limitación de las consultas agrupadas es que SQL ignora la 106 2117 31.500
información referente a las claves primarias y ajenas cuando analiza 107 2109 31.350
la validez de una consulta agrupada. Por ello, la consulta: 107 2124 3.082
108 2112 47.825
− Pedidos totales por cada vendedor. 108 2114 7.100
108 2118 3.608
SELECT num_empl, nombre, SUM(importe) FROM pedidos, 109 2108 7.105
repventas WHERE rep=num_empl GROUP BY num_empl ; 110 2107 23.132
da como resultado un error del tipo : ”La columna ‘nombre’ no es una expresión GROUP BY”.
NUM_EMPL NOMBRE SUM(IMPORTE) La consulta tiene perfecto sentido, ya que la
101 Daniel Gutierrez 26.628 agrupación por el número de empleado del
102 Soledad Martinez 22.776
vendedor es, en efecto, igual que la agrupación
103 Pedro Cruz 2.700
105 Belen Aguirre 39.327 sobre el nombre del vendedor. No obstante, SQL
106 Jose Maldonado 32.958 requiere que las columnas de SELECT estén
107 Natalia Martin 34.432 especificadas como columna de agrupación, por
108 Lorenzo Fernandez 58.533 ello el problema se corrige sencillamente
109 Maria Garcia 7.105
realizando la consulta de la forma siguiente:
110 Antonio Valle 23.132
SELECT num_empl, nombre, SUM(importe) FROM pedidos, repventas WHERE rep=num_empl
GROUP BY num_empl, nombre ;
22
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
23
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
La característica 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 razón original para la palabra
“estructurada” en el nombre Lenguaje de Consultas Estructuradas (Structured Query Language-
SQL). Esta característica juega un papel importante por tres razones:
• Una sentencia SQL con una subconsulta es frecuentemente el modo más natural de expresar una
consulta, ya que se asemeja más estrechamente a la descripción de la consulta en lenguaje
natural.
• Las subconsultas hacen más fácil 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 cláusula WHERE o HAVING de otra
sentencia SQL. Por ejemplo, analicemos la petición: “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 petición
solicita una lista de oficinas de la tabla OFICINAS, en donde el valor de la columna VENTAS
satisface cierta condición. Parece razonable que la sentencia SELECT que expresa la consulta deba
ser semejante a esta:
SELECT ciudad FROM oficinas WHERE ventas<??? ;
donde el valor “???” equivaldría a “el 50% de la suma de las cuotas de los vendedores asignados a
la oficina en cuestión”. Sabemos que la menor de las cuotas para una oficina específica puede
obtenerse como:
SELECT 0.5*SUM(cuota) FROM repventas WHERE oficina_rep=XX ;
donde “XX” representa el número de oficina.
Parece entonces razonable comenzar con la primera consulta y reemplazar los “???” con la segunda
consulta del modo siguiente:
Las subconsultas SQL dentro de la cláusula WHERE ayudan a seleccionar las filas individuales que
aparecen en los resultados de la consulta. En la cláusula HAVING, ayudan a seleccionar los grupos
de filas que aparecen en los resultados de la consulta.
24
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Conceptualmente, SQL lleva a cabo la consulta de la siguiente forma: La consulta principal extrae
sus datos de la tabla OFICINAS, y la cláusula WHERE selecciona qué oficinas serán incluidas en
los resultados de la consulta. Para ello SQL recorre las filas de la tabla OFICINAS una a una,
aplicándoles la condición de la cláusula WHERE. La cláusula 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 número, y la cláusula WHERE
compara el número con el valor VENTAS, seleccionando o rechazando la oficina actual en base a la
comparación.
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 cláusula 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. NOMBRE
Belen Aguirre
SELECT nombre FROM repventas WHERE cuota>=(SELECT objetivo FROM Lorenzo Fernandez
oficinas WHERE ciudad=’Alicante’) ; Soledad Martinez
− Lista de los productos del fabricante ACI para los cuales las existencias superan a las
existencias del producto ACI-41004.
DESCRIPCION EXISTENCIAS
SELECT descripcion,existencias FROM productos WHERE Articulo Tipo 1 277
id_fab=’ACI’ AND existencias>(SELECT existencias FROM Articulo Tipo 2 167
productos WHERE id_fab=’ACI’ AND id_producto=’41004’) ; Articulo Tipo 3 207
25
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
− Lista de los vendedores que trabajan en oficinas que superan su objetivo de NOMBRE
ventas. Belen Aguirre
Lorenzo Fernandez
SELECT nombre FROM repventas WHERE oficina_rep IN (SELECT oficina Soledad Martinez
FROM oficinas WHERE ventas>objetivo) ; Natalia Martin
− Lista de empleados que tienen todos sus clientes con límite de crédito igual o superior a 50000.
SELECT nombre FROM repventas WHERE num_empl NOT IN (SELECT NOMBRE
rep_clie FROM clientes WHERE limite_credito<50000) ; 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 EVBE S.A.
Pino S.L.
DISTINCT clie FROM pedidos WHERE fab=’ACI’ AND producto LIKE
Distribuciones Sur S.A.
‘4100%’ AND fecha_pedido BETWEEN ‘01/01/2000’ AND ‘30/06/2000’) ; Zapater Importaciones S.A.
26
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
− Lista de los vendedores que han aceptado un pedido que representa más de su
NOMBRE
cuota. Jose Maldonado
SELECT nombre FROM repventas WHERE cuota<ANY (SELECT importe Lorenzo Fernandez
FROM pedidos WHERE rep=num_empl) ; 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 CIUDAD OBJETIVO
ventas FROM repventas WHERE oficina_rep=oficina) ; Toledo 27.500
Alicante 30.000
6.2. 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:
− Lista de clientes cuyos vendedores están asignados a oficinas de la EMPRESA
Hnos. Martinez S.A.
región de ventas Centro. Lopez Asociados S.L.
Componentes Fernandez S.A.
SELECT empresa FROM clientes WHERE rep_clie IN (SELECT Domingo S.L.
num_empl FROM repventas WHERE oficina_rep IN (SELECT oficina Distribuciones Montiel S.L.
FROM oficinas WHERE region=’Centro’)) ; Construcciones Leon S.A.
Exclusivas Norte S.A.
En este ejemplo, la subconsulta más interna produce una columna que contiene los números de
oficina de las oficinas de la región ‘Centro’. La siguiente subconsulta produce una columna que
contiene los números de empleado de los vendedores que trabajan en las oficinas seleccionadas.
Finalmente la consulta externa encuentra los clientes cuyos vendedores tienen uno de los números
de empleado seleccionados.
27
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
− Supongamos ahora que el nuevo representante recibe su primer pedido, de Corporacion Oeste
S.A., un nuevo cliente que tiene asignado el número 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 número de pedido
113069.
Las sentencias INSERT que añaden 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) ;
28
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
La tabla PEDIDOS: NUM_PEDIDO FECHA_PEDIDO CLIE REP FAB PRODUCTO CANT IMPORTE
112961 17/12/1999 2117 106 REI 2A44L 7 31.500
113012 11/01/2000 2111 105 ACI 41003 35 3.745
112989 03/01/2000 2101 106 FEA 114 6 1.458
113051 10/02/2000 2118 108 QSA XK47 4 1.420
112968 12/10/1999 2102 101 ACI 41004 34 3.978
110036 30/01/2000 2107 110 ACI 4100Z 9 22.500
113045 02/02/2000 2112 108 REI 2A44R 10 45.000
112963 17/12/1999 2103 105 ACI 41004 28 3.276
113013 14/01/2000 2118 108 BIC 41003 1 652
113058 23/02/2000 2108 109 FEA 112 10 1.480
112997 08/01/2000 2124 107 BIC 41003 1 652
112983 27/12/1999 2103 105 ACI 41004 6 702
113024 20/01/2000 2114 108 QSA XK47 20 7.100
113062 24/02/2000 2124 107 FEA 114 10 2.430
112979 12/10/1999 2114 102 ACI 4100Z 6 15.000
113027 22/02/2000 2103 105 ACI 41002 54 4.104
113007 08/01/2000 2112 108 IMM 773C 3 2.825
113069 02/03/2000 2109 107 IMM 775C 22 31.350
113034 29/01/2000 2107 110 REI 2A45C 8 632
112992 04/11/1999 2118 108 ACI 41002 10 760
112975 12/10/1999 2111 103 REI 2A44G 6 2.100
113055 15/02/2000 2108 101 ACI 4100X 6 150
113048 10/02/2000 2120 102 IMM 779C 2 3.750
112993 04/01/2000 2106 102 REI 2A45C 24 1.896
113065 27/02/2000 2106 102 QSA XK47 6 2.130
113003 25/01/2000 2108 109 IMM 779C 3 5.625
113049 10/02/2000 2118 108 QSA XK47 2 776
112987 31/12/1999 2103 105 ACI 4100Y 11 27.500
113057 18/02/2000 2111 103 ACI 4100X 24 600
113042 02/02/2000 2113 101 REI 2A44R 5 22.500
113070 22/10/2000 2126 111 ACI 41004 20 2.340
Conviene resaltar el hecho de que existe una sentencia CURRENT DATE que permite introducir el
día actual sin necesidad de introducirlo como fecha. Además, SQL automáticamente asigna un valor
NULL a cualquier columna cuyo nombre falte de la lista, aunque es posible especificar de forma
explícita que una columna tiene valor NULL. Así, cuando hemos introducido el nuevo vendedor
podríamos haberlo realizado como:
29
14748 - Bases de Datos – Biblioteconomía. 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) ;
Además, SQL permite omitir la lista de columnas de la sentencia INSERT. Cuando se omite la lista
de columnas, SQL genera automáticamente 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
podría 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 NUM_PEDIDO FECHA_PEDIDO IMPORTE
PEDIDOS, el número de pedido, la fecha y el importe 112961 17/12/1999 31.500
de todos los pedidos remitidos con anterioridad al 1 112968 12/10/1999 3.978
112963 17/12/1999 3.276
de Enero de 2000, en otra tabla llamada 112983 27/12/1999 702
ANTPEDIDOS. 112979 12/10/1999 15.000
INSERT INTO antpedidos(num_pedido, fecha_pedido, 112992 04/11/1999 760
112975 12/10/1999 2.100
importe) SELECT num_pedido, fecha_pedido, importe
112987 31/12/1999 27.500
FROM pedidos WHERE fecha_pedido<’01/01/2000’ ;
El estándar SQL especifica varias restricciones sobre la consulta que aparece dentro de la sentencia
INSERT multifila:
• La consulta no puede contener una cláusula 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 cláusula FROM de la consulta
o de ninguna subconsulta que ésta contenga.
Además, los resultados de la consulta deben contener el mismo número 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.
La cláusula WHERE puede seleccionar varias filas de una tabla SQL y eliminar todas las filas
seleccionadas. La sentencia sería:
31
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
La tabla pedidos NUM_PEDIDO FECHA_PEDIDO CLIE REP FAB PRODUCTO CANT IMPORTE
quedaría: 112961 17/12/1999 2117 106 REI 2A44L 7 31.500
113012 11/01/2000 2111 105 ACI 41003 35 3.745
112989 03/01/2000 2101 106 FEA 114 6 1.458
113051 10/02/2000 2118 108 QSA XK47 4 1.420
110036 30/01/2000 2107 110 ACI 4100Z 9 22.500
113045 02/02/2000 2112 108 REI 2A44R 10 45.000
112963 17/12/1999 2103 105 ACI 41004 28 3.276
113013 14/01/2000 2118 108 BIC 41003 1 652
113058 23/02/2000 2108 109 FEA 112 10 1.480
112997 08/01/2000 2124 107 BIC 41003 1 652
112983 27/12/1999 2103 105 ACI 41004 6 702
113024 20/01/2000 2114 108 QSA XK47 20 7.100
113062 24/02/2000 2124 107 FEA 114 10 2.430
113027 22/02/2000 2103 105 ACI 41002 54 4.104
113007 08/01/2000 2112 108 IMM 773C 3 2.825
113069 02/03/2000 2109 107 IMM 775C 22 31.350
113034 29/01/2000 2107 110 REI 2A45C 8 632
113055 15/02/2000 2108 101 ACI 4100X 6 150
113048 10/02/2000 2120 102 IMM 779C 2 3.750
112993 04/01/2000 2106 102 REI 2A45C 24 1.896
113065 27/02/2000 2106 102 QSA XK47 6 2.130
113003 25/01/2000 2108 109 IMM 779C 3 5.625
113049 10/02/2000 2118 108 QSA XK47 2 776
112987 31/12/1999 2103 105 ACI 4100Y 11 27.500
113057 18/02/2000 2111 103 ACI 4100X 24 600
113042 02/02/2000 2113 101 REI 2A44R 5 22.500
Pero no es posible utilizar una composición en una sentencia DELETE. El modo de manejar esta
petición es con una de las condiciones de búsqueda subconsulta. Por ejemplo:
32
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
− 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 clientes WHERE NOT EXISTS (SELECT * FROM pedidos WHERE clie=num_clie
AND fecha_pedido<’10/11/1999’) ;
33
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
En este caso, la sentencia UPDATE actualiza varias filas de una vez ya que la cláusula 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 acción será:
NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS
106 Jose Maldonado 52 11 VP Ventas 14/06/1998 NULL 25.000 32.958
104 Carlos Martinez 33 11 Dir. Ventas 19/05/1997 106 15.750 0
105 Belen Aguirre 37 13 Dir. Ventas 12/02/1998 104 30.000 39.327
109 Maria Garcia 31 11 Rep. Ventas 12/10/1999 106 27.500 7.105
108 Lorenzo Fernandez 62 21 Dir. Ventas 12/10/1999 106 30.000 58.533
102 Soledad Martinez 48 21 Rep. Ventas 10/12/1996 108 30.000 22.776
101 Daniel Gutierrez 45 11 Rep. Ventas 20/10/1996 104 24.750 26.628
110 Antonio Valle 41 NULL Rep. Ventas 13/01/2000 101 NULL 23.123
103 Pedro Cruz 29 11 Rep. Ventas 01/03/1997 104 22.500 2.700
107 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:
34
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Antes de la actualización, las oficinas de Toledo y Alicante tenían unos objetivos de 27.500 y
30.000 respectivamente, después de la actualización sus ventas son 27.500 y 30.000
respectivamente y no 40.000. La tabla queda entonces:
OFICINA CIUDAD REGION DIR OBJETIVO VENTAS
Esto es así porque el SQL calcula los valores 22 Toledo Centro 108 40.000 27.500
de las columnas sobre los datos que hay antes 11 Valencia Este 106 52.500 40.063
de aplicar ninguna de las partes de la 12 Barcelona Este 104 70.000 29.328
13 Alicante Este 105 40.000 30.000
modificación. 21 Madrid Centro 108 60.000 81.309
− Aumentar en 5000 el límite de crédito de cualquier cliente que haya remitido un pedido de más
de 25000.
35
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
− 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 número 105: 2111 EVBE S.A. 105 50.000
2102 Exclusivas del Este S.L. 101 65.000
2103 Pino S.L. 105 50.000
2123 Hnos. Martinez S.A. 105 40.000
UPDATE clientes SET 2107 Distribuciones Sur S.A. 110 35.000
rep_clie=105 WHERE rep_clie 2115 AFS S.A. 101 20.000
IN (SELECT num_empl FROM 2101 Exclusivas Soriano S.A. 106 65.000
repventas WHERE 2112 Lopez Asociados S.L. 108 50.000
ventas<(0.8*cuota) ; 2121 Hernandez & hijos S.L. 105 45.000
2114 Componentes Fernandez S.A. 105 20.000
2124 Domingo S.L. 107 40.000
2108 Zapater Importaciones S.A. 105 55.000
2117 Hnos. Ramon S.L. 106 35.000
2122 JPF S.L. 105 30.000
2120 Distribuciones Montiel S.L. 105 50.000
2106 Construcciones Leon S.A. 105 65.000
2119 Martinez & Garcia S.L. 105 25.000
2118 Exclusivas Norte S.A. 108 60.000
2113 Importaciones Martin S.L. 105 20.000
2109 Roda & Castedo S.L. 105 25.000
2105 MALB S.A. 101 45.000
Hasta el momento hemos visto la parte del SQL referente al LMD. Veamos ahora cómo podemos
actuar sobre la propia estructura de la BD. Estos cambios son manejados por un conjunto de
sentencias SQL denominadas como lenguaje de definición de datos. Estas sentencias permiten:
• Definir y crear una nueva tabla.
• Suprimir una tabla que ya no se necesita.
• Cambiar la definición 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 – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Para ver las posibilidades que tenemos al crear una nueva tabla dividiremos el proceso en 3 partes:
1. Definición de las columnas.
2. Definición de la clave primaria y las claves ajenas (si las hay).
3. Especificar restricciones de los datos.
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);
Hay que tener en cuenta que, si especificamos que una columa es clave primaria, mediante la
cláusula PRIMARY KEY, deberemos asegurar también 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 – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
Cuando el gestor de la base de datos procesa la sentencia CREATE TABLE, compara cada
definición de clave ajena con la definición de la tabla a la que referencia, asegurándose que la clave
ajena y la clave primaria de la tabla referenciada concuerden en el número 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 comparación tenga éxito. Si dos o más 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 todavía no
existe. En su lugar debe crearse la tabla sin definición de clave ajena y añadirle la clave ajena
posteriormente utilizando la sentencia ALTER TABLE para modificar la estructura de la tabla.
Supongamos que en la tabla de pedidos no permitiéramos una cantidad de producto igual a cero,
entonces la sentencia para la creación de la tabla sería:
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 creación de tablas, aunque no esté relacionado con nuestra base de
datos de ejemplo, supongamos que queremos crear una tabla LIBRO para almacenar información
referente a los libros en una BD. Pongámonos en el caso en que existe un atributo que es el “código
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 “código de universidad”
que nos referenciaría a la clave primaria de una tabla llamada UNIVERS. Supongamos además, que
nos informan de que existe una exclusividad en la edición de un libro por parte de una editorial o de
una universidad. Esta restricción debe tenerse en cuenta a la hora de crear la tabla y para ello
usaremos la cláusula CHECK. La forma de expresarlo sería:
Adicionalmente podríamos añadir otros tipos de comprobaciones como por ejemplo, comprobar que
el tipo de encuadernación del libro solo puede ser o normal o de bolsillo o rústica. Esto se haría
incluyendo en la tabla LIBRO la siguiente condición: CHECK(Tipo_encuadernacion IN (‘normal’,
‘de bolsillo’, ‘rustica’)).
38
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
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.
En el caso del SQL, el sistema cuenta con dos mecanismos diferentes implicados en el
mantenimiento de la seguridad: el sistema de gestión de vistas, y el subsistema de autorización 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 sólo veremos por encima el caso de las vistas.
En SQL, una vista es una tabla virtual en la base de datos cuyos contenidos están 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 través 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
través de un pequeño conjunto de vistas que contienen los datos específicos 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 – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
• Simplicidad estructurada. Las vistas pueden dar a un usuario una visión "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 través de una vista, el gestor de la
base de datos puede comprobar automáticamente los datos para asegurarse que satisfacen
restricciones de integridad específicas.
Sin embargo, las vistas presentan también 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 actualización. Cuando un usuario trata de actualizar filas de una vista, el
gestor de la base de datos debe traducir la petición a una actualización 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 lograr esto se pueden definir dos vistas de forma que permita a cada director ver tan solo los
vendedores de su región. Vamos a crear la vista con los vendedores de la zona Este y después la
vista los vendedores de la zona Centro.
CREATE VIEW repeste AS SELECT * FROM repventas WHERE oficina_rep IN (11, 12, 13) ;
NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS
106 Jose Maldonado 52 11 VP Ventas 14/06/1998 NULL 25.000 32.958
104 Carlos Martinez 33 12 Dir. Ventas 19/05/1997 106 17.500 0
105 Belen Aguirre 37 13 Dir. Ventas 12/02/1998 104 30.000 39.327
109 Maria Garcia 31 11 Rep. Ventas 12/10/1999 106 27.500 7.105
101 Daniel Gutierrez 45 12 Rep. Ventas 20/10/1996 104 27.500 26.628
103 Pedro Cruz 29 12 Rep. Ventas 01/03/1997 104 25.000 2.700
CREATE VIEW repcentro AS SELECT * FROM repventas WHERE oficina_rep IN (21, 22) ;
NUM_EMPL NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS
108 Lorenzo Fernandez 62 21 Dir. Ventas 12/10/1999 106 30.000 58.533
102 Soledad Martinez 48 21 Rep. Ventas 10/12/1996 108 30.000 22.776
107 Natalia Martin 49 22 Rep. Ventas 14/11/1998 108 27.500 34.432
− Creación de una vista que contiene únicamente las oficinas de la región Este:
40
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
− Creación de una vista que muestra aquellos clientes que tiene más 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 EMPRESA REP_CLIE LIMITE_CREDITO
2117 Hnos. Ramon S.L. 106 35.000
2112 Lopez Asociados S.L. 108 50.000
2103 Pino S.L. 105 50.000
2109 Roda & Castedo S.L. 103 25.000
− Hacer que el departamento de procesamiento de NUM_EMPL NOMBRE OFICINA_REP
pedidos solo pueda acceder al número de 106 Jose Maldonado 11
empleado, su nombre y la asignación de oficina 104 Carlos Martinez 12
105 Belen Aguirre 13
de cada vendedor, pues es información 109 Maria Garcia 11
necesaria para procesar correctamente el 108 Lorenzo Fernandez 21
pedido, pero no hay necesidad de que acceda al 102 Soledad Martinez 21
total de ventas realizadas o a la cuota. 101 Daniel Gutierrez 12
110 Antonio Valle NULL
CREATE VIEW inforep AS SELECT num_empl, 103 Pedro Cruz 12
nombre, oficina_rep FROM repventas ; 107 Natalia Martin 22
− Creación una vista de la tabla OFICINAS. OFICINA CIUDAD REGION
CREATE VIEW infooficina AS SELECT oficina, ciudad, region 22 Toledo Centro
FROM oficinas ; 11 Valencia Este
12 Barcelona Este
EMPRESA REP_CLIE
13 Alicante Este
EVBE S.A. 103
21 Madrid Centro
Exclusivas del Este S.L. 101
Pino S.L. 105
Hermanos Martinez S.A. 102 − Creación de una vista de la tabla CLIENTES.
Distribuciones Sur S.A. 110
CREATE VIEW infoclie AS SELECT empresa, rep_clie FROM
AFS S.A. 101
Exclusivas Soriano S.A. 106
clientes ;
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
41
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
− Creación de una vista que contiene el número de cliente, el nombre de la empresa y el limite de
crédito para los clientes de Belen Aguirre (empleado número 105).
CREATE VIEW cliebill AS SELECT num_clie, NUM_CLIE EMPRESA LIMITE_CREDITO
empresa, limite_credito FROM clientes WHERE 2103 Pino S.L. 50.000
2122 JPF S.L. 30.000
rep_clie=105 ;
QUIEN CUANTOS TOTAL INF SUP MEDIO
− Creación de una vista que contiene datos 106 2 32.958 1.458 31.500 16.479,00
sumarios de los pedidos para cada 105 5 39.327 702 27.500 7.865,40
vendedor. 108 7 58.633 652 45.000 8.376,14
101 3 26.628 150 22.500 8.876,00
CREATE VIEW ped_por_rep(quien, cuantos, 110 2 23.132 632 22.500 11.566,00
total, inf, sup, medio) AS SELECT rep, 109 2 7.105 1.480 5.625 3.552,50
COUNT(*), SUM(importe), MIN(importe), 107 3 34.432 652 31.350 11.477,33
MAX(importe), AVG(importe) FROM pedidos 102 4 22.776 1.896 15.000 5.694,00
103 2 2.700 600 2.100 1.350,00
GROUP BY rep ;
NOMBRE CUANTOS TOTAL MEDIO
Lorenzo Fernandez 7 58.633 8.376,14 − Datos sumarios de los vendedores obtenidos a
Belen Aguirre 5 39.327 7.865,40
Natalia Martin 3 34.432 11.477,33
partir de la vista PED_POR_REP.
Jose Maldonado 2 32.958 16.479,00 SELECT nombre, cuantos, total, medio FROM
Daniel Gutierrez 3 26.628 8.876,00 repventas, ped_por_rep WHERE quien=num_empl
Antonio Valle 2 23.132 11.566,00 ORDER BY total DESC ;
Soledad Martinez 4 22.776 5.694,00
Maria Garcia 2 7.105 3.552,50
Pedro Cruz 2 2.700 1.350,00
42
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
La vista hace mucho más fácil de examinar lo que sucede en la consulta que si fuera expresada
como la composición equivalente de tres tablas.
Dado el siguiente diagrama de una base de datos y las relaciones mostradas a continuación:
OFICINAS
DPTOFICINAS
DPTOFICINAS oficina CODIGO OFICINA DEPARTAMENTO TELEFONO
codigo ciudad
region
100 11 1 963.981.000
oficina 101 11 2 963.981.100
departamento 102 11 3 963.981.200
telefono 103 11 4 963.981.300
DEPARTAMENTOS
104 11 5 963.981.400
deptno 105 12 2 933.551.000
EMPLEADOS nombre 106 12 3 933.551.100
num 107 12 4 933.551.200
nombre CATEGORIAS 108 13 3 961.671.000
edad 109 21 2 913.641.000
categoria
departamento 110 21 3 913.641.100
titulo
categoria
salario
111 21 4 913.641.200
contrato trienio 112 22 3 925.871.000
EMPLEADOS
NUM NOMBRE EDAD DEPARTAMENTOCATEGORÍACONTRATO
1000 Antonio Gutierrez 45 100 1 12/01/1989 DEPARTAMENTOS
1001 Paloma Blanco 56 100 2 17/03/1992 DEPTNO NOMBRE
1002 Antonio Pazos 52 100 3 14/03/1986 1 Dirección
1003 Ana Garcia 27 101 2 23/10/1995 2 Administración
1004 Amparo Beltran 28 101 3 04/02/1998 3 Comercial
1005 Enrique Gomez 36 101 3 05/07/2000 4 Almacén
1006 Nieves Soler 25 105 2 13/03/1996 5 Informática
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 OFICINAS
1010 Vicente Salvador 29 109 3 08/07/1995 OFICINA CIUDAD REGION
1011 Carmen Hernandez44 102 2 16/07/1990 11 Valencia Este
1012 Juan Pons 50 102 4 14/04/1994 12 Barcelona Este
1013 Pedro Fernandez 23 102 4 16/09/1999 13 Alicante Este
1014 Silvia Blasco 33 102 4 23/02/1992 21 Madrid Centro
1015 Jose Alegre 26 106 2 26/08/1997 22 Toledo Centro
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 CATEGORÍAS
1020 Jose Perez 28 110 2 22/03/1996 CATEGORIA TITULO SALARIO TRIENIO
1021 Alejandro Martos 34 110 4 17/10/1994 1 Director 50.000 1.000
1022 Veronica Muelas 25 110 4 05/07/1997 2 Jefe Sección 40.000 800
1023 Elena Lopez 29 112 4 09/07/1994 3 Administrativo 35.000 700
1024 Isabel Fernandez 22 112 4 12/10/2000 4 Comercial 35.000 700
1025 Jose Mujica 49 103 2 04/09/1987 5 Empl. almacén 25.000 500
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
43
14748 - Bases de Datos – Biblioteconomía. 2003-2004 Tema 5: Lenguajes de Consulta. SQL.
(#)
El dinero recibido por los trienios se calcula en base a la fórmula:
trienio*((fecha_actual-fecha_del_contrato)/(365*3))
44