You are on page 1of 44

14748 - Bases de Datos Biblioteconoma.

2003-2004

Tema 5: Lenguajes de Consulta. SQL.

TEMA 5: Lenguajes de consulta. SQL.


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

Sentencias de definicin de datos (Data Definition Language) que proporcionan las rdenes para definir o modificar esquemas de relacin, eliminar relaciones y crear ndices. Algunos ejemplos de sentencias son las de tipo CREATE y DROP. Sentencias de manipulacin de datos (Data Manipulation Language) que nos permiten realizar consultas y mantener los datos es decir; insertar, suprimir o modificar los datos. Comienzan con las siguientes palabras del lenguaje: SELECT, INSERT, UPDATE y DELETE.

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

A continuacin se muestra el ejemplo de base de datos relacional con el que vamos a trabajar durante todo el tema y en base al cual mostraremos los diferentes ejemplos de sentencias SQL.
OFICINAS oficina ciudad region dir objetivo ventas REPVENTAS num_empl nombre edad oficina_rep titulo contrato director cuota ventas PRODUCTOS id_fab id_producto descripcion precio existencias

CLIENTES num_clie empresa rep_clie limite_credito

PEDIDOS num_pedido fecha_pedido clie rep fab producto cant importe

OFICINA 22 11 12 13 21

CIUDAD Toledo Valencia Barcelona Alicante Madrid

REGION Centro Este Este Este Centro

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

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

La relacin CLIENTES almacena datos acerca de cada cliente, tales como el nombre de la empresa, el lmite de crdito y el vendedor que atiende al cliente.
NUM_CLIE 2111 2102 2103 2123 2107 2115 2101 2112 2121 2114 2124 2108 2117 2122 2120 2106 2119 2118 2113 2109 2105 EMPRESA REP_CLIE LIMITE_CREDITO EVBE S.A. 103 50.000 Exclusivas del Este S.L. 101 65.000 Pino S.L. 105 50.000 Hnos. Martinez S.A. 102 40.000 Distribuciones Sur S.A. 110 35.000 AFS S.A. 101 20.000 Exclusivas Soriano S.A. 106 65.000 Lopez Asociados S.L. 108 50.000 Hernandez & hijos S.L. 103 45.000 Componentes Fernandez S.A. 102 20.000 Domingo S.L. 107 40.000 Zapater Importaciones S.A. 109 55.000 Hnos. Ramon S.L. 106 35.000 JPF S.L. 105 30.000 Distribuciones Montiel S.L. 102 50.000 Construcciones Leon S.A. 102 65.000 Martinez & Garcia S.L. 109 25.000 Exclusivas Norte S.A. 108 60.000 Importaciones Martin S.L. 104 20.000 Roda & Castedo S.L. 103 25.000 MALB S.A. 101 45.000

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

La relacin PEDIDOS lleva la cuenta de cada pedido remitido por un cliente, identificando al vendedor que acept el pedido, el producto solicitado, la cantidad y el importe del pedido, etc. Por simplicidad, cada pedido atae a un solo producto.
NUM_PEDIDO 112961 113012 112989 113051 112968 110036 113045 112963 113013 113058 112997 112983 113024 113062 112979 113027 113007 113069 113034 112992 112975 113055 113048 112993 113065 113003 113049 112987 113057 113042 ID_FAB REI ACI QSA BIC IMM ACI ACI BIC IMM QSA REI FEA IMM BIC ACI IMM ACI QSA ACI REI IMM ACI FEA IMM REI ID_PRODUCTO 2A45C 4100Y XK47 41672 779C 41003 41004 41003 887P XK48 2A44L 112 887H 41089 41001 775C 4100Z XK48A 41002 2A44R 773C 4100X 114 887X 2A44G FECHA_PEDIDO 17/12/1999 11/01/2000 03/01/2000 10/02/2000 12/10/1999 30/01/2000 02/02/2000 17/12/1999 14/01/2000 23/02/2000 08/01/2000 27/12/1999 20/01/2000 24/02/2000 12/10/1999 22/02/2000 08/01/2000 02/03/2000 29/01/2000 04/11/1999 12/10/1999 15/02/2000 10/02/2000 04/01/2000 27/02/2000 25/01/2000 10/02/2000 31/12/1999 18/02/2000 02/02/2000 CLIE 2117 2111 2101 2118 2102 2107 2112 2103 2118 2108 2124 2103 2114 2124 2114 2103 2112 2109 2107 2118 2111 2108 2120 2106 2106 2108 2118 2103 2111 2113 REP 106 105 106 108 101 110 108 105 108 109 107 105 108 107 102 105 108 107 110 108 103 101 102 102 102 109 108 105 103 101 FAB REI ACI FEA QSA ACI ACI REI ACI BIC FEA BIC ACI QSA FEA ACI ACI IMM IMM REI ACI REI ACI IMM REI QSA IMM QSA ACI ACI REI PRODUCTO CANT IMPORTE 2A44L 7 31.500 41003 35 3.745 114 6 1.458 XK47 4 1.420 41004 34 3.978 4100Z 9 22.500 2A44R 10 45.000 41004 28 3.276 41003 1 652 112 10 1.480 41003 1 652 41004 6 702 XK47 20 7.100 114 10 2.430 4100Z 6 15.000 41002 54 4.104 773C 3 2.825 775C 22 31.350 2A45C 8 632 41002 10 760 2A44G 6 2.100 4100X 6 150 779C 2 3.750 2A45C 24 1.896 XK47 6 2.130 779C 3 5.625 XK47 2 776 4100Y 11 27.500 4100X 24 600 2A44R 5 22.500

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

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

La relacin REPVENTAS almacena el nmero de empleado, el nombre, la edad, las ventas anuales hasta la fecha y otros datos referentes a cada vendedor.
NUM_EMPL 106 104 105 109 108 102 101 110 103 107 NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA Jose Maldonado 52 11 VP Ventas 14/06/1998 NULL 25.000 Carlos Martinez 33 12 Dir. Ventas 19/05/1997 106 17.500 Belen Aguirre 37 13 Dir. Ventas 12/02/1998 104 30.000 Maria Garcia 31 11 Rep. Ventas 12/10/1999 106 27.500 Lorenzo Fernandez 62 21 Dir. Ventas 12/10/1999 106 30.000 Soledad Martinez 48 21 Rep. Ventas 10/12/1996 108 30.000 Daniel Gutierrez 45 12 Rep. Ventas 20/10/1996 104 27.500 Antonio Valle 41 NULL Rep. Ventas 13/01/2000 101 NULL Pedro Cruz 29 12 Rep. Ventas 01/03/1997 104 25.000 Natalia Martin 49 22 Rep. Ventas 14/11/1998 108 27.500 VENTAS 32.958 0 39.327 7.105 58.533 22.776 26.628 23.123 2.700 34.432

2. Tipos de dominios en SQL


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

Los tipos CHAR y VARCHAR se usan para definir cadenas de texto genricas, y puede contener caracteres con cualquier valor ASCII. El nmero mximo de caracteres que admiten es 255. La diferencia entre ambos es que mientras CHAR proporciona un tamao fijo para una cadena, VARCHAR admite una cantidad variable de caracteres. La sintaxis para este tipo es CHAR(n) o VARCHAR(n), donde n indica la longitud. Sus contenidos se especifican entre comillas simples. Ejemplo: Hola, 09-MAR-98, Jackie, s. 2.2. INTEGER Sus valores son nmeros enteros, positivos o negativos. Normalmente, con este tipo se pueden definir todos los nmeros enteros entre 2147483648 y 2147483647, aunque en realidad los lmites vienen definidos por la mquina. 2.3. FLOAT Sus valores representan nmeros en coma flotante, es decir, nmeros positivos o negativos que pueden tener decimales. La sintaxis para este tipo es FLOAT(n), donde n es la precisin que como mnimo se desea que tenga el nmero. 2.4. DATE Se usa para almacenar informacin de una fecha. Son validas todas las fechas del calendario gregoriano, empezando en el da 1 de Enero del ao 1 y terminando el 31 de Diciembre del ao 9999, ambos inclusive. Se representa en formato da, mes y ao (dd/mm/aaaa). 2.5. 2.6. TIME NULL Representa una hora determinada con precisin de segundos (HH:MM:SS). No se trata de un tipo de datos concreto. Es ms bien un valor que indica la ausencia de cualquier valor. Por ejemplo, en una columna de tipo numrico el valor nulo no es lo mismo que el valor cero, o en una columna de tipo alfanumrico, el nulo no es lo mismo que blanco o que el valor vaco (longitud cero). Para comparar valores con NULL slo podremos usar los operadores IS NULL o IS NOT NULL.

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

