Лекция 10: Запросы на объединение таблиц

advertisement
Лекция 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
Download