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
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
La sentencia SQL anterior es equivalente a:
Cláusula WHERE

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
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
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:
El resultado de salida se muestra en la siguiente figura: