English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En los capítulos anteriores, hemos aprendido cómo leer datos en una tabla, lo que es relativamente simple, pero en la práctica, a menudo se necesita leer datos de múltiples tablas de datos.
En este capítulo, les presentaremos cómo utilizar JOIN de MySQL para consultar datos en dos o más tablas.
Puede usar JOIN de MySQL en SELECT, UPDATE y DELETE para unir consultas de múltiples tablas.
La función de JOIN se puede dividir aproximadamente en tres categorías como sigue:
INNER JOIN (conexión interna, o conexión de igualdad):Obtener los registros que coinciden en la relación de campos entre las dos tablas.
LEFT JOIN (conexión izquierda):Obtener todos los registros de la tabla izquierda, incluso si no hay registros coincidentes en la tabla derecha.
RIGHT JOIN (conexión derecha): Al contrario que LEFT JOIN, se utiliza para obtener todos los registros de la tabla derecha, incluso si no hay registros coincidentes en la tabla izquierda.
Estructura de base de datos utilizada en este capítulo y descarga de datos:w3codebox-mysql-join-test.sql.
En w3La base de datos codebox tiene dos tablas tcount_tbl y w3codebox_tbl. Los datos de dos tablas se muestran a continuación:
Prueba el siguiente ejemplo:
mysql> use w3codebox; Base de datos cambiada mysql> SELECT * FROM tcount_tbl; +---------------+--------------+ | w3codebox_author | w3codebox_count | +---------------+--------------+ | Tutoriales básicos de la red | 10 | | oldtoolbag.com | 20 | | Google | 22 | +---------------+--------------+ 3 rows en conjunto (0.01 sec) mysql> SELECT * from w3codebox_tbl; +-----------+---------------+---------------+-----------------+ | w3codebox_id | w3codebox_title | w3codebox_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | Aprende PHP | Tutoriales básicos de la red | 2017-04-12 | | 2 | Aprende MySQL | Tutoriales básicos de la red | 2017-04-12 | | 3 | Aprende Java | oldtoolbag.com | 2015-05-01 | | 4 | Aprende Python | oldtoolbag.com | 2016-03-06 | | 5 | Aprende C | FK | 2017-04-05 | +-----------+---------------+---------------+-----------------+ 5 rows en conjunto (0.01 sec)
A continuación, utilizaremos MySQLINNER JOIN (también se puede omitir INNER y usar JOIN, el efecto es el mismo)Para conectar estas dos tablas y leer w3Todos los w en la tabla codebox_tbl3El campo codebox_author en la tabla tcount_tbl corresponde a w3Valor del campo codebox_count
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a INNER JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | sitio web básico | 10 | | 2 | sitio web básico | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | +-------------+-----------------+----------------+ 4 filas en conjunto (0.00 sec)
La siguiente sentencia SQL es equivalente a:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a, tcount_tbl b WHERE a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | sitio web básico | 10 | | 2 | sitio web básico | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | +-------------+-----------------+----------------+ 4 rows en conjunto (0.01 sec)
MySQL left join es diferente de join. MySQL LEFT JOIN leerá todos los datos de la tabla de datos izquierda, incluso si no hay datos correspondientes en la tabla derecha.
Prueba el siguiente ejemplo para w3codebox_tbl Para la tabla de la izquierda,tcount_tbl Para la tabla de la derecha, comprende la aplicación de MySQL LEFT JOIN:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a LEFT JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | sitio web básico | 10 | | 2 | sitio web básico | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | | 5 | FK | NULL | +-------------+-----------------+----------------+ 5 rows en conjunto (0.01 sec)
En el siguiente ejemplo se utilizó LEFT JOIN, esta sentencia leerá la tabla de datos izquierda w3todos los campos seleccionados de codebox_tbl, incluso si no hay un w correspondiente en la tabla tcount_tbl de la derecha3valor de campo codebox_author.
MySQL RIGHT JOIN leerá todos los datos de la tabla de datos de la derecha, incluso si no hay datos correspondientes en la tabla izquierda.
Prueba el siguiente ejemplo para w3codebox_tbl Para la tabla de la izquierda,tcount_tbl Para la tabla de la derecha, entienda la aplicación de MySQL RIGHT JOIN:
mysql> SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a RIGHT JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author; +-------------+-----------------+----------------+ | a.w3codebox_id | a.w3codebox_author | b.w3codebox_count | +-------------+-----------------+----------------+ | 1 | sitio web básico | 10 | | 2 | sitio web básico | 10 | | 3 | oldtoolbag.com | 20 | | 4 | oldtoolbag.com | 20 | | NULL | NULL | NULL | 22 | +-------------+-----------------+----------------+ 5 rows en conjunto (0.01 sec)
En el ejemplo anterior se utilizó RIGHT JOIN, esta sentencia leerá todos los campos seleccionados de la tabla de datos tcount_tbl, incluso si en la tabla izquierda w3no hay correspondencia de w en codebox_tbl3valor de campo codebox_author.
En PHP, para ejecutar una sentencia SQL utilizando mysqli_query() función, puede usar la misma sentencia SQL como parámetro de mysqli_query().
Pruebe el siguiente ejemplo:
<?php $dbhost = 'localhost'; // dirección de servidor de mysql $dbuser = 'root'; // nombre de usuario mysql $dbpass = '123456'; // nombre de usuario y contraseña de mysql $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn) { die('Fallo de conexión: ' . mysqli_error($conn)); } // establecer codificación, evitar caracteres chinos ilegales mysqli_query($conn, "set names utf8'); $sql = 'SELECT a.w3codebox_id, a.w3codebox_author, b.w3codebox_count FROM w3codebox_tbl a INNER JOIN tcount_tbl b ON a.w3codebox_author = b.w3codebox_author'; mysqli_select_db( $conn, 'w' }}3codebox'); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('No se puede leer los datos: ' . mysqli_error($conn)); } echo '<h2>Sitio web básico de tutoriales MySQL JOIN prueba<h2> echo '<table border="1><tr><td>ID de tutorial</td><td>Autor</td><td>Veces de inicio de sesión</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> "{$row['w3codebox_id']}</td> ". "<td>{$row['w3codebox_author']} </td> ". "<td>{$row['w3codebox_count'} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
El resultado de la salida se muestra como se ilustra a continuación: