Главная страница

Презентация Внутренне объединение. Теория три типа объединения


Скачать 0.56 Mb.
НазваниеТеория три типа объединения
АнкорПрезентация Внутренне объединение
Дата30.03.2023
Размер0.56 Mb.
Формат файлаpptx
Имя файлаj,]tlbytybt nf,kbw.pptx
ТипДокументы
#1025385

MySQL. JOIN

Теория

  • JOIN – оператор объединения, позволяет извлекать данные из нескольких таблиц без создания временных таблиц и за один запрос.

Теория

три типа объединения:

  • INNER JOIN
  • OUTER JOIN
  • CROSS JOIN

Таблицы "товары" и "описания"

  • Таблица с наименованием товаров хранит номер товара (id) и краткое название (name) и таблица с описанием товаров

Таблица nomenclature содержит перечень всех товаров, которые есть в базе. Таблица описаний description, напротив, содержит лишь неполный перечень описаний для товаров, которые необязательно присутсвуют в базе. Чтобы однозначно привязать описание к товару, в таблицах присутвует столбец id, который содержит уникальный номер товара.

INNER JOIN (CROSS JOIN) - внутреннее (перекрёстное) объединение

INNER JOIN

В простейшем случае (без указания условий отбора), выборка вернёт т.н. декартово произведение, в котором каждая строка одной таблицы будет сопоставлена с каждой строкой другой таблицы:

SELECT * FROM таб 1 INNER JOIN таб2;

INNER JOIN (альтернативные варианты)

Синтаксис запросов, возвращающий одинаковый результат:

  • SELECT * FROM таб1 INNER JOIN таб2;
  • SELECT * FROM таб1 CROSS JOIN таб2;
  • SELECT * FROM таб1 JOIN таб2;
  • SELECT * FROM таб1, таб2;

INNER JOIN

SELECT * FROM таб1 INNER JOIN таб2 using(наим.поля);

-объединение данных с одинаковым идентификатором


SELECT * FROM таб1 INNER JOIN таб2 ON таб1.поле1 = таб2.поле1;

INNER JOIN (‘,’)

В конструкции WHERE при объединении данных через запятую не используются Join и конструкции using, on.

SELECT * FROM таб1, таб2 WHERE таб1.наим.поля = таб2.наим.поля;

INNER JOIN (2 способа)

Код - способы объявления внутреннего объединения таблиц

SELECT * FROM Таблица1, Таблица2[, Таблица3, ...] [WHERE Условие1 [Условие2 ...]

SELECT * FROM Таблица1 [INNER | CROSS] JOIN Таблица2 [(ON Условие1 [Условие2 ...]) | (USING(Поле))]

LEFT JOIN

Левосторонние объединения позволяют извлекать данные из таблицы, дополняя их по возможности данными из другой таблицы.

LEFT JOIN

К примеру, чтобы получить полный список наименований товаров вместе с их описанием, нужно выполнить следующий запрос:

SELECT * FROM таб1 LEFT JOIN таб2 USING(наим.поля);

LEFT JOIN

Если дополнить предыдущий запрос условием на проверку несуществования описания, то можно получить список записей, которые не имеют пары в таблице описаний:

SELECT id, name FROM nomenclature LEFT JOIN description USING(id) WHERE description IS NULL;

  • По сути это и есть основное назначение внешних запросов - показывать расхождение данных двух таблиц.
  • Кроме того, при таком объединении обязательным является условие, которое задаётся через ON или USING. Без него запрос будет выдавать ошибку.

RIGHT JOIN

Этот вид объединений практически ничем не отличается от левостороннего объединения, за тем исключением, что данные берутся из второй таблицы, которая находится справа от констркуции JOIN, и сравниваются с данными, которые находятся в таблице, указанной перед конструкцией.

SELECT * FROM nomenclature RIGHT JOIN description USING(id);


Как видно, теперь уже поле name содержит нулевые значения. Также поменялся и порядок расположения столбцов.

Однако, во всех случаях использования правосторонних объединений, запрос можно переписать, используя левостороннее объединение, просто поменяв таблицы местами, и наоборот. Следующие два запроса равнозначны:

SELECT * FROM nomenclature LEFT JOIN description USING(id);

SELECT * FROM description RIGHT JOIN nomenclature USING(id);

CROSS JOIN

Тип CROSS JOIN применяется если необходимо получить все возможные сочетания из обеих таблиц. Сontition для этого типа оператора JOIN не указывается.

  • SELECT t_resources.t_name, t_users.t_nick FROM t_resources CROSS JOIN t_users
  • Этот вид объединения следует использовать с большой осторожностью, поскольку он снижает производительность и часто ( что кстати видно из примера содержит избыточную информацию.

Многотабличные запросы

Используя JOIN, можно объединять не только две таблицы, но и гораздо больше.

Помимо объединений разных таблиц, MySQL позволяет объединять таблицу саму с собой. Однако, в любом случае необходимо следить за именами столбцов и таблиц, если они будут неоднозначны, то запрос не будет выполнен.

Так, если таблицу просто объединить саму на себя, то возникнет конфликт имён и запрос не выполнится.

SELECT * FROM nomenclature JOIN nomenclature;

ERROR 1066 (42000): Not unique table/alias: 'nomenclature‘

Многотабличные запросы (SELECT)

Обойти конфликт имён позволяет использование синонимов (alias) для имён таблиц и столбцов. В следующем примере внутреннее объединение будет работать успешнее:

SELECT * FROM nomenclature AS t1 JOIN nomenclature AS t2 LEFT JOIN nomenclature AS t3 ON t1.id = t3.id AND t2.id = t1.id;

Многотабличные запросы (UPDATE и DELETE)

Помимо выборок использовать объединения можно также и в запросах UPDATE и DELETE

Так, следующие три запроса проделывают одинаковую работу:

  • UPDATE nomenclature AS t1, nomenclature AS t2 SET t1.id = t2.id WHERE t1.id = t2.id;
  • UPDATE nomenclature AS t1 JOIN nomenclature AS t2 SET t1.id = t2.id WHERE t1.id = t2.id;
  • UPDATE nomenclature AS t1 JOIN nomenclature AS t2 USING(id) SET t1.id = t2.id;

Многотабличные запросы (DELETE)

DELETE t1 FROM nomenclature AS t1 JOIN nomenclature AS t2 USING(id) WHERE t2.id > 10;

Следует помнить, что при использовании многотабличных запросов на удаление или обновление данных, нельзя включать в запрос конструкции ORDER BY и LIMIT. Впрочем, это ограничение очень эффективно обходится при помощи временных таблиц, просто, надо это учитывать при модификации однотабличных запросов.

Примеры с группировкой

По каждому поставщику вычисляются сумма и количество поступивших от него товаров:

SUM(amount*price) AS income_sum

FROM m_income AS a INNER JOIN m_product AS b ON a.product_id=b.id

Для каждого поставщика вычисляются сумма и количество его продуктов, проданных нами:

SUM(amount*price) AS outcome_sum

FROM m_outcome AS a INNER JOIN m_product AS b ON a.product_id=b.id

P.S.

!!! Внимание

USING используется для таблиц с одинаковым названием первичных ключей

В нашем случае ON



написать администратору сайта