SlideShare a Scribd company logo
1 of 26
ЛЕКЦИЯ №8
Язык SQL. Использование агрегатных функций.
Выполнение реляционных операций с помощью
SQL. Вложенные подзапросы. Промышленные
реляционные СУБД: ORACLE, ACCESS.
Агрегатные функции в SQL
Агрегатные функции предназначены для того, чтобы
вычислять некоторое значение для заданного
множества строк. Таким множеством строк может
быть группа строк, если агрегатная функция
применяется к сгруппированной таблице, или вся
таблица.
Виды агрегатный функций
COUNT - производит номера строк или не-NULL
значения полей которые выбрал запрос.
SUM - производит арифметическую сумму всех
выбранных значений данного пол.
AVG - производит усреднение всех выбранных значений
данного пол.
MAX - производит наибольшее из всех выбранных
значений данного пол.
MIN - производит наименьшее из всех выбранных
значений данного пол.
Использование агрегатных
функций
SELECT {COUNT | MAX | MIN | SUM | AVG}
(* [ALL|DISTINCT] <имя столбца>, …)
FROM <имя таблицы>
WHERE <условие>
GROUP BY <имя столбца>, … | HAVING
<условие>;
Выполнение агрегатных
функций
SELECT SUM ((amt)) FROM Orders; - 26658.4
SELECT AVG ((amt)) FROM Orders; - 2665.84
SELECT MAX ((amt)) FROM Orders; - 9891.88
SELECT MIN ((amt)) FROM Orders; - 18.69
SELECT COUNT (*) FROM Orders; - 10
Заказы
-----------------------------------------------
ONUM | AMT | ODATE | CNUM | SNUM
-------|-----------|-------------|------|------
3001 | 18.69 | 10/03/1990 | 2008 | 1007
3003 | 767.19 | 10/03/1990 | 2001 | 1001
3002 | 1900.10 | 10/03/1990 | 2007 | 1004
3005 | 5160.45 | 10/03/1990 | 2003 | 1002
3006 | 1098.16 | 10/03/1990 | 2008 | 1007
3009 | 1713.23 | 10/04/1990 | 2002 | 1003
3007 | 75.75 | 10/04/1990 | 2004 | 1002
3008 | 4723.00 | 10/05/1990 | 2006 | 1001
3010 | 1309.95 | 10/06/1990 | 2004 | 1002
3011 | 9891.88 | 10/06/1990 | 2006 | 1001
-----------------------------------------------
Группировка для агрегатных
функций
Выбрать рейтинг по городам:
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
Использование HAVING
Предположим, что в предыдущем примере, вы
хотели бы увидеть только максимальную сумму
приобретений значение которой выше $3000.00
SELECT snum, odate, MAX (amt)
FROM Oreders
WHERE MAX ((amt)) > 3000.00
GROUP BY snum, odate;
Ограничения на
использование GROUP BY
Столбцы с группировкой должны представлять собой реальные
столбцы таблиц, перечисленных в предложении FROM. Нельзя
группировать строки на основании значения вычисляемого
выражения.
Кроме того, существуют ограничения на элементы списка
возвращаемых столбцов. Все элементы этого списка должны
иметь одно значение для каждой группы строк. Это означает, что
возвращаемым столбцом может быть:
константа;
агрегатная функция, возвращающая одно значение для всех
строк, входящих в группу;
столбец группировки, который, по определению, имеет одно и то
же значение во всех строках группы;
выражение, включающее в себя перечисленные выше элементы.
Ограничения на
использование GROUP BY
В строгой интерпретации ANSI SQL, вы не можете использовать
агрегат агрегата. Предположим? что вы хотите выяснить, в какой
день имелась наибольшая сумма приобретений.
SELECT odate, MAX ( SUM (amt) )
FROM Orders
GROUP BY odate;
Если вы попробуете сделать это, то ваша команда будет вероятно
отклонена. (Некоторые реализации не предписывают этого
ограничения, которое является выгодным, потому что вложенные
агрегаты могут быть очень полезны, даже если они и несколько
проблематичны.)
Проекция и выборка
SELECT [ALL] | DISTINCT]{ * | элемент_SELECT
[,элемент_SELECT] ...}
FROM {имя_таблицы_1 | представление} [псевдоним]
[,{имя_таблицы_2 | представление} [псевдоним], ...]
[WHERE <условие>]
[GROUP BY <имя_столбца_1> [,<имя_столбца_2>, ...] |
[HAVING <имя_столбца_1> [,<имя_столбца_2>, ...]]
[ORDER BY <имя_столбца_1> [,<имя_столбца_2>, ...]];
Проекция – это выбор столбцов в любом порядке.
Выборка любой запрос SELECT с предикатом
WHERE.
Декартовое произведение
SELECT [ALL] | DISTINCT]{ * | элемент_SELECT
[,элемент_SELECT] ...}
FROM {имя_таблицы_1 | представление} [псевдоним]
,{имя_таблицы_2 | представление} [псевдоним], ...;
Соединение таблиц
Операция соединения используется в языке SQL для
вывода связанной информации, хранящейся в
нескольких таблицах, в одном запросе. В этом
проявляется одна из наиболее важных особенностей
запросов SQL - способность определять связи между
многочисленными таблицами и выводить
информацию из них в рамках этих связей. Именно эта
операция придает гибкость и легкость языку SQL.
Операции соединения подразделяются на два вида:
внутренние;
внешние
Оператор соединения JOIN
Внешние соединения (о которых мы поговорим позднее)
поддерживаются стандартом ANSI-92 и содержат
зарезервированное слово "JOIN", в то время как внутренние
соединения (или просто соединения) могут задаваться как
без использования такого слова (в стандарте ANSI-89), так и
с использованием слова "JOIN" (в стандарте ANSI-92).
Синтаксис соединения
SELECT * | <имена_столбцов> FROM
<имя_таблицы_1> [INNER | OUTER LEFT | OUTER
RIGHT | OUTER FULL] JOIN <имя_таблицы_2> ON
<имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
Внутреннее соединение
Внутреннее соединение возвращает только те строки,
для которых условие соединения принимает значение
true.
SELECT * | <имена_столбцов> FROM
<имя_таблицы_1> INNER JOIN <имя_таблицы_2>
ON <имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
или
SELECT * | <имена_столбцов> FROM
<имя_таблицы_1>, <имя_таблицы_2> WHERE
<имя_столбца_в_1_таблице> =
<имя_столбца_во_2_таблице>;
Естественное соединение
Объединение двух таблиц, в котором связанные
столбцы имеют идентичные имена, называется
естественным объединением, так как обычно это
действительно самый "естественный" способ
объединения двух таблиц.
SELECT * | <имена_столбцов> FROM
<имя_таблицы_1> NATURAL JOIN
<имя_таблицы_2> ON (<имя_столбца>);
Пример внутреннего
соединения
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
Внешнее соединение
Внешнее соединение возвращает все строки из одной
таблицы и только те строки из другой таблицы, для
которых условие соединения принимает значение true.
Строки второй таблицы, не удовлетворяющие условию
соединения (т.е. имеющие значение false), получают
значение null в результирующем наборе.
Существует три вида внешних соединений:
левое соединение
правое соединение
полное соединение
Внешнее соединение
Левое:
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_таблице>;
Пример внешнего
соединения
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 |
| |
===============================================================
Самосоединение
В некоторых задачах необходимо получить
информацию, выбранную особым образом только
из одной таблицы. Для этого используются так
называемые самосоединения, или рефлексивные
соединения. Это не отдельный вид соединения, а
просто соединение таблицы с собой с помощью
псевдонимов. Самосоединения полезны в случаях,
когда нужно получить пары аналогичных
элементов из одной и той же таблицы.
Пример самосоединения
Получить список пар отделов с одинаковыми годовыми бюджетами
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
Результат
Объединения таблиц
Объединением двух таблиц А и В
называется таблица, содержащая все
строки, которые имеются в первой
таблице (А), во второй таблице (В) или в
обеих этих таблицах одновременно.
Пересечением, двух таблиц называется
таблица, содержащая все строки,
присутствующие в обеих исходных
таблицах одновременно.
Разностью двух таблиц А и В называется
таблица, содержащая все строки, которые
присутствуют в таблице А, но отсутствуют
в таблице В.
Объединение
(SELECT …)
UNION
(SELECT …);
Пересечение
(SELECT …)
INTERSET
(SELECT …);
Разность
(SELECT …)
MINUS
(SELECT …);
Подзапросы
С помощью SQL вы можете вкладывать запросы внутрь
друг друга. Обычно, внутренний запрос генерирует
значение, которое проверяется в предикате внешнего
запроса, определяющего верно оно или нет.
Например, предположим, что мы знаем имя продавца:
Motika, но не знаем значение его поля snum, и хотим
извлечь все заказы из таблицы заказов. Имеется один
способ, чтобы сделать это:
SELECT * FROM Orders WHERE snum = ( SELECT
snum FROM Salespeople WHERE sname =
‘Motika’);
Подзапросы с произвольным
числом строк
Вы можете использовать подзапросы, которые производят
любое число строк, если вы используете специальный
оператор IN. Как вы помните, IN определяет набор
значений, одно из которых должно совпадать с другим
термином уравнения предиката в порядке, чтобы предикат
был верным. Мы можем, следовательно, использовать IN
чтобы выполнить такой же подзапрос, который не будет
работать с реляционным оператором, и найти все атрибуты
таблицы заказов для продавца в Лондоне:
SELECT * FROM Orders WHERE snum IN ( SELECT snum
FROM Salespeople WHERE city = ‘LONDON’ );
Операторы BETWEEN, LIKE, и IS NULL не могут
использоваться с подзапросами, но можно использовать
операторы ALL и ANY
Соотнесенный подзапрос
Когда вы используете подзапросы в SQL, вы можете
обратиться к внутреннему запросу таблицы в предложении
внешнего запроса FROM, сформировав – соотнесенный
подзапрос. Когда вы делаете это, подзапрос выполняется
неоднократно, по одному разу для каждой строки таблицы
основного запроса. Соотнесенный подзапрос - один из
большого количества тонких понятий в SQL из-за
сложности в его оценке.
Например, имеется один способ найти всех заказчиков в
заказах на 3-е Октября:
SELECT * FROM Customers outer WHERE 10/03/1990
IN ( SELECT odate FROM Orders inner WHERE
outer.cnum = inner.cnum );
СПАСИБО ЗА ВНИМАНИЕ

