You are on page 1of 4

TEMA 23: CONSULTAS MULTITABLA

OBJETIVOS DEL TEMA

Saber realizar consultas que ligan ms de una tabla

1.- COMPOSICIONES SIMPLES

Es posible realizar consultas multitabla, es decir, obtener datos de 2 ms tablas simultneamente, siempre y cuando estas tablas estn

relacionadas entre s dos a dos.

(Nota: antes de seguir vamos a aadir mas tablas y datos al fichero de ejemplo creado en el capitulo 21 llamado: crear_ejemplo1.sql
-- crear tabla PEDIDO CREATE TABLE PEDIDO ( DNI INTEGER NOT NULL, NUMPEDIDO INTEGER NOT NULL, FORMAPAGO INTEGER NOT NULL, IMPORTE REAL); -- insertar datos de tabla PEDIDO INSERT INTO PEDIDO (DNI,NUMPEDIDO,FORMAPAGO,IMPORTE) (12345678,500,1,123); INSERT INTO PEDIDO (DNI,NUMPEDIDO,FORMAPAGO,IMPORTE) (12345678,501,1,65.23); INSERT INTO PEDIDO (DNI,NUMPEDIDO,FORMAPAGO,IMPORTE) (12345678,523,3,201.55); INSERT INTO PEDIDO (DNI,NUMPEDIDO,FORMAPAGO,IMPORTE) (54321123,524,5,84.2); INSERT INTO PEDIDO (DNI,NUMPEDIDO,FORMAPAGO,IMPORTE) (54321123,502,5,150.38); INSERT INTO PEDIDO (DNI,NUMPEDIDO,FORMAPAGO,IMPORTE) (88010245,250,3,37); INSERT INTO PEDIDO (DNI,NUMPEDIDO,FORMAPAGO,IMPORTE) (87882215,275,2,88.25); INSERT INTO PEDIDO (DNI,NUMPEDIDO,FORMAPAGO,IMPORTE) (42611580,276,1,125.12); -- crear tabla FORMA_PAGO CREATE TABLE FORMA_PAGO (

VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES

CODIGO INTERGER NOT NULL, DESCRIPCION VARCHAR(20)); -- insertar INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO datos de tabla FORMA_PAGO FORMA_PAGO VALUES (1,'VISA'); FORMA_PAGO VALUES (2,'AMERICAN EXPRESS'); FORMA_PAGO VALUES (3,'Contrareembolso'); FORMA_PAGO VALUES (4,'Contado'); FORMA_PAGO VALUES (5,'Taln');

De esta forma, podemos reconstruir nuestra base de datos de ejemplo, saliendo de SQLITE (con .exit), borrando el fichero de la base de datos (del ejemplo1.db), y crearlo de nuevo con (sqlite3 ejemplo1.db), y ahora ejecutamos la creacin de tablas e insercin de registros con (.read crear_ejemplo1.sql)

(Nota: SQLITE usa para codificar los datos el formato UTF-8, con los que habr que asegurarse que el fichero "crear_ejemplo1.sql" est guardado en este formato si no queremos ver caracteres estraos con la letras acentuadas, ees, etc. Para ello, en windows se puede usar el "Bloc de notas" para editarlo y pulsar Archivo, Guardar como, y elegir Codificacin: UTF-8).

Por ejemplo, si queremos saber los pedidos que ha realizado los clientes, as como la forma de pago de estos pedidos se hara la siguiente consulta:

SELECT CLIENTE.APELLIDOS, CLIENTE.NOMBRE, PEDIDO.NUMPEDIDO, FORMA_PAGO.DESCRIPCION FROM CLIENTE INNER JOIN PEDIDO ON (CLIENTE.DNI = PEDIDO.DNI) INNER JOIN FORMA_PAGO ON (PEDIDO.FORMAPAGO = FORMA_PAGO.CODIGO) ORDER BY CLIENTE.APELLIDOS, CLIENTE.NOMBRE, PEDIDO.NUMPEDIDO; APELLIDOS -------------------PEREZ GARCIA PEREZ GARCIA PEREZ GARCIA SEBASTIAN YUSTE SEBASTIAN YUSTE NOMBRE ---------JOSE MARIA JOSE MARIA JOSE MARIA MARIA MARIA NUMPEDIDO ---------500 501 523 502 524 DESCRIPCION --------------VISA VISA Contrareembolso Taln Taln

A veces interesa no obtener todos los campos, sino solamente algunos, por ejemplo, supongamos que queremos listar slo los nombres de los clientes que han hecho algn pedido. Para evitar que clientes que tienen varios pedidos salgan repetidos (una vez por pedido) se puede aadir la palabra DISTINCT de forma que quedara:

SELECT DISTINCT CLIENTE.APELLIDOS, CLIENTE.NOMBRE FROM PEDIDO INNER JOIN CLIENTE ON (PEDIDO.DNI = CLIENTE.DNI) ORDER BY CLIENTE.APELLIDOS, CLIENTE.NOMBRE; APELLIDOS -------------------PEREZ GARCIA SEBASTIAN YUSTE NOMBRE -------------------JOSE MARIA MARIA

2.- COMPOSICIONES BASADAS EN DESIGUALDAD

Puede ocurrir que haya clientes que no tengan ningn pedido, en cuyo caso no apareceran, por lo que s queremos mostrar todos los clientes, tanto con pedido como sin pedido, en la relacin se cambia INNER por LEFT/RIGHT OUTER resultando: (Nota: SQLITE no permite realizar "RIGHT OUTER JOIN", para tener el mismo resultado con LEFT OUTER JOIN , basta con intercambiar las tablas)

SELECT DISTINCT CLIENTE.APELLIDOS, CLIENTE.NOMBRE FROM CLIENTE LEFT OUTER JOIN PEDIDO ON (CLIENTE.DNI = PEDIDO.DNI); APELLIDOS -------------------ARIAS FERNANDEZ JIMENO DIAZ JIMENO ZOLA PEREZ GARCIA PEREZ LOPEZ ROMERO ALONSO SEBASTIAN YUSTE NOMBRE -------------------ELENA MIGUEL DANIELA JOSE MARIA ANA LUIS MARIA

3.- RENDIMIENTO DE CONSULTAS MULTITABLA

Dado que las relaciones multitabla se hacen en base a productos de tablas (Todas las tuplas de una tabla contra todas las tuplas de otra), es evidente que a medida que la consulta implica ms tablas, los tiempos crecen exponencialmente. Una forma de mantener tiempos aceptables pasa por la creacin de ndices, sin embargo cuando las consultas estn desequilibradas RIGHT | LEFT OUTER JOIN, el empleo de ndices no siempre ayuda y los tiempos de bsqueda pueden hacerse largos.

RESUMEN DEL TEMA 23

Es usual en las BD Relacionales realizar consultas que ligan entre s ms de una tabla, para ello se utiliza dentro de la sentencia SELECT las palabras

INNER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN

Que permiten ligar estas tablas entre s.

You might also like