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:

  1. Parte I: Instalación del MySql Server y MySql Workbench
  2. Parte II: Creacción de Tablas y Relaciones entre tablas (Modelo Entidad-Relación)
  3. Parte III: Sentencias básicas de MySql (Definition & Manipulation)
  4. Parte IV: Sentencia "INNER JOIN" para la unión de Tablas
  5. 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.

Comparte esta entrada en:
Safe Creative #1401310112503
Curso de Bases de Datos con MySql -Parte IV- (Video) “INNER JOIN” por "www.jarroba.com" esta bajo una licencia Creative Commons
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Creado a partir de la obra en www.jarroba.com

8 comentarios en “Curso de Bases de Datos con MySql -Parte IV- (Video) “INNER JOIN””

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies

ACEPTAR
Aviso de cookies