Bazy Danych

Opis zajęć i zasad

Zajęcia 3

Konwersje typów *

W przypadku, gdy mamy wyrażenie, które zawiera w sobie różne typy następuje ukryta konwersja z typu o mniejszym priorytecie do typu o większym. Lista priorytetów dla typów w MSSQL:

1. user-defined data types (highest)
2. sql_varian t
3. xml
4. datetimeoffset
5. datetime2
6. datetime
7. smalldatetime
8. date
9. time
10. float
11. real
12. decimal
13. money
14. smallmoney
15. bigint
16. int
17. smallint
18. tinyint
19. bit
20. ntext
21. text
22. image
23. timestamp
24. uniqueidentifier
25. nvarchar (including nvarchar(max) )
26. nchar
27. varchar (including varchar(max) )
28. char
29. varbinary (including varbinary(max) )
30. binary (lowest)

Przykłady:

SELECT
        ID + '100'
FROM Pracownicy

SELECT
        ID + CAST( ID as money)
FROM Pracownicy

SELECT
        ID + CAST( ID as float)
FROM Pracownicy

Stałe

Stałe dzielimy na znakowe (CHAR, VARCHAR):

SELECT 'Cincinnati', 'O''Brien'

Binarne (BINARY) poprzedzone '0x' i zapisane szesnastkowo:

SELECT 0x12Ef, 0x69048AEFDD010E

Daty (DATETIME) - ciągi znaków o określonym formacie:

SELECT YEAR('December 5, 1985'), DAY('5 December, 1985') , MONTH('851205') , ISDATE('12/5/98')

Całkowitoliczbowe (INTEGER):

SELECT 1, 1234

Zmiennoprzecinowe o ustalonej precyzji (DECIMAL, NUMERIC). Stałe zmiennoprzecinkowe są konwertowane do typu numeric korzystając z minimalnej potrzebnej precyzji do jej zapamiętania. Domyślnie 6 cyfr poprzecinku.

SELECT 1894.1204, 2.0

Zmiennoprzecinowe (FLOAT, REAL), zapisane w formacie naukowym:

SELECT 101.5E5, 0.5E-2

Pieniężne (MONEY)

SELECT $12, $542023.14

Przeanalizyj co dzieje się w następujących przypadkach:

SELECT 1/10, 1.0/3, 1.0/3.0, 1.0000/3 - 0.000000000001, 1.000000/3,  10000000000.0/3, 1E0/3, 1/3E0 - 0.000000000001, 10/'10'+'1', '1'+'10'+10, 1/$3, $1/3

SELECT

GROUP BY

Część zapytania SELECT, które dzieli wyniki zapytania na grupy rekordów, zwykle na potrzeby wykorzystania funkcji agregujących. Zwracany jest jeden wiersz dla każdej grupy. Group by łączy wartości NULL w jedną grupę.

select Stanowisko, ID_Oddz
from pracownicy
group by Stanowisko, ID_Oddz

GROUP BY ROLLUP rozwija wynik na wszystkie kombinacje wyników z podzbiorów i na końcu przedstawia sumy pośrednie i sumę końcową wyników

select Stanowisko, ID_Oddz, SUM(Placa_Pod)
from pracownicy
group by ROLLUP(Stanowisko, ID_Oddz)

GROUP BY CUBE wypisuje wszystkie kombinacje wartośći parametrów łącznie z NULL.

select Stanowisko, ID_Oddz, SUM(Placa_Pod)
from pracownicy
group by CUBE(Stanowisko, ID_Oddz)

GROUP BY GROUPING SETS pozwala łączyć wiele grup group by w jedną:

select Stanowisko, ID_Oddz, SUM(Placa_Pod)
from pracownicy
group by GROUPING SETS (CUBE(Stanowisko, ID_Oddz),ROLLUP(Stanowisko, ID_Oddz))

GROUP BY () dodaje dodatkowo grupę generującą sumaryczną wartość

SELECT ID_ODdz, SUM(Placa_pod) AS TotalSales
FROM Pracownicy
GROUP BY GROUPING SETS ( Id_Oddz, () )

Inne, użycie funkcji wierszowej:

SELECT DATEPART(yyyy,Zatrudniony) AS OD_KIEDY
        ,SUM(Placa_pod) AS N'Total Zarobki Amount'
FROM Pracownicy
GROUP BY DATEPART(yyyy,Zatrudniony)
ORDER BY DATEPART(yyyy,Zatrudniony);

