Zajęcia 2 podstawy języka SQL W klauzuli SELECT mogą być użyte wyrażenia arytmetyczne, aliasy (nazwy zastępcze) kolumn, konkatenacja. W wyrażeniu arytmetycznym mogą występować nazwy kolumn, stałe wartości liczbowe oraz operatory arytmetyczne: (+ dodawanie, - odejmowanie, * mnożenie, / dzielenie). W wyrażeniach tych zachowywany jest następujący priorytet działań: mnożenie, dzielenie, dodawanie, odejmowanie. Wyróżniamy 4 operatory SQL, działające na wszystkich typach danych: BETWEEN... AND, IN (lista), LIKE, IS NULL. Operator BETWEEN...AND służy do sprawdzenia, czy wartość znajduje się w podanym przedziale (wliczając w to krańce przedziału). Górna granica musi następować po dolnej. Operator LIKE służy do wybierania wartości odpowiadających podanemu wzorcowi. Wzorzec tworzą dwa specjalne symbole: % (znak procent) odpowiada dowolnemu ciągowi znaków, _ (znak podkreślenia) odpowiada dokładnie jednemu dowolnemu znakowi. Operator IS NULL służy do wyszukiwania wartości NULL. a b a AND b a OR b TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE NULL NULL TRUE FALSE FALSE FALSE FALSE FALSE NULL FALSE NULL NULL NULL NULL NULL a NOT a TRUE FALSE FALSE TRUE NULL NULL Operatory arytmetyczne Operator Opis Przykład Wynik + dodawanie 2 + 3 5 - odejmowanie 2-3 -1 * mnożenie 2 * 3 6 / dzielenie 4 / 2 2 % reszta z dzielenia 5 % 4 1 ^ potęga 2.0 ^ 3.0 8 / pierwiastek kwadratowy / 25.0 5 / pierwiastek sześcienny / 27.0 3! silnia 5! 120 @ wartość bezwzględna @ -5.0 5 1
Operator Opis < mniejsze niż > większe niż <= mniejsze lub równe >= większy lub równe = równe <> or!= różne Składnia a BETWEEN x AND y jest równoważna zapisowi a >= x AND a <= y Zaprzeczenie a NOT BETWEEN x AND y jest równoważne a < x OR a > y SQL Funkcje operujące na łańcuchach znaków Funkcja Typ zwracany Przykład Wynik string string text 'Post' 'gresql' PostgreSQL string non-string or text 'Value: ' 42 Value: 42 non-string string char_length(string) or int char_length('jose') 4 character_length(string) lower(string) text lower('tom') tom position(substring in int position('om' in 'Thomas') 3 string) substring(string [from text substring('thomas' from 2 hom int] [for int]) for 3) substring(string from text substring('thomas' from mas pattern) '...$') substring(string from text substring('thomas' from oma pattern for escape) '%#"o_a#"_' for '#') trim([leading trailing text trim(both 'x' from 'xtomxx') Tom both] [characters] from string) upper(string) text upper('tom') TOM btrim(string text [, text btrim('xyxtrimyyx', 'xy') trim characters text]) chr(int) text chr(65) A initcap(string) text initcap('hi THOMAS') Hi Thomas left(str text, n int) text left('abcde', 2) ab length(string) int length('jose') 4 length(string bytea, int length('jose', 'UTF8') 4 encoding name ) repeat(string text, number text repeat('pg', 4) PgPgPgPg int) replace(string text, from text replace('abcdefabcdef', abxxefabxxef text, to text) 'cd', 'XX') reverse(str) text reverse('abcde') edcba right(str text, n int) text right('abcde', 2) de strpos(string, substring) int strpos('high', 'ig') 2 substr(string, from [, text substr('alphabet', 3, 2) ph count]) 2
Operatory negacji służą do zaprzeczania warunkom w klauzuli WHERE. <> nie jest równy (wszystkie systemy operacyjne) NOT kolumna= nie jest równy NOT kolumna> nie jest większy NOT BETWEEN nie jest w podanym przedziale NOT IN nie jest w zbiorze NOT LIKE nie jest zgodny z maską IS NOT NULL nie jest NULL 1. Wyświetlić numer, imię, nazwisko oraz płacę podstawową dla każdego pracownika o ile jego numer jest większy od 1250. select numer, imie, nazwisko, placa_pod where numer > 1250; numer imie nazwisko -------+------------+------------ 1260 Robert MISIECKI 1290 Piotr GŁOWACKI 1300 Dariusz WARDECKI 1390 Tadeusz KAMOCKI 1270 Jan MOLANY 1310 Aleksandra RAJCZYK 1320 Michał ARTIOMOW 1280 Anna WIŚNIEWSKA 1330 Marek KOTOROWSKI 1350 Paulina BOROSA (10 rows) 2. Wybrać numer, imię, nazwisko i datę zatrudnienia osoby lub osób o nazwisku 'DROZD' lub ARTIOMOW select numer, imie, nazwisko, data_zatrudnienia where nazwisko='drozd' OR nazwisko ='ARTIOMOW'; numer imie nazwisko data_zatrudnienia -------+--------+----------+------------------- 1080 Karol DROZD 1993-10-01 1081 Michał DROZD 1993-10-01 1320 Michał ARTIOMOW 2001-10-01 (3 rows) 3. Wyświetlić numer, imię, nazwisko i datę zatrudnienia dla każdego pracownika, który został zatrudniony po '01-01-2000'; select numer, imie, nazwisko, data_zatrudnienia where data_zatrudnienia > '2000-01-01'; numer imie nazwisko data_zatrudnienia -------+------------+------------+------------------- 1060 Cezary MISIECKI 2004-10-01 1090 Monika WOLAŃSKA 2000-10-01 1190 Michał DROBOSZ 2000-10-01 1260 Robert MISIECKI 2004-10-01 1290 Piotr GŁOWACKI 2000-10-01 3
1390 Tadeusz KAMOCKI 2000-10-01 1110 Piotr TESTA 2007-10-01 1310 Aleksandra RAJCZYK 2007-10-01 1320 Michał ARTIOMOW 2001-10-01 1120 Anna ORKA 2001-10-01 1130 Tadeusz DROBOSZ 2007-10-01 1330 Marek KOTOROWSKI 2007-10-01 (12 rows) 4. Wybrać wszystkie dane osób (oprócz id zespołu i płacy dodatkowej) o imieniu zawierającym wewnątrz literę 'j' lub 'J'. select numer, imie, nazwisko, etat, szef, data_zatrudnienia, placa_pod where imie like'%j%' or imie like '%J%'; numer imie nazwisko etat szef data_zatrudnienia placa_pod -------+---------+------------+----------+------+-------------------+----------- 1000 Józef MOCNY dyrektor 1996-10-01 3160.00 1010 Józef PODGAJNY profesor 1000 1976-10-01 4180.00 1230 Janusz MALANOWSKI adiunkt 1010 1999-10-01 2750.00 1020 Andrzej DELECKI profesor 1000 1986-10-01 4050.00 1211 Jacek WIŚNIEWSKI profesor 1020 1976-10-01 4180.00 1270 Jan MOLANY asystent 1020 1989-10-01 1400.00 1050 Jerzy LAKOCKI adiunkt 1050 1990-10-01 2790.00 (7 rows) 5. Wybrać imię, nazwisko, etat i płacę podstawową osób, których pensja podstawowa wynosi 1400 lub 2750. select imie, nazwisko, etat, placa_pod where placa_pod=1400 or placa_pod=2750; imie nazwisko etat placa_pod -----------+------------+----------+----------- Stanisław KOWALEWSKI adiunkt 2750.00 Marcin MOCNY asystent 1400.00 Marek KOWALEWSKI adiunkt 2750.00 Cezary MISIECKI asystent 1400.00 Janusz MALANOWSKI adiunkt 2750.00 Marian MALESA adiunkt 2750.00 Monika ROZUMEK adiunkt 2750.00 Jan MOLANY asystent 1400.00 Tadeusz RUSEK adiunkt 2750.00 (9 rows) 6. Wybrać imię, nazwisko, etat, płacę podstawową i płacę dodatkową osób, których pensja podstawowa wynosi 4180 a dodatkowa 420. select imie, nazwisko, etat, placa_pod, placa_dod where placa_pod=4180 and placa_dod=420; imie nazwisko etat placa_pod placa_dod -----------+------------+----------+-----------+----------- Józef PODGAJNY profesor 4180.00 420.00 Stanisław PODGAJNY profesor 4180.00 420.00 Jacek WIŚNIEWSKI profesor 4180.00 420.00 Kazimierz PODGÓRA profesor 4180.00 420.00 (4 rows) 4
7. Wybrać dane osobowe osób, których pensja podstawowa mieści się w przedziale (1400,2700). where placa_pod between 1400 and 2700; -------+--------+----------+----------+------+-------------------+-----------+-----------+--------- 1001 Marcin MOCNY asystent 1010 1996-10-01 1400.00 570.00 20 1070 Piotr MOLANY adiunkt 1010 1989-10-01 2600.00 20 1060 Cezary MISIECKI asystent 1010 2004-10-01 1400.00 20 1260 Robert MISIECKI adiunkt 1010 2004-10-01 2600.00 20 1270 Jan MOLANY asystent 1020 1989-10-01 1400.00 30 (5 rows) 8. Wyświetlić dane adiunktów, których zarobki mieszczą się pomiędzy 2500 i 2600. Zadanie wykonać dwiema metodami: stosując BETWEEN oraz stosując operatory relacji i AND. where etat='adiunkt' and placa_pod between 2500 and 2600; where etat='adiunkt' and (placa_pod>=2500 and placa_pod<=2600); -------+--------+----------+---------+------+-------------------+-----------+-----------+--------- 1070 Piotr MOLANY adiunkt 1010 1989-10-01 2600.00 20 1260 Robert MISIECKI adiunkt 1010 2004-10-01 2600.00 20 (2 rows) 9. Wyświetlić listę pracowników przyjętych do pracy pomiędzy '01-01-1996' a '31-12-1999'. where data_zatrudnienia between '1996-01-01' and '1999-12-31'; -------+-----------+------------+----------+------+-------------------+-----------+-----------+--------- 1000 Józef MOCNY dyrektor 1996-10-01 3160.00 570.00 10 1001 Marcin MOCNY asystent 1010 1996-10-01 1400.00 570.00 20 1230 Janusz MALANOWSKI adiunkt 1010 1999-10-01 2750.00 20 1300 Dariusz WARDECKI asystent 1010 1999-10-01 1360.00 20 1030 Marian MALESA adiunkt 1020 1999-10-01 2750.00 30 1100 Kamil WARSKI asystent 1020 1999-10-01 1360.00 30 1201 Michał LECHITA adiunkt 1020 1996-10-01 2755.00 570.00 30 1200 Kazimierz CZECH profesor 1050 1996-10-01 4160.00 570.00 40 (8 rows) 10. Wybrać dane osobowe osób, których pensja podstawowa mieści poza przedziałem (1000,4000). where placa_pod not between 1000 and 4000; -------+------------+------------+----------+------+-------------------+-----------+-----------+--------- 1010 Józef PODGAJNY profesor 1000 1976-10-01 4180.00 420.00 20 1011 Stanisław PODGAJNY profesor 1010 1976-10-01 4180.00 420.00 20 1220 Stanisław DOŁEK profesor 1010 1986-10-01 4050.00 270.00 20 1020 Andrzej DELECKI profesor 1000 1986-10-01 4050.00 270.00 30 1110 Piotr TESTA stażysta 1020 2007-10-01 900.00 30 1211 Jacek WIŚNIEWSKI profesor 1020 1976-10-01 4180.00 420.00 30 1310 Aleksandra RAJCZYK profesor 1020 2007-10-01 4180.00 30 1130 Tadeusz DROBOSZ stażysta 1050 2007-10-01 900.00 40 1200 Kazimierz CZECH profesor 1050 1996-10-01 4160.00 570.00 40 1280 Anna WIŚNIEWSKA stażysta 1050 1993-10-01 900.00 40 1210 Kazimierz PODGÓRA profesor 1050 1976-10-01 4180.00 420.00 40 1330 Marek KOTOROWSKI stażysta 1050 2007-10-01 900.00 40 (12 rows) 5
11. Wyświetlić listę pracowników zespołów o identyfikatorach 10, 20, 30, dla których zarobki wynoszą co najmniej 4000. Zadanie wykonać dwoma metodami: stosując IN oraz operatory relacji i OR. where id_zesp IN (10,20,30) and placa_pod >= 4000; where (id_zesp=10 or id_zesp=20 or id_zesp=30) and placa_pod >= 4000; -------+------------+------------+----------+------+-------------------+-----------+-----------+--------- 1010 Józef PODGAJNY profesor 1000 1976-10-01 4180.00 420.00 20 1011 Stanisław PODGAJNY profesor 1010 1976-10-01 4180.00 420.00 20 1220 Stanisław DOŁEK profesor 1010 1986-10-01 4050.00 270.00 20 1020 Andrzej DELECKI profesor 1000 1986-10-01 4050.00 270.00 30 1211 Jacek WIŚNIEWSKI profesor 1020 1976-10-01 4180.00 420.00 30 1310 Aleksandra RAJCZYK profesor 1020 2007-10-01 4180.00 30 (6 rows) 12. Odwrócić warunek w poprzednim zadaniu stosując operator NOT oraz stosując prawa rachunku zdań. where id_zesp not in (10,20,30) and placa_pod < 4000; where (id_zesp<>10 and id_zesp<>20 and id_zesp<>30) and placa_pod < 4000; -------+---------+------------+----------+------+-------------------+-----------+-----------+--------- 1050 Jerzy LAKOCKI adiunkt 1050 1990-10-01 2790.00 40 1120 Anna ORKA asystent 1050 2001-10-01 1260.00 40 1130 Tadeusz DROBOSZ stażysta 1050 2007-10-01 900.00 40 1280 Anna WIŚNIEWSKA stażysta 1050 1993-10-01 900.00 40 1240 Tadeusz RUSEK adiunkt 1050 1993-10-01 2750.00 40 1330 Marek KOTOROWSKI stażysta 1050 2007-10-01 900.00 40 (6 rows) 13. Wyświetlić zarobki dla pracowników zatrudnionych na etacie profesora po '01-01-1994'. Nie uwzględniać pracowników z zespołu o identyfikatorze 40. where id_zesp<>40 and etat='profesor' and data_zatrudnienia >'1994-01-01'; -------+------------+----------+----------+------+-------------------+-----------+-----------+--------- 1310 Aleksandra RAJCZYK profesor 1020 2007-10-01 4180.00 30 (1 row) 14. Wyświetl informacje o tych pracownikach, którzy zarabiają powyżej 1000 złotych, posiadają szefa. Pomiń osoby z zespołów 20 i 30. where id_zesp not in (20,30) and szef is not null and placa_pod>1000; -------+-----------+----------+------------+------+-------------------+-----------+-----------+--------- 1080 Karol DROZD sekretarka 1000 1993-10-01 1150.00 10 1050 Jerzy LAKOCKI adiunkt 1050 1990-10-01 2790.00 40 1120 Anna ORKA asystent 1050 2001-10-01 1260.00 40 6
1200 Kazimierz CZECH profesor 1050 1996-10-01 4160.00 570.00 40 1210 Kazimierz PODGÓRA profesor 1050 1976-10-01 4180.00 420.00 40 1240 Tadeusz RUSEK adiunkt 1050 1993-10-01 2750.00 40 (6 rows) 15. Wyświetl informacje o tych pracownikach, którzy są zatrudnieni w zespole nr 20 i których nazwisko zaczyna się na M lub kończy na SKI. where id_zesp=20 and (nazwisko like '%SKI' or nazwisko like 'M%'); -------+-----------+------------+----------+------+-------------------+-----------+-----------+--------- 1040 Stanisław KOWALEWSKI adiunkt 1010 1993-10-01 2750.00 20 1001 Marcin MOCNY asystent 1010 1996-10-01 1400.00 570.00 20 1041 Marek KOWALEWSKI adiunkt 1010 1993-10-01 2750.00 20 1070 Piotr MOLANY adiunkt 1010 1989-10-01 2600.00 20 1060 Cezary MISIECKI asystent 1010 2004-10-01 1400.00 20 1260 Robert MISIECKI adiunkt 1010 2004-10-01 2600.00 20 1230 Janusz MALANOWSKI adiunkt 1010 1999-10-01 2750.00 20 (7 rows) 16. Wyświetl informacje o tych pracownikach, którzy nie są ani profesorami ani asystentami ani stażystami i którzy nie zarabiają w przedziale od 1150 do 2800 złotych. where etat not in ('asystent','stażysta','profesor') and (placa_pod not between 1150 and 2800); -------+-------+----------+----------+------+-------------------+-----------+-----------+--------- 1000 Józef MOCNY dyrektor 1996-10-01 3160.00 570.00 10 (1 row) 17. Wyświetl imię, nazwisko, etat, datę zatrudnienia, płacę miesięczną asystentów zatrudnionych po roku 1999, dla których suma płacy podstawowej i dodatkowej jest wyższa niż 1200 złotych. Wyniki uporządkuj według płacy podstawowej. Jeżeli dwóch pracowników ma tę samą płacę podstawową, to posortuj ich według nazwisk. select imie, nazwisko, etat, data_zatrudnienia, placa_pod+coalesce(placa_dod,0) miesiac where etat='asystent' and (placa_pod+coalesce(placa_dod,0) > 1200) and data_zatrudnienia >='2000-01-01' order by placa_pod,nazwisko; imie nazwisko etat data_zatrudnienia miesiac --------+----------+----------+-------------------+--------- Michał ARTIOMOW asystent 2001-10-01 1260.00 Anna ORKA asystent 2001-10-01 1260.00 Cezary MISIECKI asystent 2004-10-01 1400.00 (3 rows) 18. Wybrać dane osobowe osób, których nazwiska wpisane są małymi literami. where nazwisko = lower(nazwisko); -------+------+----------+------+------+-------------------+-----------+-----------+--------- (0 rows) 7
19. Wybrać dane osobowe osób, których nazwiska wpisane są wielkimi literami i zaczynają się na literę M. Nazwiska te wypisać wersalikami (pierwsza wielka litera). select initcap(nazwisko) where nazwisko = upper(nazwisko) and nazwisko like 'M%'; initcap ------------ Mocny Mocny Molany Misiecki Misiecki Malanowski Malesa Molany (8 rows) 20. Z tabeli pracownicy wybrać długości nazwisk i etatów dla każdego pracownika z zespołu 40. select length(nazwisko) dl_nazwisko, length(etat) dl_etat where id_zesp=40; dl_nazwisko dl_etat -------------+--------- 7 7 4 8 7 8 5 8 10 8 7 8 5 7 10 8 (8 rows) 21. Z tabeli pracownicy dla profesorów lub sekretarek wybrać nazwiska i ich początkowe 5 liter. select substr(nazwisko,1,5) where etat in ('sekretarka','profesor'); substr -------- DROZD PODGA PODGA DOŁEK DELEC WIŚNI RAJCZ CZECH PODGÓ (9 rows) 22. Wypisać nazwy zespołów usuwając z nich z lewej i prawej strony literkę a. select nazwa, trim(nazwa,'a') from zespoly; 8
nazwa btrim --------------------+-------------------- administracja dministracj bazy danych bazy danych sieci komputerowe sieci komputerowe systemy operacyjne systemy operacyjne grafika grafik (5 rows) 23. Wypisać różne drugie litery z nazwiska w tabeli Osoby. select distinct substr(nazwisko,2,1) litera_nazwisko ; litera_nazwisko ----------------- I Z R E Ł U O A (8 rows) 24. Wybrać imię, nazwisko i etat profesorów i asystentów, ale w ten sposób, że zamiast 'profesor' będzie wyświetlało się 'prof.', a zamiast 'asystent' 'mgr'. select imie, nazwisko, CASE WHEN etat='profesor' THEN 'Prof.' WHEN etat='asystent' THEN 'mgr' ELSE 'brak' END where etat in ('asystent','profesor'); imie nazwisko case ------------+------------+------- Józef PODGAJNY Prof. Marcin MOCNY mgr Michał DROZD mgr Stanisław PODGAJNY Prof. Cezary MISIECKI mgr Monika WOLAŃSKA mgr Michał DROBOSZ mgr Piotr GŁOWACKI mgr Stanisław DOŁEK Prof. Dariusz WARDECKI mgr Tadeusz KAMOCKI mgr Andrzej DELECKI Prof. Kamil WARSKI mgr Jacek WIŚNIEWSKI Prof. Jan MOLANY mgr Aleksandra RAJCZYK Prof. Michał ARTIOMOW mgr Anna ORKA mgr Kazimierz CZECH Prof. Kazimierz PODGÓRA Prof. (20 rows) 9
25. Wyświetlić rozdzielone kropkami inicjały (nazwiska plus etatu) każdego wpisanego do bazy adiunkta pisane dużymi literami, niezależnie od sposobu wpisania nazwiska i etatu tej osoby do bazy. select upper(substr(nazwisko,1,1)) '.' upper(substr(etat,1,1)) '.' as inicjaly where etat='adiunkt'; inicjaly ---------- K.A. K.A. M.A. M.A. M.A. M.A. L.A. R.A. L.A. R.A. B.A. (11 rows) 10