JOIN
La sentencia JOIN permite combinar dos o más tablas en una consulta, en ocasiones una tabla no va a tener los campos que necesitamos, pero esos datos están contenidos en otra tabla, lo que tenemos que hacer en encontrar la relación entre esas tablas para poder extraer los datos. Les dejaré la imagen para que lo puedan entender de manera gráfica:
Veamos algunos ejercicios:
Ejercicio 1:
Crear una consulta que nos muestre los equipos que hay en
México, y su estadio, asi como la ciudad en el que juega, utilizando la sentencia JOIN
Consideremos que para el ejercicio, se nos pide información de dos tablas, ya que se requiere el nombre del equipo que se encuentra en la tabla EQUIPOS, pero también el nombre del estadio en el que juega que se encuentra en la tabla ESTADIOS, lo primero que tenemos que hacer, es encontrar la relación entre estas dos, es decir, cual es el campo que me estará ligando una tabla con la otra, en este caso podemos observar que el campo en común es el de idestadio, que se encuentra en ambas tablas, yo puse el mismo nombre en el campo en ambas tablas, pero se puede dar el caso que no sea así, aunque no tengan el mismo nombre, debemos identificar cuales son el o los campos que unen estas dos tablas, como les dije, en este ejemplo se unirán por el campo idestadio de la tabla EQUIPOS y el campo idestadio de la tabla ESTADIOS, así que procederemos a realizar la siguiente cosulta:
select eq.nombre as Nombre_Equipo, e.nombre as Estadio, e.ciudad
from equipos eq
inner join estadios e
on e.idestadio=eq.idestadio
where eq.codigopais='MX';
Vamos a analizar la consulta, y la vamos a ir describiendo línea por línea
select eq.nombre as Nombre_Equipo, e.nombre as Estadio, e.ciudad
from equipos eq
inner join estadios e
on e.idestadio=eq.idestadio
where eq.codigopais='MX';
Aquí estamos utilizando la sentencia INNER JOIN, la cual nos esta diciendo que nos ligue la tabla EQUIPOS eq con la tabla ESTADIOS e, nos mostrará las relaciones que encuentre entre ellas y nos mostrará los campos seleccionados, en la clausula ON, le indicaremos cual o cuales son los campos mediante el cual se ligarán esas tablas, en este caso ON e.idestadio=eq.idestadio, después en la clausula WHERE estaremos diciéndole que queremos únicamente los equipos que tengan el código de país 'MX'
Ejercicio 2:
Crear una consulta que
nos muestre los partidos jugados en la “LIGA
MX”, el numero de partido, la jornada, la fecha, la hora, el equipo local,
los goles del equipo local, goles del equipo visitante y el estadio en el que
se jugó, utilizando la clausula INNER
JOIN
La tabla partidos no se alcanza a observar, así que le ejecute el comando DESCRIBE en la consola, aqui estan los campos que contiene
Para realizar esta consulta primero debemos buscar los campos que relacionan a ambas tablas, como pueden observar la tabla PARTIDOS contiene todo lo que necesitamos, a excepción del nombre del estadio, que se encuentra en la tabla ESTADIO, el campo que une las dos tablas es de la tabla PARTIDOS el campo idestadio y de la tabla ESTADIO el campo idestadio, entonces procederemos a realizar la consulta como sigue:
SELECT p.num_partido, p.jornada, p.fecha,p.equipolocal, p.goleslocal, p.golesvisitante, p.equipovisitante,
e.nombre
FROM PARTIDOS p
INNER JOIN ESTADIOS e on e.idestadio=p.idestadio
WHERE idtorneo=11 order by p.fecha,p.jornada, p.idpartido;
De la tabla PARTIDOS con su alias "p" tenemos los campos p.num_partido, p.jornada, p.fecha,p.equipolocal, p.goleslocal, p.golesvisitante, p.equipovisitante,
De la tabla ESTADIOS con su alias "e" tenemos e.nombre
Despues tenemos la liga en el FROM PARTIDOS p
INNER JOIN ESTADIOS e on e.idestadio=p.idestadio
Como vemos, la liga entre ellos es idestadio
WHERE idtorneo=11 order by p.fecha,p.jornada, p.idpartido;
Ejercicio 3:
Crear una consulta que
nos muestre el nombre de los equipos que participaron en torneo Ascenso MX Clausura 2016, utilizando la
cláusula INNER JOIN
Como ven existe una tabla de las llamadas "pivote" que es la tabla EQUIPOSTORNEO, esta tabla se llena desde un Procedimiento Almacenado que luego veremos, lo importante es que esta tabla, solo contiene el idequipo y idtorneo, como se pueden dar cuenta el campo idtorneo de la tabla EQUIPOSTORNEO y idtorneo de la tabla TORNEOS se unen entre sí, y de la tabla EQUIPOS el campo idequipo se une con idequipo de la tabla EQUIPOSTORNEO, entonces usaremos esas llaves para incluir una tercera tabla en la consulta. Ejecutaremos el siguiente query:
SELECT e.nombre
FROM EquiposTorneos et
inner join equipos e on e.idequipo=et.idequipo
INNER JOIN TORNEOS t on t.idtorneo=et.idtorneo
where et.idtorneo = 12;
¿Creen que puedan analizar este query ustedes solos?. Espero sus comentarios.
LEFT JOIN
Esta es otra sentencia similar a INNER JOIN mientras que INNER JOIN nos enlaza los datos coincidentes entre las dos tablas, LEFT JOIN nos muestra ademas de los datos coincidentes, tambien los no coincidentes, y donde no coincidan los rellenará con un NULL, pero como siempre veamos ejemplos para que quede más claro
Ejercicio 4:
Mostrar los equipos, que
están dados de alta, pero que no tienen ningún partido capturado utilizando la
sentencia LEFT JOIN.
Para analizar y entender esta consulta debemos analizar las tablas y este diagrama nos servirá, observen que la tabla EQUIPOS esta a la izquierda, pues bien, partiremos de ahí.
Ejecutaremos la siguiente sentencia:
select eq.nombre, p.idpartido
from equipos eq
left join puntos p
Como pueden observar se llama primero a la tabla EQUIPOS eq, y
on p.idequipo=eq.idequipo
le ordenamos que muestre el nombre del equipo que jugo en un idpartido de la tabla PARTIDOS, como se declara primero la tabla EQUIPOS esta queda a la derecha, por lo tanto, le decimos que nos traiga todos los datos coincidentes de las tablas PARTIDOS y EQUIPOS, pero también todos los registros que se encuentren a la izquierda, o sea, los registros de la tabla EQUIPOS, aunque no tengan coincidencia con ningún partido, es por eso, por lo que el equipo que no tenga partido en el campo idpartido aparecerá un NULL
Al ejecutar la sentencia, nos aparecerá algo mas o menos así:
Como ven, nos aparecerá una lista bastante grande, donde un equipo se repetirá tantas veces como partidos registrados tenga, y si no encuentra partidos registrados, mostrará entonces el valor NULL en la columna idpartido, pero si analizamos el problema planteado, eso no resuleve nada, ya que nosotros queremos que nos muestre únicamente los registros de los equipos que no tengan partido, la demás lista, no nos interesa, pues bien, hace falta agregar la clausula WHERE, como lo haremos en la siguiente sentencia
select eq.nombre, p.idpartido
from equipos eq
left join puntos p
on p.idequipo=eq.idequipo
where idpartido is null
Si utilizamos RIGH JOIN es exctamente lo mismo, solo que la tabla de la derecha, es decir, la úlima que declaramos será la de EQUIPOS.
Faltan algunos temas que revisar en la sentencia SELECT pero por el momento, dejemos este post aquí, espero haya sido de su agrado y de su utilidad. Espero compartan, comenten o den clic en algun anuncio de su interés.
Saludos y hasta la próxima
No hay comentarios.:
Publicar un comentario