Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lp_IPOVS_BD.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
25.49 Mб
Скачать

Лабораторная работа № 8 Использование объединяющих и вложенных запросов и корректирующих операторов языка sql

Цель работы: изучить возможности оператора UNION и вложенных запросов и получить практические навыки использования операторов языка SQL, изменяющих данные, хранящиеся в БД.

Продолжительность работы - 4 ч.

Теоретические сведения

Наряду с использованием многотабличных запросов язык SQL позволяет формировать таблицу результатов на основе данных, содержащихся в нескольких исходных таблицах, посредством объединения запросов или применения вложенных запросов..

Объединение результатов нескольких запросов

Язык SQL предусматривает возможность объединения результатов двух или более запросов в одну таблицу с помощью оператора UNION. Например, можно объединить результаты, выполнив следующий сложный оператор, и получить список сотрудников и клиентов из Москвы:

SELECT Фамилия + Имя, Должность FROM Сотрудники

WHERE Город = 'Москва'

UNION

SELECT ОбращатьсяК, Должность FROM Клиенты

WHERE Город = 'Москва'

Чтобы таблицы результатов запроса можно было объединить с помощью оператора UNION, они должны удовлетворять следующим требованиям:

1) таблицы должны содержать одинаковое число столбцов;

2) тип данных каждого столбца первой таблицы должен совпадать с типом данных соответствующего столбца во второй таблице;

3) ни одна из таблиц не может быть отсортирована с помощью предложения ORDER BY, однако объединенные результаты запроса можно отсортировать.

Имена столбцов в объединяемых таблицах не обязательно должны быть одинаковыми.

Поскольку оператор UNION объединяет строки из двух таблиц результатов, то вполне вероятно, что в объединенной таблице будут содержаться повторяющиеся строки. По умолчанию оператор UNION в процессе своего выполнения удаляет повторяющиеся строки.

Если в результирующей объединенной таблице необходимо сохранить повторяющиеся строки, сразу за ключевым словом UNION следует указать ключевое слово ALL.

Хотя использование предложения ORDER BY в составляющих операторах SELECT, оператор UNION, запрещено, но результирующую объединенную таблицу можно отсортировать, записав предложение ORDER BY за последним оператором SELECT. Поскольку столбцы в таблице результатов запроса на объединение не имеют имен, то в предложении ORDER BY следует указывать номера столбцов.

Оператор UNION можно использовать многократно, чтобы объединить результаты трех или более запросов, указывая с помощью круглых скобок порядок выполнения операторов:

SELECT * FROM A

UNION ALL (SELECT*FROM B UNION SELECT*FROM C)

Вложенные запросы на чтение

В языке SQL существует понятие вложенного запроса. Механизм вложенных запросов позволяет использовать результат одного запроса в качестве составной части другого запроса. Возможность применения одного запроса внутри другого и была причиной появления слова “структурированный” в названии языка SQL.

Вложенным, или подчиненным, запросом (подзапросом), называется запрос, содержащийся в списке возвращаемых столбцов или предложениях WHERE или HAVING другого оператора. Вложенные запросы позволяют естественным образом формулировать запросы, которые используют результаты других запросов.

Например, из учебной базы данных “Борей” можно определить, кто из сотрудников является самым молодым по возрасту:

SELECT Фамилия, ДатаРождения FROM Сотрудники WHERE ДатаРождения = (SELECT MAX(ДатаРождения) FROM Сотрудники)

Вложенный (внутренний) запрос, указанный в условии поиска предложения WHERE, вычисляет максимальную дату рождения сотрудника, а главный (внешний) запрос сравнивает дату рождения каждого сотрудника с вычисленной датой и, в зависимости от результата сравнения, либо добавляет сотрудника в таблицу результатов запроса, либо нет. Совокупно главный и вложенный запросы выражают исходный запрос и извлекают из БД требуемую информацию.

Вложенный запрос, или подзапрос, - это оператор SELECT, заключенный в круглые скобки. Между вложенным запросом и оператором SELECT имеется ряд отличий.

1. Таблица результатов вложенного запроса всегда состоит из одного столбца, т.е. список возвращаемых столбцов должен иметь только один элемент.

2. Во вложенный запрос не может входить предложение ORDER BY.

3. Вложенный запрос не может быть запросом на объединение нескольких различных операторов SELECT; допускается использование только одного оператора SELECT.

4. Имена столбцов, используемые во вложенном запросе, могут являться ссылками на столбцы таблиц главного (внешнего) запроса.

Чтобы проиллюстрировать последнее из перечисленных отличий, определим, кто из поставщиков одних товаров одновременно является клиентом, заказывающим другие товары. Таблица результатов формируется оператором

SELECT * FROM Поставщики

WHERE Название = (SELECT Название FROM Клиенты

WHERE Клиенты.Название = Поставщики.Название)

Столбец (или поле) Поставщики.Название во вложенном запросе является примером внешней ссылки. Внешняя ссылка представляет собой имя столбца, принадлежащего таблице, указанной в предложении FROM главного запроса, и не входящего ни в одну из таблиц, перечисленных в предложении FROM вложенного запроса.

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

Процедура выполнения связанного подзапроса состоит из следующих шагов:

1) выбрать строку из таблицы, имя которой указано в главном запросе; это текущая строка кандидат (в примере это строка таблицы ПОСТАВЩИКИ с полем “Название”);

2) выполнить вложенный запрос с учётом значений, содержащихся в текущей строке-кандидате (в примере это значение поля Поставщики.Название, в соответствии с которым из таблицы КЛИЕНТЫ выбирается название клиента);

3) вычислить условие поиска главного запроса с учётом результатов вложенного запроса, выполненного на шаге 2; если вычислено значение TRUE, то текущая строка-кандидат включается в таблицу результатов;

4) повторять шаги 1-3 для следующей строки-кандидата, пока не будут проверены все строки таблицы, указанной в главном запросе.

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