SlideShare a Scribd company logo
eleks.comeleks.com
Групування
Операції над множинами
• Групування
• З’єднання
• Декартів добуток
• Переріз
• Різниця
Групування результату (GROUP BY):
select Name, sum(Amount) as [sum] from Client GROUP BY Name
Name sum
--------- --------
Client_1 0.00
Client_2 20.00
Client_3 -10.00
Group by
• Якщо не отримано жодної стрічки, то результатом виконання функції COUNT буде нуль, а
результатом всіх інших функцій - NULL.
• Аргумент агрегатної функції не може сам вміщати агрегатні функції (функція від функції).
Тобто, наприклад, в одному запиті не можна отримати максимум середніх значень.
• Результат виконання функції COUNT - ціле число (INT), інші агрегатні функції наслідують
типи даних оброблювальних значень
• Якщо при використанні функції SUM був отриманий результат, що перевищує максимальне
значення даного типу даних, то виникає помилка
AVG – середнє значення стовпчика (тільки числові типи)
COUNT – кількість стрічок (значень заданого поля)
COUNT_BIG – аналогічно до COUNT для типу bigint
MAX – найбільше значення
MIN – найменше значення
SUM – сума всіх значень (тільки числові типи)
GROUPING – тип стрічки при використання ROLE або CUBE
Агрегуючі функції
COUNT(*) повертає кількість всіх стрічок по заданій умові, не
зважаючи на NULL
COUNT(<назва поля>) обчислює кількість не NULL значень у заданій
колонці
COUNT(DISTINCT <назва поля>) підраховує кількість унікальних не
NULL значень
select count(*), count(Comment), count(distinct Comment),
max(Name), min(Address),
avg(Amount), sum(Amount)
from Client
cnt cnt_c cnt_d max min avg sum
---- ----- ----- -------- ---------- ------- ------
3 2 2 Client_3 Address_1 3.3333 10.00
Агрегуючі функції
Використання підсумкових значень (ROLLUP,CUBE):
select Name, sum(Amount) [sum] from Client
group by Name with ROLLUP
Name sum
---------- -------
Client_1 0.00
Client_2 20.00
Client_3 -10.00
NULL 10.00
Обмеження результату (HAVING)
select Name, sum(Amount) [sum] from Client
group by Name
HAVING sum(Amount) > 0
Name sum
--------- -------
Client_2 20.00
Агрегуючі функції
Традиційні операції над множинами:
• З'єднання
• Декартів добуток
• Об'єднання
• Переріз та різниця
select Document.Number, Document.Date, Client.Name
from Client, Document
where Client.ClientId = Document.ClientId
Number Date Name
---------- ----------------------- ----------
I-001 2007-01-04 00:00:00.000 Client_1
I-002 2007-01-04 00:00:00.000 Client_2
I-003 2007-02-04 00:00:00.000 Client_1
I-004 2007-02-04 00:00:00.000 Client_1
P-001 2007-01-04 00:00:00.000 Client_1
P-002 2007-02-04 00:00:00.000 Client_1
P-003 2007-02-04 00:00:00.000 Client_2
Операції над кількома множинами
Внутрішнє з'єднання (INNER JOIN):
select c.Name, d.Number, d.Date
from Client c
inner join Document d
on c.ClientId = d.ClientId
З’єднання множин
Name Number Date
--------- --------- -----------------------
Client_1 I-001 2007-01-04 00:00:00.000
Client_1 I-003 2007-02-04 00:00:00.000
Client_1 I-004 2007-02-04 00:00:00.000
Client_1 P-001 2007-01-04 00:00:00.000
Client_1 P-002 2007-02-04 00:00:00.000
Зовнішнє з'єднання (OUTER, Left):
select c.Name, d.Number, d.Date
from Client c
left join Document d
on c.ClientId = d.ClientId
and month(d.Date) = 1
and d.Number like 'I%‘
Name Number Date
---------- ---------- ----------
Client_1 I-001 2007-01-04
Client_2 I-002 2007-01-04
Client_3 NULL NULL
select c.Name, d.Number, d.Date
from Client c
left join Document d
on c.ClientId = d.ClientId
and month(d.Date) = 1
where d.Number like 'I%‘
Name Number Date
--------- ---------- ----------
Client_1 I-001 2007-01-04
Client_2 I-002 2007-01-04
З’єднання множин
Симетричність операцій LEFT та RIGHT
select Name, Number, Date
from Document
right join Client
on Instance = Client
Повне з’єднання (FULL JOIN):
select Name, Number, Date
from Document d
full join (select * from Client
where ClientId > 1) c
on c.ClientId = d.ClientId
Name Number Date
----------- ---------- -----------------------
NULL I-003 2007-02-04 00:00:00.000
NULL I-004 2007-02-04 00:00:00.000
NULL P-001 2007-01-04 00:00:00.000
NULL P-002 2007-02-04 00:00:00.000
NULL I-001 2007-01-04 00:00:00.000
Client_2 I-002 2007-01-04 00:00:00.000
Client_2 P-003 2007-02-04 00:00:00.000
Client_3 NULL NULL
З’єднання множин
Повний перелік всіх рядків:
select c.Name, dt.Name
from Client c
cross join DocumentType dt
Name Name
---------- --------
Client_1 Invoice
Client_2 Invoice
Client_3 Invoice
Client_1 Payment
Client_2 Payment
Client_3 Payment
Простий варіант запису:
select c.Name, dt.Name
from Client c, DocumentType dt
Декартів добуток
Об’єднання результатів запитів (UNION ALL):
select 1 [ID], 'CLIENT_1' [Name]
UNION ALL
select ClientId, Name from Client
ID Name
---- ----------
1 CLIENT_1
1 Client_1
2 Client_2
3 Client_3
Унікальні рядки в результатах (UNION):
select 1 [ID], 'CLIENT_1' [Name]
UNION
select ClientId, Name from Client
ID Name
---- ----------
1 Client_1
2 Client_2
3 Client_3
Об’єднання множин
Об'єднання множин
Умови об'єднання множин:
 Кількість вихідних стовпчиків кожного із запитів повинно бути однаковим
 Вихідні колонки кожного підзапиту повинні бути порівняльними між собою по типу
