- •Содержание
- •12.1. Использование подзапросов.
- •12.2. Дополнительные возможности использования подзапросов, возвращающих единичное значение.
- •12.2.1. Использование предложения exists.
- •12.2.2. Использование предложения singular.
- •12.3. Использование подзапросов, возвращающих множество значений.
- •12.3.1. Использование предложений all, some, any.
- •12.3.2. Использование having и агрегатных функций для вложенных подзапросов.
- •12.4. Внешние соединения.
- •12.5. Union - объединение результатов выполнения нескольких операторов select.
- •12.6. Использование операции сцепления строк.
- •12.7. Работа с разными бд в одном запросе.
- •Контрольные вопросы:
12.2. Дополнительные возможности использования подзапросов, возвращающих единичное значение.
12.2.1. Использование предложения exists.
Бывают случаи, когда в условии поиска нужно указать, что из таблицы требуется отобрать только те записи, для которых подзапрос возвращает одно или более значений. В этом случае в условии поиска указывается предложение
EXISTS (<подзапрос>)
Ключевые слова EXISTS и NOT EXISTS предназначены для использования только совместно с подзапросами. Результат их обработки равен TRUE или FALSE. Для ключевого слова EXISTS результат равен TRUE только тогда, когда в возвращаемой подзапросом результирующей таблице присутствует хотя бы одна строка. Если результирующая таблица подзапроса пуста, результатом обработки будет FALSE. Для NOT EXISTS правила обратные.
ПРИМЕР
Выбрать коды и названия книги студенческого фонда библиотеки, которые когда-либо выдавались на руки читателям.
SELECT Code, Name
FROM Books
WHERE Code IN (SELECT BookCode
FROM BookInventaryNumbers
WHERE FundCode = 2 AND
EXISTS (SELECT Code
FROM BookGiveOutRecord)
WHERE InventaryCode =
BookInventaryNumbers.Code))
Результат выполнения запроса приведен в таблице 12.3.
Таблица 12.3.
Code |
Name |
6 |
Автоматизированные системы управления технологическим процессом обогащения руды |
12.2.2. Использование предложения singular.
Если в условии поиска нужно указать, что из таблицы требуется выбрать лишь те записи, для которых подзапрос возвращает только одно значение, указывается предложение
SINGULAR (<onepaтop_seIect >)
ПРИМЕР
Выбрать коды и названия книги студенческого фонда библиотеки, которые выдавались на руки читателям только один раз.
SELECT Code, Name
FROM Books
WHERE Code IN (SELECT BookCode
FROM BookInventaryNumbers
WHERE FundCode = 2 AND
SINGULAR (SELECT Code
FROM BookGiveOutRecord
WHERE InventaryCode =
BookInventaryNumbers.Code))
Результат выполнения запроса приведен в таблице 12.4.
Таблица 12.4.
Code |
Name |
6 |
Автоматизированные системы управления технологическим процессом обогащения руды |
Результаты совпадают с примером для слова EXISTS только потому, что заданному условию в таблице BookGiveOutRecord Соответствует только одна запись.
12.3. Использование подзапросов, возвращающих множество значений.
12.3.1. Использование предложений 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). Подобный альтернативный метод можно считать более естественным, чем определение в подзапросе минимальной цены.
Результаты выполнения запроса представлены в таблице 12.5
Таблица 12.5.
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.
Результаты выполнения запроса представлены в таблице 12.6.
Таблица 12.6.
BookCode |
InventaryNumber |
Cost |
5 |
4578532 |
56.78 |
