Curso de Bases de Datos con MySql -Parte IV- (Video) «INNER JOIN»
En esta cuarta parte se va a pasar a explicar cómo se "unen" tablas con la sentencia INNER JOIN a partir de una clave foránea
Serie: Curso de bases de datos con MySQL parte 4 de 5
Parte IV: Sentencia INNER JOIN para la unión de Tablas
En esta cuarta parte se va a pasar a explicar cómo se «unen» tablas con la sentencia INNER JOIN a partir de una clave foránea (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 más 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 más sobre cómo relacionar tablas y el paso de claves foráneas de unas tablas a otras según su relación, mirar el tutorial 2 de bases de datos pulsando AQUI.
El script para la creación de las tablas y su relación es el siguiente y lo podéis 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 ACORDAOS 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 daría 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 sería 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. Si no tiene relación con ninguna de las tuplas de la derecha, mostrará los datos de la tabla izquierda. Para verlo más 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 ningún 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 está 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 porqué y si tenéis dudas dejar un comentario en la entrada y os resolveremos la duda.
«Curso de Bases de Datos con MySql -Parte IV- (Video) «INNER JOIN»», de Ricardo Moya en jarroba.com, con licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0. Obra registrada en Safe Creative.

Te puede interesar
Curso de MongoDB -Parte I- (Video) – «Introducción»
Primera parte del curso de MongoDB: qué es una base de datos orientada a documentos y cómo guarda los datos en BSON y JSON, frente a MySQL.
ETL: Extraer, Transformar y Cargar
ETL sirve para procesar datos masivos (Big Data) en tiempo real: extraer de varias fuentes, transformar a una estructura útil y cargar donde usarlos.
Comentarios (10)
-
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)
-



Deja un comentario