Inner JOIN.

En esta clase vamos a picotear código SQL para aprender y retener perfectamente lo que son las consultas inner que vimos en la clase 7 de este curso de lenguaje SQL.

Para ello nos vamos a basar en la base de datos de nba.sql que puedes descargar AQUÍ.

Una vez descargada, importada y abierta puedes ver 4 tablas principales.

Estructura de la base de NBA

Analizando un poco la base, la tabla Equipo tiene una clave primaria llamada Nombre. La tabla Jugadores tiene también una clave foránea llamada Nombre_Equipo que se relaciona con el campo Nombre de la tabla Equipo.

Si realizo una consulta select de ambas tablas, me muestra la consulta de ambas tablas:

consulta SELECT de ambas tablas

El editor SGBD me muestra las dos tablas con todos sus columnas y registros porque no tengo nada filtrado. Pero se me muestran cada consulta en una pestaña diferente.

Si quisiera que me mostrara el contenido en la misma tabla, debería de llamar a las dos tablas en la sentencia SELECT, tal cual ves en la imagen:

consulta SELECT de ambas tablas

Con inner join hacemos lo mismo agrupando las consultas dentro de una misma pestaña teniendo en cuenta que la llamada a los campos de las tablas debe de ser coherente.

consulta INNER JOIN de ambas tablas

Pero estas tablas no están relacionadas entre sí, ya que se están cargando los datos directamente sin ninguna relación. Si queremos que estén relacionados entre sí, deberemos de usar las claúsulas ON en donde relacionaremos las columnas que nos interesan.

SELECT * FROM jugadores INNER JOIN equipos ON jugadores.Nombre_equipo = equipos.Nombre

consulta inner de dos consultas

Fijate que en la consulta lo que estoy haciendo es referenciar al campo de una tabla que es clave foránea (Nombre_equipo de la tabla Jugadores) respecto a la clave primaria de la tabla Equipos (Nombre). Lo que he consguido en esta consulta es hacer que se me muestren los jugadores que tiene cada equipo y las direcciones de los equipos.

Esta es la base del inner join, mostrar las dos consultas en una, en un lado una tabla y en la unión de ambas las claves referenciadas; en el otro lado la otra tabla. De hecho para que funcione un inner join las tablas relacionadas deben de tener campos en común.

inner join funciona que relaciona dos o más tablas en una consulta

Podríamos filtrar la consulta para que, por ejemplo me muestre solo los jugadores qué juegan en Nueva York:

SELECT * FROM jugadores INNER JOIN equipos ON jugadores.Nombre_equipo = equipos.Nombre AND Ciudad='New York'

consulta inner de jugadores de Nueva York

Esta consulta es parecida a esta misma:

SELECT * FROM jugadores, equipos where ciudad ='New York'

La diferencia entre la primera y la segunda consulta es que en la primera te aparecen el nombre de los jugadores que han jugado en Nueva York de forma relacionada; mientras que en la segunda consulta te aparecen los nombres de jugadores y los nombres de equipos sin relación entre ambas tablas.

consulta normal no relaciona las tablas

Por ejemplo puedes consultar el equipo que juega un jugador en cuestión y que te devuelva la consulta relacionada llamando al nombre del jugador en la consulta anterior:

SELECT * FROM jugadores INNER JOIN equipos ON jugadores.Nombre_equipo = equipos.Nombre where jugadores.Nombre='Corey Brever'

consulta relacionada del jugador Corey Brever

Y podríamos afinar más la consulta para que por ejemplo nos muestren los jugadores que pertenecen a cada equipo. Por ejemplo si queremos saber los jugadores que pertenecen al equipo 76ers, una simple consulta Select con una claúsula Where nos valdría:

SELECT * FROM jugadores where Nombre_equipo ='76ers'

consulta para saber los jugadores de un único equipo

Pero si quisieramos sacar los jugadores que tiene cada equipo, con un inner join nos devolvería los resultados. Además podemos usar alias para cada tabla a usar:

SELECT jugador.Nombre, jugador.Peso, jugador.Nombre_equipo FROM jugadores AS jugador
INNER JOIN equipos AS ubicacion ON jugador.Nombre_equipo = ubicacion.Nombre

El resultado es el siguiente:

Muestra los jugadores de cada equipo

La cuestión es que la relación entre dos tablas debe de ser lo más específica posible. Y suelen relacionar claves foráneas y primarias entre las tablas de una base de datos. Entonces, la cláusula JOIN nos permite asociar 2 o más tablas, en base a una columna que tengan en común.

Ahora vamos a fijarnos en las estadisticas de los jugadores por partidos. Esta tabla muestra las estadisticas de los jugadores por partido en cuanto a tapones, recogidas, asistencias y puntos. Y como puedes ver tenemos un id que es el que llama de jugadores, porque tenemos una clave primaria y foránea relacionada por el símbolo que aparece junto a la descripción de la tabla.

Tabla de estadisticas por jugadores

Por ejemplo voy a mostrar las estadísticas que juego del jugador Pau Gasol. Para ello, en la tabla jugadores hago una búsqueda de dicho jugador y lo llamo en la relación del inner join junto a la tabla estadistica de la forma siguiente:

SELECT * from jugadores
INNER JOIN estadisticas ON jugadores.codigo = estadisticas.jugador
WHERE jugadores.Nombre='Pau Gasol'

Inner join de las estadisticas de los jugadores

También tenemos la tabla partidos en la cual muestran los datos de las puntuaciones de partidos entre dos equipos y la temporada que se jugó. ¿Sabrías hacer la consulta join para que mostrasen en un equipo cualquiera (por ejemplo, los Lakers), que mostrase solo la puntuación cuando han perdido el partido en casa?

Estructura de la tabla partidos

Os dejo un vídeo sobre el cual aprenderás bien los conceptos que hemos repasado en esta clase.