- •Лабораторная работа №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.
- •Задания для самостоятельной работы
- •Контрольное задание
- •Требования к отчету:
- •Контрольные вопросы:
Вложенные подзапросы.
Вложенный подзапрос это подзапрос, заключенный в круглые скобки и вложенный в предложение WHERE (HAVING) инструкции SELECT или других инструкций, использующих предложение WHERE. Вложенный подзапрос может содержать в своем предложении WHERE (HAVING) другой вложенный подзапрос и т.д. Назначение вложенных подзапросов состоит в том, чтобы при отборе строк таблицы, сформированной основным запросом, можно было использовать данные из других.
Существуют простые и коррелированные вложенные подзапросы.
Простые вложенные подзапросы обрабатываются системой "снизу вверх". Первым обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д.
Коррелированные вложенные подзапросы обрабатываются системой в обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т.д., пока в результат не будут включены все строки, удовлетворяющие вложенному подзапросу (последовательности вложенных подзапросов).
Подзапросы включаются в предложение WHERE (HAVING) с помощью ключевых слов IN, EXISTS или одного из условий сравнения ( = | <> | < | <= | > | >= ):
подзапросы, не возвращающие ни одного или возвращающие несколько значений, начинаются с IN или операторов сравнения и содержат ключевые слова ANY или ALL;
подзапросы, возвращающие единственное значение, начинаются с оператора сравнения;
подзапросы, представляющие собой тест на существование или присутствие данных, начинаются с EXISTS.
Простые вложенные подзапросы
Простые вложенные подзапросы используются для представления множества значений, исследование которых должно осуществляться в каком-либо предикате IN, например:
SELECT *
FROM “Поставщики”
WHERE “Код_поставщика” IN
(SELECT DISTINCT “Код_поставщика”
FROM “Книги”
WHERE“Автор” LIKE ‘%Дейт%’ )
Система выполняет прежде всего вложенный подзапрос. Этот подзапрос выдает множество уникальных кодов поставщиков, которые поставили книги указанного автора. Затем будет выполнен внешний запрос, который выведет данные об этих поставщиках.
Тот же результат можно получить с помощью соединения:
SELECT ”Поставщики”.*
FROM “Книги”, “Поставщики”
WHERE “Книги”.”Код_поставщика” = “Поставщики”.“Код_поставщика”
AND “Автор” LIKE ‘%Дейт%’
При выполнении последнего запроса система должна одновременно обрабатывать данные из двух таблиц, тогда как в предыдущем примере эти таблицы обрабатываются поочередно. Естественно, что для их реализации требуются различные ресурсы памяти и времени.
В подобных запросах можно использовать не только оператор IN, но и операторы сравнения (<>, <=, <, >= или >), однако, если вложенный подзапрос возвращает более одного значения и не используется оператор IN, будет возникать ошибка.
