Лекция 10: Запросы на объединение таблиц Вопрос 1. Декартово объединение таблиц Сочетание всех строк из всех таблиц, участвующих в объединении, называется декартовым объединением. В большинстве случаев такой набор оказывается непригодным для использования из-за огромных размеров. Иногда его использую для поиска всех возможных комбинаций в задачах статистического или математического анализа. Создание декартового произведения можно проиллюстрировать с помощью матриц. Если рассматривать каждую таблицу как матрицу и затем совместить эти две матрицы, то получится новая матрица со всеми сочетаниями строк всех исходных матриц. Каждая строка одной таблицы присоединяется к каждой строке второй таблицы. Количество столбцов итоговой таблицы равно сумме числа столбцов в исходных таблицах. Количество сток итоговой таблицы равно произведению числа строк в исходных таблицах. Декартовы объединения создаются не с помощью директивы WHERE, а с помощью служебных слов CROSS JOUN. Применение декартова произведения демонстрирует следующий пример. Например, необходимо вывести все идентификаторы заказчиков и все названия книг. Это демонстрирует следующий запрос: SELECT Books.title, Customers.id КОД FROM Books CROSS JOIN Customers образуется таблица, содержащая 36 x 11 = 361 строку. Из первых 45 строк этой таблицы лишь 2 и 42 записи актуальны: в них идентификаторы книг соответствуют их названиям. В остальных - полная чепуха. Вопрос 2. Внутренние объединения таблиц Объединение двух таблиц выполняется на основе условий объединения. В результате получается новая таблица, строки удовлетворяют этим условиям. Внутренние объединения возвращают данные, если находят совпадающую информацию в обеих таблицах. Чаще всего используются следующие типы внутренних объединений: объединения по эквивалентности и естественные объединения. В объединении по эквивалентности значения столбцов сравниваются, избыточные столбцы которой также выводятся в результирующем наборе. В естественном объединении избыточные столбцы дважды не выводятся. Если из декартова произведения убрать ненужные строки и столбцы, то можно получить актуальные таблицы, соответствующие любому из соединений. Очевидно, что отбор актуальных строк обеспечивается вводом в запрос WHERE фразы, в которой устанавливаются соответствия. Например, нам надо узнать как часто мужчины посещают ваш магазин. Такой скорректированный запрос позволяет получить эквисоединение таблиц и выглядит следующим образом: Код SELECT count(fname) AS мужчины FROM Customers INNER JOIN Sales ON Sales.customer=Customers.id and Customers.pol='муж1 Мы только что выяснили, сколько мужчин сделало заказы в вашем магазине, теперь вам необходимо узнать кто именно это был. Сделаем это следующим образом: SELECT DISTINCT fname, lname, age Код FROM Customers INNER JOIN Sales ON Sales.customer=Customers.id and Customers.pol='муж' Вопрос 3. Самообъединения В соответствии с названием, при самообъединении связываются строки одной и той же таблицы. Запросы, сравнивающие данные, чаще всего используют самообъединения. Например, следующий запрос, возвращает список всех заказчиков которые живут в одном городе и имеют одинаковые имена: SELECT Custl.fname, Custl.lname, Cust2.fname, Cust2.1name Custl.address FROM Customers AS Custl INNER JOIN КОД Customers AS Cust2 ON Custl.address = Cust2.address AND Custl.lname = Cust2.lname WHERE Custl. id < Cust2 . id ORDER BY Custl.address