
Презентации БД (ВФ) / DB_lec7
.pdf
|
|
|
|
SQL |
|
|
|
|
|
|
|
Использование IN и EXISTS. |
|
Emp |
|||
|
Dept |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dep_id |
Emp_id |
|
Salary |
|
Dep_id |
Name_dept |
|
|
|
|||
|
|
|
|
|
|
|
||
|
|
|
|
|
1 |
10 |
|
100 |
|
1 |
! |
|
|
|
|||
|
|
|
|
|
|
|
||
|
|
|
|
|
1 |
15 |
|
150 |
|
2 |
IT |
|
|
|
|||
|
|
|
|
|
|
|
||
|
|
|
|
|
2 |
20 |
|
200 |
|
3 |
$ % ' % () |
|
|
||||
|
|
|
|
|
|
|||
|
|
|
|
|
2 |
25 |
|
250 |
SELECT * FROM EMP e |
|
|
|
|||||
|
|
|
|
|
|
|||
|
|
3 |
30 |
|
300 |
|||
WHERE d.dep_id IN |
|
|
|
|||||
|
|
|
|
|
|
|||
|
(SELECT e.dep_id FROM DEPT d); |
|
|
|
|
|||
|
4 |
70 |
|
500 |
||||
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
обрабатывается как:
SELECT * FROM EMP e, (SELECT DISTINCT dept_id from DEPT) d WHERE d.dep_id =e.dep_id

|
|
|
|
|
|
SQL |
|
|
|
|
|
|
|
|
|
Использование IN и EXISTS. |
|
Emp |
|||
|
Dept |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dep_id |
Emp_id |
|
Salary |
|
Dep_id |
Name_dept |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
1 |
10 |
|
100 |
|
1 |
|
|
! |
|
|
|
|||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
1 |
15 |
|
150 |
|
2 |
|
IT |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
2 |
20 |
|
200 |
|
3 |
|
$ % ' % () |
|
|
|||||
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
2 |
25 |
|
250 |
SELECT * FROM EMP e |
|
|
|
|
||||||
|
|
|
|
|
|
|
||||
WHERE EXISTS |
|
|
|
3 |
30 |
|
300 |
|||
|
|
(SELECT null |
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
70 |
|
500 |
||
|
FROM |
DEPT d WHERE d.dep_id=e.dep_id); |
|
|||||||
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
обрабатывается как:
for dep_id in (select * from EMP E) loop
if (exists (select null from DEPT D where D.dep_id = E.dep_id)) then ВЫДАТЬ ЗАПИСЬ
end if end loop

SQL
Использование NOT IN и NOT EXISTS.
Emp
Mgr_id |
Emp_id |
Salary |
|
|
|
1 |
10 |
100 |
|
|
|
null |
3 |
150 |
|
|
|
2 |
20 |
200 |
|
|
|
2 |
25 |
250 |
|
|
|
3 |
30 |
300 |
|
|
|
4 |
70 |
500 |
|
|
|
SELECT count(*) FROM EMP e WHERE e.emp_id NOT IN
(SELECT Mgr_id FROM EMP);
---------------------------------
Результат: 0
SELECT count(*) FROM EMP e WHERE NOT EXISTS
(SELECT null FROM EMP m where e.emp_id=m.mgr_id);
---------------------------------
Результат: 5

SQL
Использование NOT IN и NOT EXISTS.
Обобщенные правила по использованию IN,NOT IN, EXISTS, NOT EXISTS
1.Правила, описанные ниже не являются рецептами на все случаи жизни. В зависимости от конкретной ситуации из них могут быть исключения.
2.Принцип работы EXIST и NOT EXISTS во многом аналогичен.
3.Принцип работы IN и NOT IN во многом аналогичен если нет значений NULL. Если присутствуют значения NULL, работа IN и NOT IN отличается.
4.Предикат NOT IN не содержит значений NULL.
5.Предикат IN может работать эффективней чем EXISTS, если внешний запрос работает с большим набором данных, а внутренний с не большим.
6.Предикат EXISTS может работать эффективней чем IN, если внешний запрос работает с небольшим набором данных, а внутренний с большим.
7.Результат работы NOT IN и NOT EXISTS различен, если в данных присутствует NULL.
8.Результат работы NOT IN и NOT EXISTS одинаковый, если в данных нет значений NULL, но производительность работы разная.

SQL
Теоретико-множественные операции
UNION или UNION ALL – для операции объединения, MINUS – для операции вычитания,
INTERSECT – для операции пересечения.
Операция UNION
A B
Возвращает результат объединения двух запросов, исключая дубликаты.
SELECT Dep_id FROM Dep UNION SELECT Dep_id FROM Emp
--------
1
2
3

SQL
Теоретико-множественные операции
Операция UNION ALL
A B
Возвращает результат объединения двух запросов, включая дубликаты.
SELECT Dep_id FROM Dep UNION ALL SELECT Dep_id FROM Emp
--------
1
1
2
3

SQL
Теоретико-множественные операции
Операция INTERSECT
A B
Возвращает строки, которые присутствуют в обоих запросах.
SELECT Dep_id FROM Dep WHERE Dep_id <>3 INTERSECT
SELECT Dep_id
FROM Emp
--------
1
2

SQL
Теоретико-множественные операции
Операция MINUS
A B
Возвращает строки первого запроса, которые отсутствуют во втором
SELECT Dep_id FROM Dep MINUS SELECT Dep_id FROM Emp
WHERE Dep_id NOT IN(1,2)
--------
1
2
3

SQL
Агрегирующие функции
Агрегирующие или групповые функции, работают с набором строк и предоставляют один результат в группе
|
Сотрудник |
|
|
Номер отдела |
Зарплата |
|
|
1 |
100 |
|
|
1 |
150 |
|
|
1 |
80 |
|
|
2 |
200 |
|
|
2 |
300 |
|
|
3 |
100 |
|
|
3 |
110 |
|
|
3 |
130 |
|
|
3 |
180 |
|
|
Минимальная зарплата |
MIN(зарплата) |
|
В таблице «Сотрудник»
80

SQL
Типы агрегирующих функций. Синтаксис.
–AVG
–COUNT
–MAX
–MIN
–SUM
Групповые
функции
SELECT |
[column,] Групповая_функция(column), ... |
FROM |
таблица |
[WHERE |
условие] |
[GROUP BY |
column] |
[ORDER BY |
column]; |