Ćwiczenia MS Access/SQL I. Zadania podstawowe 1. Wyświetlanie zawartości tabeli a) Polecenie: Wyświetl wszystkie rekordy z tabeli Pracownicy (wszystkie atrybuty). SELECT * FROM Pracownicy; b) Polecenie: Wyświetl dane (wszystkie atrybuty) wszystkich klientów. SELECT * FROM Klienci; 2. Sortowanie ORDER a) Polecenie: Wyświetl wszystkie rekordy z tabeli Pracownicy (wszystkie atrybuty) posortowane alfabetycznie według nazwiska, a następnie według imienia. SELECT * FROM Pracownicy ORDER BY Nazwisko, Imię; b) Polecenie: Wyświetl wszystkie rekordy z tabeli Produkty (wszystkie atrybuty) posortowane malejąco według ceny jednostkowej. SELECT * FROM Produkty ORDER BY CenaJednostkowa DESC; 3. Wyświetlanie poszczególnych atrybutów danej tabeli a) Polecenie: Wyświetl ID zamówień, daty zamówień, miasta i kraje odbiorców z tabeli Zamówienia. SELECT IDZamówienia, DataZamówienia, MiastoOdbiorcy, KrajOdbiorcy FROM Zamówienia; b) Polecenie: Wyświetl imiona, nazwiska i miasta zamieszkania poszczególnych pracowników, posortowane alfabetycznie według nazwiska, a następnie imienia i nazwy miasta. SELECT Imię, Nazwisko, Miasto FROM Pracownicy ORDER BY Nazwisko, Imię, Miasto; 4. Wyświetlanie części rekordów tabeli a) Polecenie: Wypisz pierwsze 4 kategorie produktów i ich opis. SELECT TOP 4 NazwaKategorii, Opis FROM Kategorie; 1 b) Polecenie: Wyświetl wszystkie informacje na temat 10 najdroŜszych produktów z tabeli Produkty. SELECT TOP 10 * FROM Produkty ORDER BY CenaJednostkowa DESC; c) Polecenie: Wypisz pierwsze 25% wszystkich zamówień, wyświetl numer zamówienia, opis i ilość dla zamówienia. SELECT TOP 25 PERCENT IDzamówienia, IDproduktu, Ilość FROM [Opisy zamówień]; II. Wybór wierszy 1. Wybór wierszy: klauzula WHERE (łączenie warunków, kolejność wykonywanych poleceń: AND, OR, nawiasy, Operatory porównań. a) Polecenie: Wyświetl wszystkie produkty, których stan magazynowy jest mniejszy niŜ 30. SELECT * FROM Produkty WHERE StanMagazynu<30; b) Polecenie: Wyświetl nazwy, adresy i miasta dostawców ze Szwecji, posortowane według nazw firm. SELECT NazwaFirmy, Adres, Miasto FROM Dostawcy WHERE Kraj='Szwecja'; c) Polecenie: Wyświetl wszystkie zamówienia, które zostały złoŜone po 1997 roku i wysłane do Londynu. SELECT * FROM Zamówienia WHERE (DataZamówienia>#12/31/1997#) AND (MiastoOdbiorcy='Londyn'); d) Polecenie: Wyświetl wszystkie zamówienia na których cena jednostkowa była większa od 200 lub ilość zamawianego towaru przekraczała 100. SELECT * FROM [Opisy zamówień] WHERE (CenaJednostkowa>200) OR (Ilość>100); 2. Polecenie BETWEEN AND a) Polecenie: Wyświetl wszystkich pracowników (imię, nazwisko, stanowisko) przyjętych do pracy w 1 kwartale 1994 roku. SELECT Imię, Nazwisko, Stanowisko FROM Pracownicy WHERE DataZatrudnienia BETWEEN #1/1/1994# AND #3/31/1994#; 2 b) Polecenie: Wyświetl wszystkie zamówienia, dla których fracht mieści się w granicach 80-120 zł. SELECT * FROM Zamówienia WHERE Fracht BETWEEN 80 AND 120; 3. Polecenie IN Polecenie: Wyświetl ID dostawcy, firmę, Przedstawiciela i jego stanowisko pochodzących z Niemiec, Szwecji lub Holandii. SELECT IDDostawcy, NazwaFirmy, Przedstawiciel, StanowiskoPrzedstawiciela FROM Dostawcy WHERE Kraj IN ('Niemcy', 'Szwecja', 'Holandia'); 4. Polecenie LIKE Zgodność Brak zgodności Rodzaj zgodności Wzorzec (zwraca True) (zwraca False) Wiele znaków a*a aa, aBa, aBBBa aBC *ab* abc, AABB, Xab aZb, bac Znak specjalny a[*]a a*a aaa Wiele znaków ab* abcdefg, abc cab, aab Jeden znak a?a aaa, a3a, aBa aBBBa Jedna cyfra a#a a0a, a1a, a2a aaa, a10a Zakres znaków [a-z] f, p, j 2, & Poza zakresem [!a-z] 9, &, % b, a Nie cyfra [!0-9] A, a, &, ~ 0, 1, 9 Połączenie a[!b-m]# An9, az0, a99 abc, aj0 a) Polecenie: Wybierz kategorie, do których zostały zaklasyfikowane owoce. SELECT * FROM Kategorie WHERE Opis LIKE '*owoce*'; b) Polecenie: Wyświetl informacje na temat wszystkich pracowników, których imię zaczyna się na literę „A”. SELECT * FROM Pracownicy WHERE Imię LIKE 'A*'; 5. Wybór nieznanych wartości IS (NOT) NULL a) Polecenie: wypisz informacje o pracownikach, dla których jest wypełnione pole region. SELECT * FROM Pracownicy WHERE Region IS NOT NULL; 3 b) Polecenie: wyświetl nazwy tych dostawców, którzy nie posiadają strony internetowej. SELECT NazwaFirmy FROM Dostawcy WHERE StronaMacierzysta IS NULL; 6. Wybór nie powtarzających się informacji DISTINCT a) Polecenie: Wypisz wszystkie miasta, z których pochodzą klienci. SELECT DISTINCT Miasto FROM Klienci; b) Wypisz wszystkie miasta, w których dokonano zamówień w sierpniu 1996. SELECT DISTINCT MiastoOdbiorcy FROM Zamówienia WHERE DataZamówienia BETWEEN #8/1/1996# AND #8/31/1996#; III. Zastosowanie funkcji i innych operacji na atrybutach; aliasy 1. Funkcje ciągów znaków: sumowanie tekstów, LEFT, RIHGT, SUBSTRING, REPLACE Funkcje tekstowe ASCII LENGTH RTRIM CHAR LOCATE SPACE CONCAT LTRIM SUBSTRING LCASE RIGHT UCASE LEFT a) Polecenie: Zamień w imionach pracowników literę „N” na znak „_”. SELECT Replace(Imię, 'n', '_') FROM Pracownicy; b) Polecenie: Wypisz nazwy miast, oraz pierwsze 3 znaki i ostatnie 45 znaków. SELECT Nazwa_miasto, LEFT(Nazwa_miasto, 3) AS Pierwsze3, RIGHT (Nazwa_miasto, 45) AS Ostatnie45 FROM Miasto; c) Polecenie: Wypisz imiona i nazwiska pracowników, zamieniając nazwiska na litery drukowane. SELECT Imię, UCase(Nazwisko) AS NazwiskoDrukowanymi FROM Pracownicy; 2. Operatory arytmetyczne: + - / * % a) Polecenie: Powiększ cenę jednostkową wszystkich produktów o 10% i wypisz jako nową kolumnę. SELECT *, CenaJednostkowa*1.1 AS NowaCena FROM Produkty; 4 b) Wyznacz wartości poszczególnych produktów w magazynie (wyświetl wraz z nazwami produktów). SELECT NazwaProduktu, StanMagazynu*CenaJednostkowa AS Wartość FROM Produkty; 3. Funkcje arytmetyczne, np. ABS lub ROUND Funkcje numeryczne ABS ATAN FLOOR SIN LOG SQRT CEILING POWER TAN COS RAND MOD EXP SIGN Polecenie: Zaokrąglij do pełnych złotych cenę produktów i dopisz walutę. SELECT NazwaProduktu, CCur(Round(CenaJednostkowa,0)) FROM Produkty; 4. Funkcje daty: DAY, MONTH, YEAR, DATE, DATEADD Funkcje daty i czasu CURDATE DAYOFYEAR MONTH CURTIME YEAR WEEK NOW HOUR QUARTER DAYOFMONTH MINUTE MONTHNAME DAYOFWEEK DAYNAME SECOND a) Polecenie: wypisz dzisiejszą datę, dzień, miesiąc i rok w osobnych kolumnach. SELECT DAY(Date()) AS Dzień, MONTH(Date()) AS Miesiąc, YEAR(Date()) AS Rok; b) Wypisz pracowników (imię i nazwisko) oraz dzień (datę), w którym upływa (upłynęło) 10 lat od momentu zatrudnienia. Uwzględnij tylko tych pracowników, którzy mają mniej niŜ 50 lat a staŜ pracy większy niŜ 13 lat, oraz w momencie zatrudnienia byli przed 35 rokiem Ŝycia (zakłada się dla uproszczenia, Ŝe upływ roku następuje wraz z przejściem do kolejnego roku kalendarzowego – np. pracownikowi zatrudnionemu 31.XII.00 roczny staŜ przypisuje się juŜ 1.I.01). SELECT Imię, Nazwisko, DateAdd('yyyy', 10, DataZatrudnienia) FROM Pracownicy WHERE (YEAR(Date()) - YEAR(DataUrodzenia) < 50) AND (YEAR(Date()) - YEAR(DataZatrudnienia) > 13) AND (YEAR(DataZatrudnienia) - YEAR(DataUrodzenia) < 35); 5. Literały – ciąg znaków SELECT kolumna1, „literał” , kolumna2 FROM tabela Sumowanie pól znakowych a) Polecenie: Wyświetl w jednej kolumnie o nazwie dane: nazwisko, imię i stanowisko pracownika SELECT Nazwisko+' '+Imię+' '+Stanowisko AS Dane FROM Pracownicy; 5 b) Polecenie: Wyświetl w jednej kolumnie o nazwie dane: nazwisko, imię, w następnej literał: pracuje od, data zatrudnienia pracownika SELECT Nazwisko, Imię, 'Pracuje od:', DataZatrudnienia FROM Pracownicy; IV. Zastosowanie funkcji agregujących 1. Funkcje agregujące; klauzula GROUP BY i HAVING a) Wyświetl sumę kosztów frachtu ze wszystkich zamówień. SELECT SUM(Fracht) FROM Zamówienia; b) Wyświetl sumę wartości produktów w magazynie. SELECT SUM(StanMagazynu*CenaJednostkowa) AS SumaWartości FROM Produkty; c) Polecenie: Zlicz ilość rekordów znajdujących się w tablicy Produkty. SELECT COUNT(*) FROM Produkty; d) Polecenie: Wyświetl wartość sprzedaŜy poszczególnych produktów, bez rabatów (ID produktu i wartość sprzedaŜy). SELECT IDProduktu, SUM(Ilość*CenaJednostkowa) AS WartośćBezRabatów FROM [Opisy zamówień] GROUP BY IDProduktu; e) Polecenie: Wyświetl średnie ilości sprzedaŜy według poziomów przyznanych rabatów. SELECT Rabat, AVG(Ilość) AS FROM [Opisy zamówień] GROUP BY Rabat; f) ŚredniaIlość Polecenie: Wypisz zamówienia, posortowane malejąco wg ceny do zapłaty przez klienta. SELECT IDZamówienia, SUM(CCur(Round(Ilość*CenaJednostkowa*(1Rabat),2))) AS DoZapłaty FROM [Opisy zamówień] GROUP BY IDZamówienia ORDER BY 2 DESC; g) Polecenie: j.w., przy czym wyświetlane są tylko zamówienia o kwocie przekraczającej 5000 zł. SELECT IDZamówienia, SUM(CCur(Round(Ilość*CenaJednostkowa*(1Rabat),2))) AS DoZapłaty FROM [Opisy zamówień] GROUP BY IDZamówienia HAVING SUM(Round(Ilość*CenaJednostkowa*(1-Rabat),2))>5000 ORDER BY 2 DESC; 6 h) Polecenie: Wypisz największą, najmniejszą i przeciętną (niewaŜoną) cenę produktu w magazynie. SELECT MIN(CenaJednostkowa) AS Najmniejsza, MAX(CenaJednostkowa) AS Największa, AVG(CenaJednostkowa) AS Średnia FROM Produkty; V. Łączenie tabel 1. Złączenia wewnętrzne: INNER JOIN a) Polecenie: wyświetl ID zamówień połączone z danymi spedytora. SELECT IDzamówienia, Spedytorzy.* FROM Spedytorzy INNER JOIN Zamówienia ON Spedytorzy.IDspedytora = Zamówienia.IDspedytora; b) Polecenie: wyświetl nazwy miast, posortowane alfabetycznie, wraz z nazwami regionów (tabele: Miasto, Region). SELECT Nazwa_miasto, Nazwa_region FROM Region INNER JOIN Miasto ON Region.IDregion = Miasto.IDregion; c) Polecenie: wyświetl imiona i nazwiska pracowników oraz nazwy miast, które są pod ich opieką (tabele: Pracownicy, Pracownicy_miasto, Miasto). SELECT Imię, Nazwisko, Nazwa_miasto FROM Pracownicy INNER JOIN (Miasto INNER JOIN Pracownicy_miasto ON Miasto.IDmiasto = Pracownicy_miasto.IDmiasto) ON Pracownicy.IDpracownika = Pracownicy_miasto.IDpracownicy; d) Polecenie: wyświetl miasta, które są pod opieką pracowników o numerach 1 i 2. SELECT DISTINCT Nazwa_miasto FROM Miasto INNER JOIN Pracownicy_miasto ON Miasto.IDmiasto = Pracownicy_miasto.IDmiasto WHERE IDPracownicy IN (1,2); e) Polecenie: utwórz ranking pracowników według wartości dokonanej przez nich sprzedaŜy (uwzględniającej rabaty). SELECT Pracownicy.IDPracownika, Imię, Nazwisko, SUM(CCur(Round(Ilość*CenaJednostkowa*(1-Rabat),2))) FROM (Pracownicy INNER JOIN Zamówienia ON Pracownicy.IDpracownika = Zamówienia.IDpracownika) INNER JOIN [Opisy zamówień] ON Zamówienia.IDzamówienia = [Opisy zamówień].IDzamówienia GROUP BY Pracownicy.IDPracownika, Imię, Nazwisko ORDER BY 4 DESC; 2. CROSS JOIN (tylko wyjaśnienie) 7 3. Złączenia zewnętrzne: LEFT|RIGHT OUTER JOIN a) Polecenie: dopisz do tabeli pracowników nowego pracownika. Następnie wyświetl imiona i nazwiska pracowników wraz z ID miast, które są pod ich opieką, uwzględniając takŜe w zestawieniu osoby nie opiekujące się Ŝadnym miastem. SELECT Imię, Nazwisko, IDMiasto FROM Pracownicy LEFT OUTER JOIN Pracownicy_miasto ON Pracownicy.IDpracownika = Pracownicy_miasto.IDpracownicy; 4. Podzapytania a) Polecenie: Wypisz 5 najtańszych produktów spośród produktów o ponadprzeciętnych cenach. SELECT TOP 5 * FROM Produkty WHERE CenaJednostkowa> (SELECT AVG(CenaJednostkowa) FROM Produkty) ORDER BY CenaJednostkowa; b) Polecenie: wyświetl nazwiska i imiona pracowników, którzy nie sprzedali niczego do Argentyny. SELECT Nazwisko, Imię FROM Pracownicy WHERE IDPracownika NOT IN (SELECT DISTINCT IDPracownika FROM Zamówienia WHERE KrajOdbiorcy='Argentyna'); 5. Operator UNION Polecenie: Wyświetl w jednej tablicy miasto, nazwe firmy i przedstawiciela, klienta i dostawce, przy czym wyświetl typ relacji klient czy dostawca, w osobnym polu. SELECT NazwaFirmy, Przedstawiciel, 'Klient' FROM Klienci UNION SELECT NazwaFirmy, Przedstawiciel, 'Dostawca' FROM Dostawcy; 8