даних (у відповідному порядку їх слідування).
 У результуючому наборі імена стовпців співпадають із заданими в першому запиті
 Вираз ORDER BY застосовується до результату з’єднання і тому вказується лише раз
(в кінці запиту)
 За допомогою дужок можна міняти порядок виконання об’єднання
select 0 [ID], 'ALL' [Name]
UNION
(select 1 [ID], 'CLIENT_1' [Name]
UNION ALL
select ClientId, Name
from Client)
order by ID
ID Name
---- ----------
0 ALL
1 CLIENT_1
2 Client_2
3 Client_3
Інші операції над множинами
INTERSECT
EXCEPT
Інші операції над множинами
Операція перетину множин (INTERSECT):
select 1 [ID], 'CLIENT_1' [Name]
INTERSECT
select ClientId, Name from Client
ID Name
---- ----------
1 CLIENT_1
Операція різниці множин (EXCEPT):
select ClientId, Name from Client
EXCEPT
select 1 [ID], 'CLIENT_1' [Name]
ID Name
---- ----------
2 Client_2
3 Client_3
Додаткові можливості оператора SELECT
Опція FOR XML (AUTO, PATH, RAW):
select c.ClientId, c.Name, c.Address,
d.DocumentId, d.Number, d.Date
from Client c, Document d
where c.ClientId = d.ClientId
for xml auto,
elements,
root('Clients')
Оператори PIVOT та UNPIVOT:
select [1] M1, [2] M2, [3] M3, [4] M4, [5] M5, [6] M6
from (select month(Date) nm, Amount from Document) d
pivot (sum(Amount) for d.nm in ([1],[2],[3],[4],[5],[6])) dd
M1 M2 M3 M4 M5 M6
------- ------- ------- ------- ------- -------
55.00 90.00 NULL NULL NULL NULL
SQL Grouping, Joins

More Related Content

PPTX
SQL: Indexes, Select operator
PPTX
tsql
PDF
PPTX
01 c# basics
PPT
07 Containers
PPTX
передача параметрів в функції
PPT
лекції 4 7
ODP
Phpunit модульне тестування
SQL: Indexes, Select operator
tsql
01 c# basics
07 Containers
передача параметрів в функції
лекції 4 7
Phpunit модульне тестування

What's hot (20)

PPT
лекції 4
PPT
08 Functions
PPTX
Clean code (UA)
PDF
Тестування з допомогою PHPUnit
PPT
01 Incapsulation
PDF
Lecture 07 swift
PPTX
+5 розгал в с++
PDF
Lecture 13 Local Optimization on Mobile Devices
PPTX
Design patterns part 2
PPT
JavaScript. Lectures. part 1. basis
PDF
Lecture 203 - Data manipulation using SQL
PPTX
Sql 04n edited
PPTX
PPTX
+3 проста математика
PDF
Coding for Future in Lutsk. JavaScript. Part 6
PDF
лекція3
PPT
02 Copying Objects
PPT
PPTX
лекції 4
08 Functions
Clean code (UA)
Тестування з допомогою PHPUnit
01 Incapsulation
Lecture 07 swift
+5 розгал в с++
Lecture 13 Local Optimization on Mobile Devices
Design patterns part 2
JavaScript. Lectures. part 1. basis
Lecture 203 - Data manipulation using SQL
Sql 04n edited
+3 проста математика
Coding for Future in Lutsk. JavaScript. Part 6
лекція3
02 Copying Objects
Ad

