Также с помощью такого способа связать можно два подзапроса конструкцией JOIN.
Связать два подзапроса: один — все люди (MAN), которым больше 35 лет (YEAROLD), второй — все автомобили (AUTO), произведенные после 2003 года (RELEASEDT).
Обратите внимание, что при использовании подзапроса как источника данных необходимо для каждого такого подзапроса применять уникальные псевдонимы, такие как псевдоним n в нашем примере.
Можно ли в таком виде запросов использовать запросы с таблицей DUAL?
Да, вот пример:
Можно ли в таком виде запросов использовать разные типы объединений?
Да, можно использовать любые типы объединений JOIN.
Контрольные вопросы и задания для самостоятельного выполнения
1. Выбрать все автомобили BMW из AUTO, используя подзапрос как таблицу после FROM.
2. Выбрать все автомобили из AUTO и их владельцев, которым больше 25 лет, используя подзапрос как таблицу.
3. Выбрать все города, в которых больше миллиона жителей, используя подзапрос после FROM.
Шаг 39. Повторение темы подзапросов. Подзапросы в запросах с группировкой данных
Подзапросы можно сочетать с запросами с группировкой данных. Это интересная возможность, которая позволяет разрешить некоторые проблемы.
Продемонстрируем, как работают подзапросы в запросах с группировками данных.
Пример 1.Выбрать из таблицы MAN имя и возраст, выбрать из таблицы CITY наименование города подзапросом, сгруппировать данные по названию города, найти сумму возрастов всех жителей каждого города с заданным именем, использовать тип подзапроса «колонка запроса».
Обратите внимание: в данном примере мы перед тем как сгруппировать данные, используем выборку с подзапросом «колонка таблицы» в качестве внутреннего подзапроса.
Пример 2.Выбрать только те названия городов из таблицы CITY, где в таблице MAN более одного человека, использовать подзапрос.
В этом запросе нет группировки, но используется агрегатная функция COUNT.
Пример 3.Найти количество автомобилей каждой марки, которые купили люди, проживающие в городах с населением более миллиона человек. Используйте подзапрос с IN.
В этом запросе используется два вложенных подзапроса IN, записи по которым фильтруются, после чего выполняется группировка по отфильтрованным значениям.
Пример 4.Найти количество автомобилей каждой марки, которые купили люди не старше 35 лет. Используйте подзапрос с EXISTS.
В данном запросе используется логический оператор NOT, чтобы правильно перевести в SQL условие — не старше.
Подзапросы можно сочетать с группировками, но важно понимать, что подзапрос как колонка запроса не может быть частью групповой функции, то есть следующий запрос будет неверен.
Примеры неправильных запросов:
Неправильный запрос — другой синтаксис:
Подзапрос как колонка запроса не может вернуть более одной строки.
Если мы используем подзапрос как в примере 3, то такой подзапрос также не может вернуть более одной строки.
Можно переписать первый пример другим способом, без подзапросов?
Да, эта задача имеет несколько решений, предлагаю вам их найти самостоятельно.
В примере 3 мы использовали несколько вложенных подзапросов. Как еще можно решить эту задачу, чтобы не использовать вложенные подзапросы?
Задача решается различными способами, например: запрос как источник данных, соединение таблиц.
Почему ни в одном из практических примеров не было подзапроса как источника данных для запроса?
Подобный пример мы разберем в следующем шаге.
Контрольные вопросы и задания для самостоятельного выполнения
1. Повторите материалы данного шага.
2. Перепишите запрос из примера 3 с использованием подзапроса EXISTS.
3. Выберите только те названия городов из таблицы CITY, где в таблице MAN не более одного человека, используйте EXISTS.
4. Найдите количество автомобилей каждой марки, которые купили люди старше 29 лет. Используйте подзапрос с IN.
Шаг 40. Сочетание разных типов подзапросов
В прошлых шагах мы с вами рассмотрели возможности работы с подзапросами, а также различные типы подзапросов и их использование в языке SQL.
Перечислим типы подзапросов, с которыми мы познакомились:
Читать дальше
Конец ознакомительного отрывка
Купить книгу