BAD02.rst

Bazy Danych

Opis zajęć i zasad

Zajęcia 2

Kazdy z Państwa z listy z pierwszego tygodnia ma założoną bazę danych na serwerze

mssql-2016.wmi.amu.edu.pl

o nazwie

dbad_sXXXXXX

Zamiast localhost po włączeniu trzeba wpisać mssql-2016.wmi.amu.edu.pl i znaleźć swoją bazę. Tylko do niej macie Państwo prawa dostępu. Dalsze procedowanie podobnie jak na pierwszych zajęciach.

Uwaga! Możliwe jest też zdalne logowanie do bazy poprzez hasło (autoryzacje nie windowsem tylko przez user/pass). Hasło pojawiło się u Państwa na pulpicie w zeszły poniedziałek. Jeżeli ktoś usunął sobie ten plik proszę o kontakt z prowadzącym.

Dodatkowo każdy z Państwa ma założoną bazę na serwerze PostgreSQL.

Server: psql.wmi.amu.edu.pl

Login państwa index, hasło także powinno być u Państwa na pulpicie (ewentualnie proszę o kontakt z prowadzącym). Więcej informacji można znaleźć tutaj:

Do połączenia i uruchamiania zapytań SQL na bazie postgresql polecam korzystać z programu pgAdmin.

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 z wielu tabel

Gdy chcemy odpytywać wiele tabel będziemy się do nich odwoływać w select poprzez nazwa_tabeli.nazwa_kolumny. Przykład:

select pracownicy.nazwisko, oddzialy.Nazwa miasto,
from Pracownicy, Oddzialy

Funkcje wbudowane SQL[*]_

Służą do przekształcania danych, pobranych przez polecenie SQL, lub wyliczają nowe dane.

Funkcje dzielimy na:

* wierszone - działające na wartościach jednego rekordu
* grupowe - operaujące na wartościach wielu rekordów

Funkcje wierszowe

Funkcje te będziemy póki co umieszczać w klauzuli select lub where

SELECT
        funkcja_A(wyrażenie_1, wyrażenie_2) AS wynik
FROM tabela

Funkcje znakowe

LOWER(wartość) - zamienia WIELKIE litery na małe

select LOWER(Nazwisko) as prac
from Pracownicy

UPPER(wartość) - zamienia małe litery na WIELKIE

select UPPER(Nazwisko) as prac
from Pracownicy

LEFT(string,dlugość) - zwraca tyle początkowych znaków stringa ile określono przez długość, lub NULL jeżeli wartość stringa to NULL.

select LEFT(Nazwisko,3) as prac
from Pracownicy

REPLACE(str,from_str,to_str) - zwraca string określony w str gdzie wszystkie wystąpienia from_str zostają zamienione na to_str. Uwaga! dopasowania do from_str nie są case-sensitive.

select REPLACE(Nazwisko,'R','*') as prac
from Pracownicy

select REPLACE(Nazwisko,'r','*') as prac
from Pracownicy

LEN(string) - zwraca liczbę bitów, na których zapisany jest string

select LEN(Nazwisko) as Dlugosc, Nazwisko
from Pracownicy

select LEN(placa_dod) as Dlugosc, Placa_dod
from Pracownicy

select LEN(placa_dod) as Dlugosc, Placa_dod
from Pracownicy
where LEN(placa_dod)>5

W drugim przypadku dane są traktowane jak ciągi binarne. Zwracany przez LEN typ to INT, lub BIGINT.

CHARINDEX(expressionToFind,expressionToSearch [ , start_location ]) - Wyszukuje pozycje danej podsekwencji w ciągu znaków. Trzeci argument jest opcjonalny, jeżeli nie jest zdefiniowany, jest ujemny lub równy zero, wtedy wyszukiwanie rozpoczynamy od początku stringa.

Uwaga! porządek argumentów jest odwrotny niż w replace, najpierw co szukamy, a potem gdzie szukamy.

select CHARINDEX('E',Nazwisko) as Gdzie, Nazwisko
from Pracownicy

select CHARINDEX('E',Nazwisko,4) as Gdzie, Nazwisko
from Pracownicy

select CHARINDEX('E',LOWER(Nazwisko),4) as Gdzie, Nazwisko
from Pracownicy

Charindex zwraca 0 jeżeli nie znajdzie dopasowania.

Pełną listę funkcj znakowych można znaleźć tutaj:

UWAGA! Istnieją funkcje znakowe dostępne w innych silnikach baz danych jak np INITCAP, które nie występują w Transact-SQL.

Funkcje liczbowe

POWER(float,p) - zwraca wartość argumentu float podniesionego do potęgi p.

select POWER(placa_pod,2) as Potega
from Pracownicy

