miércoles, 27 de mayo de 2015

Como hacer consultas en dos tablas vinculadas utilizando la clausula INNER JOIN



El INNER JOIN permite emparejar filas de distintas tablas de forma más eficiente que con la utilización de la clausula “SELECT - WHERE”.

Utilizando “SELECT - WHERE” primero se combinan ambas tablas (si ambas tablas tienen 4 filas, el resultado de la tabla combinada será de 16 filas) y luego se seleccionan las filas que cumplan la condición de emparejamiento.

Con INNER JOIN se busca directamente las filas que cumplen la condición, con lo cual solo se emparejan las filas que luego aparecen en el resultado.

INNER JOIN empareja las filas que son comunes en ambas tablas.

Sintaxis:
SELECT campos
FROM tabla1
INNER JOIN tabla2 ON tabla1.campo=tabla2.campo

Observaciones para el uso de la clausula INNER JOIN:
  • Dentro de la cláusula ON los nombres de campos deben llevar el nombre de la tabla seguido de un  punto.
  • Los campos que son emparejados en la cláusula ON deben ser del mismo tipo de datos.
  • Los campos a emparejar no deben ser de tipo FLOAT, DOUBLE, MEMO u OLE.
  • Para el emparejamiento puede utilizarse cualquier tipo de operador de comparación: ( =, <, >, <=, >=, o <> )
  • Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y OR poniendo cada condición entre paréntesis.
  • Se pueden combinar más de dos tablas, en este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo.


Ejemplo:
Crear la siguiente base de datos con sus datos respectivos. 
Puede copiar el siguiente código en el portapapeles y pegarlo directamente en la línea de comandos del MySQL.

CREATE DATABASE IF NOT EXISTS nomina2;
USE nomina2;
CREATE TABLE IF NOT EXISTS departamentos(
cod_dep INT(2) NOT NULL,
descripcion VARCHAR(30) NOT NULL,
telf_dep VARCHAR(12) NOT NULL,
ciudad VARCHAR(20) NOT NULL,
presupuesto FLOAT(9,2) UNSIGNED NOT NULL,
fec_creacion DATE NOT NULL,
PRIMARY KEY(cod_dep)
) ENGINE=innodb;

CREATE TABLE IF NOT EXISTS empleado(
codigo INT(5) NOT NULL,
nombre VARCHAR(50) NOT NULL,
ingreso DATE NOT NULL,
sueldo FLOAT(7,2) UNSIGNED NOT NULL DEFAULT 7300.00, 
num_hijos INT(2) UNSIGNED NOT NULL,
tipo ENUM("Fijo","Temporal") NOT NULL,
tiempo_contrato TINYINT(2) UNSIGNED DEFAULT 1 NOT NULL,
dep_asignado INT(2) NOT NULL,
PRIMARY KEY(codigo),
FOREIGN KEY(dep_asignado) REFERENCES departamentos(cod_dep)
  ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=innodb;

INSERT INTO departamentos
(cod_dep,descripcion,telf_dep,ciudad,fec_creacion)
VALUES
(1,"Los Angeles","0268-2527823","Coro","2015-05-20"),
(2,"Lagunazo","0262-2519041","Valencia","2015-03-08"),
(3,"La Cascada","0212-2128078","Caracas","2014-01-25");

INSERT INTO empleado
(codigo,nombre,ingreso,sueldo,num_hijos,tipo,tiempo_contrato,dep_asignado)
VALUES
(1,"Alexis Porras","2012-02-20",9500,2,"Fijo",1,1),
(2,"Francisco Marin","1999-08-10",12300,0,"Fijo",4,2),
(3,"Humberto Cepeda","2004-05-07",8300,0,"Temporal",2,2),
(4,"Lino Araujo","2003-07-06",15200,3,"Fijo",5,3),
(5,"Raiza Villalobos","2011-01-03",7300,3,"Temporal",1,3);

Se desea listar todos los empleados con el nombre de su departamento y su respectivo teléfono.

Método INNER-JOIN: 

SELECT empleado.nombre,departamentos.descripcion,departamentos.telf_dep 
FROM empleado 
INNER JOIN departamentos
ON empleado.dep_asignado=departamentos.cod_dep;

Método SELECT-WHERE:
SELECT empleado.nombre,departamentos.descripcion,departamentos.telf_dep 
FROM empleado,departamentos WHERE empleado.dep_asignado=departamentos.cod_dep;

Observación:
En el método SELECT-WHERE, se genera primero una consulta de quince (15) filas provenientes de la unión de las tres (3) filas de la tabla "departamentos" x cinco (5) filas de la tabla "empleados" y luego se genera una consulta con solo cinco (5) filas.
En el método INNER-JOIN se genera una consulta solo con cinco (5) filas, por lo que el método INNER-JOIN resulta ser mucho más eficiente.
Tal vez no se considere significativa la diferencias entre 15 filas y 3 filas. Pero si en lugar de 2 tablas pequeñas fuesen 3 tablas de 750.000 filas, 12500 filas y 4700 filas respectivamente. El rendimiento en la consulta será significativo. 


No hay comentarios:

Publicar un comentario