Viewers also liked (20)

PPTX
SDLC. QA Role
PPTX
Advanced styles
PPTX
Web service lecture
PPTX
PPTX
PPTX
Improving rpc bkp
PPTX
Version control
PPTX
SDLC. PM Role
PPTX
Windows service
PPTX
Frontend basics
PPTX
Angular. presentation
PPTX
NoSQL basics
PPTX
Aspnet core
PPTX
Continuous Delivery concept overview. Continuous Integration Systems. DevOps ...
PPTX
sql introduction
PPTX
G rpc lection1_theory_bkp2
PPTX
G rpc lection1
PPTX
SDLC. BA Role
PPTX
SDLC. UX Role
PPTX
Mvvw patterns
SDLC. QA Role
Advanced styles
Web service lecture
Improving rpc bkp
Version control
SDLC. PM Role
Windows service
Frontend basics
Angular. presentation
NoSQL basics
Aspnet core
Continuous Delivery concept overview. Continuous Integration Systems. DevOps ...
sql introduction
G rpc lection1_theory_bkp2
G rpc lection1
SDLC. BA Role
SDLC. UX Role
Mvvw patterns
Ad

More from eleksdev (8)

PPTX
Lecture android best practices
PPTX
Communication in android
PPTX
Hello android world
PPTX
Android location and sensors API
PPTX
Lecture java basics
PPTX
Css animation, html5 api
PPTX
If unit2 summary
PPTX
Lecture android best practices
Communication in android
Hello android world
Android location and sensors API
Lecture java basics
Css animation, html5 api
If unit2 summary

