Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_раб_09.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
75.26 Кб
Скачать

Лабораторная работа № 9 Использование в операторе select подзапросов, возвращаемых единичное значение. Цель работы

Научиться использовать в операторе SELECT подзапросов, возвращающих единичное значение.

Ход работы

1. Перед началом работы ознакомьтесь с методическими указаниями.

2. Скопируйте файл LIBRARY.GDB с сервера на свою рабочую станцию в каталог C:\DB. Использую утилиту WISQL подключитесь к базе данных LIBRARY.GDB.

3. Средствами утилиты WISQL необходимо проверить правильность работы всех операторов SELECT, которые приведены в примерах методических указаний. Для этого Вам необходимо визуально сравнить результат их выполнения в утилите WISQL с теми результатами, которые приведены в методических указаниях. Методика проверки описана в лабораторной работе №6.

4. Написать операторы SELECT и проверить правильность их работы, которые должны получить следующие сведения из базы данных LIBRARY.GDB.

- Определите названия книг, которые брал читатель с номером читательского билета 5672.

- Выведите названия книг, которые читатели вернули не вовремя, и определите, на сколько отличается их стоимость от средней стоимости книг в библиотеке.

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

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

- Определить названия книг, которые ни разу не брали читатели, средняя стоимость которых больше, чем средняя стоимость книг по библиотеке.

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

Методические указания Использование подзапросов.

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

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

SELECT ...

FROM ...

WHERE Сравниваемое значение> <оператор> SELECT ...

FROM ...

WHERE . . .

В данном случае внешний (второй) оператор SELECT использует результат выполнения внутреннего (первого) оператора для определения содержания окончательного результата всей операции. Внутренние запросы могут быть помещены в предложения WHERE и HAVING внешнего оператора SELECT – в этом случае они получают название подзапросов, или вложенных запросов. Кроме того, внутренние операторы могут использоваться в операторах INSERT, UPDATE и DELETE. Существует три типа подзапросов:

  • Скалярный подзапрос возвращает значение, выбираемое из пересечения одного столбца с одной строкой, - т.е. единственное значение. В принципе, скалярный подзапрос может использоваться везде, где требуется указать единственное значение.

  • Строковый подзапрос возвращает значения нескольких столбцов таблицы, но в виде единственной строки. Строковый подзапрос может использоваться везде, где применяется конструктор строковых значений – обычно это предикаты.

  • Табличный подзапрос возвращает значения одного или больше столбцов таблицы, размещенные в более чем одной строке. Табличный подзапрос может использоваться везде, где допускается указывать таблицу – например, как операнд предиката IN.

Подзапрос представляет собой инструмент создания временной таблицы, содержимое которой извлекается и обрабатывается внешним оператором. Подзапрос может указываться непосредственно после операторов сравнения (т.е. операторов = , <, >, >=, <=, <>) в предложениях WHERE и HAVING. Текст подзапроса должен быть заключен в скобки.

ПРИМЕР (Скалярный подзапрос)

Выведите на экран все даты возврата книг для читателя с номером читательского билета 28.

SELECT ReturnDate, FactReturnDate

FROM BookGiveOutRecord

WHERE ReaderCode = (SELECT Code

FROM Readers

WHERE ReaderCardNumber = 28)

Внутренний оператор SELECT (SELECT Code FROM Readers WHERE ReaderCardNumber = 28) предназначен для определения кода читателя с номером читательского билета 28. После этого выполняется внешний подзапрос, предназначенный для выборки подобных сведений. Иначе говоря, внутренний оператор SELECT возвращает таблицу, состоящую из единственного значения - Code. Оно представляет собой 2.

В результате внешний оператор SELECT приобретает следующий вид:

SELECT ReturnDate, FactReturnDate

FROM BookGiveOutRecord

WHERE ReaderCode = 2

Результаты выполнения этого запроса представлены в таблице 10.1.

Таблица 10.1.

ReturnDate

FactReturnDate

25-SEP-04

24-sep-04

ПРИМЕР (Скалярный подзапрос с агрегатной функцией)

Составьте список инвентарных номеров книг, цена которых выше средней, указав насколько их цена превышает среднюю цену книг по библиотеке.

SELECT InventaryNumber, Cost – (SELECT AVG (Cost)

FROM BookInventaryNumbers) AS Cost_diff

FROM BookInventaryNumbers

WHERE Cost > (SELECT AVG (Cost)

FROM BookInventaryNumbers)

Необходимо отметить, что нельзя прямо предложение ‘WHERE Cost > AVG (Cost)’, поскольку применять обобщающие функции в предложениях WHERE запрещено. Для достижения желаемого результата следует создать подзапрос, вычисляющий среднее значение цены книг, а затем использовать его во внешнем операторе SELECT, предназначенном для выборки сведений о тех книгах, цена которых превышает это среднее значение. Иначе говоря, подзапрос возвращает значение средней цены книг по библиотеке, равное 25.30 гривень. Результат выполнения этого скалярного подзапроса используется во внешнем операторе SELECT как для вычисления отклонения центы от среднего уровня, так и для отбора сведений о книгах. Поэтому внешний оператор SELECT приобретает следующий вид:

SELECT InventaryNumber, Cost – 25.30 AS Cost_diff

FROM BookInventaryNumbers

WHERE Cost > 25.30

Результаты выполнения запроса представлены в таблице 10.2.

Таблица 10.2.

InventaryNumber

Cost_diff

4532477

8.71

4678532

31.48

К подзапросам применяются следующие правила и ограничения:

1. В подзапросах не должна использоваться фраза ORDER BY, хотя она может присутствовать во внешнем запросе.

2. Список в предложении SELECT подзапроса должен состоять из имен отдельных столбцов или составленных из них выражений – за исключением случая, когда в подзапросе присутствует ключевое слово EXISTS.

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

4. Если подзапрос является одним из двух операндов, участвующих в операции сравнения, то запрос должен указываться в правой части этой операции. Например, приведенный ниже вариант записи запроса из предыдущего примера является некорректным, поскольку подзапрос размещен в левой части операции сравнения со значением столбца Cost:

SELECT InventaryNumber, Cost

FROM BookInventaryNumbers

WHERE (SELECT AVG (Cost) FROM BookInventaryNumbers) < Cost

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