
- •Г.В.Преснякова Основы jet - sql
- •Оглавление
- •Введение
- •Типы запросов:
- •Правила построения выражений
- •Функции
- •Запросы на выборку данных
- •Задания для самостоятельного выполнения
- •Задание псевдонимов для полей
- •Создание в запросах вычисляемых полей и использование функций
- •Предложение where
- •Запрос с параметром (параметрический запрос)
- •Задания для самостоятельного выполнения
- •Предложение group by
- •Предложение having
- •Задания для самостоятельного выполнения
- •Предложение order by
- •Задания для самостоятельного выполнения
- •Задания для самостоятельного выполнения
- •Перекрестные запросы
- •Использование псевдонимов для таблиц
- •Задания для самостоятельного выполнения
- •Подчиненные (вложенные или подзапросы) запросы
- •Подзапросы, возвращающие одну строку
- •Подзапросы возвращающие более одной строки
- •Операторы all, any и some
- •Операция not in
- •Использование подзапросов в предложении having
- •Вложенность подзапросов
- •Основные правила при формировании вложенных подзапросов
- •Операторы exists и not exists
- •Задания для самостоятельного выполнения
- •Управляющие запросы Создание таблицы
- •Модификация структуры таблицы
- •Создание индекса
- •Удаление таблицы или индекса
- •Объединение запросов
- •Задания для самостоятельного выполнения
- •Пример создание структуры таблиц и схемы данных операторами sql.
Подзапросы, возвращающие одну строку
Когда подзапрос возвращает одну строку, в предложении WHERE родительского запроса используют простые операции сравнения (= , < >, > , < , <= и т. д.).
Пример 20.Так для поиска сотрудника, имеющего минимальную зарплату, необходимо исполнить запрос:
SELECT имя, отдел, зарплата
FROM Сотрудники
WHERE зарплата = (SELECT Min(зарплата)
FROM Сотрудники );
Подзапросы возвращающие более одной строки
Пример 21.Для получения номеров и имен поставщиков, имеющих более более 3-х поставок, необходимо исполнить запрос:
SELECT номерп, имяп
FROM поставщики
WHERE номерп IN (SELECT номерп
FROM поставки
GROUP BY номерп HAVING Count( * ) > 3 );
Поскольку подзапрос может вернуть более одного поставщика, в родительском запросе используется операция сравнения IN-сравнение с множеством значений.
Такой же результат можно получить и без подчиненного запроса. Как?
Типы подчиненных запросов:
запросы, использующие сравнения, синтаксическая конструкция которых может быть такой:
[ANYALL SOME] (инструкция SQL)
где
ANY – любой,ALL– все (по умолчанию),SOME– некоторые.
запросы, содержащие предложения, синтаксическая конструкция которых может быть такой:
выражение [NOT]IN(инструкцияSQL)
запросы, содержащие предложения, синтаксическая конструкция которых может быть такой:
[NOT]EXISTS(инструкцияSQL)
где EXISTS– существуют.
Пример 22. Отобрать из таблицыдеталидетали, которые стоят столько же, сколькоподшипник. Эту задачу можно решить с помощью однотабличного подчиненного запроса:
SELECT детали.*
FROM детали WHERE ((детали.цена = (SELECT цена FROM детали WHERE имяд="подшипник")));
В таблице детали не должно быть подшипников по разным ценам.
Операторы all, any и some
Эти операторы совместно с операциями =, < >, >, <, <=, >= могут быть использованы для подзапросов, возвращающих более одной строки.
Операторы ANYиSOMEвозвращают значенияTRUE, если условие выполняется хотя бы для одного возвращаемого подзапросом значения, в противном случае -FALSE.
Оператор ALLвозвращает значенияTRUE, если условие выполняется для каждого возвращаемого подзапросом значения, в противном случае -FALSE.
Пример 23.Чтобы получить список сотрудников, получающих зарплату больше, чем зарплаталюбогосотрудника 30 отдела, необходимо исполнить запрос:
SELECT *
FROM Сотрудники
WHERE зарплата > ANY (SELECT зарплата FROM Сотрудники WHERE отдел = 30 );
Пример 24.Из таблицыСотрудники (номер, фамилия, имя, должность, отдел, зарплата )отобрать сведения о продавцах, зарплата которых превышает зарплатувсехначальников и директоров. Это можно сделать запросом:
SELECT Сотрудники.*
FROM Сотрудники
WHERE должность LIKE "продавец*" AND зарплата > ALL
(SELECT зарплата FROM Сотрудники
WHERE ((должность LIKE "*начальник*") OR ( должность LIKE
"*директор*")));
Операция not in
Для исключения значений, возвращаемых подзапросом, используется операция NOTIN. При использованииNOTINнеобходимо учитывать, что если среди возвращаемых подзапросом значений имеется неопределенное значение (NULL), то результат сравнения в операцииNOTINбудетNULL.