SQL Grouping, Joins

  • 1. eleks.comeleks.com Групування Операції над множинами • Групування • З’єднання • Декартів добуток • Переріз • Різниця
  • 2. Групування результату (GROUP BY): select Name, sum(Amount) as [sum] from Client GROUP BY Name Name sum --------- -------- Client_1 0.00 Client_2 20.00 Client_3 -10.00 Group by • Якщо не отримано жодної стрічки, то результатом виконання функції COUNT буде нуль, а результатом всіх інших функцій - NULL. • Аргумент агрегатної функції не може сам вміщати агрегатні функції (функція від функції). Тобто, наприклад, в одному запиті не можна отримати максимум середніх значень. • Результат виконання функції COUNT - ціле число (INT), інші агрегатні функції наслідують типи даних оброблювальних значень • Якщо при використанні функції SUM був отриманий результат, що перевищує максимальне значення даного типу даних, то виникає помилка
  • 3. AVG – середнє значення стовпчика (тільки числові типи) COUNT – кількість стрічок (значень заданого поля) COUNT_BIG – аналогічно до COUNT для типу bigint MAX – найбільше значення MIN – найменше значення SUM – сума всіх значень (тільки числові типи) GROUPING – тип стрічки при використання ROLE або CUBE Агрегуючі функції
  • 4. COUNT(*) повертає кількість всіх стрічок по заданій умові, не зважаючи на NULL COUNT(<назва поля>) обчислює кількість не NULL значень у заданій колонці COUNT(DISTINCT <назва поля>) підраховує кількість унікальних не NULL значень select count(*), count(Comment), count(distinct Comment), max(Name), min(Address), avg(Amount), sum(Amount) from Client cnt cnt_c cnt_d max min avg sum ---- ----- ----- -------- ---------- ------- ------ 3 2 2 Client_3 Address_1 3.3333 10.00 Агрегуючі функції
  • 5. Використання підсумкових значень (ROLLUP,CUBE): select Name, sum(Amount) [sum] from Client group by Name with ROLLUP Name sum ---------- ------- Client_1 0.00 Client_2 20.00 Client_3 -10.00 NULL 10.00 Обмеження результату (HAVING) select Name, sum(Amount) [sum] from Client group by Name HAVING sum(Amount) > 0 Name sum --------- ------- Client_2 20.00 Агрегуючі функції
  • 6. Традиційні операції над множинами: • З'єднання • Декартів добуток • Об'єднання • Переріз та різниця select Document.Number, Document.Date, Client.Name from Client, Document where Client.ClientId = Document.ClientId Number Date Name ---------- ----------------------- ---------- I-001 2007-01-04 00:00:00.000 Client_1 I-002 2007-01-04 00:00:00.000 Client_2 I-003 2007-02-04 00:00:00.000 Client_1 I-004 2007-02-04 00:00:00.000 Client_1 P-001 2007-01-04 00:00:00.000 Client_1 P-002 2007-02-04 00:00:00.000 Client_1 P-003 2007-02-04 00:00:00.000 Client_2 Операції над кількома множинами
  • 7. Внутрішнє з'єднання (INNER JOIN): select c.Name, d.Number, d.Date from Client c inner join Document d on c.ClientId = d.ClientId З’єднання множин Name Number Date --------- --------- ----------------------- Client_1 I-001 2007-01-04 00:00:00.000 Client_1 I-003 2007-02-04 00:00:00.000 Client_1 I-004 2007-02-04 00:00:00.000 Client_1 P-001 2007-01-04 00:00:00.000 Client_1 P-002 2007-02-04 00:00:00.000
  • 8. Зовнішнє з'єднання (OUTER, Left): select c.Name, d.Number, d.Date from Client c left join Document d on c.ClientId = d.ClientId and month(d.Date) = 1 and d.Number like 'I%‘ Name Number Date ---------- ---------- ---------- Client_1 I-001 2007-01-04 Client_2 I-002 2007-01-04 Client_3 NULL NULL select c.Name, d.Number, d.Date from Client c left join Document d on c.ClientId = d.ClientId and month(d.Date) = 1 where d.Number like 'I%‘ Name Number Date --------- ---------- ---------- Client_1 I-001 2007-01-04 Client_2 I-002 2007-01-04 З’єднання множин
  • 9. Симетричність операцій LEFT та RIGHT select Name, Number, Date from Document right join Client on Instance = Client Повне з’єднання (FULL JOIN): select Name, Number, Date from Document d full join (select * from Client where ClientId > 1) c on c.ClientId = d.ClientId Name Number Date ----------- ---------- ----------------------- NULL I-003 2007-02-04 00:00:00.000 NULL I-004 2007-02-04 00:00:00.000 NULL P-001 2007-01-04 00:00:00.000 NULL P-002 2007-02-04 00:00:00.000 NULL I-001 2007-01-04 00:00:00.000 Client_2 I-002 2007-01-04 00:00:00.000 Client_2 P-003 2007-02-04 00:00:00.000 Client_3 NULL NULL З’єднання множин
  • 10. Повний перелік всіх рядків: select c.Name, dt.Name from Client c cross join DocumentType dt Name Name ---------- -------- Client_1 Invoice Client_2 Invoice Client_3 Invoice Client_1 Payment Client_2 Payment Client_3 Payment Простий варіант запису: select c.Name, dt.Name from Client c, DocumentType dt Декартів добуток
  • 11. Об’єднання результатів запитів (UNION ALL): select 1 [ID], 'CLIENT_1' [Name] UNION ALL select ClientId, Name from Client ID Name ---- ---------- 1 CLIENT_1 1 Client_1 2 Client_2 3 Client_3 Унікальні рядки в результатах (UNION): select 1 [ID], 'CLIENT_1' [Name] UNION select ClientId, Name from Client ID Name ---- ---------- 1 Client_1 2 Client_2 3 Client_3 Об’єднання множин
  • 12. Об'єднання множин Умови об'єднання множин:  Кількість вихідних стовпчиків кожного із запитів повинно бути однаковим  Вихідні колонки кожного підзапиту повинні бути порівняльними між собою по типу даних (у відповідному порядку їх слідування).  У результуючому наборі імена стовпців співпадають із заданими в першому запиті  Вираз ORDER BY застосовується до результату з’єднання і тому вказується лише раз (в кінці запиту)  За допомогою дужок можна міняти порядок виконання об’єднання select 0 [ID], 'ALL' [Name] UNION (select 1 [ID], 'CLIENT_1' [Name] UNION ALL select ClientId, Name from Client) order by ID ID Name ---- ---------- 0 ALL 1 CLIENT_1 2 Client_2 3 Client_3
  • 13. Інші операції над множинами INTERSECT EXCEPT
  • 14. Інші операції над множинами Операція перетину множин (INTERSECT): select 1 [ID], 'CLIENT_1' [Name] INTERSECT select ClientId, Name from Client ID Name ---- ---------- 1 CLIENT_1 Операція різниці множин (EXCEPT): select ClientId, Name from Client EXCEPT select 1 [ID], 'CLIENT_1' [Name] ID Name ---- ---------- 2 Client_2 3 Client_3
  • 15. Додаткові можливості оператора SELECT Опція FOR XML (AUTO, PATH, RAW): select c.ClientId, c.Name, c.Address, d.DocumentId, d.Number, d.Date from Client c, Document d where c.ClientId = d.ClientId for xml auto, elements, root('Clients') Оператори PIVOT та UNPIVOT: select [1] M1, [2] M2, [3] M3, [4] M4, [5] M5, [6] M6 from (select month(Date) nm, Amount from Document) d pivot (sum(Amount) for d.nm in ([1],[2],[3],[4],[5],[6])) dd M1 M2 M3 M4 M5 M6 ------- ------- ------- ------- ------- ------- 55.00 90.00 NULL NULL NULL NULL