Uso de JOIN en MySQL

En los capítulos anteriores, hemos aprendido a leer datos de una sola tabla, lo cual es relativamente sencillo, pero en las aplicaciones reales a menudo es necesario leer datos de múltiples tablas.

En este capítulo presentaremos cómo usar JOIN de MySQL para consultar datos en dos o más tablas.

Puede usar JOIN de MySQL en las sentencias SELECT, UPDATE y DELETE para realizar consultas de múltiples tablas.

JOIN se divide aproximadamente en las siguientes tres categorías según su función:

  • INNER JOIN (unión interna, o equijoin): Obtiene los registros donde los campos coinciden en ambas tablas.
  • LEFT JOIN (unión izquierda):Obtiene todos los registros de la tabla izquierda, incluso si la tabla derecha no tiene registros coincidentes.
  • RIGHT JOIN (unión derecha):A diferencia de LEFT JOIN, se utiliza para obtener todos los registros de la tabla derecha, incluso si la tabla izquierda no tiene registros coincidentes.

Estructura de la base de datos y descarga de datos utilizados en este capítulo:ejemplo-mysql-join-test.sql。

INNER JOIN

INNER JOIN devuelve las filas coincidentes que cumplen la condición de conexión en ambas tablas. A continuación se muestra la sintaxis básica de la sentencia INNER JOIN:

SELECT column1, column2, ...
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

Descripción de parámetros:

  • column1, column2, ... son los nombres de las columnas que desea seleccionar. Si se usa*significa seleccionar todas las columnas.
  • table1, table2son los nombres de las dos tablas que se van a conectar.
  • table1.column_name = table2.column_namees la condición de conexión, que especifica las columnas utilizadas para la coincidencia en las dos tablas.

INNER JOIN simple:

SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

La sentencia SQL anterior seleccionará los ID de pedido y los nombres de clientes que cumplan la condición de conexión en las tablas orders y customers.

2. Usar alias de tabla:

SELECT o.order_id, c.customer_name
FROM orders AS o
INNER JOIN customers AS c ON o.customer_id = c.customer_id;

La sentencia SQL anterior utiliza los alias de tabla o y c como alias de las tablas orders y customers.

3. INNER JOIN de múltiples tablas:

SELECT orders.order_id, customers.customer_name, products.product_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id
INNER JOIN order_items ON orders.order_id = order_items.order_id
INNER JOIN products ON order_items.product_id = products.product_id;

La sentencia SQL anterior implica la conexión de cuatro tablas: orders, customers, order_items y products. Selecciona el ID de pedido, el nombre del cliente y el nombre del producto, conectando las columnas relacionadas de estas tablas.

4. Usar la cláusula WHERE para filtrar:

SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id
WHERE orders.order_date >= '2023-01-01';

La sentencia SQL anterior usa la cláusula WHERE después de INNER JOIN para filtrar los pedidos con fecha posterior o igual a '2023-01-01'.

LEFT JOIN

LEFT JOIN devuelve todas las filas de la tabla izquierda e incluye las filas coincidentes de la tabla derecha. Si no hay filas coincidentes en la tabla derecha, se devolverán valores NULL. A continuación se muestra la sintaxis básica de la sentencia LEFT JOIN:

SELECT column1, column2, ...
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;

1. LEFT JOIN simple:

SELECT customers.customer_id, customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

La sentencia SQL anterior seleccionará el ID de cliente y el nombre de cliente de la tabla de clientes, e incluirá todas las filas de la tabla izquierda customers, así como los ID de pedido coincidentes (si los hay).

2. Usar alias de tabla:

SELECT c.customer_id, c.customer_name, o.order_id
FROM customers AS c
LEFT JOIN orders AS o ON c.customer_id = o.customer_id;

La sentencia SQL anterior utiliza los alias de tabla c y o para reemplazar los nombres de las tablas customers y orders, respectivamente.

3. LEFT JOIN de múltiples tablas:

SELECT customers.customer_id, customers.customer_name, orders.order_id, products.product_name
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
LEFT JOIN order_items ON orders.order_id = order_items.order_id
LEFT JOIN products ON order_items.product_id = products.product_id;

La sentencia SQL anterior conecta cuatro tablas: customers, orders, order_items y products, y selecciona el ID de cliente, nombre de cliente, ID de pedido y nombre de producto. La unión izquierda garantiza que, incluso si no hay filas coincidentes en order_items o products, se seguirá devolviendo la información del cliente y del pedido.

4. Usar la cláusula WHERE para filtrar:

SELECT customers.customer_id, customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE orders.order_date >= '2023-01-01' OR orders.order_id IS NULL;

