- •Лабораторная работа №2 sql: выборка данных.
- •Знакомство с Query Tool pgAdmin
- •Синтаксис инструкции select.
- •Выборка без использования предложения where. Простая выборка данных
- •Выборка null-значений
- •Выборка null-значений
- •Выборка c использованием предложения where.
- •Использование between
- •Использование in
- •Использование like
- •Ограничение максимального размера выборки
- •Использование данных типа timestamp
- •Выборка с упорядочением
- •Выборка и агрегирование данных.
- •Преобразование типов данных в инструкции select.
- •Задания для самостоятельной работы
- •Использование select для соединения двух и более таблиц. Декартово произведение таблиц
- •Соединение таблицы со своей копией
- •Вложенные подзапросы.
- •Простые вложенные подзапросы
- •Коррелированные вложенные подзапросы
- •Запросы, использующие exists в предложении where
- •Подзапросы c any и all
- •Использование with
- •Объединение двух или более запросов
- •Реализация операций реляционной алгебры c помощью предложения select.
- •Задания для самостоятельной работы
- •Контрольное задание
- •Требования к отчету:
- •Контрольные вопросы:
Подзапросы c any и all
ANY и ALL отличаются от EXISTS тем, что используются совместно с реляционными операторами. В этом отношении они подобны оператору IN, однако, в отличие от IN, они могут использоваться только с подзапросами.
Оператор ANY приводит к тому, что текущая строка внешнего запроса включается в результат, если любое (ANY) из значений, выведенных подзапросом, совпадает со значением в текущей строке внешнего запроса. Следующий запрос
SELECT *
FROM ”Заказчики”
WHERE “Код_заказчика” = ANY (SELECT “Код_заказчика” FROM “Заказы”)
равнозначен запросу
SELECT *
FROM Заказчики
WHERE Код_заказчика IN (SELECT Код_заказчика FROM Заказы);
Отличие заключается в том, что оператор ANY может использовать другие операторы сравнения, а не только оператор «=» как в случае IN. Например, если в предыдущем запросе в предложении WHERE заменить оператор «=» на оператор «<=», то получим информацию о заказчике с минимальным значением в поле Код_заказчика, поскольку это – единственное значение, для которого условие основного запроса выполняется.
Оператор ALL аналогичен оператору ANY по взаимодействию с внешним запросом, но для того, чтобы текущее значение во внешнем запросе было выбрано, оно должно удовлетворять условию в предикате внешнего запроса для каждого значения, выбранного подзапросом.
В SQL сказать, что значение больше( или меньше ), чем любое(ANY) из набора значений, тоже самое что сказать, что оно больше( или меньше ) чем любое одно отдельное из этих значений. И наоборот, сказать, что значение не равно всему (ALL) набору значений, равносильно тому, что нет такого значения в наборе которому оно было бы равно.
Любой запрос, который может быть сформулирован с ANY или с ALL, может быть также сформулирован с EXISTS, хотя обратное в общем случае неверно. Строго говоря, вариант с EXISTS не абсолютно идентичен вариантам с ANY или с ALL из-за различия в том, как обрабатываются NULL-значения. Всякий раз, когда допустимый подзапрос возвращает пустое множество, предикат с ALL автоматически верен, а с ANY – автоматически неверен.
Использование with
Конструкция WITH позволяет оформить результаты подзапроса в виде временной таблицы, которая создается на время выполнения запроса. Т.о., WITH может использоваться для структурирования сложных запросов с многоуровневой иерархией подзапросов. Синтаксис конструкции WITH достаточно прост:
WITH идентификатор AS (запрос)
Например,
WITH subquery_ as (
SELECT "Название", "Цена"
FROM "Книги"
WHERE "Издательство" = 'BHV')
SELECT *
FROM _subquery_
WHERE "Цена" >= ANY(SELECT "Цена" FROM _subquery_ )
Объединение двух или более запросов
Предложение UNION позволяет объединить результаты выполнения нескольких запросов к разным таблицам в одном подмножестве данных, реализуя один запрос. Синтаксис UNION имеет вид:
запрос_1 UNION запрос_1
Непременное требование – одинаковые количество и типы полей в объединяемых предложением UNION запросах, хотя второе требование можно обойти, если использовать преобразование типов в запросах. Например:
SELECT ”Имя”, “Адрес”
FROM “Заказчики”
UNION
SELECT “Название”, “Адрес”
FROM “Поставщики”
Следует иметь в виду, что:
Избыточные дубликаты всегда исключаются из результата UNION.
Предложением с UNION можно объединить любое число таблиц (проекций таблиц).
Весь запрос может использовать только одно предложение ORDER BY. Оно применяется ко всему результату и должно находится после последней инструкции SELECT.
