En la lección pasada hablamos sobre los diferentes tipos de JOIN en SQL. Hoy vamos a profundizar en el INNER JOIN.
INNER JOIN es un tipo de unión de datos en bases relacionales que te permite tomar filas de dos tablas y devolver solo aquellas filas que "coinciden" según la condición que tú defines. O sea, INNER JOIN devuelve solo las partes que se cruzan entre dos tablas, ignorando todo lo demás.
Imagina que tienes dos cajas. En una hay tarjetas con estudiantes y en la otra — tarjetas con los cursos en los que están inscritos los estudiantes. Quieres saber qué estudiantes están inscritos en qué cursos. Si no hay coincidencia (por ejemplo, un estudiante no está inscrito en nada), esos datos no nos interesan por ahora. Este escenario es perfecto para INNER JOIN.
Sintaxis de INNER JOIN
La sintaxis es bastante directa — indicas las dos tablas que quieres unir y defines la condición de unión usando la palabra clave ON.
SELECT columnas
FROM tabla1 INNER JOIN tabla2
ON tabla1.campo = tabla2.campo;
tabla1ytabla2— son las tablas que quieres unir.campo— son las columnas por las que se hace la comparación.- La condición después de
ONindica las reglas para comparar filas de ambas tablas.
Ejemplos de uso de INNER JOIN
Para los siguientes ejemplos vamos a trabajar con dos tablas:
Tabla students — datos sobre estudiantes
| student_id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Anna | 22 |
| 3 | Peter | 19 |
| 4 | Dia | 21 |
Tabla enrollments — datos sobre inscripciones a cursos
| enrollment_id | student_id | course_id |
|---|---|---|
| 101 | 1 | 501 |
| 102 | 2 | 502 |
| 103 | 2 | 503 |
| 104 | 3 | 504 |
Fíjate que la estudiante Dia (con student_id = 4) no está inscrita en ningún curso.
Ejemplo 1: Obtener inscripciones de estudiantes y sus cursos
Queremos saber qué estudiantes están inscritos en cursos. Este es un ejemplo típico de uso de INNER JOIN. Solo nos importa donde hay coincidencia de datos entre las tablas students y enrollments usando student_id.
SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;
Resultado:
| name | course_id |
|---|---|
| Otto | 501 |
| Anna | 502 |
| Anna | 503 |
| Peter | 504 |
¿Qué vemos? INNER JOIN solo devolvió los estudiantes que están inscritos en cursos. La estudiante Dia, que no está inscrita en ningún lado, quedó fuera.
Ejemplo 2: Obtener pedidos y clientes
Ahora vamos con otro ejemplo. Supón que tenemos las tablas orders (pedidos) y customers (clientes). Queremos obtener una lista de todos los pedidos con los nombres de los clientes.
Tabla orders
| order_id | customer_id | amount |
|---|---|---|
| 1 | 101 | 500 |
| 2 | 102 | 300 |
| 3 | 103 | 700 |
Tabla customers
| customer_id | name |
|---|---|
| 101 | Otto |
| 102 | Anna |
| 104 | Peter |
Tarea: necesitamos unir orders y customers por customer_id para devolver solo los pedidos que tienen un cliente correspondiente.
SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;
Resultado:
| order_id | name | amount |
|---|---|---|
| 1 | Otto | 500 |
| 2 | Anna | 300 |
Fíjate que el pedido con order_id = 3 no aparece en el resultado, porque el cliente con customer_id = 103 no existe en la tabla customers.
Cómo INNER JOIN ayuda a unir tablas (y qué puede salir mal)
INNER JOIN es la herramienta principal que vas a usar en casi cualquier proyecto que implique una base de datos relacional. Es como una llave inglesa en tu caja de herramientas: puedes intentar arreglártelas sin ella, pero te va a costar mucho más conseguir resultados. Por ejemplo:
- Al crear reportes donde necesitas combinar datos de varias tablas.
- Para hacer análisis, cuando tienes que unir hechos con dimensiones (por ejemplo, ventas y clientes).
- Para integrar datos de sistemas externos.
El error más común de los que empiezan es olvidarse del ON o poner mal la condición de unión. Si no pones la condición correcta, en vez del resultado esperado vas a obtener el producto cartesiano de las dos tablas — pueden ser miles o millones de filas que no tienen sentido.
Ejemplo de error:
En este ejemplo no hay condición de unión, así que la consulta va a crear todas las combinaciones posibles de filas de las dos tablas (y eso seguro que no es lo que quieres):
SELECT students.name, enrollments.course_id
FROM students, enrollments; -- ERROR: no hay condición de unión!
El resultado será un caos: cada fila de students se combina con cada fila de enrollments.
GO TO FULL VERSION