Базы данных
Подзапросы
Подзапросы
Однострочные подзапросы
Однострочные подзапросы. Агрегирующие функции в подзапросах
Многострочные подзапросы
Многострочные подзапросы
Оператор EXISTS
Использование NULL-значений
Использование NULL-значений
66.44K
Категория: Базы данныхБазы данных

Язык SQL. Подзапросы. (Лекция 10)

1. Базы данных

Лекция 9
Язык SQL.
Подзапросы

2. Подзапросы

SELECT
select_list
FROM table1
WHERE expr operator
(SELECT select_list FROM table2);
• Выполняется до выполнения основного запроса;
• Результат выполнения подзапроса используется в
основном запросе;
• Подзапросы заключаются в круглые скобки
18.11.2017
Горбунов О.Е.
2

3. Подзапросы

SELECT last_name, salary
FROM employee
WHERE salary >
(SELECT salary
FROM employee
WHERE last_name = 'Abel');
18.11.2017
Горбунов О.Е.
3

4. Однострочные подзапросы

• Возвращают одну строку
• Используйте операторы сравнения (>, >=, <, <=, =, <>)
SELECT last_name, job_id, salary
FROM
employees
WHERE job_id = (SELECT job_id
FROM
employees
WHERE last_name =
'Taylor')
AND salary >
(SELECT salary
FROM
employees
WHERE last_name =
'Taylor');
18.11.2017
Горбунов О.Е.
4

5. Однострочные подзапросы. Агрегирующие функции в подзапросах

SELECT last_name, job_id, salary
FROM
employees
WHERE salary = (SELECT MIN(salary)
FROM
employees);
SELECT
department_id, MIN(salary)
FROM
employees
GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary)
FROM
employees
WHERE
department_id = 50);
18.11.2017
Горбунов О.Е.
5

6. Многострочные подзапросы

• Возвращают более одной строки
• Используются специальные операторы
– IN
– ANY (используется после оператора сравнения)
– ALL (используется после оператора сравнения)
=ANY эквивалентно IN
<>ALL эквивалентно NOT IN
18.11.2017
Горбунов О.Е.
6

7. Многострочные подзапросы

SELECT employee_id, last_name,
job_id, salary
FROM
employees
WHERE salary < ANY (SELECT salary
FROM
employees
WHERE job_id =
'IT_PROG' AND
job_id <>
'IT_PROG‘);
18.11.2017
Горбунов О.Е.
7

8. Оператор EXISTS

SELECT employee_id,salary,last_name
FROM employees M
WHERE EXISTS
(SELECT employee_id FROM employees W
WHERE (W.manager_id=M.employee_id)
AND W.salary > 10000);
18.11.2017
Горбунов О.Е.
8

9. Использование NULL-значений

SELECT emp.last_name
FROM
employee emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM
employee mgr);
Ничего не вернет, если в подзапросе одно из
значение будет равно NULL.
Для IN нет подобной проблемы.
Выход – использовать WHERE NOT NULL либо EXISTS
и коррелированный подзапрос.
18.11.2017
Горбунов О.Е.
9

10. Использование NULL-значений

SELECT emp.last_name
FROM employee emp
WHERE NOT EXISTS ( SELECT emp.employee_id
FROM employee slv
WHERE emp.employee_id = slv.manager_id );
18.11.2017
Горбунов О.Е.
10
English     Русский Правила