3.1.

Las clusulas SELECT / FROM

La clusula SELECT que inicia cada sentencia especifica la lista de atributos de los datos que queremos recuperar en la consulta. Corresponde con la operacin de proyeccin del lgebra relacional. Para especificar la lista de elementos seleccionados podemos escribir cualquiera de los elementos siguientes teniendo en cuenta que, si hay ms de uno, estarn separados por comas. El nombre de una columna, que har referencia a un atributo de la tabla que especifiquemos en la clusula FROM. Ms adelante veremos que, en determinadas ocasiones, al tener ms de una tabla en la clusula FROM necesitaremos adems especificar el nombre de la tabla a la que pertenece dicho atributo escrito de la siguiente forma: mi_tabla.atributo_seleccionado El valor *, para indicar que se desea informacin de todas las columnas que forman la tabla. Una constante, especificando que el valor constante va a aparecer en todas las filas de los resultados de la consulta. O una expresin SQL, indicando que SQL debe calcular el valor a colocar en los resultados segn el estilo especificado por la expresin, por ejemplo: AVG .Esto lo veremos ms adelante.

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

Dando como resultado una tabla de tres columnas (hemos seleccionado 3 atributos) y diez filas (ya que hay diez vendedores) que es la tabla de la derecha.

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

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

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

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

REGION Centro Este Este Este Centro

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

Conceptualmente, SQL efecta esta consulta generando primero un conjunto completo de resultados (cinco filas) y eliminando luego las filas que son duplicados exactos de alguna otra para formar los resultados finales. Si se omite la palabra DISTINCT, SQL no elimina filas duplicadas. Tambin se puede especificar la palabra clave ALL para indicar que las filas duplicadas sean mostradas, pero es innecesario ya que ste es el comportamiento por defecto. Veamos algunos ejemplos muy sencillos usando las clusulas SELECT / FROM: Lista de la poblacin, regin y ventas de cada oficina de ventas:
SELECT ciudad, region, ventas FROM oficinas ;
CIUDAD Toledo Valencia Barcelona Alicante Madrid REGION VENTAS Centro 34.432 Este 40.063 Este 29.328 Este 39.327 Centro 81.309

Lista de la ciudad, regin y el resultado de ventas para cada oficina:


SELECT ciudad, region, (ventas-objetivo) FROM oficinas;

CIUDAD Toledo Valencia Barcelona Alicante Madrid

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

Resultado de elevar la cuota de ventas un 3% a cada vendedor:


SELECT nombre, cuota, (cuota+(0.03*ventas)) FROM repventas ;

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Valor del inventario de cada ID_FAB ID_PRODUCTO DESCRIPCION EXISTENCIAS*PRECIO producto: REI 2A45C V Stago Trinquete 16.590
SELECT id_fab, id_producto, descripcion, (existencias*precio) FROM productos ;
ACI QSA BIC IMM ACI ACI BIC IMM QSA REI FEA IMM BIC ACI IMM ACI QSA ACI REI IMM ACI FEA IMM REI 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

Mes y ao de contrato de cada vendedor:


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

Lista de ventas para cada ciudad:


CIUDAD Toledo Valencia Barcelona Alicante Madrid tiene ventas de VENTAS tiene ventas de 34.432 tiene ventas de 40.063 tiene ventas de 29.328 tiene ventas de 39.327 tiene ventas de 81.309

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

SELECT ciudad, tiene ventas de, ventas FROM oficinas ;

Todos los datos de la tabla oficinas:


SELECT * FROM oficinas ;

OFICINA 22 11 12 13 21

CIUDAD Toledo Valencia Barcelona Alicante Madrid

REGION Centro Este Este Este Centro

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

3.2.

La clusula WHERE

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL. CIUDAD VENTAS OBJETIVO Toledo 34.432 27.500 Alicante 39.327 30.000 Madrid 81.309 60.000 NOMBRE VENTAS CUOTA Belen Aguirre 39.327 30.000 NOMBRE VENTAS Belen Aguirre 39.327 Daniel Gutierrez 26.628 Pedro Cruz 2.700

SELECT ciudad, ventas, objetivo FROM oficinas WHERE ventas>objetivo ;

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


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

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


SELECT nombre, ventas FROM repventas WHERE director=104 ;

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

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


La condicin de bsqueda ms comn utilizada en una consulta SQL es la de comparacin. SQL calcula y compara los valores de dos expresiones SQL por cada fila de datos. Las expresiones pueden ser tan simples como un nombre de columna o una constante, o pueden ser expresiones aritmticas ms complejas. Hay seis modos de comparar dos expresiones (=, <>, <, <=, >, >=). Veamos algunos ejemplos: Lista de los vendedores contratados antes de 1998:
SELECT nombre FROM repventas WHERE contrato<01/01/1998 ;
NOMBRE Carlos Martinez Soledad Martinez Daniel Gutierrez Pedro Cruz

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL. CIUDAD Valencia Barcelona Alicante REGION Este Este Este

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


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

La condicin de comparacin ms habitual es la que comprueba si el valor de una columna es igual a cierta constante. Cuando la columna es clave primaria, la condicin asla una sola fila de la tabla produciendo una sola fila de resultados, como por ejemplo el caso de Seleccionar el nombre y lmite de crdito del cliente nmero 2107:
SELECT empresa, limite_credito FROM clientes WHERE num_clie=2107 ;
EMPRESA LIMITE_CREDITO Distribuciones Sur S.A. 35.000

Recordemos que SQL trata el valor NULL como valor desconocido, por lo que si tratamos de hacer una comparacin con un valor nulo, esa tupla no ser devuelta en la consulta. Por ejemplo: Lista de vendedores que superan sus cuotas:
SELECT nombre FROM repventas WHERE ventas>cuota ;
NOMBRE Jose Maldonado Belen Aguirre Lorenzo Fernandez Natalia Martin

Lista de vendedores que no superan sus cuotas:


SELECT nombre FROM repventas WHERE ventas<=cuota ;

NOMBRE Carlos Martinez Maria Garcia Soledad Martinez Daniel Gutierrez Pedro Cruz

Condiciones de rango (BETWEEN)


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

Pedidos que caen en un determinado rango de importe:


NUM_PEDIDO IMPORTE 110036 22.500 112987 27.500 113042 22.500

SELECT num_pedido, importe FROM pedidos WHERE importe BETWEEN 20000.00 AND 29999.99 ;

La versin negada del test de rango, NOT BETWEEN, comprueba los valores que caen fuera del rango. Por ejemplo: Lista de vendedores cuyas ventas no estn entre el 75 y el NOMBRE Carlos Martinez 150% de su cuota:
SELECT nombre, ventas, cuota FROM repventas WHERE ventas NOT BETWEEN (0.75*cuota) AND (1.50*cuota) ;
VENTAS CUOTA 0 17.500 Maria Garcia 7.105 27.500 Lorenzo Fernadez 58.533 30.000 Pedro Cruz 2.700 25.000

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Condiciones de pertenencia a un conjunto (IN)


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

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


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

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

