consultas (SENTENCIA JOIN)
Un JOIN funciona de manera similiar a la sentencia SELECT sobre las tablas de una base de datos. Esta sentencia nos permite extraer registros que pertenezcan a una u otra tabla luego de comparar los registros comunes para las tablas.
INNER JOIN
Para el JOIN entre dos o más tablas, basta con usar el join después de referenciar los campos y una primera tabla, luego de ellos se deben relacionar otras tablas, para esto se debe usar la claúsula INNER JOIN después del FROM.
El "INNER" funciona como función de intersección entre dos conjuntos, de tal manera, que el INNER JOIN se podría remplazar por una consulta del tipo:
SELECT campo1.tabla1,campo2.tabla1, campo1.tabla2'
FROM tabla1,tabla2
WHERE campo1.tabla1 =campo1.tabla2;
De tal manera, que la sentencia anterior se podría remplazar por la siguiente;
SELECT (campo1,campo2)
FROM tabla1 INNER JOIN
tabla2 ON tabla1.campo1=tabla2.campo1;
lgo similar a la teoría de conjuntos donde el INNER JOIN representa la intersección:
Los registros que se traeràn, seràn aquellos que por la llave primaria y foranea hacen parte de las dos tablas y se relacionan.
Supongamos que tenemos dos tablas como las siguientes, en la que hay un relaciòn uno a muchos entre la tabla medicos y pacientes. Quiere decir que a un médico se le pueden asignar uno o muchos pacientes.
TABLA MEDICOS:
Ahora la tabla de PACIENTES
Observe que hay dos pacientes sin medico asignado ( NULL)
Si hicieramos una consulta como las ya estudiadas seria algo así:
SELECT id_cedula, tadm_pacientes.apellidos_y_nombres AS PACIENTE,
tadm_medicos.apellidos_y_nombres AS MEDICO,
id_especialidad
FROM tadm_pacientes, tadm_medicos
WHERE tadm_pacientes.id_medico=tadm_medicos.id_medico
ORDER BY id_especialidad;
para obtener :
ahora lo podemos hacer usando la sentencia INNER JOIN:
SELECT id_cedula, tadm_pacientes.apellidos_y_nombres as PACIENTE,
tadm_medicos.apellidos_y_nombres AS MEDICO
FROM tadm_pacientes INNER JOIN
tadm_medicos ON tadm_pacientes.id_medico=tadm_medicos.id_medico
order by id_especialidad;
con lo que vamos a obtener exactamente el mismo resultado de la consulta anterior.
Ahora realicemos una consulta sobre las mismas dos tablas pero usando LEFT OUTER JOIN:
LETF OUTER JOIN
El comportamiento es similiar al del INNER JOIN, la diferencia es que el LEFT OUTER JOIN nos traerà los registros que estén a la izquierda de la cláusula JOIN, como veremos a continuación en el ejemplo:
SELECT campo1.tabla1,campo2.tabla1, campo1.tabla2'
FROM tabla1
LEFT OUTER JOIN tabla2 ON campo1 =tabla2.campo1;
Esta consulta devolverá todos los registros de la tabla1, independientemente de que tengan registros de la tabla2. En el caso de que los datos de tabla1 no tenga registros iguales en tabla2, se devolverá el valor NULL para los
campos no relacionados en tabla2.
Ahora realicemos una consulta sobre las mismas dos tablas pero usando LEFT OUTER JOIN:
SELECT id_cedula, tadm_pacientes.apellidos_y_nombres as PACIENTE,
tadm_medicos.apellidos_y_nombres AS MEDICO
FROM tadm_pacientes
LEFT OUTER JOIN tadm_medicos ON tadm_pacientes.Id_medico =tadm_medicos.id_medico;
¿Qué datos distintos trae?
trae todos los pacientes incluso aquellos que no tengan medico asignado, en este caso, Manjarres Jennifer y Manrique Julian.
RIGHT OUTER JOIN
Hace lo contrario al LEFT, de tal manera que nos trae todos los registros que estén a la derecha de la cláusula JOIN. su estructura sería:
SELECT (Nombres, Apellidos, Direccion, BARRIOS.Nombre AS Barrio)
FROM ESTUDIANTES
RIGHT OUTER JOIN BARRIOS ON IdBarrio = BARRIOS.Codigo;
SELECT campo1.tabla1,campo2.tabla1, campo1.tabla2'
FROM tabla1
RIGHT OUTER JOIN tabla2 ON campo1 =tabla2.campo1;
Esta consulta devolverá los registros obtenidos tabla2 , tengan o no algún registro en tabla1.
Como se puede observar trae los registros que estén a la derecha de la intersección, incluida la intersección.
El siguiente dibujo muestra los registros que se traen:
AHORA HAGAMOS UN RIGHT OUTER JOIN
SELECT id_cedula, tadm_pacientes.apellidos_y_nombres as PACIENTE,
tadm_medicos.apellidos_y_nombres AS MEDICO
FROM tadm_pacientes
RIGHT OUTER JOIN tadm_medicos ON tadm_pacientes.Id_medico =tadm_medicos.id_medico;
que nos trae:
como puede observar, trae todos los medicos aunque no tengan pacientes asignados hasta ahora