jueves, 12 de mayo de 2016

Select en MySQL (Maria DB) Parte II - Uso de JOINS

Buenas tardes queridos lectores, el día de hoy les escribiré sobre el uso de JOIN en consultas SELECT de MySql (MariaDB), para eso, utilizaré una imagen que pulula por la red, que hace una descripción bastante gráfica del JOIN, espero restauren la base de datos de Ejemplo que les compartí la otra vez para que puedan seguir las consultas, sino, no se preocupen, con ver el ejemplo, podrán hacer las consultas que quieran, lo importante es entenderle, pues bien, pasemos a lo que nos interesa que es hacer las cosas

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';


Al ejecutar la consulta, nos devuelve el siguiente resultado:





















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

Aquí, estamos primeramente indicándole a la sentencia SELECT, cuales son los campos que va a seleccionar y de que tablas, si nos fijamos en la clausula FROM observamos que la tabla EQUIPOS tiene un "alias" que es "eq", esto es, porque tenemos que indicarle a MariaDB, a que tabla pertenece cada campo, ademas que los dos campos se llaman igual (nombre), y la base de datos, no sabría cual es cual, además es más sencillo decir eq.nombre que equipo.nombre, aunque también puede funcionar. Estaremos llamando de la tabla EQUIPOS el campo de nombre y de la tabla ESTADIOS el campo de nombre, ciudad. La tabla ESTADIOS tiene un alias "e" que se nombra en el INNER JOIN

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;

Al realizar la consulta, quedaría de la siguiente manera:



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;

Simplemente usando la clausula WHERE le indicamos que solo el torneo idtorneo=11 que es el de la liga mexicana y le indicamos que nos ordene el resultado de manera ascendente primeramente la fecha, luego la jornada, y el idpartido, que aunque no se encuentra en la lista del Select, si puede formar parte de un ORDER BY

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;

El resultado de ese query es el siguiente:


¿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

Como ven, la sentencia WHERE nos acota a los resultados que queremos




















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

Banderas de Visitantes

Flag Counter