English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Использование соединений MySQL

В предыдущих главах мы уже научились читать данные из одной таблицы, это относительно просто, но в реальных приложениях часто нужно читать данные из нескольких таблиц.

В этой главе мы расскажем, как использовать JOIN MySQL для запросов данных в двух или более таблицах.

Вы можете использовать JOIN MySQL в SELECT, UPDATE и DELETE для объединения запросов к нескольким таблицам.

JOINroughly divided into the following three categories:

  • INNER JOIN (внутренний соединитель, или эквивалентный соединитель):: Получает записи, соответствующие условиям соответствия полей в двух таблицах.

  • LEFT JOIN (левый соединитель):Получает все записи левой таблицы, даже если в правой таблице нет соответствующих записей.

  • RIGHT JOIN (правый соединитель): В противоположность LEFT JOIN, используется для получения всех записей правой таблицы, даже если в левой таблице нет соответствующих записей.

Структура базы данных и данные для скачивания, используемые в этой главе:w3codebox-mysql-join-test.sql.

В командной строке используйте INNER JOIN

У нас в базе данных w3codebox есть две таблицы tcount_tbl и w3codebox_tbl. Данные в таблицах такие:

Онлайн пример

Попробуйте следующий пример:

mysql> use w3codebox;
База данных изменена
mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| w3codebox_author | w3codebox_count |
+---------------+--------------+
| 基础教程网                       | 10                                   |
| oldtoolbag.com                   | 20                                   |
| Google                           | 22                                   |
+---------------+--------------+
3 строк в наборе (0,01 сек)
 
mysql> SELECT * from w3codebox_tbl;
+-----------+---------------+---------------+-----------------+
| w3codebox_id | w3codebox_title  | w3codebox_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1         | Учимся PHP    | Основной учебник сеть  | 2017-04-12      |
| 2         | Учимся MySQL  | Основной учебник сеть  | 2017-04-12      |
| 3         | Учимся Java   | oldtoolbag.com    | 2015-05-01      |
| 4         | Учимся Python | oldtoolbag.com    | 2016-03-06      |
| 5         | Учимся C      | FK            | 2017-04-05      |
+-----------+---------------+---------------+-----------------+
5 строк в наборе (0.01 сек)

Далее мы используем MySQLINNER JOIN (можно также опустить INNER и использовать только JOIN, эффект будет одинаковым)Используя INNER JOIN для подключения указанных таблиц и чтения значений поля w3codebox_author из таблицы w3codebox_tbl и соответствующего поля w3codebox_count из таблицы tcount_tbl:

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           | Основной учебный сайт    | 10             |
| 2           | Основной учебный сайт    | 10             |
| 3           | oldtoolbag.com   | 20             |
| 4           | oldtoolbag.com   | 20             |
+-------------+-----------------+----------------+
4 строк в наборе (0.00 сек)

Данное SQL предложение эквивалентно:

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           | Основной учебный сайт    | 10             |
| 2           | Основной учебный сайт    | 10             |
| 3           | oldtoolbag.com   | 20             |
| 4           | oldtoolbag.com   | 20             |
+-------------+-----------------+----------------+
4 rows in set (0.01 sec)

MySQL LEFT JOIN

MySQL left join и join различаются. MySQL LEFT JOIN будет читать все данные левой таблицы, даже если в правой таблице нет соответствующих данных.

Онлайн пример

Попробуйте следующий пример, чтобы w3codebox_tbl Для левой таблицы,tcount_tbl Для правой таблицы, понимание применения 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           | Основной учебный сайт    | 10             |
| 2           | Основной учебный сайт    | 10             |
| 3           | oldtoolbag.com   | 20             |
| 4           | oldtoolbag.com   | 20             |
| 5           | FK              | NULL           |
+-------------+-----------------+----------------+
5 строк в наборе (0.01 сек)

В предыдущем примере использовался LEFT JOIN, этот запрос будет читать все поля левой таблицы w3codebox_tbl, даже если в правой таблице tcount_tbl нет соответствующего значения w3codebox_author.

MySQL RIGHT JOIN

MySQL RIGHT JOIN будет читать все данные правой таблицы, даже если в левой таблице нет соответствующих данных.

Онлайн пример

Попробуйте следующий пример, чтобы w3codebox_tbl Для левой таблицы,tcount_tbl Для правой таблицы, понимание применения 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           | Основной учебный сайт    | 10             |
| 2           | Основной учебный сайт    | 10             |
| 3           | oldtoolbag.com   | 20             |
| 4           | oldtoolbag.com   | 20             |
| NULL        | NULL            | 22             |
+-------------+-----------------+----------------+
5 строк в наборе (0.01 сек)

В данном примере используется RIGHT JOIN, который будет читать все поля из таблицы tcount_tbl, даже если в левой таблице w3codebox_tbl нет соответствующего значения w3codebox_author.

Использование JOIN в сценариях PHP

В PHP вы можете использовать функцию mysqli_query() для выполнения SQL-запросов, вы можете использовать приведенный выше SQL-запрос в качестве параметра функции mysqli_query().

Попробуйте следующий пример:

<?php
$dbhost = 'localhost'; // Адрес сервера MySQL
$dbuser = 'root'; // Логин пользователя MySQL
$dbpass = '123456'; // Пароль пользователя MySQL
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if (!$conn)
{
    die('Ошибка подключения: ' . mysqli_error($conn));
}
// Установка кодировки, предотвращение неправильного отображения китайских иероглифов
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, 'w3codebox');
$retval = mysqli_query($conn, $sql);
if(! $retval )
{
    die('Не удается прочитать данные: ' . mysqli_error($conn));
}
echo '<h2>Учебный сайт MySQL JOIN тест<h2>';
echo '<table border="1"><tr><td>ID учебника</td><td>Автор</td><td>Количество входов</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);
?>

Результат вывода показан на рисунке ниже: