
- •Лабораторная работа № 10 Использование в операторе select подзапросов, возвращающих множество значений. Цель работы
- •Ход работы
- •Методические указания Использование предложений all, some, any.
- •Использование having и агрегатных функций для вложенных подзапросов.
- •Внешние соединения.
- •Union - объединение результатов выполнения нескольких операторов select.
- •Отчет должен содержать:
Лабораторная работа № 10 Использование в операторе select подзапросов, возвращающих множество значений. Цель работы
Научиться использовать в операторе SELECT подзапросы, которые возвращают множество значений.
Ход работы
1. Перед началом работы ознакомьтесь с методическими указаниями.
2. Скопируйте файл LIBRARY.GDB с сервера на свою рабочую станцию в каталог C:\DB. Использую утилиту WISQL подключитесь к базе данных LIBRARY.GDB.
3. Средствами утилиты WISQL необходимо проверить правильность работы всех операторов SELECT, которые приведены в примерах методических указаний. Для этого Вам необходимо визуально сравнить результат их выполнения в утилите WISQL с теми результатами, которые приведены в методических указаниях. Методика проверки описана в лабораторной работе №6.
4. Написать операторы SELECT и проверить правильность их работы, которые должны получить следующие сведения из базы данных LIBRARY.GDB.
- Выбрать фамилию, имя и отчество людей родившихся в Днепропетровске и Днепропетровской области, которые зарегистрированы в базе данных «БИБЛИОТЕКА».
- Найдите инвентарные номера книг студенческого фонда библиотеки, стоимость которых больше любой из книг научного фонда библиотеки.
- Определить коды и среднюю стоимость экземпляров книг, у которых она ниже максимальной средней стоимости экземпляра книги.
- Используя внешнее соединение таблиц, выведите на экран список всех библиотекарей с указанием даты и названий книг, которые они принимали у читателей.
- Выбрать фамилии, имена, отчества, серии и номера паспортов читателей и библиотекарей, в фамилиях которых присутствуют как заглавные, так и прописные буквы ‘ко’.
5. Те, кто ведет проект согласно индивидуальному заданию, должны придумать самостоятельно и уточнить с преподавателем дополнительно по 5 запросов, которые выбирают информацию из созданных ими баз данных и соответствуют цели лабораторной работы. Эти запросы необходимо написать и проверить правильность их работы согласно описанию в соответствующем пункте методических указаний.
Методические указания Использование предложений all, some, any.
Если в условиях поиска необходимо указать, что сравниваемое значение (значение столбца, результат вычисления выражения) должно находиться в определенных отношениях со всеми значениями из множества значений, возвращаемых подзапросом, применяют предложение типа
<сравниваемое значение> [NOT] <оператор> {ALL | SOME | ANY} (<подзапрос>)
где подзапрос может возвращать более одного значения. Оператор определяет операцию сравнения (>, >=, < и т.д.). Отношение сравниваемого значения и значений, возвращаемых подзапросом, устанавливается словами ALL и SOME (ANY).
ALL определяет, что условие поиска истинно, когда сравниваемое значение находится в отношении, определяемом оператором, со всеми значениями, возвращаемыми подзапросом. Например:
WHERE STOLBEZ > ALL (SELECT POLE FROM TABLIZA)
определяет, что текущее значение столбца STOLBEZ должно быть больше всех значений в столбце POLE из таблицы TABLIZA.
SOME (вместо него можно указать ANY) что условие поиска истинно, когда сравниваемое значение находится в отношении, определяемом оператором, хотя бы с одним значением, возвращаемым подзапросом. Например:
WHERE STOLBEZ > SOME (SELECT POLE FROM TABLIZA)
определяет, что текущее значение столбца STOLBEZ должно быть больше хотя бы одного значения в столбце POLE из таблицы TABLIZA.
ПРИМЕР
Найдите инвентарные номера всех книг, чья стоимость превышает стоимость хотя бы одной книги книжного фонда под номером «1».
SELECT BookCode, InventaryNumber, Cost
FROM BookInventaryNumbers
WHERE Cost > SOME (SELECT Cost
FROM BookInventaryNumbers
WHERE FundCode = ‘1’)
Хотя этот запрос может быть записан с использованием подзапроса, определяющего минимальную стоимость книг книжного фонда под номером ‘1’, после чего внешний подзапрос сможет выбрать сведения о всех книгах, чья стоимость превосходит это значение, возможен и другой подход, заключающийся в использовании ключевых слов SOME / ANY. В этом случае внутренний подзапрос создает набор числовых значений {15.56, 22.33, 34.01, 12.99}, а внешний запрос выбирает сведения о тех книгах, цена которых больше любого из значений в этом наборе (фактически, больше минимального значения – 12.99). Подобный альтернативный метод можно считать более естественным, чем определение в подзапросе минимальной цены.
Результаты выполнения запроса представлены в таблице 11.1.
Таблица 11.1.
BookCode |
InventaryNumber |
Cost |
1 |
4567890 |
15.56 |
2 |
4510000 |
22.33 |
3 |
4532477 |
34.01 |
5 |
4678532 |
56.78 |
ПРИМЕР
Найдите инвентарные номера всех книг, чья стоимость превышает стоимость любой книги книжного фонда под номером «1».
SELECT BookCode, InventaryNumber, Cost
FROM BookInventaryNumbers
WHERE Cost > ALL (SELECT Cost
FROM BookInventaryNumbers
WHERE FundCode = «1»)
В целом этот запрос подобен предыдущему. И в данном случае можно было бы использовать подзапрос, определяющий максимальное значение стоимости книг из фонда под номером ‘1’, после чего с помощью внешнего запроса выбрать сведения обо всех книгах, стоимость которых превышает это значение. Однако в данном примере выбран подход с использованием ключевого слова ALL.
Результаты выполнения запроса представлены в таблице 11.2.
Таблица 11.2.
BookCode |
InventaryNumber |
Cost |
5 |
4578532 |
56.78 |