Curso de Bases de Datos con MySql -Parte IV- (Video) «INNER JOIN»
Este Curso de bases de datos con MySql esta formado por las siguientes entradas:
- Parte I: Instalación del MySql Server y MySql Workbench
- Parte II: Creacción de Tablas y Relaciones entre tablas (Modelo Entidad-Relación)
- Parte III: Sentencias básicas de MySql (Definition & Manipulation)
- Parte IV: Sentencia "INNER JOIN" para la unión de Tablas
- Parte V: Sentencia "GROUP BY" para la agrupación de datos
Parte IV: Sentencia INNER JOIN para la unión de Tablas
En esta cuarta parte se va a pasar a explicar como se "unen" tablas con la sentencia INNER JOIN a partir de una clave foranea (como es obvio). Tal y como se explica en el siguiente Video Tutorial se unen las dos tablas a partir de la "clave" común que en este caso es el identificador de la persona. A continuación mostramos la estructura de la sentencia INNER JOIN:
SELECT * FROM Tabla1 INNER JOIN Tabla2 ON Tabla1.identificador = Tabla2.identificador;
La misma estructura tienen las sentencias de LEFT JOIN y RIGHT JOIN que veremos mas adelante
A continuación mostramos el Video-Tutorial de como hacerlo:
Todo el material para poder realizar y seguir este tutorial os lo podeis descargar AQUI.
En este tutorial se ha realizado con las siguientes tablas y con la relación que se muestra en la siguiente imagen:
Para saber mas sobre como relacionar tablas y el paso de claves foraneas de unas tablas a otras según su relación, mirar el tutorial 2 de bases de datos pulsando AQUI.
El script para la creacción de las tablas y su relación es el siguiente y lo podeis ejecutar tal y como se muestra en el video tutorial:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; CREATE SCHEMA IF NOT EXISTS `miprimerabasededatos` DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci ; USE `miprimerabasededatos` ; -- ----------------------------------------------------- -- Table `miprimerabasededatos`.`Persona` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `miprimerabasededatos`.`Persona` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `Nombre` VARCHAR(80) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL , `Apellido1` VARCHAR(80) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL , `Apellido2` VARCHAR(80) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL , `DNI` VARCHAR(9) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL , PRIMARY KEY (`id`) , UNIQUE INDEX `id_UNIQUE` (`id` ASC) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_spanish_ci; -- ----------------------------------------------------- -- Table `miprimerabasededatos`.`Coche` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `miprimerabasededatos`.`Coche` ( `Matricula` VARCHAR(7) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL , `Marca` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL , `Modelo` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NOT NULL , `Caballos` INT(11) NOT NULL , `Persona_id` INT(11) NOT NULL , PRIMARY KEY (`Matricula`, `Persona_id`) , UNIQUE INDEX `Matricula_UNIQUE` (`Matricula` ASC) , INDEX `fk_Coche_Persona_idx` (`Persona_id` ASC) , CONSTRAINT `fk_Coche_Persona` FOREIGN KEY (`Persona_id` ) REFERENCES `miprimerabasededatos`.`Persona` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_spanish_ci; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
PARA VER LOS CAMBIOS ACORDAROS DE "REFRESCAR".
Para meter contenido a las dos tablas, tal y como se ha hecho en el tutorial, ejecutar las siguientes sentencias:
TABLA PERSONA
INSERT INTO `Persona` (`id`,`Nombre`,`Apellido1`,`Apellido2`,`DNI`) VALUES (1,'Ricardo','Moya','Garcia','30000000A'); INSERT INTO `Persona` (`id`,`Nombre`,`Apellido1`,`Apellido2`,`DNI`) VALUES (2,'Pepe','Garcia','Garcia','23456789F'); INSERT INTO `Persona` (`id`,`Nombre`,`Apellido1`,`Apellido2`,`DNI`) VALUES (3,'Paco','Gonzalez','Gonzalez','76134289Q'); INSERT INTO `Persona` (`id`,`Nombre`,`Apellido1`,`Apellido2`,`DNI`) VALUES (4,'Lola','Perez','Lopez','34872453R');
TABLA COCHE
INSERT INTO `Coche` (`Matricula`,`Marca`,`Modelo`,`Caballos`,`Persona_id`) VALUES ('1234bcb','Citroen','C3',500,1); INSERT INTO `Coche` (`Matricula`,`Marca`,`Modelo`,`Caballos`,`Persona_id`) VALUES ('5678CDC','Renault','Clio',120,2); INSERT INTO `Coche` (`Matricula`,`Marca`,`Modelo`,`Caballos`,`Persona_id`) VALUES ('6713bbb','Reanult','Megane',150,2); INSERT INTO `Coche` (`Matricula`,`Marca`,`Modelo`,`Caballos`,`Persona_id`) VALUES ('8923DDD','Seat','Ibiza',100,3); INSERT INTO `Coche` (`Matricula`,`Marca`,`Modelo`,`Caballos`,`Persona_id`) VALUES ('9823bbb','Ferrari','F25',900,1);
NOTA: Se ha introducido una tupla más en la tabla persona para mostrar un ejemplo claro con el LEFT JOIN.
La primera consulta realizada en el video tutorial en el que se hace la misma consulta que con el INNER JOIN pero sin el INNER JOIN es la siguiente:
SELECT * FROM Coche C ,Persona P WHERE C.Persona_id = P.id;
El resultado de la consulta es el siguiente:
Matricula | Marca | Modelo | Caballos | Persona_id | id | Nombre | Apellido1 | Apellido2 | DNI |
1234bcb | Citroen | C3 | 500 | 1 | 1 | Ricardo | Moya | Garcia | 30000000A |
9823bbb | Ferrari | F25 | 900 | 1 | 1 | Ricardo | Moya | Garcia | 30000000A |
5678CDC | Renault | Clio | 120 | 2 | 2 | Pepe | Garcia | Garcia | 23456789F |
6713bbb | Reanult | Megane | 150 | 2 | 2 | Pepe | Garcia | Garcia | 23456789F |
8923DDD | Seat | Ibiza | 100 | 3 | 3 | Paco | Gonzalez | Gonzalez | 76134289Q |
Esa misma consulta realizada con la sentencia INNER JOIN tendría la siguiente forma y daria el mismo resultado:
SELECT * FROM Coche INNER JOIN Persona ON Coche.Persona_id = Persona.id;
La siguiente consulta es una consulta utilizando el INNER JOIN pero en la que seleccionamos unos datos concretos de una determinada persona. En este caso seleccionamos el id, el Nombre de la persona con id=2 y la Marca y Modelo de los Coches que tiene:
SELECT id,Nombre,Marca,Modelo FROM Coche INNER JOIN Persona ON Coche.Persona_id = Persona.id WHERE Persona.id=2;
El resultado de la consulta seria el siguiente:
id | Nombre | Marca | Modelo |
2 | Pepe | Renault | Clio |
2 | Pepe | Reanult | Megane |
Ahora ponemos un ejemplo con el LEFT JOIN, que lo que hace es seleccionar todos los "id" de la tabla izquierda (de la tabla LEFT) y los une con las tuplas de la tabla con la que le unimos. Sino tiene relación con ninguna de las tuplas de la derecha, mostrara los datos de la tabla izquierda. Para verlo mas sencillo realizamos la siguiente consulta con el LEFT JOIN:
SELECT id,Nombre,Marca,Modelo FROM Persona LEFT JOIN Coche ON Coche.Persona_id = Persona.id;
Y el resultado que obtenemos de la consulta es el siguiente:
id | Nombre | Marca | Modelo |
1 | Ricardo | Citroen | C3 |
1 | Ricardo | Ferrari | F25 |
2 | Pepe | Renault | Clio |
2 | Pepe | Reanult | Megane |
3 | Paco | Seat | Ibiza |
4 | Lola | NULL | NULL |
Como se observa en este caso la persona con identificador '4' llamada 'Lola' no tiene ningun coche, pero la consulta realizada la da como resultado sin que esta tenga una tupla asociada en la tabla Coche de la base de datos. En este caso el LEFT JOIN porque la consulta es "Persona LEFT JOIN Coche" y Persona esta a la izquierda de Coche. Queda como ejercicio probar el RIGHT JOIN poniendo "Coche RIGHT JOIN Persona" para que veáis el resultado que obteneis. "¿Sera el mismo o no?" pues la respuesta es 'SI' ;). Analizar el porque y si teneis dudas dejar un comentarios en la entrada y os resolveremos la duda.
Me funciono de maravilla !!, la explicación que das es muy buena Gracias
como hago para obtener una consulta con inner join donde, necesito corroborar datos de tres tablas una principal y otras dos vinculadas por un id, tabla viajante necesito sacar cuales fueron las ventas mayores a x de la tabla ventas, y en que localidad hay mas clientes? gracias.
Muy buen aporte, saludos!
¡Gracias! Muy bueno tu aporte a la comunidad informática.
Hola, una duda para el uso de joins es necesario que el engine de las tablas sea inno db??? Saludos
No tiene porqué, Microsoft SQL no es Inno db y permite hacer Joins (https://technet.microsoft.com/en-us/library/ms191517(v=sql.105).aspx)
gracias
muy bueno! descargue los 4 tutoriales
muchas gracias
gracias que bien me quedo.