More Related Content

Similar to Базы данных лекция №8

22 - Базы данных. Представления
22 - Базы данных. Представления22 - Базы данных. Представления
22 - Базы данных. ПредставленияRoman Brovko
 
лабораторная работа 8
лабораторная работа 8лабораторная работа 8
лабораторная работа 8student_kai
 
0045
00450045
0045JIuc
 
0044
00440044
0044JIuc
 
0042
00420042
0042JIuc
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregationAcceptic
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaSveta Smirnova
 
СУБД осень 2012 Лекция 4
СУБД осень 2012 Лекция 4СУБД осень 2012 Лекция 4
СУБД осень 2012 Лекция 4Technopark
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Javametaform
 
Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Alexey Kovyazin
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьSergey Xek
 
18 - Базы данных. Общая структура оператора SELECT
18 - Базы данных. Общая структура оператора SELECT18 - Базы данных. Общая структура оператора SELECT
18 - Базы данных. Общая структура оператора SELECTRoman Brovko
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...CocoaHeads
 

Similar to Базы данных лекция №8 (20)

лабраб 7
лабраб 7лабраб 7
лабраб 7
 
22 - Базы данных. Представления
22 - Базы данных. Представления22 - Базы данных. Представления
22 - Базы данных. Представления
 
лабораторная работа 8
лабораторная работа 8лабораторная работа 8
лабораторная работа 8
 