HAVING

HAVING Pozwala określić, które ze zgrupowanych rekoródów przez GROUP BY mają być wyświetlone przykład:

select Max(Placa_pod), ID_Oddz
from pracownicy
where Placa_pod < 4000
group by ID_Oddz
Having Max(Placa_pod) < 4000

WHERE definiuje które wiersze mają być pominięte przed grupowaniem, HAVING określa które grupy nas interesują.

TOP

Służy do ograniczenia wyświetlania liczby wierszy zapytania do określonej liczby.

SELECT TOP(2) Nazwisko
from Pracownicy
ORDER BY NAZWISKO DESC

ORDER BY

UWAGA! W order by możemy korzystać z nazw aliasów, lub też wskazywać kolumny po numerach

Przykład:

SELECT Nazwisko as NAZ, Placa_pod as kasa
from Pracownicy
ORDER BY naz

SELECT Nazwisko as NAZ, Placa_pod as kasa
from Pracownicy
ORDER BY kasa

SELECT Nazwisko as NAZ, Placa_pod as kasa
from Pracownicy
ORDER BY 1

SELECT Nazwisko as NAZ, Placa_pod as kasa
from Pracownicy
ORDER BY 2

Funkcje grupowe

Funkcje grupowe (agregujące) operują na wartościach wielu rekordów zwracając pojedynczą wartość. Nie licząc funkcji COUNT pomijają one wartości NULL. Używane są zazwyczaj w sekcji GROUP BY.

AVG

Zwraca średnią arytmetyczną.

Składnia:

AVG ( [ ALL | DISTINCT ] expression )
        OVER ( [ partition_by_clause ] order_by_clause )
select
        AVG(PLACA_pod)
from
        pracownicy
where
        id_Oddz = 20

select
        AVG(PLACA_pod)
from
        pracownicy
Group by
        ID_Oddz

select
        AVG(DISTINCT ID_oddz)
from
        pracownicy

select
        ID_Oddz, Placa_pod, AVG(Placa_pod) OVER (Partition by ID_oddz) as srednia_w_oddziale
from
        pracownicy

select
        ID_Oddz, Placa_pod, AVG(Placa_pod) OVER (Partition by ID_oddz ORDER BY Placa_pod) as srednia_w_oddziale_rosnaco
from
        pracownicy

MIN, MAX

Zwracają minimalną lub maksymalną wartość z danego zbioru, może być używane dla danych liczbowych, znakowych, dat.

select MAX(NAzwisko), ID_Oddz
from pracownicy
Group by ID_Oddz

SUM

Zwraca sumę wartości danych ze zbioru, działa tylko na danych liczbowych

select SUM(Placa_pod), ID_Oddz
from pracownicy
Group by ID_Oddz

COUNT, COUNT_BIG

Zwraca liczbę krotek w grupie (w tym wartości null). W przypadku podania wartości zliczane są unikalne wartości danego typu, gdy chcemy zliczyć wszystkie krotki wpisujemy '*'.

COUNT_BIG działa jak COUNT tylko zwraca BIGINT jako wynik.

 select count(*)
 from pracownicy

 select count(Nazwisko)
 from pracownicy
 Where nazwisko like '[ABC]%'

 select count(*), MAX(Placa_pod)
 from pracownicy
 group by ID_Oddz

 SELECT DISTINCT ID_Oddz
, MIN(Placa_pod) OVER (PARTITION BY ID_Oddz) AS MinSalary
, MAX(Placa_pod) OVER (PARTITION BY ID_Oddz) AS MaxSalary
, AVG(Placa_pod) OVER (PARTITION BY ID_Oddz) AS AvgSalary
,COUNT(*) OVER (PARTITION BY ID_Oddz) AS EmployeesPerDept
 from PRACOWNICY

Zadanie Domowe

Termin wykonania zadania: Sobota 22.10.2016 do godziny 24.00.

Wykonać zadania 2,5,8,12,13

Rozwiązania proszę przesłać przez stronę:

Logujemy się jak na komputery Wydziałowe, przesyłamy plik (jeden wspólny dla wszystkich) z rozwiązaniami.

UWAGA! Rozwiązania można przesłać tylko raz.

*

Wykorzystano materiały z

http://www.sql-kursy.pl/ms-sql-kurs-funkcje-agregujace-group-by-5.html

https://msdn.microsoft.com/pl-pl/library/

https://msdn.microsoft.com/en-us/library/ms177673.aspx