Está en la página 1de 6

CONSULTAS BSICAS CON DOS TABLAS

Por qu varias tablas?


Puede haber varios motivos. Por una parte, podemos tener bloques de informacin claramente distintos. Por ejemplo, en una base de datos que guarde la informacin de una empresa tendremos datos como los artculos que distribuimos y los clientes que nos los compran, que no deberan guardarse en una misma tabla. Por otra parte, habr ocasiones en que veamos que los datos, a pesar de que se podran clasificar dentro de un mismo "bloque de informacin" (tabla), seran redundantes: existira gran cantidad de datos repetitivos, y esto puede dar lugar a dos problemas:

Espacio desperdiciado. Posibilidad de errores al introducir los datos, lo que dara lugar a inconsistencias:

Veamos un ejemplo:
+---------+-----------+-----------+ | nombre | direccion | ciudad | +---------+-----------+-----------+ | juan | su casa | alicante | | alberto | calle uno | alicante | | pedro | su calle | alicantw | +---------+-----------+-----------+

Si en vez de repetir "alicante" en cada una de esas fchas, utilizsemos un cdigo de ciudad, por ejemplo "a", gastaramos menos espacio (en este ejemplo, 7 bytes menos en cada ficha). Por otra parte, hemos tecleado mal uno de los datos: en la tercera ficha no hemos indicado "alicante", sino "alicantw", de modo que si hacemos consultas sobre personas de Alicante, la ltima de ellas no aparecera. Al teclear menos, es tambin ms dificil cometer este tipo de errores. A cambio, necesitaremos una segunda tabla, en la que guardemos los cdigos de las ciudades, y el nombre al que corresponden (por ejemplo: si cdigoDeCiudad = "a", la ciudad es "alicante"). LAS CLAVES PRIMARIAS Generalmente, ser necesario tener algn dato que nos permita distinguir de forma clara los datos que tenemos almacenados. Por ejemplo, el nombre de una persona no es nico: pueden aparecer en nuestra base de datos varios usuarios llamados "Juan Lpez". Si son nuestros clientes, debemos saber cual es cual, para no cobrar a uno de ellos un dinero que corresponde a otro. Eso se suele solucionar guardando algn dato adicional que s sea nico para cada cliente, como puede ser el Documento Nacional de Identidad, o el Pasaporte. Si no hay ningn dato claro que nos sirva, en ocasiones aadiremos un "cdigo de cliente", inventado por nosotros, o algo similar.

Estos datos que distinguen claramente unas "fichas" de otras los llamaremos "claves primarias".

CREANDO DATOS
Comenzaremos creando una nueva base de datos, de forma similar al ejemplo anterior: create database ejemplo2; use ejemplo2; Despus creamos la tabla de ciudades, que guardar su nombre y su cdigo. Este cdigo ser el que acte como "clave primaria", para distinguir otra ciudad. Por ejemplo, hay una ciudad llamado "Toledo" en Espaa, pero tambin otra en Argentina, otra en Uruguay, dos en Colombia, una en Ohio (Estados Unidos)... el nombre claramente no es nico, asi que podramos usar cdigo como "te" para Toledo de Espaa, "ta" para Toledo de Argentina y as sucesivamente. La forma de crear la tabla con esos dos campos y con esa clave primaria sera: create table ciudades ( codigo varchar(3), nombre varchar(30), primary key (codigo) ); Mientras que la tabla de personas sera casi igual al ejemplo anterior, pero aadiendo un nuevo dato: el cdigo de la ciudad create table personas ( nombre varchar(20), direccion varchar(40), edad decimal(3), codciudad varchar(3) ); Para introducir datos, el hecho de que exista una clave primaria no supone ningn cambio, salvo por el hecho de que no se nos dejara introducir dos ciudades con el mismo cdigo: insert into ciudades values ('a', 'alicante'); insert into ciudades values ('b', 'barcelona'); insert into ciudades values ('m', 'madrid'); insert into personas values ('juan', 'su casa', 25, 'a'); insert into personas values ('pedro', 'su calle', 23, 'm'); insert into personas values ('alberto', 'calle uno', 22, 'b');

