Презентация Внутренне объединение. Теория три типа объединения
Скачать 0.56 Mb.
|
MySQL. JOINТеория
Теориятри типа объединения:
Таблицы "товары" и "описания"
Таблица nomenclature содержит перечень всех товаров, которые есть в базе. Таблица описаний description, напротив, содержит лишь неполный перечень описаний для товаров, которые необязательно присутсвуют в базе. Чтобы однозначно привязать описание к товару, в таблицах присутвует столбец id, который содержит уникальный номер товара. INNER JOIN (CROSS JOIN) - внутреннее (перекрёстное) объединение
INNER JOINВ простейшем случае (без указания условий отбора), выборка вернёт т.н. декартово произведение, в котором каждая строка одной таблицы будет сопоставлена с каждой строкой другой таблицы:SELECT * FROM таб 1 INNER JOIN таб2;INNER JOIN (альтернативные варианты)Синтаксис запросов, возвращающий одинаковый результат:
INNER JOINSELECT * 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;
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 не указывается.
Этот вид объединения следует использовать с большой осторожностью, поскольку он снижает производительность и часто ( что кстати видно из примера содержит избыточную информацию.Многотабличные запросыИспользуя 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Так, следующие три запроса проделывают одинаковую работу:
Многотабличные запросы (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_sumFROM m_income AS a INNER JOIN m_product AS b ON a.product_id=b.idДля каждого поставщика вычисляются сумма и количество его продуктов, проданных нами:SUM(amount*price) AS outcome_sumFROM m_outcome AS a INNER JOIN m_product AS b ON a.product_id=b.idP.S.!!! ВниманиеUSING используется для таблиц с одинаковым названием первичных ключейВ нашем случае ON |