Базы данных Лабораторная работа № 5 Запросы к нескольким таблицам
Перейти к заданию
Соединение является подмножеством более общей комбинации данных из нескольких таблиц, называемой декартовым произведением. Декартово произведение двух таблиц представляет собой таблицу, состоящую из всех возможных пар строк, входящих в состав обеих таблиц. Например, декартово произведение таблиц employee и department можно получить с помощью следующей инструкции:
SELECT * FROM department, employee
Количество строк в декартовом произведении равно произведению числа строк в исходных таблицах. Число столбцов в декартовом произведении равно сумме количества столбцов в исходных таблицах.
Последовательность выполнения инструкции SELECT, которая включает произведение двух таблиц, состоит в следующем:
Формируется декартово произведение таблиц, указанных в предложении FROM.
Если в запросе присутствует предложение WHERE, применение условий отбора к каждой строке таблицы декартова произведения и сохранение в таблице только тех строк, которые удовлетворяют заданным условиям. В терминах реляционной алгебры эта операция называется ограничением декартового произведения.
Для каждой оставшейся строки определяется значение каждого элемента, указанного в списке выборки SELECT, в результате чего формируется отдельная строка результирующей таблицы.
Если в исходном запросе присутствует слово DISTINCT, из результирующей таблицы удаляются все строки-дубликаты. В реляционной алгебре действия, выполняемые на 3 и 4 этапах, эквивалентны операции проекции по столбцам, заданным в списке выборки SELECT.
Если выполняемый запрос содержит предложение ORDER BY, осуществляется упорядочивание строк результирующей таблицы.
Если необходимо получить значения из нескольких таблиц, то можно либо применить подзапрос, либо выполнить соединение таблиц. Если результирующая таблица запроса должна содержать столбцы из разных исходных таблиц, то целесообразно использовать соединение таблиц. Для выполнения соединения достаточно в предложении FROM указать имена двух и более таблиц, разделив их запятыми, после чего включить в запрос предложение WHERE с определением столбцов, используемых для соединения указанных таблиц. Вместо имен таблиц можно использовать псевдонимы, назначенные им в предложении FROM. В этом случае имена таблиц и назначаемые им псевдонимы должны разделяться пробелами. Псевдонимы могут использоваться с целью уточнения имен столбцов во всех тех случаях, когда возможна неоднозначность в отношении того, к какой таблице относится тот или иной столбец. Кроме того, псевдонимы могут быть использованы для сокращенного обозначения имен таблиц. Если для таблицы определен псевдоним, он может применяться в любом месте, где требуется указание имени этой таблицы.
Пример 1. Простое соединение
Получите фамилии работников и названия отделов, в которых они работают.
Требуется получить значения столбца last_name из таблицы employee и столбца department из таблицы department, поэтому при построении запроса мы воспользуемся соединением таблиц. Для формирования результирующих строк используются те строки исходных таблиц, которые имеют одинаковые значения в столбце dept_no. Это условие определяется посредством задания условия отбораemployee.dept_no=department.dept_no. Подобные столбцы исходных таблиц называют сочетаемыми столбцами. Описанная операция эквивалентна операции соединения по равенству реляционной алгебры.
SELECT last_name, department FROM employee JOIN department ON employee.dept_no=department.dept_no
LAST_NAME DEPARTMENT ========== ====================== Lee Corporate Headquarters Bender Corporate Headquarters MacDonald Sales and Marketing Yanowski Sales and Marketing Nelson Engineering Brown Engineering Hall Finance Steadman Finance Johnson Marketing Nordstrom Marketing ....
Чаще всего многотабличные запросы выполняются для двух таблиц, соединенных связью типа «главный-подчиненный». В приведенном выше примере таблицы employee и department соединены именно такой связью. Каждая строка таблицы employee (подчиненной) связана лишь с одной строкой таблицы department (главной), тогда как одна и та же строка таблицы department (главной) может быть связана со многими строками таблицы employee (подчиненной). Пары строк, которые создаются при выполнении запроса, представляют собой результат всех допустимых комбинаций строк главной и подчиненной таблиц. Таблица, содержащая внешний ключ, является подчиненной. Таблица, содержащая первичный ключ, будет главной. Для использования связи «главный-подчиненный» в запросе SQL необходимо указать условие отбора, в котором будут сравниваться значения первичного и внешнего ключей.
SQL дополнительно предоставляет следующие способы определения внутреннего соединения:
SELECT last_name, department FROM employee, department WHERE department.dept_no= employee.dept_no
SELECT last_name, department FROM employee e JOIN department d ON d.dept_no= e.dept_no
SELECT last_name, department FROM employee e INNER JOIN department d ON d.dept_no= e.dept_no
В каждом случае предложение
FROM table1 JOIN table2 ON col1 = col2
заменяет предложение
FROM table1, table2 WHERE table1.col1=table2.col2.
Обратите внимание, что для столбцов с номером отдела (dept_no) необходимо уточнение, поскольку такое имя присутствует в обеих таблицах, участвующих в соединении. Поэтому необходимо явно указать, значения какой таблицы нас интересуют. Уточнение имени осуществляется путем указания в качестве префикса перед именем столбца имени соответствующей таблицы (или ее псевдонима). В нашем примере используется значение d как псевдоним таблицы department и e как псевдоним таблицы employee.
