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.labs.wmi.amu.edu.pl

o nazwie

dbad_sXXXXXX

Zamiast localhost po włączeniu trzeba wpisać mssql.labs.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.

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: Sobota 15.10.2016 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