SELECT nombre, cuota, ventas FROM repventas WHERE oficina_rep IN (11,13,22) ;

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

Condiciones de correspondencia con un patrn (LIKE)


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

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

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

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


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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL. NOMBRE Antonio Valle NOMBRE

Decir que vendedores an no tienen asignada una oficina:


SELECT nombre FROM repventas WHERE oficina_rep IS NULL ;

La forma IS NOT NULL encuentra las filas que no contienen un valor NULL. Jose Maldonado Por ejemplo: Carlos Martinez Listar los vendedores que tienen asignada una oficina:
SELECT nombre FROM repventas WHERE oficina_rep IS NOT NULL ;
Belen Aguirre Maria Garcia Lorenzo Fernandez Soledad Martinez Daniel Gutierrez Pedro Cruz Natalia Martin

Operadores para las bsquedas (AND / OR / NOT)


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

El operador OR se utiliza para combinar dos condiciones de bsqueda cuando una u otra (o ambas) deban ser ciertas. Por ejemplo, decir los vendedores que estn por debajo de la cuota o con ventas inferiores a 30000: NOMBRE CUOTA VENTAS
SELECT nombre, cuota, ventas FROM repventas WHERE ventas<cuota OR ventas<30000.00 ;
Carlos Martinez Maria Garcia Soledad Martinez Daniel Gutierrez Antonio Valle Pedro Cruz 17.500 27.500 30.000 27.500 NULL 25.000 0 7.105 22.776 26.628 23.123 2.700

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

NOMBRE CUOTA VENTAS Carlos Martinez 17.500 0 Pedro Cruz 25.000 2.700

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

11

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

Si la columna de resultados de la consulta (que se utiliza para ordenacin) es una columna calculada, no tiene nombre de columna que se pueda emplear en una especificacin de ordenacin. En este caso, debe especificarse un nmero de columna en lugar de un nombre o bien darle un nombre a la columna mediante la palabra clave AS. Veamos ambos casos con el siguiente ejemplo: Lista de las oficinas clasificadas en orden descendente de CIUDAD REGION VENTAS rendimiento de ventas:
SELECT ciudad, region, (ventas-objetivo) FROM oficinas ORDER BY 3 DESC ; SELECT ciudad, region, (ventas-objetivo) AS ventas FROM oficinas ORDER BY ventas DESC ;
Madrid Alicante Toledo Valencia Barcelona Centro Este Centro Este Este 21.309 9.327 6.932 -12.437 -40.672

3.4.

La clusula UNION y la clusula INTERSECT

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Anlogamente, la segunda parte de la peticin puede satisfacerse con la FAB PRODUCTO consulta, productos de los cuales se ha hecho un pedido mayor de 30000:
SELECT DISTINCT fab, producto FROM pedidos WHERE importe>30000 ;
IMM 775C REI 2A44L REI 2A44R

La unin de ambas consultas nos dar como resultado la consulta original, y se realiza de la siguiente forma: ID_FAB ID_PRODUCTO
SELECT id_fab, id_producto FROM productos WHERE precio>2000 UNION SELECT DISTINCT fab, producto FROM pedidos WHERE importe>30000 ;
ACI ACI IMM REI REI 4100Y 4100Z 775C 2A44L 2A44R

Para poder realizar una unin existen varias restricciones: Ambas tablas deben contener el mismo nmero de columnas. El tipo de datos de cada columna en la primera tabla debe ser el mismo que el tipo de datos en la columna correspondiente en la segunda tabla. Ninguna de las dos tablas puede estar ordenadas con la clusula ORDER BY. Puede observarse que la UNION combina las filas de los dos conjuntos de resultados eliminando por defecto las filas duplicadas. Si se desean mantener las filas duplicadas en una operacin UNION, se puede especificar la palabra clave ALL a continuacin de la palabra UNION. Por ejemplo, veamos el resultado de la unin de las consultas anteriores conservando las filas repetidas:
SELECT id_fab, id_producto FROM productos WHERE precio>2000 UNION ALL SELECT DISTINCT fab, producto FROM pedidos WHERE importe>30000 ;
ID_FAB ACI REI ACI REI IMM REI REI ID_PRODUCTO 4100Y 2A44L 4100Z 2A44R 775C 2A44L 2A44R

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

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

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

ID_FAB ID_PRODUCTO REI 2A44L REI 2A44R

13

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

4. Consultas multitabla (composiciones)


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

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

Como puede observarse, SQL no requiere que las columnas de emparejamiento sean incluidas en los resultados de la consulta multitabla. Normalmente se omiten pues las claves primarias y las claves ajenas suelen ser nmeros de identificacin difciles de recordar y poco descriptivos.

Lista de los vendedores de las oficinas con objetivo igual o superior a 60000, dando la ciudad y regin donde trabajan:
SELECT nombre, ciudad, region FROM repventas, oficinas WHERE oficina_rep=oficina AND objetivo>=60000 ;
NOMBRE Carlos Martinez Lorenzo Fernandez Soledad Martinez Daniel Gutierrez Pedro Cruz CIUDAD Barcelona Madrid Madrid Barcelona Barcelona REGION Este Centro Centro Este Este

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

SELECT num_pedido, importe, descripcion FROM pedidos, productos WHERE fab=id_fab AND producto=id_producto ;

La tabla PEDIDOS y la tabla PRODUCTOS de la base de datos ejemplo estn relacionadas por un par de claves ajena/primaria. Las columnas FAB y PRODUCTO de la tabla PEDIDOS forman juntas una clave ajena para la tabla PRODUCTOS, que se emparejan con las columnas ID_FAB e ID_PRODUCTO, respectivamente. Por tanto, para componer las tablas deben especificarse ambos pares de columnas de emparejamiento.

Este tipo de composiciones son menos habituales y se encuentran generalmente en consultas que afectan a claves ajenas compuestas.

15

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL. NOMBRE Jose Maldonado Lorenzo Fernandez Natalia Martin Belen Aguirre

Lista de los pedidos superiores a 25000, incluyendo el nombre del vendedor que tom el pedido y el nombre del cliente que lo solicit.

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.

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

SQL puede combinar datos de tres o ms tablas utilizando las mismas tcnicas bsicas utilizadas para las consultas de dos tablas. Esta consulta utiliza dos claves ajenas de la tabla PEDIDOS. La columna CLIE es una clave ajena para la tabla CLIENTES, que enlaza cada pedido con el cliente que lo remiti. La columna REP es una clave ajena para la tabla REPVENTAS, que enlaza cada pedido con el vendedor que lo acept. Lista de los pedidos superiores a 25000, incluyendo el nombre del cliente que remiti el pedido y el nombre del vendedor asignado a ese cliente.
NUM_PEDIDO IMPORTE EMPRESA 112961 31.500 Hnos. Ramon S.L. 113045 45.000 Lopez Asociados S.L. 113069 31.350 Roda & Castedo S.L. 112987 27.500 Pino S.L. NOMBRE Jose Maldonado Lorenzo Fernandez Pedro Cruz Belen Aguirre

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

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

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

NOMBRE Jose Maldonado Lorenzo Fernandez Pedro Cruz Belen Aguirre

CIUDAD Valencia Madrid Barcelona Alicante

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

Ver los pedidos recibidos en los NUM_PEDIDO IMPORTE FECHA_PEDIDO NOMBRE das en que un vendedor fue 112968 3.978 12/10/1999 Maria Garcia contratado. 112979 15.000 12/10/1999 Maria Garcia
SELECT num_pedido, importe, fecha_pedido, nombre FROM pedidos, repventas WHERE fecha_pedido=contrato ;
112975 112968 112979 112975 2.100 3.978 15.000 2.100 12/10/1999 12/10/1999 12/10/1999 12/10/1999 Maria Garcia Lorenzo Fernandez Lorenzo Fernandez Lorenzo Fernandez