0045
00450045
0045
 
Access 04
Access 04Access 04
Access 04
 
0044
00440044
0044
 
0042
00420042
0042
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregation
 
My sql 0
My sql 0My sql 0
My sql 0
 
лабраб 6
лабраб 6лабраб 6
лабраб 6
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
СУБД осень 2012 Лекция 4
СУБД осень 2012 Лекция 4СУБД осень 2012 Лекция 4
СУБД осень 2012 Лекция 4
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 
Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0
 
User Aggs In As
User Aggs In AsUser Aggs In As
User Aggs In As
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
18 - Базы данных. Общая структура оператора SELECT
18 - Базы данных. Общая структура оператора SELECT18 - Базы данных. Общая структура оператора SELECT
18 - Базы данных. Общая структура оператора SELECT
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Lec 13
Lec 13Lec 13
Lec 13
 

More from Vitaliy Pak

Lecture 5. Secure agent roaming for mobile business
Lecture 5. Secure agent roaming for mobile businessLecture 5. Secure agent roaming for mobile business
Lecture 5. Secure agent roaming for mobile businessVitaliy Pak
 
Trend of 4th induatrial revolution linked application service technology base...
Trend of 4th induatrial revolution linked application service technology base...Trend of 4th induatrial revolution linked application service technology base...
Trend of 4th induatrial revolution linked application service technology base...Vitaliy Pak
 
Lecture 4. information delivery for mobile business
Lecture 4. information delivery for mobile businessLecture 4. information delivery for mobile business
Lecture 4. information delivery for mobile businessVitaliy Pak
 
Lecture 3. A methodology for M-Tansformation of small and medium enterprises
Lecture 3. A methodology for M-Tansformation of small and medium enterprisesLecture 3. A methodology for M-Tansformation of small and medium enterprises
Lecture 3. A methodology for M-Tansformation of small and medium enterprisesVitaliy Pak
 
Lecture 2. mobile business strategy
Lecture 2. mobile business strategyLecture 2. mobile business strategy
Lecture 2. mobile business strategyVitaliy Pak
 
Lecture 1. the definition of mobile business
Lecture 1. the definition of mobile businessLecture 1. the definition of mobile business
Lecture 1. the definition of mobile businessVitaliy Pak
 
Базы данных лекция №7
Базы данных лекция №7Базы данных лекция №7
Базы данных лекция №7Vitaliy Pak
 
Базы данных лекция №6
Базы данных лекция №6Базы данных лекция №6
Базы данных лекция №6Vitaliy Pak
 
Базы данных лекция №5
Базы данных лекция №5Базы данных лекция №5
Базы данных лекция №5Vitaliy Pak
 
Базы данных лекция №12
Базы данных лекция №12Базы данных лекция №12
Базы данных лекция №12Vitaliy Pak
 
Базы данных лекция №11
Базы данных лекция №11Базы данных лекция №11
Базы данных лекция №11Vitaliy Pak
 
Базы данных лекция №10
Базы данных лекция №10Базы данных лекция №10
Базы данных лекция №10Vitaliy Pak
 
Базы данных лекция №9
Базы данных лекция №9Базы данных лекция №9
Базы данных лекция №9Vitaliy Pak
 
Difference between Chinese and Korean
Difference between Chinese and KoreanDifference between Chinese and Korean
Difference between Chinese and KoreanVitaliy Pak
 
лекция 1. введение в веб технологии
лекция 1. введение в веб технологиилекция 1. введение в веб технологии
лекция 1. введение в веб технологииVitaliy Pak
 
Двухфакторная аутентификация
Двухфакторная аутентификацияДвухфакторная аутентификация
Двухфакторная аутентификацияVitaliy Pak
 
Базы данных лекция №4
Базы данных лекция №4Базы данных лекция №4
Базы данных лекция №4Vitaliy Pak
 
Базы данных лекция №3
Базы данных лекция №3Базы данных лекция №3
Базы данных лекция №3Vitaliy Pak
 

More from Vitaliy Pak (20)

Lecture 5. Secure agent roaming for mobile business
Lecture 5. Secure agent roaming for mobile businessLecture 5. Secure agent roaming for mobile business
Lecture 5. Secure agent roaming for mobile business
 
Trend of 4th induatrial revolution linked application service technology base...
Trend of 4th induatrial revolution linked application service technology base...Trend of 4th induatrial revolution linked application service technology base...
Trend of 4th induatrial revolution linked application service technology base...
 
