Saltar al contenido

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

Ricardo Moya

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:

Diagrama entidad-relación de las tablas Persona y Coche, con relación de uno a muchos a través de Persona_id

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.

Ricardo Moya

Me dedico profesionalmente al Machine Learning y al Big Data. Me gusta aprender tecnologías nuevas y explicarlas de la mejor manera posible en esta web.

Te puede interesar

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.

9 Ene 2022

Comentarios (10)

  1. Instalar MySQL

    Me funciono de maravilla !!, la explicación que das es muy buena Gracias

  2. hugo

    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.

  3. sd-enHack

    Muy buen aporte, saludos!

  4. Ricardo Mora

    ¡Gracias! Muy bueno tu aporte a la comunidad informática. 

  5. Luis

    Hola, una duda para el uso de joins es necesario que el engine de las tablas sea inno db??? Saludos 

    1. Ramón Invarato Jarroba.com

      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)

  6. jonathan

    gracias

  7. jonathan

    muy bueno! descargue los 4 tutoriales

  8. stalin

    muchas gracias

  9. freddy

    gracias que bien me quedo.

Deja un comentario


Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.