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.
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 t3. xml4. datetimeoffset5. datetime26. datetime7. smalldatetime8. date9. time10. float11. real12. decimal13. money14. smallmoney15. bigint16. int17. smallint18. tinyint19. bit20. ntext21. text22. image23. timestamp24. uniqueidentifier25. nvarchar (including nvarchar(max) )26. nchar27. varchar (including varchar(max) )28. char29. 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 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
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
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 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
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.
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 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
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:
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