SQL no exige que las columnas de emparejamiento estn relacionadas como clave primaria y clave ajena. Cualquier par de columnas de dos tablas pueden servir de columnas de emparejamiento, siempre que tengan tipos de datos comparables, tal y como se ha mostrado en este ejemplo. Lista los vendedores y oficinas donde la cuota del vendedor es superior al 50% del objetivo de la oficina. NOMBRE CUOTA CIUDAD OBJETIVO
SELECT nombre, cuota, ciudad, objetivo FROM repventas, oficinas WHERE oficina_rep=oficina AND cuota>(0.5*objetivo) ;
Belen Aguirre Maria Garcia Natalia Martin 30.000 Alicante 27.500 Valencia 27.500 Toledo 30.000 52.500 27.500

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL. 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

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


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

En este ejemplo, los nombres cualificados de las dos columnas VENTAS son OFICINAS.VENTAS y REPVENTAS.VENTAS, esto es, el nombre de la tabla seguido por el nombre de la columna.

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

106 104 105 109 108 102 101 103 107

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

52 33 37 31 62 48 45

11 12 13 11 21 21 12 12 22

Pedro Cruz 29 Natalia Martin 49

VP Ventas Dir. Ventas Dir. Ventas Rep. Ventas Dir. 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/1995 20/10/1996 01/03/1997 14/11/1998

NULL 106 104 106 106 108 104 104 108

25.000 32.958 17.500 0

11 12 13 11 21 21 12 12 22

Valencia

Este 106 52.500

40.063 29.328 39.327 40.063 81.309 81.309 29.328 29.328 34.432

Barcelona Este 104 70.000 Alicante Valencia Este 105 30.000 Este 106 52.500

30.000 39.327 27.500 7.105 30.000 58.533 30.000 22.776 27.500 26.628 25.000 2.700 27.500 34.432

Madrid Centro 108 60.000 Madrid Centro 108 60.000 Barcelona Este 104 70.000 Barcelona Este 104 70.000 Toledo Centro 108 27.500

En una consulta multitabla, el asterisco selecciona todas las columnas de todas las tablas listadas en la clusula FROM. La ltima consideracin que nos queda en este apartado de consultas multitabla es que, en ocasiones, nos interesan consultas que afectan a una relacin que una tabla tiene consigo misma. Por ejemplo, supongamos que se desea listar los nombres de todos los vendedores y sus directores. Cada vendedor aparece como una fila en la tabla REPVENTAS, y la columna DIRECTOR contiene el nmero de empleado del director del vendedor. Por ello, la columna DIRECTOR es una clave ajena para la propia tabla REPVENTAS. Si se tratara de expresar esta consulta como cualquier otra consulta de dos tablas implicando una coincidencia clave ajena/clave primaria:
SELECT nombre, nombre FROM repventas, repventas WHERE director=num_empl ;

aparecera un error del tipo Referencia duplicada a la tabla repventas. Frente a esto, podramos pensar que la solucin est en eliminar la segunda NOMBRE NOMBRE referencia a la tabla REPVENTAS, haciendo:
SELECT nombre, nombre FROM repventas WHERE director=num_empl ;

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

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

En este ejemplo no sera realmente necesario utilizar dos alias, uno para cada tabla de la consulta, podramos haber usado solo uno, quedando la consulta como:
SELECT repventas.nombre, dirs.nombre FROM repventas, repventas dirs WHERE repventas.director=dirs.num_empl ;

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


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

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

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

puede escribirse como:


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

5. Consultas sumarias y funciones de agregacin


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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

5.1.

Clculo del total de una columna (SUM)

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

Total de pedidos aceptados por el empleado Belen Aguirre.


SELECT SUM(importe) FROM pedidos, repventas WHERE nombre=Belen Aguirre AND rep=num_empl ;

5.2.

Clculo del promedio de una columna (AVG)

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

Precio medio del pedido ordenado por el cliente 2103.


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

5.3.

Determinacin de los valores extremos (MIN y MAX)

Las funciones MIN() y MAX() determinan los valores menor y mayor de una columna, respectivamente. Los datos de la columna pueden contener informacin numrica, de cadena o de fecha/hora. El resultado de la funcin MIN() y MAX() tiene exactamente el mismo tipo de dato que los datos de la columna. Veamos algunos ejemplos: Cuotas mnima y mxima asignadas a los vendedores.
SELECT MIN(cuota), MAX(cuota) FROM repventas ;
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

Fecha del pedido ms antiguo en la base de datos.


SELECT MIN(fecha_pedido) FROM pedidos ;

Mejor rendimiento de todos los vendedores. SELECT MAX(100*ventas/cuota) FROM repventas ; Primer y ltimo vendedor por orden alfabtico. SELECT MIN(nombre), MAX(nombre) FROM repventas ;

5.4.

Cuenta de valores de datos (COUNT)

La funcin COUNT() cuenta el nmero de valores de datos que hay en una columna. Los datos de la columna pueden ser de cualquier tipo. La funcin COUNT() devuelve siempre un entero, independientemente del tipo de datos de la columna. Algunos ejemplos son: Decir el nmero de clientes. SELECT COUNT(num_clie) FROM clientes ;
COUNT(NUM_CLIE) 21 19

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

COUNT(NOMBRE) 4 COUNT(IMPORTE) 4

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

5.5.

Funciones de agregacin en la lista de seleccin

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

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

5.6.

Valores NULL y funciones de columna

Las funciones de agregacin SUM(), AVG(), MIN(), MAX() y COUNT() aceptan cada una de ellas una columna de valores de datos como argumento y producen un nico valor como resultado. Sin embargo, dicha columna puede contener valores NULL. En tal caso, los valores NULL son ignorados por las funciones de agregacin. Veamos un ejemplo: Ejemplo de funciones de columna con valores NULL. SELECT COUNT(*), COUNT(ventas), COUNT(cuota) FROM repventas ;
COUNT(*) COUNT(VENTAS) COUNT(CUOTA) 10 10 9

20

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

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

5.7.

Eliminacin de filas duplicadas (DISTINCT)

Al igual que en la seleccin de una lista, se puede pedir a SQL que elimine valores duplicados de una columna antes de aplicarle la funcin de agregacin. Para eliminar valores duplicados, la palabra clave DISTINCT se incluye delante del argumento de la funcin de columna, inmediatamente despus del parntesis abierto. Veamos algunos ejemplos: Nmero de ttulos diferentes de los vendedores. SELECT COUNT(DISTINCT titulo) FROM repventas ; Nmero de oficinas con vendedores que superan sus cuotas. SELECT COUNT(DISTINCT oficina_rep) FROM repventas WHERE ventas>cuota ;
COUNT(DISTINCT OFICINA_REP) 4 COUNT(DISTINCT TITULO) 3

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

5.8.

Consultas agrupadas (clusula GROUP BY)

Las consultas sumarias descritas hasta ahora son como los totales al final de un informe, condensan todos los datos detallados del informe en una nica fila sumaria de datos. Sin embargo, en algunos casos es til obtener subtotales. La clusula GROUP BY proporciona esta capacidad. Veamos un ejemplo: Tamao medio de los pedidos para cada vendedor. SELECT rep, AVG(importe) FROM pedidos GROUP BY rep ; SQL lleva a cabo la consulta de la siguiente forma:
REP AVG(IMPORTE) 101 8.876,00 102 5.694,00 103 1.350,00 105 7.865,40 106 16.479,00 107 11.477,33 108 8.361,86 109 3.552,50 110 11.566,00

21

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

1. 2.

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. 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) NULL NULL NULL 11 25.000 27.500 12 17.500 27.500 13 30.000 30.000 21 30.000 30.000 22 27.500 27.500 OFICINA_REP COUNT(*) NULL 1 11 2 12 3 13 1 21 2 22 1

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

SELECT oficina_rep, COUNT(*) FROM repventas GROUP BY oficina_rep ;


COUNT(DISTINCT NUM_CLIE) 3 4 3 1 2 2 1 2 2 1 REP_CLIE 101 102 103 104 105 106 107 108 109 110

Nmero de clientes diferentes atendidos por cada vendedor. SELECT COUNT(DISTINCT num_clie), rep_clie FROM clientes GROUP BY rep_clie ;
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

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

da como resultado un error del tipo : La columna nombre no es una expresin GROUP BY.
NUM_EMPL 101 102 103 105 106 107 108 109 110 NOMBRE SUM(IMPORTE) Daniel Gutierrez 26.628 Soledad Martinez 22.776 Pedro Cruz 2.700 Belen Aguirre 39.327 Jose Maldonado 32.958 Natalia Martin 34.432 Lorenzo Fernandez 58.533 Maria Garcia 7.105 Antonio Valle 23.132

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

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

22

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

5.9.

Condiciones de bsqueda en grupos (clusula HAVING)

Al igual que la clusula WHERE puede ser utilizada para seleccionar y rechazar filas individuales que participan en una consulta, la clusula HAVING puede ser utilizada para seleccionar y rechazar grupos de filas. El formato de la clusula HAVING es anlogo al de la clusula WHERE, consistiendo en la palabra clave HAVING seguida de la condicin de bsqueda. Por tanto, la clusula HAVING especifica una condicin de bsqueda por grupos. Veamos algunos ejemplos: Tamao de pedido promedio por vendedor para vendedores con pedidos REP AVG(IMPORTE) totales de ms de 30000. 105 7.865,40
SELECT rep, AVG(importe) FROM pedidos GROUP BY rep HAVING SUM(importe)>30000 ;
106 107 108 16.479,00 11.477,33 8.361,86

SQL efecta la consulta de la siguiente forma: 1. La clusula GROUP BY dispone los pedidos en grupos por vendedor. 2. La clusula HAVING elimina entonces los grupos donde el total de pedidos no excede de 30000. 3. Finalmente la clusula SELECT calcula el tamao de pedido medio para cada uno de los grupos restantes y genera los resultados de la consulta. Cuota total y ventas totales para todos los vendedores de una oficina en oficinas con dos o ms personas.
SELECT ciudad, sum(cuota), sum(repventas.ventas) FROM oficinas, repventas WHERE oficina=oficina_rep GROUP BY ciudad HAVING COUNT(*)>=2 ;
CIUDAD SUM(CUOTA) SUM(REPVENTAS.VENTAS) Barcelona 70.000 29.328 Madrid 60.000 81.309 Valencia 52.500 40.063

En este caso el proceso que realiza SQL es el siguiente: 1. Compone las tablas OFICINAS y REPVENTAS para hallar la ciudad donde trabaja cada vendedor. 2. Agrupa las filas resultantes por oficina. 3. Elimina los grupos con menos de dos filas. 4. Calcula la cuota total y las ventas totales para cada grupo. Precio, existencias y cantidad total de los pedidos de cada producto para los cuales la cantidad total pedida es superior al 75% de las existencias.
SELECT descripcion, precio, existencias, SUM(cant) FROM productos, pedidos WHERE fab=id_fab AND producto=id_producto GROUP BY id_fab, id_producto, descripcion, precio, existencias HAVING SUM(cant)>(0.75*existencias) ORDER BY existencias DESC ;
DESCRIPCION PRECIO EXISTENCIAS SUM(CANT) Reductor 355 38 32 Ajustador 25 37 30 Bancada Motor 243 15 16 Bisagra Dcha. 4.500 12 15 Riostra 1-Tm 1.425 5 22

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

6. Subconsultas y subconsultas anidadas


La caracterstica de subconsulta de SQL permite utilizar los resultados de una consulta como parte de otra. La capacidad de utilizar una consulta dentro de otra fue la razn original para la palabra estructurada en el nombre Lenguaje de Consultas Estructuradas (Structured Query LanguageSQL). Esta caracterstica juega un papel importante por tres razones: Una sentencia SQL con una subconsulta es frecuentemente el modo ms natural de expresar una consulta, ya que se asemeja ms estrechamente a la descripcin de la consulta en lenguaje natural. Las subconsultas hacen ms fcil la escritura de sentencias SELECT, ya que permiten descomponer una consulta en partes (la consulta y sus subconsultas) y luego recomponerlas. Hay algunas consultas que no pueden ser expresadas en el lenguaje SQL sin utilizar una subconsulta. Una subconsulta es una consulta que aparece dentro de la clusula WHERE o HAVING de otra sentencia SQL. Por ejemplo, analicemos la peticin: Lista las oficinas en donde las ventas de la oficina son inferiores al 50% de la suma de las cuotas de los vendedores de la oficina. La peticin solicita una lista de oficinas de la tabla OFICINAS, en donde el valor de la columna VENTAS satisface cierta condicin. Parece razonable que la sentencia SELECT que expresa la consulta deba ser semejante a esta:
SELECT ciudad FROM oficinas WHERE ventas<??? ;

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

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

Las subconsultas SQL dentro de la clusula WHERE ayudan a seleccionar las filas individuales que aparecen en los resultados de la consulta. En la clusula HAVING, ayudan a seleccionar los grupos de filas que aparecen en los resultados de la consulta. Veamos algunas consideraciones a tener en cuenta: Una subconsulta debe producir una nica columna de datos como resultados. Esto significa que una subconsulta siempre tiene un nico elemento de seleccin de la clusula SELECT. La clusula ORDER BY no puede ser especificada en una subconsulta. Los resultados de la subconsulta se utilizan internamente por parte de la consulta principal y nunca son visibles al usuario, por lo que carece de sentido ordenarlos. Una subconsulta no puede ser la UNION de varias sentencias SELECT diferentes; slo se permite una nica SELECT. Los nombre de columna que aparecen en una subconsulta pueden referirse a columnas de tablas en la consulta principal.
24

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

6.1.

Subconsultas en la clusula WHERE

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

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


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

Conceptualmente, SQL lleva a cabo la consulta de la siguiente forma: La consulta principal extrae sus datos de la tabla OFICINAS, y la clusula WHERE selecciona qu oficinas sern incluidas en los resultados de la consulta. Para ello SQL recorre las filas de la tabla OFICINAS una a una, aplicndoles la condicin de la clusula WHERE. La clusula WHERE compara el valor de la columna VENTAS de la fila actual con el valor producido por la subconsulta. Para examinar el valor VENTAS, SQL lleva a cabo la subconsulta, determinando la suma de las cuotas para los vendedores de la oficina actual. La subconsulta produce un nmero, y la clusula WHERE compara el nmero con el valor VENTAS, seleccionando o rechazando la oficina actual en base a la comparacin. Dentro del cuerpo de una subconsulta, con frecuencia es necesario referirse al valor de una columna en la fila actual de la consulta principal, tal y como sucede en la consulta anterior. En estos casos, la columna de la consulta principal que se utiliza en la subconsulta se conoce como referencia externa. Una referencia externa es un nombre de columna que no se refiere a ninguna de las tablas designadas en la clusula FROM de la subconsulta en la cual aparece el nombre de la columna. En vez de ello, el nombre de columna se refiere a una columna de una tabla especificada en la tabla FROM de la consulta principal. Lista los vendedores con cuota igual o superior al objetivo de Alicante.
SELECT nombre FROM repventas WHERE cuota>=(SELECT objetivo FROM oficinas WHERE ciudad=Alicante) ;
NOMBRE Belen Aguirre Lorenzo Fernandez Soledad Martinez EMPRESA Pino S.L. JPF S.L.

Lista de los clientes atendidos por Belen Aguirre.


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

Lista de los productos del fabricante ACI para los cuales las existencias superan a las existencias del producto ACI-41004.
SELECT descripcion,existencias FROM productos WHERE id_fab=ACI AND existencias>(SELECT existencias FROM productos WHERE id_fab=ACI AND id_producto=41004) ;
DESCRIPCION EXISTENCIAS Articulo Tipo 1 277 Articulo Tipo 2 167 Articulo Tipo 3 207

Condicin de pertenencia a un conjunto ( IN )


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

25

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

SELECT nombre FROM repventas WHERE oficina_rep IN (SELECT oficina FROM oficinas WHERE ventas>objetivo) ;

Lorenzo Fernandez Soledad Martinez Natalia Martin

Lista de empleados que tienen todos sus clientes con lmite de crdito igual o superior a 50000.
SELECT nombre FROM repventas WHERE num_empl NOT IN (SELECT rep_clie FROM clientes WHERE limite_credito<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.

Condicin de existencia (EXISTS)


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

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

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

Como la condicin de bsqueda EXISTS no utiliza realmente los resultados de la subconsulta, es posible relajar la regla de que las subconsultas deben devolver una nica columna de datos y permitir utilizar la forma SELECT * en la subconsulta de un test EXISTS.

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


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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Lista de los vendedores que han aceptado un pedido que representa ms de su NOMBRE cuota. Jose Maldonado
SELECT nombre FROM repventas WHERE cuota<ANY (SELECT importe FROM pedidos WHERE rep=num_empl) ;
Lorenzo Fernandez Natalia Martin

Lista de las oficinas y sus objetivos en donde todos los vendedores tienen ventas que igualan o superan el objetivo de la oficina.
SELECT ciudad, objetivo FROM oficinas WHERE objetivo<ALL (SELECT ventas FROM repventas WHERE oficina_rep=oficina) ;
CIUDAD OBJETIVO 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:
EMPRESA Lista de clientes cuyos vendedores estn asignados a oficinas de la Hnos. Martinez S.A. regin de ventas Centro. Lopez Asociados S.L.

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

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

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

6.3.

Subconsultas en la clusula HAVING

Cuando una subconsulta aparece en la clusula HAVING funciona como parte de la seleccin de grupo de filas efectuada por la clusula HAVING. Consideremos la siguiente consulta: Lista de los vendedores cuyo tamao de pedido medio para productos fabricados por ACI es superior al tamao de pedido medio global.
SELECT nombre, AVG(importe) FROM repventas, pedidos WHERE num_empl=rep AND fab=ACI GROUP BY nombre HAVING AVG(importe)>(SELECT AVG(importe) FROM pedidos) ;
NOMBRE AVG(IMPORTE) Antonio Valle 22.500,00 Soledad Martinez 15.000,00

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

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


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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

7.1.

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

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

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


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

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

Quedando las tablas de la siguiente forma:


28

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

La tabla CLIENTES:

NUM_CLIE 2111 2102 2103 2123 2107 2115 2101 2112 2121 2114 2124 2108 2117 2122 2120 2106 2119 2118 2113 2109 2105 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 CLIE 2117 2111 2101 2118 2102 2107 2112 2103 2118 2108 2124 2103 2114 2124 2114 2103 2112 2109 2107 2118 2111 2108 2120 2106 2106 2108 2118 2103 2111 2113 2126 REP 106 105 106 108 101 110 108 105 108 109 107 105 108 107 102 105 108 107 110 108 103 101 102 102 102 109 108 105 103 101 111 FAB REI ACI FEA QSA ACI ACI REI ACI BIC FEA BIC ACI QSA FEA ACI ACI IMM IMM REI ACI REI ACI IMM REI QSA IMM QSA ACI ACI REI ACI PRODUCTO CANT IMPORTE 2A44L 7 31.500 41003 35 3.745 114 6 1.458 XK47 4 1.420 41004 34 3.978 4100Z 9 22.500 2A44R 10 45.000 41004 28 3.276 41003 1 652 112 10 1.480 41003 1 652 41004 6 702 XK47 20 7.100 114 10 2.430 4100Z 6 15.000 41002 54 4.104 773C 3 2.825 775C 22 31.350 2A45C 8 632 41002 10 760 2A44G 6 2.100 4100X 6 150 779C 2 3.750 2A45C 24 1.896 XK47 6 2.130 779C 3 5.625 XK47 2 776 4100Y 11 27.500 4100X 24 600 2A44R 5 22.500 41004 20 2.340

La tabla PEDIDOS:

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

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

Adems, SQL permite omitir la lista de columnas de la sentencia INSERT. Cuando se omite la lista de columnas, SQL genera automticamente una lista formada por todas las columnas de la tabla, en secuencia de izquierda a derecha. Esta es la misma secuencia de columnas generadas por SQL cuando se utiliza una consulta SELECT *. Utilizando esta forma, la sentencia INSERT anterior podra escribirse como:
INSERT INTO repventas VALUES(111,Enrique Jordan,36,13,Dir. Ventas,25/07/2000,NULL,NULL,0);

Supongamos que se desea copiar, a partir de la tabla PEDIDOS, el nmero de pedido, la fecha y el importe de todos los pedidos remitidos con anterioridad al 1 de Enero de 2000, en otra tabla llamada ANTPEDIDOS.

INSERT INTO antpedidos(num_pedido, fecha_pedido, importe) SELECT num_pedido, fecha_pedido, importe FROM pedidos WHERE fecha_pedido<01/01/2000 ;

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

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

7.2.

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

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

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

106 104 105 109 108 102 101 110 103 107

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

52 33 37 31 62 48 45 41 29 49

11 12 13 11 21 21 12 NULL 12 22

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.


FAB PRODUCTO CANT IMPORTE

NUM_PEDIDO FECHA_PEDIDO CLIE REP

La tabla PEDIDOS despus de eliminar los pedidos del cliente 2126 quedara:

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

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

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

NUM_CLIE

EMPRESA

REP_CLIE LIMITE_CREDITO

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

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.

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

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

La tabla CLIENTES despus de eliminar los clientes del representante 111.

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL. CLIE 2117 2111 2101 2118 2107 2112 2103 2118 2108 2124 2103 2114 2124 2103 2112 2109 2107 2108 2120 2106 2106 2108 2118 2103 2111 2113 REP 106 105 106 108 110 108 105 108 109 107 105 108 107 105 108 107 110 101 102 102 102 109 108 105 103 101 FAB REI ACI FEA QSA ACI REI ACI BIC FEA BIC ACI QSA FEA ACI IMM IMM REI ACI IMM REI QSA IMM QSA ACI ACI REI PRODUCTO CANT IMPORTE 2A44L 7 31.500 41003 35 3.745 114 6 1.458 XK47 4 1.420 4100Z 9 22.500 2A44R 10 45.000 41004 28 3.276 41003 1 652 112 10 1.480 41003 1 652 41004 6 702 XK47 20 7.100 114 10 2.430 41002 54 4.104 773C 3 2.825 775C 22 31.350 2A45C 8 632 4100X 6 150 779C 2 3.750 2A45C 24 1.896 XK47 6 2.130 779C 3 5.625 XK47 2 776 4100Y 11 27.500 4100X 24 600 2A44R 5 22.500

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

Eliminar todos los pedidos:


DELETE FROM pedidos ;

La clusula WHERE de la sentencia DELETE es opcional, pero casi siempre est presente. Si se omite la clusula WHERE de una sentencia DELETE, se suprimen todas las filas de la tabla destino pero, aunque esto produce una tabla vaca, no borra la tabla PEDIDOS de la base de datos. La definicin de la tabla PEDIDOS y sus columnas siguen estando almacenadas en la base de datos. Suprimir todos los pedidos aceptados por Soledad Martinez. En este caso la seleccin de las filas no se puede hacer en base a una nica tabla sino que debe efectuarse en base a datos contenidos en otras tablas. Aqu, sin saber el nmero de empleado de Soledad Martinez no se pueden determinar los pedidos a eliminar consultando nicamente la tabla PEDIDOS. Entonces, se podra pensar en hallar todos los pedidos utilizando una consulta de dos tablas como la siguiente:
SELECT num_pedido, importe FROM pedidos, repventas WHERE rep=num_empl AND nombre=Soledad Martinez ;
NUM_PEDIDO IMPORTE 112979 15.000 113048 3.750 112993 1.896 113065 2.130

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

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

32

14748 - Bases de Datos Biblioteconoma. 2003-2004 NUM_PEDIDO 112961 113012 112989 113051 112968 110036 113045 112963 113013 113058 112997 112983 113024 113062 113027 113007 113069 113034 112992 112975 113055 113003 113049 112987 113057 113042 113070 FECHA_PEDIDO 17/12/1999 11/01/2000 03/01/2000 10/02/2000 12/10/1999 30/01/2000 02/02/2000 17/12/1999 14/01/2000 23/02/2000 08/01/2000 27/12/1999 20/01/2000 24/02/2000 22/02/2000 08/01/2000 02/03/2000 29/01/2000 04/11/1999 12/10/1999 15/02/2000 25/01/2000 10/02/2000 31/12/1999 18/02/2000 02/02/2000 22/10/1999 CLIE 2117 2111 2101 2118 2102 2107 2112 2103 2118 2108 2124 2103 2114 2124 2103 2112 2109 2107 2118 2111 2108 2108 2118 2103 2111 2113 2126 REP 106 105 106 108 101 110 108 105 108 109 107 105 108 107 105 108 107 110 108 103 101 109 108 105 103 101 111 FAB REI ACI FEA QSA ACI ACI REI ACI BIC FEA BIC ACI QSA FEA ACI IMM IMM REI ACI REI ACI IMM QSA ACI ACI REI ACI

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

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

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

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

7.3.

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

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

14748 - Bases de Datos Biblioteconoma. 2003-2004 EMPRESA La tabla CLIENTES quedara NUM_CLIE 2111 EVBE S.A. entonces:

Tema 5: Lenguajes de Consulta. SQL.

Como vemos en este ejemplo, la clusula WHERE identifica una sola fila de la tabla CLIENTES y la clusula SET asigna nuevos valores a dos de las columnas de esta fila.

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

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

Reducir la cuota de los representantes de ventas de la oficina nmero 12 en un 10% y cambiarles de oficina para que pasen a ser miembros de la oficina 11:
UPDATE repventas SET oficina_rep=11, cuota=0.9*cuota WHERE oficina_rep=12 ;

En este caso, la sentencia UPDATE actualiza varias filas de una vez ya que la clusula WHERE selecciona varias filas de la tabla REPVENTAS, y el valor de las columnas OFICINA_REP y CUOTA se modifica en todas ellas. El resultado de esta accin ser:
NUM_EMPL 106 104 105 109 108 102 101 110 103 107 NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS Jose Maldonado 52 11 VP Ventas 14/06/1998 NULL 25.000 32.958 Carlos Martinez 33 11 Dir. Ventas 19/05/1997 106 15.750 0 Belen Aguirre 37 13 Dir. Ventas 12/02/1998 104 30.000 39.327 Maria Garcia 31 11 Rep. Ventas 12/10/1999 106 27.500 7.105 Lorenzo Fernandez 62 21 Dir. Ventas 12/10/1999 106 30.000 58.533 Soledad Martinez 48 21 Rep. Ventas 10/12/1996 108 30.000 22.776 Daniel Gutierrez 45 11 Rep. Ventas 20/10/1996 104 24.750 26.628 Antonio Valle 41 NULL Rep. Ventas 13/01/2000 101 NULL 23.123 Pedro Cruz 29 11 Rep. Ventas 01/03/1997 104 22.500 2.700 Natalia Martin 49 22 Rep. Ventas 14/11/1998 108 27.500 34.432

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

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


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

34

14748 - Bases de Datos Biblioteconoma. 2003-2004

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

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

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

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

Antes de la actualizacin, las oficinas de Toledo y Alicante tenan unos objetivos de 27.500 y 30.000 respectivamente, despus de la actualizacin sus ventas son 27.500 y 30.000 respectivamente y no 40.000. La tabla queda entonces: Esto es as porque el SQL calcula los valores de las columnas sobre los datos que hay antes de aplicar ninguna de las partes de la modificacin.
OFICINA 22 11 12 13 21 CIUDAD Toledo Valencia Barcelona Alicante Madrid REGION Centro Este Este Este Centro DIR OBJETIVO VENTAS 108 40.000 27.500 106 52.500 40.063 104 70.000 29.328 105 40.000 30.000 108 60.000 81.309

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


UPDATE repventas SET cuota=1.05*cuota ;
NUM_EMPL 106 104 105 109 108 102 101 110 103 107 NOMBRE Jose Maldonado Carlos Martinez Belen Aguirre Maria Garcia Lorenzo Fernandez Soledad Martinez Daniel Gutierrez Antonio Valle Pedro Cruz Natalia Martin EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS 52 11 VP Ventas 14/06/1998 NULL 26.250 32.958 33 12 Dir. Ventas 19/05/1997 106 18.375 0 37 13 Dir. Ventas 12/02/1998 104 31.500 39.327 31 11 Rep. Ventas 12/10/1999 106 28.875 7.105 62 21 Dir. Ventas 12/10/1999 106 31.500 58.533 48 21 Rep. Ventas 10/12/1996 108 31.500 22.776 45 12 Rep. Ventas 20/10/1996 104 28.875 26.628 41 NULL Rep. Ventas 13/01/2000 101 NULL 23.123 29 12 Rep. Ventas 01/03/1997 104 26.250 2.700 49 22 Rep. Ventas 14/11/1998 108 28.875 34.432

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

La tabla de CLIENTES quedar entonces de la siguiente forma:


35

14748 - Bases de Datos Biblioteconoma. 2003-2004 NUM_CLIE 2111 2102 2103 2123 2107 2115 2101 2112 2121 2114 2124 2108 2117 2122 2120 2106 2119 2118 2113 2109 2105

Tema 5: Lenguajes de Consulta. SQL.

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

Queremos asignar todos los clientes, atendidos por los vendedores cuyas ventas son menores al 80% de sus cuotas, al NUM_CLIE EMPRESA REP_CLIE LIMITE_CREDITO vendedor nmero 105: 2111 EVBE S.A. 105 50.000
2102 2103 2123 2107 2115 2101 2112 2121 2114 2124 2108 2117 2122 2120 2106 2119 2118 2113 2109 2105 Exclusivas del Este S.L. Pino S.L. Hnos. Martinez S.A. Distribuciones Sur S.A. AFS S.A. Exclusivas Soriano S.A. Lopez Asociados S.L. Hernandez & hijos S.L. Componentes Fernandez S.A. Domingo S.L. Zapater Importaciones S.A. Hnos. Ramon S.L. JPF S.L. Distribuciones Montiel S.L. Construcciones Leon S.A. Martinez & Garcia S.L. Exclusivas Norte S.A. Importaciones Martin S.L. Roda & Castedo S.L. MALB S.A. 101 105 105 110 101 106 108 105 105 107 105 106 105 105 105 105 108 105 105 101 65.000 50.000 40.000 35.000 20.000 65.000 50.000 45.000 20.000 40.000 55.000 35.000 30.000 50.000 65.000 25.000 60.000 20.000 25.000 45.000

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

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


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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

8.1.

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

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

Definicin de las columnas


Despus de escribir la clusula CREATE TABLE nombre_de_la_tabla () y situado entre los parntesis, debemos especificar las columnas que tendr la tabla (indicando su nombre y caractersticas) y separadas por comas. El orden en que definamos las columnas nos va a determinar el orden de izquierda a derecha de las columnas en la tabla. Cada definicin especifica: El nombre de la columna, que se utiliza para referirse a la columna en las sentencias SQL. Cada columna de la tabla debe tener un nombre nico, pero los nombres pueden ser iguales a los de las columnas de otras tablas. El dominio de los datos de la columna, que determina la clase de datos que la columna almacena. (Son los especificados en el pto. 2 de este tema). Si la columna no puede contener datos nulos, la clusula NOT NULL impide que aparezcan valores NULL en la columna, en caso contrario se permiten los valores nulos en la columna. Con esto, algunas sentencias de ejemplo (aunque incompletas) seran:
CREATE TABLE oficinas (oficina INTEGER NOT NULL, ciudad VARCHAR(15) NOT NULL, region VARCHAR(10) NOT NULL, objetivo INTEGER, ventas INTEGER NOT NULL); CREATE TABLE pedidos (num_pedido INTEGER NOT NULL, fecha_pedido DATE NOT NULL, clie INTEGER NOT NULL, rep INTEGER, fab CHAR(3) NOT NULL, producto CHAR(5) NOT NULL, cant INTEGER NOT NULL, importe INTEGER NOT NULL);

Definicin de la clave primaria y las claves ajenas


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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Cuando el gestor de la base de datos procesa la sentencia CREATE TABLE, compara cada definicin de clave ajena con la definicin de la tabla a la que referencia, asegurndose que la clave ajena y la clave primaria de la tabla referenciada concuerden en el nmero de columnas que contienen y en sus tipos de datos. La tabla referenciada debe estar ya definida en la base de datos para que esta comparacin tenga xito. Si dos o ms tablas se referencian mutuamente, no se puede definir la clave ajena de la tabla que se cree en primer lugar, ya que la tabla referenciada todava no existe. En su lugar debe crearse la tabla sin definicin de clave ajena y aadirle la clave ajena posteriormente utilizando la sentencia ALTER TABLE para modificar la estructura de la tabla.

Especificacin de restricciones de los datos


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

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

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

8.2.

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

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

8.3.

Modificacin de la definicin de una tabla ( ALTER TABLE )

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

Aadir una columna


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

Aadir una columna inventario mnimo a la tabla PRODUCTOS.


ALTER TABLE productos ADD cant_min INTEGER NOT NULL ;

Suprimir de una columna


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

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

9. Vistas en SQL (LDD)


En el caso del SQL, el sistema cuenta con dos mecanismos diferentes implicados en el mantenimiento de la seguridad: el sistema de gestin de vistas, y el subsistema de autorizacin que nos permitan asignar a los usuarios permisos de acceso a tablas y vistas de la base de datos. Como ya se ha comentado anteriormente, nosotros slo veremos por encima el caso de las vistas. En SQL, una vista es una tabla virtual en la base de datos cuyos contenidos estn definidos por una consulta. Para el usuario de la base de datos, la vista aparece igual que una tabla real, con un conjunto de columnas designadas y filas de datos pero a diferencia de una tabla real, una vista no existe en la base de datos como conjunto almacenado de valores. En su lugar, las filas y columnas de datos visibles a travs de la vista son los resultados producidos por la consulta que define la vista. Las vistas proporcionan una variedad de beneficios, pudiendo resaltarse los siguientes: Seguridad. Cada usuario puede obtener permiso para acceder a la base de datos nicamente a travs de un pequeo conjunto de vistas que contienen los datos especficos que el usuario est autorizado a ver. Simplicidad de consulta. Una vista puede extraer datos de varias tablas diferentes y presentarlos como una nica tabla, haciendo que consultas multitabla se formulen como consultas de una sola tabla con respecto a la vista.
39

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

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

106 104 105 109 101 103

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

52 33 37 31 45 29

11 12 13 11 12 12

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 NOMBRE EDAD OFICINA_REP TITULO CONTRATO DIRECTOR CUOTA VENTAS

108 102 107

Lorenzo Fernandez 62 Soledad Martinez 48 Natalia Martin 49

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

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL. CIUDAD Valencia Barcelona Alicante REGION DIR OBJETIVO VENTAS Este 106 52.500 40.063 Este 104 70.000 29.328 Este 105 30.000 39.327

CREATE VIEW oficinaeste AS SELECT * FROM oficinas WHERE region='Este' ;

OFICINA 11 12 13

Creacin de una vista para Soledad Martinez (empleada 102) que contiene solamente los pedidos remitidos por clientes asignados a ella.
CREATE VIEW pedidossoledad AS SELECT * FROM pedidos WHERE clie IN (SELECT num_clie FROM clientes WHERE rep_clie=102) ;
NUM_PEDIDO 113024 112979 113048 112993 113065 FECHA_PEDIDO 20/01/2000 12/10/1999 10/02/2000 04/01/2000 27/02/2000 CLIE 2114 2114 2120 2106 2106 REP 108 102 102 102 102 FAB QSA ACI IMM REI QSA PRODUCTO CANT IMPORTE XK47 20 7.100 4100Z 6 15.000 779C 2 3.750 2A45C 24 1.896 XK47 6 2.130

Creacin de una vista que muestra aquellos clientes que tiene ms de 30.000 en pedidos.
CREATE VIEW clientesvip AS SELECT * FROM clientes WHERE 30000<(SELECT SUM(importe) FROM pedidos WHERE clie=num_clie) ;
NUM_CLIE 2117 2112 2103 2109 EMPRESA REP_CLIE LIMITE_CREDITO Hnos. Ramon S.L. 106 35.000 Lopez Asociados S.L. 108 50.000 Pino S.L. 105 50.000 Roda & Castedo S.L. 103 25.000 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

Hacer que el departamento de procesamiento de

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

Creacin una vista de la tabla OFICINAS.


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

Creacin de una vista de la tabla CLIENTES.


CREATE VIEW infoclie AS SELECT empresa, rep_clie FROM clientes ;

41

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

Creacin de una vista que contiene el nmero de cliente, el nombre de la empresa y el limite de crdito para los clientes de Belen Aguirre (empleado nmero 105).
CREATE VIEW cliebill AS SELECT num_clie, empresa, limite_credito FROM clientes WHERE rep_clie=105 ;
NUM_CLIE EMPRESA LIMITE_CREDITO 2103 Pino S.L. 50.000 2122 JPF S.L. 30.000

Creacin de una vista que contiene datos sumarios de los pedidos para cada vendedor.
CREATE VIEW ped_por_rep(quien, cuantos, total, inf, sup, medio) AS SELECT rep, COUNT(*), SUM(importe), MIN(importe), MAX(importe), AVG(importe) FROM pedidos GROUP BY rep ;
NOMBRE Lorenzo Fernandez Belen Aguirre Natalia Martin Jose Maldonado Daniel Gutierrez Antonio Valle Soledad Martinez Maria Garcia Pedro Cruz CUANTOS TOTAL MEDIO 7 58.633 8.376,14 5 39.327 7.865,40 3 34.432 11.477,33 2 32.958 16.479,00 3 26.628 8.876,00 2 23.132 11.566,00 4 22.776 5.694,00 2 7.105 3.552,50 2 2.700 1.350,00

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

Datos sumarios de los vendedores obtenidos a partir de la vista PED_POR_REP.


SELECT nombre, cuantos, total, medio FROM repventas, ped_por_rep WHERE quien=num_empl ORDER BY total DESC ;

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


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

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 ;

42

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

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

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

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

10. Ejercicio propuesto de consultas en SQL


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

DEPARTAMENTOS EMPLEADOS num nombre edad departamento categoria contrato deptno nombre CATEGORIAS categoria titulo salario trienio

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

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

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

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

REGION Este Este Este Centro Centro

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

TRIENIO 1.000 800 700 700 500

43

14748 - Bases de Datos Biblioteconoma. 2003-2004

Tema 5: Lenguajes de Consulta. SQL.

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

(#)

El dinero recibido por los trienios se calcula en base a la frmula: trienio*((fecha_actual-fecha_del_contrato)/(365*3)) 44

You might also like