□ SELECT product_id, name
FROM products
WHERE product_id IN (1, 2, 3);
PRODUCT_ID NAME
1 Modern Science
2 Chemistry
3 Supernova
Как будет показано ниже в этом разделе, список значений может быть
результатом выполнения подзапроса.
Примечание Чтобы проверить, входит ли значение в список, возвращаемый коррелированным
подзапросом (см. ниже раздел «Написание коррелированных подзапросов»), можно также
использовать оператор EXISTS.
180 Глава 6
Использование IN в многострочных подзапросах
Оператор IN используется для проверки, входит ли значение в определенный
список значений (см. главу 2). Такой список значений может быть получен
из результатов, возвращаемых подзапросом. Для выполнения логической
операции, противоположной IN, можно использовать оператор
NOT IN. Этот оператор используется с целью проверить, что значение не
входит в указанный список значений.
В следующем простом примере оператор IN используется для проверки,
входит ли проверяемое значение pro d u ct_ id в список значений product_
id , возвращаемых подзапросом; подзапрос возвращает значения столбца
p rodu ct_id для товаров, в названии которых имеется буква е:
□ SELECT product_id, name
FROM products
WHERE product_id IN
(SELECT product_id
FROM products
WHERE name like ‘ Х е Г );
PRODUCT IIDD NAME
1 Modern Science
2 Chemistry
3 Supernova
5 Z F ile s
6 2412: The Return
7 Space Force 9
8 From Another P lan et
11 C re a tiv e Y e ll
12 My Front Line
В следующем примере оператор NOT IN используется для проверки того,
что p rodu ct_id не входит в список значений produ ct_id из таблицы
purchases:
□ SELECT product_id, name
FROM products
WHERE product_id NOT IN
(SELECT product_id
FROM purchases);
PRODUCT IIDD NAME
4 Tank War
5 Z F ile s
6 2412: The Return
7 Space Force 9
8 From Another P lan e t
9 C la s s ic a l Music
10 Pop 3
11 C re a tiv e Y e ll
12 My Front Line
Подзапросы 181
Использование ANY в многострочных подзапросах
Оператор ANY используется для сравнения значения с любым значением в
списке. Перед оператором ANY в запросе нужно поместить какой-либо из
операторов =, о , <., >, <= или >=. В следующем примере ANY используется
для проверки того, что какие-то служащие имеют зарплату, меньше любой
минимальной зарплаты в таблице salary_grades:
□ SELECT employee_id, last_name
FROM employees
WHERE salary < ANY
(SELECT low_salary
FROM salary_grades);
EMPLOYEE_ID LAST_NAME
2 Johnson
3 Hobbs
4 Jones
Использование ALL в многострочных подзапросах
Оператор ALL используется для сравнения значения со всеми значениями
из списка. Перед оператором ALL в запросе нужно поместить какой-либо
из операторов =, о , <., >, <= или >=. В следующем примере ALL используется
для проверки того, что какие-то служащие имеют зарплату, больше любой
максимальной зарплаты в таблице salary_ grades:
□ SELECT employee_id, last_name
FROM employees
WHERE s a la r y > ALL
(SELECT h ig h _ sa la ry
FROM sa la ry_ g rad e s );
no rows returned
Как можно судить по результатам запроса, ни у кого из сотрудников зарплата
не превышает максимально возможную зарплату.
Написание многостолбцовых подзапросов
Рассмотренные ранее подзапросы возвращали строки, содержащие всего
один столбец. Но можно писать подзапросы, которые будут возвращать
несколько столбцов. В следующем примере отбираются товары с самой
низкой ценой для каждой группы типа продуктов:
П SELECT product_id, product_type_id, name, price
FROM products
WHERE (product_type_id, price) IN
(SELECT product_type_id, MIN(price)
FROM products
GROUP BY product_type_id);
182 Глава 6
PRODUCT_ID PRODUCT_TYPE_ID NAME PRICE
1 1 Modern Science 19.95
4 2 Tank War 13.95
8 3 From Another P lan e t 12.99
9 4 C la s s ic a l Music 10.99
Подзапрос возвращает значения столбца pro du ct_type_ id и минималь-
ное значение столбца price для каждой группы товаров, которые в выражении
WHERE внешнего запроса сравниваются с produ ct_type_ id и price для
каждого товара.
Написание коррелированных подзапросов
Коррелированный подзапрос ссылается на один или несколько столбцов
внешнего запроса. Принято называть такой подзапрос коррелированным,
потому что подзапрос устанавливает отношение с внешним запросом посредством
одних и тех же столбцов.
Обычно коррелированный подзапрос используется, когда нужен ответ
на вопрос, который зависит от значения в каждой строке, содержащейся
во внешнем запросе. Например, вам может потребоваться определить,
есть ли связь между данными, но для вас не имеет значения, как много
строк возвращает подзапрос, то есть вы просто хотите проверить, возвращаются
ли какие-либо строки вообще, но для вас не имеет значения, как