MOSTRANDO DATOS Cuando queremos mostrar datos de varias tablas a la vez, deberemos hacer unos pequeos cambios en las rdenes "slect" que hemos visto:

En primer lugar, indicaremos varios nombres despus de "FROM" (los de cada una de las tablas que necesitemos). Adems, puede ocurrir que cada tengamos campos con el mismo nombre en distintas tablas (por ejemplo, el nombre de una persona y el nombre de una ciudad), y en ese caso deberemos escribir el nombre de la tabla antes del nombre del campo.

Por eso, una consulta bsica sera algo parecido (slo parecido) a: select personas.nombre, direccion, ciudades.nombre from personas, ciudades; Pero esto todava tiene problemas: estamos combinando TODOS los datos de la tabla de personas con TODOS los datos de la tabla de ciudades, de modo que obtenemos 3x3 = 9 resultados:
+---------+-----------+-----------+ | nombre | direccion | nombre | +---------+-----------+-----------+ | juan | su casa | alicante | | pedro | su calle | alicante | | alberto | calle uno | alicante | | juan | su casa | barcelona | | pedro | su calle | barcelona | | alberto | calle uno | barcelona | | juan | su casa | madrid | | pedro | su calle | madrid | | alberto | calle uno | madrid | +---------+-----------+-----------+ 9 rows in set (0.00 sec)

Pero esos datos no son reales: si "juan" vive en la ciudad de cdigo "a", slo debera mostrarse junto al nombre "alicante". Nos falta indicar esa condicin: "el cdigo de ciudad que aparece en la persona debe ser el mismo que el cdigo que aparece en la ciudad", as: select personas.nombre, direccion, ciudades.nombre from personas, ciudades where personas.codciudad = ciudades.codigo; Esta ser la forma en que trabajaremos normalmente. Este ltimo paso se puede evitar en ciertas circunstancias, pero ya lo veremos ms adelante. El resultado de esta consulta sera:
+---------+-----------+-----------+ | nombre | direccion | nombre | +---------+-----------+-----------+ | juan | su casa | alicante | | alberto | calle uno | barcelona | | pedro | su calle | madrid | +---------+-----------+-----------+

Ese s es el resultado correcto. Cualquier otra consulta que implique las dos tablas deber terminar comprobando que los dos cdigos coinciden. Por ejemplo, para ver qu personas viven en la ciudad llamada "madrid", haramos: select personas.nombre, direccion, edad from personas, ciudades where ciudades.nombre='madrid' and personas.codciudad = ciudades.codigo;
+--------+-----------+------+ | nombre | direccion | edad | +--------+-----------+------+ | pedro | su calle | 23 | +--------+-----------+------+

Y para saber las personas de ciudades que comiencen con la letra "b", haramos: select personas.nombre, direccion, ciudades.nombre from personas, ciudades where ciudades.nombre like 'b%' and personas.codciudad = ciudades.codigo;
+---------+-----------+-----------+ | nombre | direccion | nombre | +---------+-----------+-----------+ | alberto | calle uno | barcelona | +---------+-----------+-----------+

Si en nuestra tabla puede haber algn dato que se repita, como la direccin, podemos pedir un listado sin duplicados, usando la palabra "distinct": select distinct direccion from personas; Desde MySQL es posible realizar una consulta que devuelva los valores de una tabla que est relacionada con otras de una sola vez. Por ejemplo, tenemos una tabla principal bien normalizada, con muchos campos que estan relacionados mediante un id con otras tablas que contienen los valores reales. Lo que necesitamos hacer es convertir esa tabla ppal en otra en que los IDs se conviertan en dichos valores reales, y para ello utilizaremos JOINs: Hay varios tipos de JOIN:
- Cross-Join - Equi-Join o Inner Join - Left Join

