1. ЛЕКЦИЯ №8
Язык SQL. Использование агрегатных функций.
Выполнение реляционных операций с помощью
SQL. Вложенные подзапросы. Промышленные
реляционные СУБД: ORACLE, ACCESS.
2. Агрегатные функции в SQL
Агрегатные функции предназначены для того, чтобы
вычислять некоторое значение для заданного
множества строк. Таким множеством строк может
быть группа строк, если агрегатная функция
применяется к сгруппированной таблице, или вся
таблица.
3. Виды агрегатный функций
COUNT - производит номера строк или не-NULL
значения полей которые выбрал запрос.
SUM - производит арифметическую сумму всех
выбранных значений данного пол.
AVG - производит усреднение всех выбранных значений
данного пол.
MAX - производит наибольшее из всех выбранных
значений данного пол.
MIN - производит наименьшее из всех выбранных
значений данного пол.
4. Использование агрегатных
функций
SELECT {COUNT | MAX | MIN | SUM | AVG}
(* [ALL|DISTINCT] <имя столбца>, …)
FROM <имя таблицы>
WHERE <условие>
GROUP BY <имя столбца>, … | HAVING
<условие>;
6. Группировка для агрегатных
функций
Выбрать рейтинг по городам:
SELECT city, SUM(RATING) FROM Clients
GROUP BY city;
Заказчики
----------------------------------------------
CNUM | CNAME | CITY | RATING | SNUM
-------|------------|---------|--------|------
2001 | Hoffman | London | 100 | 1001
2002 | Giovanni | Rome | 200 | 1003
2003 | Liu | SanJose | 200 | 1002
2004 | Grass | Berlin | 300 | 1002
2006 | Clemens | London | 100 | 1001
2008 | Cisneros | SanJose | 300 | 1007
2007 | Pereira | Rome | 100 | 1004
-------------------------
CITY | RATING | SNUM
---------|--------|------
London | 200 | 1001
Rome | 300 | 1003
SanJose | 500 | 1002
Berlin | 300 | 1002
7. Использование HAVING
Предположим, что в предыдущем примере, вы
хотели бы увидеть только максимальную сумму
приобретений значение которой выше $3000.00
SELECT snum, odate, MAX (amt)
FROM Oreders
WHERE MAX ((amt)) > 3000.00
GROUP BY snum, odate;
8. Ограничения на
использование GROUP BY
Столбцы с группировкой должны представлять собой реальные
столбцы таблиц, перечисленных в предложении FROM. Нельзя
группировать строки на основании значения вычисляемого
выражения.
Кроме того, существуют ограничения на элементы списка
возвращаемых столбцов. Все элементы этого списка должны
иметь одно значение для каждой группы строк. Это означает, что
возвращаемым столбцом может быть:
константа;
агрегатная функция, возвращающая одно значение для всех
строк, входящих в группу;
столбец группировки, который, по определению, имеет одно и то
же значение во всех строках группы;
выражение, включающее в себя перечисленные выше элементы.
9. Ограничения на
использование GROUP BY
В строгой интерпретации ANSI SQL, вы не можете использовать
агрегат агрегата. Предположим? что вы хотите выяснить, в какой
день имелась наибольшая сумма приобретений.
SELECT odate, MAX ( SUM (amt) )
FROM Orders
GROUP BY odate;
Если вы попробуете сделать это, то ваша команда будет вероятно
отклонена. (Некоторые реализации не предписывают этого
ограничения, которое является выгодным, потому что вложенные
агрегаты могут быть очень полезны, даже если они и несколько
проблематичны.)
10. Проекция и выборка
SELECT [ALL] | DISTINCT]{ * | элемент_SELECT
[,элемент_SELECT] ...}
FROM {имя_таблицы_1 | представление} [псевдоним]
[,{имя_таблицы_2 | представление} [псевдоним], ...]
[WHERE <условие>]
[GROUP BY <имя_столбца_1> [,<имя_столбца_2>, ...] |
[HAVING <имя_столбца_1> [,<имя_столбца_2>, ...]]
[ORDER BY <имя_столбца_1> [,<имя_столбца_2>, ...]];
Проекция – это выбор столбцов в любом порядке.
Выборка любой запрос SELECT с предикатом
WHERE.
12. Соединение таблиц
Операция соединения используется в языке SQL для
вывода связанной информации, хранящейся в
нескольких таблицах, в одном запросе. В этом
проявляется одна из наиболее важных особенностей
запросов SQL - способность определять связи между
многочисленными таблицами и выводить
информацию из них в рамках этих связей. Именно эта
операция придает гибкость и легкость языку SQL.
Операции соединения подразделяются на два вида:
внутренние;
внешние
13. Оператор соединения JOIN
Внешние соединения (о которых мы поговорим позднее)
поддерживаются стандартом ANSI-92 и содержат
зарезервированное слово "JOIN", в то время как внутренние
соединения (или просто соединения) могут задаваться как
без использования такого слова (в стандарте ANSI-89), так и
с использованием слова "JOIN" (в стандарте ANSI-92).
Синтаксис соединения
SELECT * | <имена_столбцов> FROM
<имя_таблицы_1> [INNER | OUTER LEFT | OUTER
RIGHT | OUTER FULL] JOIN <имя_таблицы_2> ON
<имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
14. Внутреннее соединение
Внутреннее соединение возвращает только те строки,
для которых условие соединения принимает значение
true.
SELECT * | <имена_столбцов> FROM
<имя_таблицы_1> INNER JOIN <имя_таблицы_2>
ON <имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
или
SELECT * | <имена_столбцов> FROM
<имя_таблицы_1>, <имя_таблицы_2> WHERE
<имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
15. Естественное соединение
Объединение двух таблиц, в котором связанные
столбцы имеют идентичные имена, называется
естественным объединением, так как обычно это
действительно самый "естественный" способ
объединения двух таблиц.
SELECT * | <имена_столбцов> FROM
<имя_таблицы_1> NATURAL JOIN
<имя_таблицы_2> ON (<имя_столбца>);
16. Пример внутреннего
соединения
FIRST_NAME LAST_NAME DEPT_NO
Mary S. MacDonald 1
Robert Nelson 3
DEPT_NO DEPARTMENT
1 Corporate Headquarters
2 Sales and Marketing
3 Engineering
4 Finance
Employee
Department
SELECT first_name, last_name, department FROM employee
e, department d WHERE e.dept_no = d.dept_no;
или
SELECT first_name, last_name, department FROM employee
e INNER JOIN department d ON e.dept_no = d.dept_no;
Результат
FIRST_NAME LAST_NAME DEPARTMENT
Robert Nelson Engineering
Mary S. MacDonald Corporate Headquarters
17. Внешнее соединение
Внешнее соединение возвращает все строки из одной
таблицы и только те строки из другой таблицы, для
которых условие соединения принимает значение true.
Строки второй таблицы, не удовлетворяющие условию
соединения (т.е. имеющие значение false), получают
значение null в результирующем наборе.
Существует три вида внешних соединений:
левое соединение
правое соединение
полное соединение
18. Внешнее соединение
Левое:
SELECT * | <имена_столбцов> FROM <имя_таблицы_1>
LEFT JOIN <имя_таблицы_2> ON
<имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
Правое:
SELECT * | <имена_столбцов> FROM <имя_таблицы_1>
RIGHT JOIN <имя_таблицы_2> ON
<имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
Полное:
SELECT * | <имена_столбцов> FROM <имя_таблицы_1>
FULL JOIN <имя_таблицы_2> ON
<имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
19. Пример внешнего
соединения
branchNo bCity cityID
В004 Bristol 1
B003 Glasgow 3
В002 London 2
propertyN
o
pCity cityID
PA14 Aberdeen 4
PL94 London 2
PG4 Glasgow 3Таблица 8.1. Branch
Таблица 8.2. PropertyForRent
SELECT b.*, р.*
FROM Branch b LEFT JOIN PropertyForRent p ON b.bCity = p.pCity;
===================== SQL Execution Log ======================
| |
| branchNo bcity cityID propertyNo pCity cityID |
| -------- ------- ------ ---------- ------- ------ |
| B003 Glasgow 3 PG4 Glasgow 3 |
| B004 Bristol 1 NULL NULL NULL |
| B002 London 2 PL94 London 2 |
| |
===============================================================
20. Самосоединение
В некоторых задачах необходимо получить
информацию, выбранную особым образом только
из одной таблицы. Для этого используются так
называемые самосоединения, или рефлексивные
соединения. Это не отдельный вид соединения, а
просто соединение таблицы с собой с помощью
псевдонимов. Самосоединения полезны в случаях,
когда нужно получить пары аналогичных
элементов из одной и той же таблицы.
21. Пример самосоединения
Получить список пар отделов с одинаковыми годовыми бюджетами
SELECT d1.department, d2.department, d1.budgetFROM
department d1, department d2 WHERE d1.budget =
d2.budget
DEPT_NO DEPARTMENT BUDGET
1 Software Development 400000.00
2 Field Office: Canada 500000.00
3 Finance 400000.00
4 Field Office: East Coast 500000.00
5 Field Office: Japan 500000.00
6 Field Office: Singapore 300000.00
7 Field Office: Switzerland 500000.00
8 Quality Assurance 300000.00
DEPARTMENT DEPARTMENT BUDGET
Software Development Finance 400000.00
Field Office: East Coast Field Office: Canada 500000.00
Field Office: Japan Field Office: East Coast 500000.00
Field Office: Japan Field Office: Canada 500000.00
Field Office: Japan Field Office: Switzerland 500000.00
Field Office: Singapore Quality Assurance 300000.00
Field Office: Switzerland Field Office: East Coast 500000.00
Department
Результат
22. Объединения таблиц
Объединением двух таблиц А и В
называется таблица, содержащая все
строки, которые имеются в первой
таблице (А), во второй таблице (В) или в
обеих этих таблицах одновременно.
Пересечением, двух таблиц называется
таблица, содержащая все строки,
присутствующие в обеих исходных
таблицах одновременно.
Разностью двух таблиц А и В называется
таблица, содержащая все строки, которые
присутствуют в таблице А, но отсутствуют
в таблице В.
Объединение
(SELECT …)
UNION
(SELECT …);
Пересечение
(SELECT …)
INTERSET
(SELECT …);
Разность
(SELECT …)
MINUS
(SELECT …);
23. Подзапросы
С помощью SQL вы можете вкладывать запросы внутрь
друг друга. Обычно, внутренний запрос генерирует
значение, которое проверяется в предикате внешнего
запроса, определяющего верно оно или нет.
Например, предположим, что мы знаем имя продавца:
Motika, но не знаем значение его поля snum, и хотим
извлечь все заказы из таблицы заказов. Имеется один
способ, чтобы сделать это:
SELECT * FROM Orders WHERE snum = ( SELECT
snum FROM Salespeople WHERE sname =
‘Motika’);
24. Подзапросы с произвольным
числом строк
Вы можете использовать подзапросы, которые производят
любое число строк, если вы используете специальный
оператор IN. Как вы помните, IN определяет набор
значений, одно из которых должно совпадать с другим
термином уравнения предиката в порядке, чтобы предикат
был верным. Мы можем, следовательно, использовать IN
чтобы выполнить такой же подзапрос, который не будет
работать с реляционным оператором, и найти все атрибуты
таблицы заказов для продавца в Лондоне:
SELECT * FROM Orders WHERE snum IN ( SELECT snum
FROM Salespeople WHERE city = ‘LONDON’ );
Операторы BETWEEN, LIKE, и IS NULL не могут
использоваться с подзапросами, но можно использовать
операторы ALL и ANY
25. Соотнесенный подзапрос
Когда вы используете подзапросы в SQL, вы можете
обратиться к внутреннему запросу таблицы в предложении
внешнего запроса FROM, сформировав – соотнесенный
подзапрос. Когда вы делаете это, подзапрос выполняется
неоднократно, по одному разу для каждой строки таблицы
основного запроса. Соотнесенный подзапрос - один из
большого количества тонких понятий в SQL из-за
сложности в его оценке.
Например, имеется один способ найти всех заказчиков в
заказах на 3-е Октября:
SELECT * FROM Customers outer WHERE 10/03/1990
IN ( SELECT odate FROM Orders inner WHERE
outer.cnum = inner.cnum );