
- •Г.В.Преснякова Основы jet - sql
- •Оглавление
- •Введение
- •Типы запросов:
- •Правила построения выражений
- •Функции
- •Запросы на выборку данных
- •Задания для самостоятельного выполнения
- •Задание псевдонимов для полей
- •Создание в запросах вычисляемых полей и использование функций
- •Предложение where
- •Запрос с параметром (параметрический запрос)
- •Задания для самостоятельного выполнения
- •Предложение group by
- •Предложение having
- •Задания для самостоятельного выполнения
- •Предложение order by
- •Задания для самостоятельного выполнения
- •Задания для самостоятельного выполнения
- •Перекрестные запросы
- •Использование псевдонимов для таблиц
- •Задания для самостоятельного выполнения
- •Подчиненные (вложенные или подзапросы) запросы
- •Подзапросы, возвращающие одну строку
- •Подзапросы возвращающие более одной строки
- •Операторы all, any и some
- •Операция not in
- •Использование подзапросов в предложении having
- •Вложенность подзапросов
- •Основные правила при формировании вложенных подзапросов
- •Операторы exists и not exists
- •Задания для самостоятельного выполнения
- •Управляющие запросы Создание таблицы
- •Модификация структуры таблицы
- •Создание индекса
- •Удаление таблицы или индекса
- •Объединение запросов
- •Задания для самостоятельного выполнения
- •Пример создание структуры таблиц и схемы данных операторами sql.
Использование подзапросов в предложении having
Подзапросы можно использовать не только в предложениях WHERE, определяющих условия выбора строк, но и в условии выбора групп строк, задаваемых предложениемHAVING.
Пример 25.Для получения списка отделов, в которых средняя зарплата больше, чем в 5-м отделе, можно исполнить запрос:
SELECT отдел, Avg(зарплата) AS [средняя зарплата]
FROM Сотрудники
GROUP BY отдел
HAVING Avg(зарплата) > (SELECT Avg(зарплата)
FROM Сотрудники
WHERE отдел = 5 );
С помощью подзапроса определяется средняя зарплата в 5-м отделе, значение которой далее используется для сравнения со средней зарплатой в каждом отделе.
Вложенность подзапросов
Подзапросы могут быть вложенными один в другой, например:
Пример 26.
SELECT фамилия, имя, должность, зарплата
FROM Сотрудники
WHERE зарплата > (SELECT Max(зарплата)
FROM Сотрудники
WHERE отдел = (SELECT отдел
FROM отделы
WHERE [название отдела] = “специальный”));
Допускается до 255 уровней вложенности подзапросов.
Основные правила при формировании вложенных подзапросов
Вложенный подзапрос должен быть заключен в скобки и располагаться в правой части условия внешнего по отношению к нему запроса.
Подзапрос не может иметь предложения ORDERBY, которое может появиться только в конце основного запроса
Число столбцов в SELECT- списке вложенного подзапроса, их порядок и типы данных должны быть такими же, как в левой части условия родительского запроса.
Вложенные подзапросы всегда выполняются от внутренних к внешним.
Подзапросымогут:
возвращать одну и более строк,
использовать групповые функции и предложение GROUPBY,
соединять таблицы,
выбирать данные из таблицы, которая присутствует в основном запросе,
использовать операции над множествами.
Таблицам, как и полям, можно давать другие имена-псевдонимы.
Операторы exists и not exists
Эти операторы часто используется в условии для взаимосвязанных запросов и определяют наличие или отсутствие возвращаемого подзапросом значения. Если подзапрос обнаруживает хотя бы одну строку, удовлетворяющую условию поиска, оператор EXISTSвозвращает значениеTRUE, в противном случае -FALSE.
Оператор NOTEXISTSможет оказаться более корректным, чем оператор сравненияNOTIN, когда подзапрос находит пустые значения. УсловиеNOTINвозвращает значениеNULL, когда в списке сравниваемых значений появляется пустое значение, что в большинстве случаев имеет смыслFALSE.
Пример 27.Например, если мы хотим найти поставщиков, которые ничего не поставляют, запрос вида:
SELECT *
FROM поставщики
WHERE номерп NOT IN (SELECT номерп FROM поставки);
может не вернуть ни одной строки, в то время как запрос:
SELECT *
FROM поставщики e
WHERE NOT EXISTS (SELECT номерп FROM поставки WHERE номерп = e.номерп);
вернет корректный результат.
Пример 28.Выдать сведения о деталях (номер, имя и цену), для которых есть поставки. Эта задача может быть решена с помощью подчиненного запроса:
SELECT D.номерд AS [номер детали], D.имяд AS [имя детали], D.цена AS [цена детали]
FROM детали AS D
WHERE (((Exists (SELECT *
FROM поставки AS P
WHERE D.номерд=P.номерд))));
Пример 29.Отобрать все поставки для деталей, не дороже 200 руб.
Эту задачу также можно решить с помощью подчиненного запроса:
SELECT поставки.*
FROM поставки
WHERE ((поставки.номерд In (SELECT номерд
FROM детали
WHERE цена < 200)));
Пример 30.Выдать сведения о сотрудниках, зарплата которых больше средней зарплаты в их отделе. Это так называемый взаимосвязанный запрос:
SELECT *
FROM Сотрудники e
WHERE зарплата > (SELECT avg(зарплата)FROM Сотрудники m
WHERE m.отдел = e.отдел)
ORDER BY отдел;