Памятка по JOIN-ам в SQL
Нередко web-разработчикам приходится сталкиваться с необходимостью выбора данных из нескольких таблиц одновременно. Думаю, никого из читателей не
тревожит вопрос о том стоит ли вообще использовать такие запросы. Ответ очевиден. Такие запросы уменьшают число обращений к базе данных, тем самым
уменьшая время выполнения скрипта и нагрузку на сервер. Давайте разберёмся как пользоваться многотабличными запросами.
Допустим, у нас есть две таблицы:
Таблица tbl1:
id | name |
1 | А |
2 | Б |
3 | В |
Таблица tbl2:
id | letter |
2 | Г |
3 | Д |
4 | Е |
Произведём простейший запрос к двум таблицам.
1 |
SELECT * FROM tbl1,tbl2 WHERE tbl1.id=tbl2.id |
В результате этого запроса получится следующая таблица:
id | name | id | letter |
2 | Б | 2 | Г |
3 | В | 3 | Д |
То есть, данный запрос строго выбирает из двух таблиц только те строки, столбцы id которых совпадают.
Аналогичного результата можно добиться с помощью следующего запроса:
1 |
SELECT * FROM tbl1 JOIN tbl2 WHERE tbl1.id=tbl2.id |
Для формирования условия в запросах, использующих объединение JOIN, вместо ключевого слова WHERE предпочтительно использовать ключевое слово ON,
как это продемонстрировано в следующем листинге:
1 |
SELECT * FROM tbl1 JOIN tbl2 ON tbl1.id=tbl2.id |
Выше было продемонстрировано перекрестное объединение таблиц tbl1 и tbl2. При это результирующая таблица содержит комбинации строк обеих таблиц, удовлетворяющих
условию tbl1.id = tbl2.id. Левое объединение (LEFT JOIN) позволяет включить в результирующую таблицу строки «левой» таблицы tbl1, которой не нашлось соответствие
в «правой» таблице tbl2. Смотрите следующий пример:
1 |
SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id |
Результатом будет следующая таблица
id | name | id | letter |
1 | А | NULL | NULL |
2 | Б | 2 | Г |
3 | В | 3 | Д |
Как видно из этого примера, записи в таблице tbl1 со значением id = 1 не нашлось соответствия в таблице tbl2, т.к. поле id в ней принимает значения 2,3,4. Тем не менее
в результирующую таблицу запись включена, при этом значения полей из таблицы tbl2 принимают значение NULL. Следует заметить, что для задания условия вместо ключевого слова
WHERE при левом и правом объединениях используется ключевое слово ON.
В следующем примере демонстрируется «правое» объединение при помощи конструкции RIGHT JOIN.
1 |
SELECT * FROM tbl1 RIGHT JOIN tbl2 ON tbl1.id=tbl2.id |
Результирующая таблица:
id | name | id | letter |
2 | Б | 2 | Г |
3 | В | 3 | Д |
NULL | NULL | 4 | Е |
Как видим, при правом объединении возвращаются строки, удовлетворяющие условию tbl1.id = tbl2.id, и строки «правой» таблицы tbl2, которым не нашлось соответствия в левой таблице tbl1.