La sentencia SQL anterior usa la cláusula WHERE después de LEFT JOIN para filtrar los pedidos con fecha posterior o igual a '2023-01-01', así como los clientes sin pedidos coincidentes.

LEFT JOIN es un tipo de conexión muy común, especialmente cuando se necesita devolver todas las filas de la tabla izquierda. Cuando no hay filas coincidentes en la tabla derecha, las columnas correspondientes se mostrarán como NULL. Al usar LEFT JOIN, asegúrese de comprender la condición de conexión y filtrar los resultados según sus necesidades.

RIGHT JOIN

RIGHT JOIN devuelve todas las filas de la tabla derecha e incluye las filas coincidentes de la tabla izquierda. Si no hay filas coincidentes en la tabla izquierda, se devolverán valores NULL. A continuación se muestra la sintaxis básica de la sentencia RIGHT JOIN:

SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;

A continuación se muestra un ejemplo sencillo de RIGHT JOIN:

SELECT customers.customer_id, orders.order_id
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;

La sentencia SQL anterior seleccionará todos los ID de pedido de la tabla derecha orders, e incluirá los ID de cliente coincidentes de la tabla izquierda customers. Si no hay un ID de cliente coincidente en la tabla customers, las columnas correspondientes se mostrarán como NULL.

En el proceso de desarrollo, RIGHT JOIN no se usa con frecuencia, porque se puede lograr el mismo efecto con LEFT JOIN intercambiando el orden de las tablas. Por ejemplo, la consulta anterior se puede reescribir usando LEFT JOIN de la siguiente manera:

SELECT customers.customer_id, orders.order_id
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;

La sentencia SQL anterior devuelve el mismo resultado, porque LEFT JOIN y RIGHT JOIN son simétricos. En la práctica, puede elegir qué forma usar según su preferencia personal o las normas de la organización.


Usar INNER JOIN en el símbolo del sistema

INNER JOIN puede conectar varias tablas según la condición de conexión especificada, por lo que puede obtener datos relacionados en la consulta.

Al usar INNER JOIN, asegúrese de que la condición de conexión sea precisa y comprenda la relación entre las tablas conectadas.

Ejemplo

Tenemos dos tablas tcount_tbl y ejemplo_tbl en la base de datos EJEMPLO.

Pruebe el siguiente ejemplo:

Datos de ejemplo de prueba

mysql> use EJEMPLO; Database changed mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | ejemplo_author | ejemplo_count| Ejemplo |10 | | EJEMPLO.COM | 20 | | Google | 22 | +---------------+--------------+ 3 rows in set (0.01 sec) mysql> SELECT * from ejemplo_tbl; +-----------+---------------+---------------+-----------------+ | ejemplo_id | ejemplo_title | ejemplo_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1| AprenderPHP| Ejemplo |2017-04-12 | | 2| AprenderMySQL| Ejemplo |2017-04-12 | | 3| AprenderJava | EJEMPLO.COM | 2015-05-01 | | 4| AprenderPython | EJEMPLO.COM | 2016-03-06 | | 5| AprenderC | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 rows in set (0.01 sec)

A continuación usaremos el INNER JOIN de MySQL(también se puede omitir INNER y usar JOIN, el efecto es el mismo)para conectar las dos tablas anteriores y leer los valores del campo ejemplo_count en la tabla tcount_tbl correspondientes a todos los campos ejemplo_author en la tabla ejemplo_tbl:

INNER JOIN

mysql> SELECT a.ejemplo_id, a.ejemplo_author, b.ejemplo_count FROM ejemplo_tbl a INNER JOIN tcount_tbl b ON a.ejemplo_author = b.ejemplo_author; +-------------+-----------------+----------------+ | a.ejemplo_id | a.ejemplo_author | b.ejemplo_count | +-------------+-----------------+----------------+ | 1| Ejemplo |10 | | 2| Ejemplo |10 | | 3 | EJEMPLO.COM | 20 | | 4 | EJEMPLO.COM | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.00 sec)

La sentencia SQL anterior es equivalente a:

Cláusula WHERE

mysql> SELECT a.ejemplo_id, a.ejemplo_author, b.ejemplo_count FROM ejemplo_tbl a, tcount_tbl b WHERE a.ejemplo_author = b.ejemplo_author; +-------------+-----------------+----------------+ | a.ejemplo_id | a.ejemplo_author | b.ejemplo_count | +-------------+-----------------+----------------+ | 1| Ejemplo |10 | | 2| Ejemplo |10 | | 3 | EJEMPLO.COM | 20 | | 4 | EJEMPLO.COM | 20 | +-------------+-----------------+----------------+ 4 rows in set (0.01 sec)


MySQL LEFT JOIN

LEFT JOIN es un tipo de conexión muy común, especialmente cuando se necesita devolver todas las filas de la tabla izquierda.

Cuando no hay filas coincidentes en la tabla derecha, las columnas correspondientes se mostrarán como NULL.

Al usar LEFT JOIN, asegúrese de comprender la condición de conexión y filtrar los resultados según sus necesidades.

MySQL left join se diferencia de join: LEFT JOIN lee todos los datos de la tabla izquierda, incluso si la tabla derecha no tiene datos correspondientes.

Ejemplo

Pruebe el siguiente ejemplo, tomandoejemplo_tblcomo tabla izquierda,tcount_tblcomo tabla derecha, para comprender la aplicación de MySQL LEFT JOIN:

LEFT JOIN

mysql> SELECT a.ejemplo_id, a.ejemplo_author, b.ejemplo_count FROM ejemplo_tbl a LEFT JOIN tcount_tbl b ON a.ejemplo_author = b.ejemplo_author; +-------------+-----------------+----------------+ | a.ejemplo_id | a.ejemplo_author | b.ejemplo_count | +-------------+-----------------+----------------+ | 1| Ejemplo |10 | | 2| Ejemplo |10 | | 3 | EJEMPLO.COM | 20 | | 4 | EJEMPLO.COM | 20 | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)

En el ejemplo anterior se usó LEFT JOIN; esta sentencia leerá todos los datos de los campos seleccionados de la tabla izquierda ejemplo_tbl, incluso si no hay valores de campo ejemplo_author correspondientes en la tabla derecha tcount_tbl.


MySQL RIGHT JOIN

MySQL RIGHT JOIN lee todos los datos de la tabla derecha, incluso si la tabla izquierda no tiene datos correspondientes.

En el proceso de desarrollo real, RIGHT JOIN no se usa con frecuencia, porque se puede lograr el mismo efecto con LEFT JOIN intercambiando el orden de las tablas.

Ejemplo

Pruebe el siguiente ejemplo, tomandoejemplo_tblcomo tabla izquierda,tcount_tblcomo tabla derecha, para comprender la aplicación de MySQL RIGHT JOIN:

RIGHT JOIN

mysql> SELECT a.ejemplo_id, a.ejemplo_author, b.ejemplo_count FROM ejemplo_tbl a RIGHT JOIN tcount_tbl b ON a.ejemplo_author = b.ejemplo_author; +-------------+-----------------+----------------+ | a.ejemplo_id | a.ejemplo_author | b.ejemplo_count | +-------------+-----------------+----------------+ | 1| Ejemplo |10 | | 2| Ejemplo |10 | | 3 | EJEMPLO.COM | 20 | | 4 | EJEMPLO.COM | 20 | | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 rows in set (0.01 sec)

En el ejemplo anterior se usó RIGHT JOIN; esta sentencia leerá todos los datos de los campos seleccionados de la tabla derecha tcount_tbl, incluso si no hay valores de campo ejemplo_author correspondientes en la tabla izquierda ejemplo_tbl.


Usar JOIN en scripts de PHP

En PHP, se utiliza la función mysqli_query() para ejecutar sentencias SQL. Puedes usar la misma sentencia SQL anterior como parámetro de la función mysqli_query().

Prueba el siguiente ejemplo:

Prueba de MySQL ORDER BY:

<?php $dbhost = 'localhost'; //Dirección del host del servidor mysql $dbuser = 'root'; //Nombre de usuario de mysql $dbpass = '123456'; //Contraseña del usuario de mysql $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Error de conexión:' . mysqli_error($conn)); } //Configurar la codificación para evitar que los caracteres chinos se muestren incorrectamente. mysqli_query($conn , "set names utf8"); $sql = 'SELECT a.ejemplo_id, a.ejemplo_author, b.ejemplo_count FROM ejemplo_tbl a INNER JOIN tcount_tbl b ON a.ejemplo_author = b.ejemplo_author'; mysqli_select_db( $conn, 'EJEMPLO' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('No se pudieron leer los datos:' . mysqli_error($conn)); } echo '<h2>Prueba de JOIN en MySQL del tutorial Ejemplo<h2>'; echo '<table border="1"><tr><td>ID del tutorial</td><td>Autor</td><td>Número de inicios de sesión</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['ejemplo_id']}</td> ". "<td>{$row['ejemplo_author']} </td> ". "<td>{$row['ejemplo_count']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>

El resultado de salida se muestra en la siguiente figura:

Otras extensiones