En este ejemplo se ver la utilizacin de lo que se llama un Equi-Join o Inner Join. Para ver el funcionamiento creamos una base de datos de ejemplo: MySQL: CREATE DATABASE contactos; USE contactos; CREATE TABLE clientes ( id INT(3), nombre VARCHAR(100), tipo_cliente INT(2), localidad INT(3) ); CREATE TABLE tipos_cliente

( id INT(2), tipo VARCHAR(255) ); CREATE TABLE localidades ( id INT(3), nombre_localidad VARCHAR(255) ); RELLENAMOS LA TABLA INSERT INTO clientes 1 ); INSERT INTO clientes Mezclas', 3, 2 ); INSERT INTO clientes 3 ); INSERT INTO clientes ); "CLIENTES" VALUES ( 1, 'Marcos Gonzalez', 1, VALUES ( 2, 'Ingeniera y VALUES ( 3, 'Daniel Aguilar', 1, VALUES ( 4, 'Abel Molina', 2, 3

RELLENAMOS LA TABLA TIPOS_CLIENTE INSERT INTO tipos_cliente VALUES ( 1, 'Desarrollador' ); INSERT INTO tipos_cliente VALUES ( 2, 'Diseador' ); INSERT INTO tipos_cliente VALUES ( 3, 'Otros' );

RELLENAMOS LA TABLA LOCALIDADES INSERT INTO localidades VALUES ( 1, 'Oviedo' ); INSERT INTO localidades VALUES ( 2, 'Girona' ); INSERT INTO localidades VALUES ( 3, 'Barcelona' ); Y ahora la consulta: Lo que queremos hacer es recoger todos los valores de la tabla clientes pero recogiendo el valor real de los Id's, que est situado en otras tablas relacionadas. SELECT clientes.nombre AS nombre_cliente, localidades.nombre_localidad AS localidad_cliente, tipos_cliente.tipo AS tipo_cliente

FROM clientes, localidades, tipos_cliente WHERE clientes.localidad=localidades.id AND clientes.tipo_cliente=tipos_cliente.id; Lo que hemos hecho aqu es, en la clausula SELECT seleccionar los campos de los que queremos sacar informacin y darles un nombre de alias con AS. El alias nos sirve para utilizar nombres que nos aclaren ms la funcin de la tabla en cuestin, pero es totalmente opcional en este caso. Seguidamente, en la clausula FROM decimos de qu tablas sacamos la informacin del SELECT, y para acabar debemos aclarar las condiciones que se tienen que cumplir para que los valores sean los correctos en cada columna. En este caso los id's de la tabla ppal (clientes) deben coincidir con los id's de las tablas relacionadas. Si ejecutamos esta consulta debemos obtener el siguiente valor: nombre_cliente localidad_cliente tipo_cliente Marcos Gonzalez Oviedo Desarrollador Daniel Aguilar Barcelona Desarrollador Abel Molina Barcelona Diseador Ingeniera y Mezclas Girona Otros
Enlaces relacionados:

También podría gustarte

  • Pregunta Modulos
    Pregunta Modulos
    Documento5 páginas
    Pregunta Modulos
    Alejandro Romero Huayta
    Aún no hay calificaciones
  • Modulo 13
    Modulo 13
    Documento10 páginas
    Modulo 13
    Alejandro Romero Huayta
    Aún no hay calificaciones
  • Modulo 14
    Modulo 14
    Documento5 páginas
    Modulo 14
    Alejandro Romero Huayta
    Aún no hay calificaciones
  • Pregunta Modulos
    Pregunta Modulos
    Documento5 páginas
    Pregunta Modulos
    Alejandro Romero Huayta
    Aún no hay calificaciones
  • Problemas Maxim
    Problemas Maxim
    Documento5 páginas
    Problemas Maxim
    Alejandro Romero Huayta
    Aún no hay calificaciones
  • Solucion Pregunta
    Solucion Pregunta
    Documento2 páginas
    Solucion Pregunta
    Alejandro Romero Huayta
    100% (1)