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
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