Ai in farming
Ai in farmingAi in farming
Ai in farming
 
Lecture 4. information delivery for mobile business
Lecture 4. information delivery for mobile businessLecture 4. information delivery for mobile business
Lecture 4. information delivery for mobile business
 
Lecture 3. A methodology for M-Tansformation of small and medium enterprises
Lecture 3. A methodology for M-Tansformation of small and medium enterprisesLecture 3. A methodology for M-Tansformation of small and medium enterprises
Lecture 3. A methodology for M-Tansformation of small and medium enterprises
 
Lecture 2. mobile business strategy
Lecture 2. mobile business strategyLecture 2. mobile business strategy
Lecture 2. mobile business strategy
 
Lecture 1. the definition of mobile business
Lecture 1. the definition of mobile businessLecture 1. the definition of mobile business
Lecture 1. the definition of mobile business
 
Базы данных лекция №7
Базы данных лекция №7Базы данных лекция №7
Базы данных лекция №7
 
Базы данных лекция №6
Базы данных лекция №6Базы данных лекция №6
Базы данных лекция №6
 
Базы данных лекция №5
Базы данных лекция №5Базы данных лекция №5
Базы данных лекция №5
 
Базы данных лекция №12
Базы данных лекция №12Базы данных лекция №12
Базы данных лекция №12
 
Базы данных лекция №11
Базы данных лекция №11Базы данных лекция №11
Базы данных лекция №11
 
Базы данных лекция №10
Базы данных лекция №10Базы данных лекция №10
Базы данных лекция №10
 
Базы данных лекция №9
Базы данных лекция №9Базы данных лекция №9
Базы данных лекция №9
 
Difference between Chinese and Korean
Difference between Chinese and KoreanDifference between Chinese and Korean
Difference between Chinese and Korean
 
IT in Korea
IT in KoreaIT in Korea
IT in Korea
 
лекция 1. введение в веб технологии
лекция 1. введение в веб технологиилекция 1. введение в веб технологии
лекция 1. введение в веб технологии
 
Двухфакторная аутентификация
Двухфакторная аутентификацияДвухфакторная аутентификация
Двухфакторная аутентификация
 
Базы данных лекция №4
Базы данных лекция №4Базы данных лекция №4
Базы данных лекция №4
 
Базы данных лекция №3
Базы данных лекция №3Базы данных лекция №3
Базы данных лекция №3
 

Базы данных лекция №8

  • 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 <условие>;
  • 5. Выполнение агрегатных функций SELECT SUM ((amt)) FROM Orders; - 26658.4 SELECT AVG ((amt)) FROM Orders; - 2665.84 SELECT MAX ((amt)) FROM Orders; - 9891.88 SELECT MIN ((amt)) FROM Orders; - 18.69 SELECT COUNT (*) FROM Orders; - 10 Заказы ----------------------------------------------- ONUM | AMT | ODATE | CNUM | SNUM -------|-----------|-------------|------|------ 3001 | 18.69 | 10/03/1990 | 2008 | 1007 3003 | 767.19 | 10/03/1990 | 2001 | 1001 3002 | 1900.10 | 10/03/1990 | 2007 | 1004 3005 | 5160.45 | 10/03/1990 | 2003 | 1002 3006 | 1098.16 | 10/03/1990 | 2008 | 1007 3009 | 1713.23 | 10/04/1990 | 2002 | 1003 3007 | 75.75 | 10/04/1990 | 2004 | 1002 3008 | 4723.00 | 10/05/1990 | 2006 | 1001 3010 | 1309.95 | 10/06/1990 | 2004 | 1002 3011 | 9891.88 | 10/06/1990 | 2006 | 1001 -----------------------------------------------
  • 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.
  • 11. Декартовое произведение SELECT [ALL] | DISTINCT]{ * | элемент_SELECT [,элемент_SELECT] ...} FROM {имя_таблицы_1 | представление} [псевдоним] ,{имя_таблицы_2 | представление} [псевдоним], ...;
  • 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 );