Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab5.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
27.8 Кб
Скачать

Базы данных Лабораторная работа № 5 Запросы к нескольким таблицам

Перейти к заданию

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

SELECT * FROM department, employee

Количество строк в декартовом произведении равно произведению числа строк в исходных таблицах. Число столбцов в декартовом произведении равно сумме количества столбцов в исходных таблицах.

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

  1. Формируется декартово произведение таблиц, указанных в предложении FROM.

  2. Если в запросе присутствует предложение WHERE, применение условий отбора к каждой строке таблицы декартова произведения и сохранение в таблице только тех строк, которые удовлетворяют заданным условиям. В терминах реляционной алгебры эта операция называется ограничением декартового произведения.

  3. Для каждой оставшейся строки определяется значение каждого элемента, указанного в списке выборки SELECT, в результате чего формируется отдельная строка результирующей таблицы.

  4. Если в исходном запросе присутствует слово DISTINCT, из результирующей таблицы удаляются все строки-дубликаты. В реляционной алгебре действия, выполняемые на 3 и 4 этапах, эквивалентны операции проекции по столбцам, заданным в списке выборки SELECT.

  5. Если выполняемый запрос содержит предложение 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.

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]