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 utilización de lo que se llama un Equi-Join o Inner Join.
Para ver el funcionamiento creamos una base de datos de ejemplo:
En este ejemplo se verá la utilización de lo que se llama un Equi-Join o Inner Join.
Para ver el funcionamiento creamos una base de datos de ejemplo:
-
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 «clientes»
-
INSERT INTO clientes VALUES ( 1, ‘Marcos Gonzalez’, 1, 1 );
-
INSERT INTO clientes VALUES ( 2, ‘Ingeniería y Mezclas’, 3, 2 );
-
INSERT INTO clientes VALUES ( 3, ‘Daniel Aguilar’, 1, 3 );
-
INSERT INTO clientes VALUES ( 4, ‘Abel Molina’, 2, 3 );
-
#rellenamos la tabla tipos_cliente
-
INSERT INTO tipos_cliente VALUES ( 1, ‘Desarrollador’ );
-
INSERT INTO tipos_cliente VALUES ( 2, ‘Diseñador’ );
-
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 información y darles un nombre de alias con AS. El alias nos sirve para utilizar nombres que nos aclaren más la función de la tabla en cuestión, pero es totalmente opcional en este caso.
Seguidamente, en la clausula FROM decimos de qué tablas sacamos la información 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 | Diseñador |
Ingeniería y Mezclas | Girona | Otros |
Enlaces relacionados: * JOIN Syntax
amigo como hago para un insert, update, delete con inner join
Hola Erivera, aca te dejo un enlace en Stackoverflow, creo que es lo que necesitas http://stackoverflow.com/questions/17666443/insert-query-with-an-inner-join