MySQL INNER JOIN
Что такое ВНУТРЕННЕЕ СОЕДИНЕНИЕ в MySQL?
В MySQL INNER JOIN выбирает все строки из обеих участвующих таблиц, чтобы они появлялись в результате, если и только если обе таблицы удовлетворяют условиям, указанным в предложении ON. JOIN, CROSS JOIN и INNER JOIN являются синтаксическими эквивалентами. В стандартном SQL они не эквивалентны. INNER JOIN используется с предложением ON, CROSS JOIN используется в противном случае.
Иллюстрированная презентация MySQL INNER JOIN:
MySQL INNER JOIN Синтаксис:
MySQL поддерживает следующие синтаксисы JOIN для table_references (ссылка на таблицу также известна как выражение соединения.) Часть операторов SELECT и операторов UPDATE и DELETE для нескольких таблиц:
table_references: escaped_table_reference [, escaped_table_reference] ... escaped_table_reference: табличная_ссылка | {OJ table_reference} табличная_ссылка: table_factor | join_table table_factor: tbl_name [PARTITION (имя_раздела)] [[AS] псевдоним] [index_hint_list] | table_subquery [AS] псевдоним | (table_references) join_table: табличная_ссылка [ВНУТРЕННИЙ | CROSS] JOIN table_factor [join_condition] | table_reference STRAIGHT_JOIN table_factor | table_reference STRAIGHT_JOIN table_factor ON conditional_expr | table_reference {LEFT | RIGHT} [OUTER] JOIN table_reference join_condition | table_reference NATURAL [{LEFT | RIGHT} [OUTER]] JOIN table_factor join_condition: ON conditional_expr | ИСПОЛЬЗОВАНИЕ (column_list) index_hint_list: index_hint [, index_hint] ... index_hint: USE {INDEX | KEY} [FOR {JOIN | ORDER BY | GROUP BY}] ([index_list]) | IGNORE {INDEX | KEY} [FOR {JOIN | ORDER BY | GROUP BY}] (index_list) | СИЛА {ИНДЕКС | КЛЮЧ} [FOR {JOIN | ORDER BY | GROUP BY}] (index_list) index_list: index_name [, index_name] ...
Пример: MySQL INNER JOIN
При объединении записей из более чем одной таблицы пользователь должен указать, как записи в таблице можно сопоставить с записями в другой. Поскольку обе таблицы имеют столбец cate_id, мы можем сопоставить его с помощью этого столбца. Предложение ON используется для сопоставления записей в двух таблицах на основе значения столбца cate_id. Использование INNER JOIN объединяет таблицы. INNER JOIN позволяет строкам из любой таблицы появляться в результате тогда и только тогда, когда обе таблицы удовлетворяют условиям, указанным в предложении ON.
В этом примере предложение ON указывает, что столбец cate_id и book_mast, и таблицы категорий должен совпадать. Если cate_id не появляется в обеих таблицах, строка не будет отображаться в результате, потому что условие в условии ON не выполняется. Только те категории будут участвовать в JOIN, чьи книги написаны на английском языке.
Код:
SELECT book_mast.book_id,book_mast.book_name,cate_descrip
FROM book_mast
INNER JOIN category
ON book_mast.cate_id=category.cate_id
WHERE book_mast.pub_lang="English";
Пример таблицы: book_mast
Пример таблицы: категория :
Пример вывода:
mysql> ВЫБРАТЬ book_mast.book_id, book_mast.book_name, cate_descrip -> ОТ book_mast -> ВНУТРЕННЯЯ РЕЙТИНГ категория -> ВКЛ book_mast.cate_id = category.cate_id -> ГДЕ book_mast.pub_lang = "английский"; + --------- + ------------------------------------- + - ------------- + | book_id | book_name | cate_descrip | + --------- + ------------------------------------- + - ------------- + | BK001 | Введение в электродинамику | Наука | | BK002 | Понимание стальных конструкций | Технологии | | BK004 | Передача тепла и массы | Технологии | | BK010 | Основы термодинамики | Технологии | | BK012 | Природа Мира | Природа | | BK009 | Уход за психическим здоровьем | Медицинский | + --------- + ------------------------------------- + - ------------- + 6 рядов в наборе (0,04 сек)
PHP скрипт
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>example-inner-join-with-multiple-tables php mysql examples | w3resource</title>
<meta name="description" content="example-inner-join-with-multiple-tables php mysql examples | w3resource">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12">
<h2>List of the book ids, name of the book and category description:</h2>
<table class='table table-bordered'>
<tr>
<th>Book ID</th><th>Name of the book</th><th>Category description</th>
</tr>
<?php
$hostname="your_hostname";
$username="your_username";
$password="your_password";
$db = "your_dbname";
$dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);
foreach($dbh->query('SELECT book_mast.book_id,book_mast.book_name,cate_descrip
FROM book_mast
INNER JOIN category
ON book_mast.cate_id=category.cate_id
WHERE book_mast.pub_lang="English"') as $row) {
echo "<tr>";
echo "<td>" . $row['book_id'] . "</td>";
echo "<td>" . $row['book_name'] . "</td>";
echo "<td>" . $row['cate_descrip'] . "</td>";
echo "</tr>";
}
?>
</tbody></table>
</div>
</div>
</div>
</body>
</html>
Пример: MySQL INNER JOIN с псевдонимом
Следующая инструкция MySQL возвращает идентификаторы книги, название книги, идентификатор издателя, описание категории и язык издателя, где язык издателя - английский, а идентификатор издателя не равен P004. Обратите внимание, что псевдонимы использовались для ссылки на имена столбцов. ВНУТРЕННЕЕ СОЕДИНЕНИЕ выполняется на основе условия, что идентификатор категории в таблице book_mast также должен существовать в таблице категорий.
Код:
SELECT bk.book_id,bk.book_name,bk.pub_id,ca.cate_descrip,bk.pub_lang
FROM book_mast AS bk
INNER JOIN category AS ca ON bk.cate_id=ca.cate_id AND
bk.pub_lang="English" AND bk.pub_id<>'P004';
Пример таблицы: book_mast :
Пример вывода:
mysql> SELECT bk.book_id, bk.book_name, bk.pub_id, ca.cate_descrip, bk.pub_lang -> ОТ book_mast AS bk -> ВНУТРЕННЯЯ РЕШЕНИЕ категория КАК ВКЛ bk.cate_id = ca.cate_id И -> bk.pub_lang = 'английский' И bk.pub_id <> 'P004'; + --------- + ------------------------------------- + - ------- + -------------- + ---------- + | book_id | book_name | pub_id | cate_descrip | pub_lang | + --------- + ------------------------------------- + - ------- + -------------- + ---------- + | BK001 | Введение в электродинамику | P003 | Наука | Английский | | BK002 | Понимание стальных конструкций | P001 | Технологии | Английский | | BK010 | Основы термодинамики | P007 | Технологии | Английский | | BK012 | Природа Мира | P008 | Природа | Английский | | BK009 | Уход за психическим здоровьем | P007 | Медицинский | Английский | + --------- + ------------------------------------- + - ------- + -------------- + ---------- + 5 рядов в наборе (0,00 сек)
MySQL INNER JOIN с использованием трех таблиц
Образцы таблиц:
стол - врачи + ------- + --------- + | докид | имя | + ------- + --------- + | 1 | А.ВАРМА | | 2 | Д.ГОМЕС | + ------- + --------- + стол - специализируйся + ------ + ---------- + ------- + | спид | desc | докид | + ------ + ---------- + ------- + | 1 | special1 | 1 | | 2 | special2 | 2 | + ------ + ---------- + ------- + таблица - расписание + ----- + ------ + ---------- + ------- + | Tid | день | sit_time | докид | + ----- + ------ + ---------- + ------- + | 1 | Пн | 17:00:00 | 1 | | 2 | СР | 08:00:00 | 1 | | 3 | Вт | 16:00:00 | 2 | | 4 | FRI | 09:00:00 | 2 | + ----- + ------ + ---------- + ------- +
Приведенные выше таблицы связаны друг с другом. В врачах , специализированных и временных таблицах первичным ключом последовательно являются docid , spid и tid . Документ docid в таблицах специализации и расписаниях является внешним ключом, который является ссылкой на первичный ключ docid таблицы врачей .
Если мы хотим, чтобы все записи для врача, который специализировался на special1 и сидел в своей палате в среду (WED) в свое время по расписанию, можно использовать следующий SQL-запрос:
Код:
SELECT a.docid,a.dname,
b.desc,c.tday,c.sit_time
FROM doctors a
INNER JOIN specialize b
ON a.docid=b.docid
INNER JOIN timeschedule c
ON a.docid=c.docid
WHERE a.docid=1 AND c.tday='WED';
Пример вывода:
+ ------- + --------- + ---------- + ------ + ---------- + | докид | имя | desc | день | sit_time | + ------- + --------- + ---------- + ------ + ---------- + | 1 | А.ВАРМА | special1 | СР | 08:00:00 | + ------- + --------- + ---------- + ------ + ---------- +
Пояснение:
Шаг 1
ВЫБЕРИТЕ a.docid, a.dname, b.desc ОТ врачей ВНУТРЕННЕЕ СОЕДИНЕНИЕ специализируется на ON a.docid = b.docid;
Шаг 2
ВЫБЕРИТЕ a.docid, a.dname, b.desc, c.tday, c.sit_time ОТ врачей ВНУТРЕННЕЕ СОЕДИНЕНИЕ специализируется на ON a.docid = b.docid ВНУТРЕННЕЕ СОЕДИНЕНИЕ расписание ON a.docid = c.docid;
Шаг 3
ВЫБЕРИТЕ a.docid, a.dname, b.desc, c.tday, c.sit_time ОТ врачей ВНУТРЕННЕЕ СОЕДИНЕНИЕ специализируется на ON a.docid = b.docid ВНУТРЕННЕЕ СОЕДИНЕНИЕ расписание ON a.docid = c.docid ГДЕ a.docid = 1 И c.tday = 'WED';
Ключевые моменты для запоминания
Нажмите на следующее, чтобы получить презентацию слайдов -
ВНУТРЕННИЕ СОЕДИНЕНИЯ: SQL и другие реляционные базы данных
Предыдущий: выберите с помощью date_add ()
Далее: левое соединение
Новый контент: Composer: менеджер зависимостей для PHP , R программирования