ROUND(numeric_expression,length [ ,function ]) - zwraca wartość liczbową podaną jako pierwszy parametr w zaokrągleniu. Trzeci parametr jest opcjonalny jezeli znajduje się tam wartość różna od zera zamiast zaokrąglenia otrzymamy obcięcie wartośći.

Uwaga! Dla pełnych dziesiątek stosujemy wartości ujemne

select ROUND(placa_pod,-2) as Potega
from Pracownicy

/* Obciecie*/
select ROUND(placa_pod,-2,1) as Potega
from Pracownicy

select ROUND(placa_pod,1) as Potega
from Pracownicy

Pełną listę funkcj znakowych można znaleźć tutaj:

Funkcje operujące na datach i interwałach czasowych

Funkcje pobierające wartośći czasu systemowego:

SELECT SYSDATETIME()
        ,SYSDATETIMEOFFSET()
        ,SYSUTCDATETIME()
        ,CURRENT_TIMESTAMP
        ,GETDATE()
        ,GETUTCDATE();

DATEDIFF(datepart,startdate,enddate) - zwraca okres pomiędzy startdate a enddate. Typ jaki ma być zwrócony określony jest w datepart. Możliwe wartości:

Wartość

Skrót

year

yy, yyyy

quarter

qq, q

month

mm, m

dayofyear

dy, y

day

dd, d

week

wk, ww

hour

hh

minute

mi, n

second

ss, s

SELECT DATEDIFF(Day,Zatrudniony,SYSDATETIME()) as Staz
from Pracownicy

DATENAME(datepart,date) - zwraca określoną w datepart część z daty

Set language polish
SELECT DATENAME(Weekday,Zatrudniony) as Dzien
from Pracownicy

Datepart do wyboru są takie same jak podane powyżej w tabeli, plus weekday, dayofyear

Uwaga! Funkcja set langugage, zmienia język, wystarczy ją wykonać raz, aby kolejne funkcje zachowały język polski.

YEAR(date) - zwraca rok

SELECT YEAR(Zatrudniony) as ROK
from Pracownicy

Funkcje konwersji

cast

CAST(wartość_konwertowana AS typ_danych [ ( length ) ] )

CONVERT ( typ_danych [ ( length ) ] , wyrażenie [ , style ] )

Służą do zamiany (rzutowania) z jednego typu na inny. Domyślna wartość length to 30.

select nazwisko + ' Jest z nami od : ' +  CAST (Zatrudniony as varchar(100)) as Info
from Pracownicy

SELECT CAST(10.6496 AS int);

SELECT CAST(10.3496847 AS money);

select CAST(ROUND(Placa_pod+Placa_dod, 0) AS int) AS Computed
from pracownicy

select  nazwisko, convert(int, placa_pod) placa_pod
from pracownicy

/*Convert the binary value 0x4E616d65 to a character value*/
SELECT CONVERT(char(8), 0x4E616d65, 0) AS [Style 0, binary to character];

Dokładniejszy opis styli można znaleźć tutaj:

Pozostałe funkcje

CASE - słówko kluczowe po którym podajemy liste wartości, z których wybierana jest jedna.

CASE dzielimy na prosty i przeszukujący, składnia:

CASE input_expression
        WHEN when_expression THEN result_expression [ ...n ]
        [ ELSE else_result_expression ]
END

Przeszukujący, składnia:

CASE
        WHEN Boolean_expression THEN result_expression [ ...n ]
        [ ELSE else_result_expression ]
END

Input_expression porównywany jest z wartościami when_expression, result_expression to zwracany wynik w przypadku dopasowania.

SELECT  Nazwisko, "Zarobki" =
CASE Stanowisko
        WHEN 'Dyrektor' THEN 'Dyro'
        ELSE 'Nie dyro!'
END
FROM Pracownicy

SELECT  Nazwisko, "Zarobki" =
CASE
        WHEN Placa_pod =  0 THEN 'zero!'
        WHEN Placa_pod < 2000 THEN 'niskie'
        WHEN Placa_pod >= 2000 and Placa_pod < 4000 THEN 'średnie'
        WHEN Placa_pod >= 3000 and Placa_pod < 20000 THEN 'B.Wysokie'
        ELSE 'Za wysokie!'
END
FROM Pracownicy

Zadanie Domowe

Wykonaj i prześlij rozwiązania do zadań numer: 2,4,5,7,9

Termin wykonania zadania: Niedziela 22.10.2017 do godziny 24.00.

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

Logujemy się jak na komputery Wydziałowe, dodajemy się do grupy BAD i 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.cs.put.poznan.pl/pboinski/files/SBD/03aFunkcjeWierszowe.pdf

https://msdn.microsoft.com/pl-pl/library/ms181984(v=sql.110).aspx

https://msdn.microsoft.com/pl-pl/library/ms177516(v=sql.110).aspx