Операции соединения подзапросов
Операции соединения подзапросов языка SQL – это реализация операторов реляционной алгебры объединения, пересечения и вычитания. Для выполнения этих операторов требуется, чтобы элементы обоих множеств были взаимно однородными, то есть содержали элементы одинаковой природы, или, если выражаться в терминах баз данных, строки, состоящие из атрибутов одинаковых типов. Сами множества строк создаются при помощи подзапросов.
Существует четыре операции соединения подзапросов:
UNION – объединение строк из обоих подзапросов; в результате остаются строки из обоих подзапросов, причем полностью повторяющиеся строки удаляются;
UNION ALL – объединение строк из обоих подзапросов; в результате остаются строки из обоих подзапросов, причем полностью повторяющиеся строки остаются;
INTERSECT – пересечение строк из обоих подзапросов; в результате остаются строки, присутствующие в обоих подзапросах;
MINUS – вычитание результатов одного подзапроса из результатов второго подзапроса.
Пример:
-- получение списка студентов(их номера зачеток),не имеющих хобби
SELECT N_z FROM Students
MINUS
SELECT N_z FROM St_Hobby;
Частичный вывод запрошенных данных
Необходимость частичного вывода запрошенных данных часто обусловлена либо предполагаемым большим объемом данных, когда нужно предварительно проверить адекватность запроса и полученных данных, либо требованиями к реализации конкретной задачи (например, постраничный вывод данных). Например, при помощи использования функции агрегирования MAX, можно получить информацию о том, кто является самым «активным» студентом, но невозможно вывести информацию о двух самых активных, трех и т.д.
СУБД ORACLE динамически присваивает порядковый номер каждой записи, возвращаемой в результате выполнения любого запроса, по умолчанию скрывая его от пользователя. Первая (или единственная) возвращенная запись получит номер 1 независимо от своего положения в таблице. На эти номера можно ссылаться в параметре WHERE. Если в операторе SELECT заданы параметры сортировки результатов запроса, то можно добиться того, что СУБД покажет 5, 50 или 500 наиболее важных записей.
Синтаксис, позволяющий это реализовать, выглядит следующим образом:
SELECT имя_столбца_1 [, имя_столбца_2 …]
FROM имя_таблицы
WHERE (ROWNUM >= нижняя_граница)
AND (ROWNUM <= верхняя_граница)
ORDER BY столбец_сортировки;
При необходимости можно указывать либо нижнюю границу, либо верхнюю, либо обе. Например, для того чтобы вывести двух лидеров (самых “активных” студентов) на основе количества их хобби, можно выполнить следующий запрос:
SELECT N_z, COUNT(N_z)
FROM Students
WHERE ROWNUM<=2
GROUP BY N_z
ORDER BY COUNT(N_z)DESC;