Wprowadzenie do SQL Instrukcja laboratoryjna Ludmiła Rekuć, Witold Rekuć Wrocław, 2013-02-11
Spis treści Temat 1. System zarządzania bazą danych, baza danych i jej składowe. Zakładanie tabel - definiowanie pól. Własności pól. Definiowanie kluczy. Aktualizacja tabel. Powiązania między tabelami...3 Temat 2. Zapoznanie się z BD firmy handlowej (sql_bzd.accdb). Zadania tematu muszą być wykonane samodzielnie w domu, bez użycia komputera...6 Temat 3. Kwerendy wybierające: definiowanie, sortowanie, projekcja, selekcja, złączenie, grupowanie (podsumowanie). Kwerendy tworzące tabelę...8 Temat 4. Operacje teoriomnogościowe algebry relacji - "kwerendy usuwające" i " kwerendy dołączające"..11 Temat 5. Operacja dzielenia...14 Temat 6. Teta - złączenie... 16 Załącznik... 17 1. Wstęp...17 2. Wybrane typy danych (dziedzin wartości) i ich właściwości...18 3. Budowa wyrażeń w instrukcjach SQL...19 4. Składnia poleceń języka SQL...22 4.1. Definiowanie i zmiana definicji tabel bazy danych...22 4.2. Aktualizacja zawartości tabel...22 4.3. Wyszukiwanie danych...23 5. Opis bazy danych "Tpd_bzd_2007.accdb"...24
Temat 1. System zarządzania bazą danych, baza danych i jej składowe. Zakładanie tabel - definiowanie pól. Własności pól. Definiowanie kluczy. Aktualizacja tabel. Powiązania między tabelami Co należy wiedzieć z zakresu MS ACCESS SQL przed przystąpieniem do zajęć praktycznych: Czemu służy instrukcja CREATE TABLE, jaka jej minimalna składnia? Co może być zdefiniowane dla każdego pola? Co może być zdefiniowane względem kilku pól? Jak zapisać dane do tabeli? Jak zmienić definicję tabeli? Jak zmienić dane w tabeli? Jak usunąć tabele? Jak zdefiniować relacje między tabelami? Pierwsze kroki w środowisku MS Access SQL Uruchom MS Access a, wybierz opcję pusta baza danych, nazwij BD: Sesja, wskaż miejsce, gdzie BD powinna zostać utworzona i wybierz polecenie utwórz. Na Pasku komunikatów kliknij przycisk Opcje, a następnie kliknij polecenie Włącz tę zawartość. Na karcie Tworzenie w grupie Inne kliknij polecenie Projekt kwerendy. Zamknij okno dialogowe Pokazywanie tabeli. Na karcie Projektowanie w grupie Typ kwerendy kliknij przycisk Definicja danych. Zadania podstawowe: Celem zadań jest zdefiniowanie bazy danych Sesja, wprowadzenie do bazy kilku rekordów danych, aktualizacja definicji bazy danych, aktualizacja zawartości. BD Sesja składa się z trzech tabel: Tabela "Studenci" o schemacie : Numer liczba z zakresu od 1 do 15000; Nazwisko tekst długości nie większej niż 30 znaków, musi być wprowadzone; Kod pocztowy tekst składający się z pięciu cyfr, pole opcjonalne. Kluczem podstawowym tej tabeli jest Indeks. Tabela "Przedmioty" o schemacie : Kod 6-cio znakowy ciąg; Nazwa tekst długości nie większej niż 25 znaków, musi być wprowadzone; Kluczem podstawowym tej tabeli jest Kod. Tabela "Egzaminy" o schemacie: Nr studenta jak w tabeli Studenci; Kod przedmiotu jak w tabeli Przedmioty; Data typ danych DATETIME; Ocena liczba ułamkowa. Kluczem podstawowym jest {NrStudenta, KodPrzedmiotu, Data}.
Zadanie 1 Wpisz następującą instrukcję SQL: CREATE TABLE Studenci ( Numer SmallInt PRIMARY KEY, Nazwisko Text(30) NOT NULL ) Zalecenie: system ignoruje koniec wiersza, można więc pisać instrukcje nie dzieląc na wiersze. Zaleca się jednak wyróżnienie składowych instrukcji, zwiększa to jej czytelność. Na karcie Projektowanie w grupie Wyniki kliknij przycisk Uruchom. W oknie BD powinien pojawić się nowy obiekt tabela Studenci. W oknie BD otwórz obiekt tabela Studenci i obejrzyj wynik wykonania instrukcji. Zamknij tabelę. Dodaj do tabeli nową kolumnę dla wpisywania kodów pocztowych. W tym celu wpisz następującą instrukcję zmieniającą definicję tabeli i uruchom: ALTER TABLE Studenci ADD COLUMN [Kod pocztowy] text(5) W oknie BD otwórz obiekt tabela Studenci i obejrzyj wynik wykonania instrukcji. Zamknij tabelę. Spróbuj dodać następną kolumnę wg uznania a następnie usuń ją za pomocą...drop COLUMN... Wpisz i uruchom następującą instrukcję SQL: INSERT INTO Studenci VALUES (1,'naz1','34445') W oknie BD otwórz obiekt tabela Studenci i obejrzyj wynik wykonania instrukcji. Zamknij tabelę. W podobny sposób wprowadź kilka kolejnych rekordów. Spróbuj wprowadzić powtarzające się wartości w kolumnie Numer i wartości Null w kolumnach Numer i Nazwisko. Jaka jest reakcja systemu i dlaczego? Zadanie 2. Utwórz w podobny sposób tabelę Przedmioty i wprowadź kilka rekordów danych. Zadanie 3. Utwórz tabelę Egzaminy. Nr Studenta jest odwołaniem do kolumny Numer w tabeli Studenci; Kod przedmiotu jest odwołaniem do kolumny Kod w tabeli Przedmioty; Data data przeprowadzenia egzaminu, nie może być nie wpisana; Ocena liczba ułamkowa. Zastanów się, co może być kluczem w tej tabeli? Zdefiniuj klucz podstawowy. Wykonaj powiązanie tabel z wymuszeniem więzów integralności. Przykład definicji powiązania: CREATE TABLE Egzaminy ( [Nr studenta] smallint REFERENCES studenci(numer), Pytania (celem znalezienia odpowiedzi skorzystaj z materiałów wykładu lub pomocy ACCESS,a): 1) jak przyporządkować nazwę wprowadzanemu ograniczeniu powiązania? (wtedy można go w razie potrzeby usunąć)? 2) Jak zdefiniować powiązanie po wielu polach? 3) Jak zdefiniować wielopolowy klucz podstawowy tabeli?
4) Jak usunąć ograniczenie? Zadanie 4 Wpisz do tabeli Egzaminy kilka wierszy danych. Przeanalizuj możliwość wpisania wartości w kolumnach ID_ Studenta i Kod_ przedmiotu spoza zbioru wartości znajdujących się w odpowiednich kolumnach tabel Studenci i Przedmioty: 1) dodaj do tabeli Egzaminy rekord egzaminu dla nieistniejącego studenta jak zachowuje się SZBD? 2) dodaj do tabeli Egzaminy rekord egzaminu dla nieistniejącego przedmiotu jak zachowuje się SZBD? Usuń wybrane wiersze z tabeli Egzaminy. Usuń wybrane wiersze z tabeli Przedmioty. Przeanalizuj możliwość usuwania wierszy powiązanych z wierszami w tabeli Egzaminy: a) usuń z tabeli Studenci rekord studenta, który ma egzaminy, b) usuń z tabeli Przedmioty rekord przedmiotu, z którego są egzaminy, c) dla studenta mającego egzaminy zmień numer studenta w tabeli student na inną wartość sprawdź, czy zmieni się ten numer we wszystkich rekordach egzaminów studenta?. Jak wpływa połączenie tabel z wymuszaniem więzów integralności na możliwość dodawania, usuwania i aktualizacji rekordów? Zadanie 5 Załóż bazę danych do pamiętania danych o stanach materiałów w magazynach. Materiał jest charakteryzowany przez: indeks, nazwę, cenę i jednostkę miary. Magazyn jest charakteryzowany przez numer i adres. Chcemy wiedzieć jakie są stany magazynowe materiałów w magazynach, przy założeniu, że każdy materiał może być składowany w wielu magazynach i każdy magazyn może składować wiele materiałów. Należy zdefiniować tabele i powiązać je relacjami. Typy danych w kolumnach i właściwości według uznania. Zadanie 6 Załóż bazę danych do pamiętania danych o składzie potraw wytwarzanych z surowców. Potrawa jest charakteryzowana przez: numer, nazwę. Surowiec jest charakteryzowany przez numer, adres dostawcy. Chcemy wiedzieć, jakie surowce są używane do każdego rodzaju potraw i w jakiej ilości. Należy zdefiniować tabele i powiązać je relacjami. Typy danych w kolumnach i właściwości według uznania.
Temat 2. Zapoznanie się z BD firmy handlowej (sql_bzd.accdb). Zadania tematu muszą być wykonane samodzielnie w domu, bez użycia komputera Zadania: 1. Zapoznaj się ze strukturą BD Sql_bzd_2007.accdb (Załącznik,3 ). 2. Zastanów się nad kluczami głównymi tabel. 3. Zastanów się nad kluczami obcymi tabel; jakie jest powiązanie tabel? 4. Niżej podane są fragmenty tabel Sql_bzd_2007.accdb z danymi. Należy: a) odtwórz "papierową" postać dokumentu - NrFaktury=10/07/92; NrSprzedawcy = 4058; (zacznij od tab. Dokumenty, znajdź pełną nazwę i adres sprzedawcy, pełną nazwę i adres nabywcy, pozycje dokumentu, pełną nazwę towaru w każdej pozycji, nazwę jednostki miary). b) znajdź nazwy miejscowości nabywców pasztetów i zup CHOISE. c) znajdź nazwy i adresy sprzedawców, którzy sprzedali i "Wodę Halinka" i "Wafle DRAGOLAND". DOKUMENTY NrFaktury NrSprzedawcy NrNabywcy Data wystawienia 10/07/92 4058 0 01-07-92 1/07/92 4063 0 02-07-92 12/07/92 4063 0 10-07-92 155/92 4074 0 23-07-92 270/92/Z 717 0 24-07-92 278/92/Z 698 0 29-07-92 R/168/92/Z 0 3263 14-07-92 R/215/92/Z 0 681 02-07-92 R/216/92/Z 0 4083 03-07-92 POZYCJEDOKUMENTU NrFaktury Nr NrPozycji SmbTow Ilość CenaNetto 10/07/92 Sprzedawcy 4058 1 038 12 12,50 10/07/92 4058 2 039 10 12,00 10/07/92 4058 3 049 10 12,00 11/07/92 4063 1 230 1 120,00 11/07/92 4063 2 123 5 2,00 12/07/92 4063 1 098 20 10,00 155/92 4074 1 227 210 0,36 270/92/Z 717 1 013 10 2,70 278/92/Z 698 1 200 1 100,00 R/168/92/Z 0 1 050 77 0,70 R/168/92/Z 0 2 059 2 0,80 R/168/92/Z 0 3 193 7 1,90 R/215/92/Z 0 1 193 32 1,72 R/216/92/Z 0 1 047 500 0,36
TOWARY Symbol Nazwa Jm Cena normatywna StawkaVat 013 CHRUPKI 4 2,12 22,00% 038 CHESTER TOP 3 8,00 22,00% 039 VONK BLOK 3 4,00 22,00% 047 PASZTET 3 0,27 22,00% 049 KONSERWA "BIERWURST" 5 0,86 22,00% 050 ZUPY CHOISE 4 0,56 22,00% 059 ORZESZKI SOLONE 4 0,76 22,00% 098 Woda "HALINKA" 1 0,60 22,00% 123 MIELONKA TLUSZCZ.-WOL. 300G 5 1,40 22,00% 193 KONSERWA WOLOWO-WIEPRZOWA 200G 5 1,38 22,00% 200 ANDY-KANDY cukierki 4 0,76 22,00% 227 Szprot Pasta 5 0,36 22,00% 230 Wafle "DRAGOLAND" 3 9,00 22,00% MIEJSCOWOŚCI Kod miejscowości Nazwa KodWoj 37 WAŁBRZYCH DL 39 WISŁA MP 41 WROCŁAW DL 43 ZARÓW DL FIRMY NR NazwaFr Ulica KodMjc Tlf 0 Nasza firma Handlowa 13 41 (071)345-678-234 681 DOZAMELIN ul. W. Pstrowskiego 10 41 698 Grabieczak Roman ul. Pomorska 41 717 Kocwin Maria ul. Ruska 41 3263 Pinowski Jan ul. Legnicka 94/5 41 4058 Parówex S. A. TEINA 500 833/24 39 4063 4067 ul. Lanska 44/22 37 8741,236851 4074 Kiosk Wielobranżowy Hutnicza 21 43 4083 Backi Wojciech Prowicza 93 41 WOJEWÓDZTWA Kod MP DL Nazwa małopolskie dolnośląskie
Temat 3. Kwerendy wybierające: definiowanie, sortowanie, projekcja, selekcja, złączenie, grupowanie (podsumowanie). Kwerendy tworzące tabelę. Celem ćwiczenia jest opanowanie podstawowych umiejętności korzystania z danych zgromadzonych w bazie danych. Co należy wiedzieć z zakresu MS ACCESS SQL przed przystąpieniem do zajęć praktycznych: Czemu służy instrukcja SELECT, jaka jest jej minimalna składnia? Klauzula FROM instrukcji SELECT; Jak zapisać operację złączenia dwóch lub kilku tabel w kwerendzie SQL? Jak powołać pole, którego wartości są wynikiem obliczeń? Klauzula WHERE instrukcji SELECT; dostępne operatory i budowanie wyrażeń; Klauzule GROUP BY i HAVING; Instrukcja SELECT INTO, składnia i zastosowanie. Zadania podstawowe Wszystkie zadania dotyczą bazy danych firmy handlowej. Zadanie 1 Zdefiniuj w SQL kwerendę wybierającą, która utworzy arkusz danych odnośnie dokumentów i firm, które te dokumenty wystawiły, czyli o schemacie: (NrSprzedawcy, Nazwa, Telefon, Data, NrFaktury) Przykład rozwiązania: SELECT NrSprzedawcy, Nazwa, Telefon, Data, NrFaktury FROM Dokumenty INNER JOIN Firmy ON Dokumenty.NrSprzedawcy = Firmy.Nr; Uwaga: Zazwyczaj SZBD wymaga wskazania pola z kwalifikatorem (nazwą tabeli z której to pole pochodzi) tylko w przypadku, kiedy są takie same nazwy pól w różnych tabelach. Jednak w Access'e po klauzuli ON wymagana jest pełna nazwa pól. Uruchom kwerendę i obejrzyj wynikowy arkusz danych. Usuń powiązanie między tabelami w kwerendzie: zlikwiduj operację INNER JOIN zostawiając po klauzuli FROM nazwy tabel odseparowane przecinkiem. Przeanalizuj zmiany w wynikowym arkuszu danych. Powstała tabela zawierająca iloczyn kartezjański wartości z tabel źródłowych. Powiąż tabele sprzęgając NrNabywcy z tabeli Dokumenty z Nr z tabeli Firmy. Przeanalizuj zmiany w wynikowym arkuszu. Zmień kwerendę celem dokonania selekcji rekordów z niepustym numerem telefonu (Telefon is not Null w klauzuli WHERE). Przeanalizuj zmiany w wynikowym arkuszu. Dodaj do kwerendy po klauzuli WHERE z odpowiednim wyrażeniem logicznym następną klauzulę: ORDER BY NrNabywcy, Data, NrFaktury; Przeanalizuj zmiany w wynikowym arkuszu. Zmień kwerendę w zakresie klauzuli ORDER BY na: ORDER BY NrNabywcy DESC, Data DESC, NrFaktury DESC; Przeanalizuj zmiany w wynikowym arkuszu. Zmień kwerendę celem dokonania projekcji na (Nazwa, Telefon). W wynikowym arkuszu są duplikaty wierszy. Dla usunięcia duplikatów zmień kwerendę: SELECT DISTINCT Nazwa,...
Zadanie 2 Za pomocą kwerendy wybierającej w SQL, na podstawie tabel Towary i PozycjeDokumentu utwórz arkusz danych przedstawiający kolumny {NrSprzedawcy, NrFaktury, NrPozycji, NazwaTowaru, Wartość : [Ilość]*[CenaNetto]}. (Inaczej mówiąc, należy wykonać projekcję na wymienione atrybuty z wyniku złączenia źródłowych tabel Towary i PozycjeDokumentu). Posortować wg NrSprzedawcy, NrFaktury, NrPozycji. Aby utworzyć kolumnę, której nie ma w żadnej tabeli należy nazwę kolumnę i sposób obliczania jej wartości wskazać po klauzuli SELECT, np.: SELECT...,[Ilość]*[CenaNetto] AS Wartość,... Aby wynik umieścić w fizycznie istniejącej tabeli Kwoty pozycji dokumentów należy zmienić kwerendę wybierającą na kwerendę tworzącą tabelę. W tym celu dodaj przed klauzulą FROM: INTO [Kwoty pozycji dokumentów] Uwaga: jeśli w nazwie obiektu BD występuje spacja lub inny znak specjalny należy nazwę ująć w nawiasy kwadratowe. Zadanie 3 Za pomocą kwerendy wybierającej SQL utwórz arkusz danych informujący na jaką kwotę sumaryczną został wystawiony każdy dokument (można tu wykorzystać tabelę utworzoną w zadaniu 2 z projekcją na atrybuty: {NrFaktury, NrSprzedawcy, Kwota}; przeprowadzić grupowanie wg pól NrFaktury, Nr Sprzedawcy, zsumować wartości pola Kwota w grupach. Przykład rozwiązania: SELECT NrFaktury, NrSprzedawcy, Sum(kwota) AS Sumaryczna FROM [kwoty pozycji dokumentów] GROUP BY NrFaktury, NrSprzedawcy; Zapoznaj się z funkcjami agregującymi opisanymi w pomocy Access'a. Zmodyfikuj kwerendę celem wykluczenia z wynikowego zestawienia faktur wystawionych przez Naszą firmę (która ma numer 0). Przeanalizuj dwa rozwiązania: wpisanie warunku selekcji w klauzuli WHERE oraz zdefiniowanie go w klauzuli HAVING. Czy w tym przypadku wynikowe tabeli są różne? Przypomnienie: za pomocą HAVING można wyselekcjonować grupy spełniające warunek, natomiast za pomocą WHERE wyselekcjonować wiersze, które następnie zostaną zgrupowane. Zadanie 4 Za pomocą kwerendy wybierającej utworzyć arkusz danych o kolumnach: Numer, NazwaFirmy, Wartość, informujący na jaką sumaryczną kwotę otrzymał faktury każdy z nabywców Naszej firmy. Wśród nabywców nie ujmować Naszej Firmy (można skorzystać z numeru Naszej Firmy -0). Zadanie 5 Za pomocą kwerendy wybierającej utworzyć arkusz danych o następujących kolumnach: {Symbol, Nazwa, Wartość}, informujący na jaką kwotę sumaryczną został kupiony przez Naszą firmę każdy z towarów w sierpniu 1992 (użyj funkcji Year i Month). Znaleźć trzy towary kupione za największą kwotę. Dodatkowa informacja: Funkcja Year(..) zwraca rok podanej daty jako liczbę, np. Year(#13-09-2012#) = 2012; w zadaniu należy jako argumentu użyć nazwę kolumny [Data]. Podobnie funkcja Month(...) zwraca miesiąc podanej daty jako liczbę: Month(#13-09-2012#) = 9; Żeby ograniczyć wynik do podanej liczby rekordów należy posortować odpowiednio i użyć po klauzuli SELECT klauzuli TOP z wymaganą liczbą rekordów: SELECT TOP 3 Symbol, Nazwa, Sum(Kwota) AS Wartość... Zadania dodatkowe. 1. Wyselekcjonować firmy z Wrocławia lub Krakowa, którym Nasza firma sprzedała cokolwiek w sierpniu 1992 (użyj funkcji Year i Month).
2. Znaleźć miejscowości klientów Naszej firmy, którzy to klienci kupili ryż na kwotę większą niż 30 zł jednorazowo lub kupili kawę na kwotę większą niż 50 zł jednorazowo. 3. Dla każdej firmy z Wrocławia znaleźć sumaryczną kwotę podatku VAT zapłaconego w związku z zakupami w "Naszej Firmie" w lipcu 1992 (użyj funkcji Year i Month). 4. Znaleźć dwie najlepsze (pod względem kwoty sprzedaży) firmy, u których zaopatrywała się Nasza firma w lipcu 1992 (użyj funkcji Year i Month). 5. Znaleźć trzy najlepiej sprzedające się towary klientom Naszej firmy z woj. dolnośląskiego. 6. Utworzyć arkusz informujący na jaką kwotę wystawiła faktury Nasza firma (jedna liczba!). 7. Utworzyć arkusz informujący na jaką kwotę przeprowadził transakcje każdy nabywca Naszej firmy z każdym z towarów. 8. Utworzyć arkusz informujący, na jaką kwotę Nasza firma nabyła każdy z towarów z rozbiciem na województwa firm. 9. Utworzyć arkusz danych informujący o tym, z iloma różnymi towarami każdy z nabywców Naszej firmy miał do czynienia (inaczej mówiąc, należy określić liczność asortymentu towarów kupowanych przez klientów). Zadanie wykonać w dwóch krokach: 1 - utworzyć arkusz o następujących kolumnach: NrNabywcy, SymbolTowaru nie zawierający duplikatów; 2 - na podstawie kwerendy z kroku 1 przeprowadzić agregację (funkcja Policz) i utworzyć arkusz danych o kolumnach {NazwaNabywcy, Liczność asortymentu}. 10. Na podstawie wyniku zadania 9 utworzyć tabelę zawierającą 10 klientów o najbardziej szerokich zainteresowaniach (największej liczności asortymentu). 11. Utworzyć arkusz informujący o liczności asortymentu towarów nabywanych przez Naszą firmę w każdym województwie. 12. Utworzyć arkusz informujący klientom z ilu województw był sprzedany przez Naszą firmę każdy towar. 13. Wykonać zestawienie obrotów Naszej Firmy z podziałem na miesiące (1..12) roku zadanego parametrem (użyj funkcji Year i Month).
Temat 4. Operacje teoriomnogościowe algebry relacji - "kwerendy usuwające" i " kwerendy dołączające" Dotychczas były używane dwa rodzaje kwerend kwerendy wybierające i kwerendy tworzące tabele. Możliwość realizacji teoriomnogościowych operacji algebry relacji dostarczają kwerendy usuwające i dołączające. Zadanie 1 1. Operacje teoriomnogościowe na abstrakcyjnych tabelach r1 i r2. a) Utworzyć nową bazę danych z tabelami r1 ( A B ) r2 ( A B ) a1 b1 a1 b1 a1 b2 a2 b2 a3 b3 a3 b4 a2 b3 b) wykonać warianty sumy tabel: wynik kwerendy = r1 r2 tabela r3 = r1 r2 Objaśnienia: Aby zsumować dwie tabele (lub wyniki kwerend) należy użyć operacji UNION między odpowiednimi tabelami (lub kwerendami). Wynik operacji nie będzie mógł być umieszczony w fizycznej tabeli bezpośrednio. W tym celu należy zapamiętać kwerendę sumującą, a w następnym kroku użyć w instrukcji funkcjonalnej SELECT...INTO jako źródło danych. Przykładowe rozwiązanie, pierwszy krok: tworzymy kwerendę np. Kw1: TABLE r1 UNION TABLE r2; lub inaczej: SELECT * FROM r1 UNION SELECT * FROM r2; W następnym kroku tworzymy tabelę r3: SELECT * INTO r3 FROM Kw1; Znak * oznacza,że łączymy wszystkie kolumny odpowiednio. Jeśli nazwy kolumn są w tabelach różne należy wymienić obie listy nazw łączonych kolumn w odpowiedniej kolejności. Należy zwrócić uwagę, że wynik sumującej kwerendy domyślnie nie zawiera duplikatów, Aby w wyniku znalazły się wszystkie sumowane wiersze należy dodać po UNION orzeczenie ALL. Zadanie 2 Wykonać operację iloczynu tabel korzystając z operacji złączenia wykonać iloczyn tabel r3 = r1 r2 Objaśnienia: Aby znaleźć iloczyn tabel należy wykonać instrukcję SELECT z odpowiednim złączeniem podanych tabel po klauzuli FROM. Aby umieścić wynik w fizycznej tabeli należy użyć instrukcji SELECT.INTO. SELECT r1.* FROM r1 INNER JOIN r2 ON (r1.a=r2.a) and (r1.b=r2.b);
Zadanie 3 Wykonać warianty różnicy relacji r1 = r1 r2 r3 = r1 r2 Objaśnienia: Aby znaleźć różnicę dwóch tabel należy użyć operacji DELETE, która usuwa z podanej fizycznej tabeli wiersze spełniające pewien warunek. W tym przypadku to są takie wiersze, które są w obu tabelach, czyli stanowiące iloczyn dwóch tabel. Po klauzuli DELETE i obowiązkowym orzeczeniu DICTINCTROW należy podać tabelę, z której będą usuwane wiersze w postaci np.r1.*, a następnie po FROM określić wynik złączenia dwóch wyjściowych tabel, czyli wspomniany iloczyn: DELETE DISTINCTROW r1.* FROM r1 INNER JOIN r2 ON (r1.b = r2.b) AND (r1.a = r2.a); Zadanie 4 Znaleźć dopełnienie tabeli ZWIEDZIŁA. Utworzyć tabele: GRUPA ( Numer, Liczba uczestników ) OBIEKT ( Nazwa ) 1 15 Muzeum 2 19 ZOO 3 17 Zamek 4 19 ZWIEDZILA ( Numer_grupy Nazwa_obiektu ) 1 Muzeum 2 ZOO 4 Zamek Zakładając, że każda grupa turystyczna ma zwiedzić każdy obiekt, wyznaczyć tabelę zawierającą wizyty, które jeszcze muszą mieć miejsce (dopełnienie relacji ZWIEDZIŁA). Zadanie 5 Wykonać operacje teoriomnogościowe na rzeczywistej bazie danych "Tpd_bzd_2007.accdb" a) Utworzyć za pomocą kwerendy SQL tabele Dostawcy i Odbiorcy o schemacie {Numer, NazwaFirmy, Telefon} ( Dostawcy to ci, u kogo kupowała Nasza firma, Odbiorcy ci komu Nasza firma sprzedawała; nie ujmować Naszej firmy w tabelach). Zsumować tabele Dostawcy i Odbiorcy w tabeli Klienci. b) Podać firmy, które są jednocześnie dostawcami i odbiorcami towarów. (wykonać iloczyn tabel; sprawdzić jak wpływa wartość null w polu Telefon na wynik iloczynu) c) Podać firmy, które są tylko odbiorcami towarów. d) Podać firmy, które są tylko dostawcami towarów. e) Podać firmy, które nie są jednocześnie dostawcami i odbiorcami towarów. Zadania dodatkowe 1. Znaleźć firmy, z którymi nie była przeprowadzona żadna transakcja. 2. Znaleźć towary, które były przez Naszą firmę sprzedawane klientom z Wrocławia i nie były sprzedawane klientom z województwa dolnośląskiego (spoza Wrocławia). 3. Utworzyć za pomocą kwerendy tabelę "M1" o schemacie {NazwaMjc} miejscowości klientów kupujących w Naszej firmie konserwę albo kawę, oraz tabelę "M2" o schemacie {NazwaMjc} miejscowości klientów kupujących herbatę. Znaleźć miejscowości, które znalazły się w obu tabelach. 4. Znaleźć poszukiwane w zadaniu 3 miejscowości bez tworzenia tabel, w jednej kwerendzie SQL z podkwerendami. 5. Utworzyć za pomocą kwerendy tabelę "T1" o schemacie {Symbol,Nazwa} towarów, które były kupowane w Naszej firmie przez klientów z Wrocławia w lipcu 1992 albo przez klientów z
Krakowa w sierpniu 1992 i tabelę "T2" o schemacie {Symbol,Nazwa} towarów sprzedawanych klientom z Warszawy kiedykolwiek. Znaleźć towary, które są w tabeli "T1" i nie występują w "T2" 6. Utworzyć za pomocą kwerendy tabelę "W1" o schemacie {NazwaWoj} województw firm, którym Nasza firma sprzedawała albo od nich kupowała kawę na kwotę większą niż 30 zł jednorazowo oraz tabelę "W2" nazw województw firm, z którymi przedmiotem transakcji (kupna lub sprzedaży) była konserwa lub ryż. Zsumować zawartość tabel W1 i W2 w tabeli W2. 7. Utworzyć za pomocą kwerendy tabelę "K1" o schemacie {Numer, NazwaNabywcy} numerów i nazw firm, które kupowały od Naszej firmy kawę w lipcu 1992 roku albo chrupki kiedykolwiek oraz tabelę "K2" firm kupujących w Naszej firmie towary w puszkach. Znaleźć firmy występujące w K1 i nie występujące w K2 8. Znaleźć towary, które były sprzedawane przez Naszą firmę klientom z Wrocławia, ale nigdy nie były sprzedawane klientom z Krakowa. 9. Znaleźć towary, które były kupione od Naszej firmy (na kwotę > 20 zł jednorazowo) przez klientów z Wrocławia i przez klientów z Krakowa. 10. Do listy klientów, którzy kupili u nas kawy w sumie na kwotę > 100 dołączyć klientów, którzy kawy u nas nigdy nie kupili, ale każdy z nich kupił "pasztet" i "zupy choise".
Temat 5. Operacja dzielenia. Operacja dzielenia pozwala znaleźć rekordy dzielnej, które łączą się z każdym rekordem dzielnika. Dane są tabele: r(r) i s(s) q(r-s) =r(r) s(s) = π {R-S} (r) - π {R-S} ((π {R-S} (r) s) - r), gdzie r dzielna, s dzielnik, operacja iloczynu kartezjańskiego, π {R-S} (r) operacja projekcji tabeli r na schemat R-S (R schemat tabeli r, S schemat tabeli s). Schemat ilorazu jest różnicą schematów dzielnej i dzielnika. Zadanie 1 Podać nazwy i adresy firm, które kupiły od Naszej firmy każdy z towarów podanych w tabeli: s(symbol_towaru ) 007 009 059 Uwaga: przy tworzeniu zestawienia r(symbol_towaru, Nr Nabywcy) odpowiednika relacji r ze wzoru wyżej, ograniczyć się tylko do towarów w s(symbol_towaru) wykorzystując selektywne właściwości złączenia (wykonanie r := r [Symbol_towaru=Symbol_towaru] s pozostawi w relacji r tylko te transakcje, które dotyczyły towarów z s). Przykład rozwiązania (jednego z możliwych) w krokach: 1. Dzielnik: SELECT symbol FROM Towary WHERE (Symbol='007') OR (Symbol = '009') OR (Symbol = '059'); ; zapamiętujemy kwerendę np. pod nazwą 'Kw dzielnik'. 2. Dzielna - tabela z dwoma kolumnami: numerem nabywcy i symbolem towaru, który nabył (z ograniczeniem tylko do towarów, które są w dzielniku): SELECT DISTINCT NrNabywcy, SmbTow INTO [Tab Dzielna] FROM Dokumenty INNER JOIN (PozycjeDokumentu INNER JOIN [Kw Dzielnik] ON ([Kw Dzielnik].Symbol=PozycjeDokumentu.SmbTow)) ON (PozycjeDokumentu.NrSprzedawcy = Dokumenty.Nrsprzedawcy) and (Dokumenty.NrFaktury=PozycjeDokumentu.NrFaktury); 3. Iloczyn kartezjański Dzielnika i Dzielnej: SELECT DISTINCT NrNabywcy, Symbol INTO [Tab Iloczyn] FROM [Kw Dzielnik],[Tab Dzielna]; 4. Iloczyn Dzielna: DELETE DISTINCTROW [Tab Iloczyn].* FROM [Tab Dzielna] INNER JOIN [Tab Iloczyn] ON ([Tab Dzielna].NrNabywcy=[Tab Iloczyn].NrNabywcy) and ([Tab Dzielna].SmbTow=[Tab Iloczyn].Symbol); 5. Dzielna Iloczyn: DELETE DISTINCTROW [Tab Dzielna].*
FROM [Tab Dzielna] INNER JOIN [Tab Iloczyn] ON ([Tab Dzielna].NrNabywcy=[Tab Iloczyn].NrNabywcy); 6. Krok ostatni. SELECT DISTINCT NrNabywcy, Nazwa FROM [Tab Dzielna] INNER JOIN Firmy ON ([Tab Dzielna].NrNabywcy=Firmy.Nr); Rozwiązanie zadania za pomocą jednej kwerendy z podkwerendami: znajdujemy dzielnik i dzielną a następnie zamiast kroków 3-6 wykonujemy kwerendę: SELECT Distinct Firmy.Nr, Firmy.nazwa FROM [Tab Dzielna] as r1 INNER JOIN Firmy ON (r1.nrnabywcy=firmy.nr) WHERE NOT EXISTS (SELECT * FROM [Kw Dzielnik] WHERE NOT EXISTS ( SELECT * FROM [Tab Dzielna] AS r2 WHERE (r1.nrnabywcy=r2.nrnabywcy) and (r2.smbtow=[kw Dzielnik].Symbol ))); Zadania 1. Znaleźć miejscowości, z których klienci kupili w Naszej firmie każdy z towarów: "Zupy CHOISE"," Orzeszki solone", ""Kawa BURG" (niekoniecznie każdy z klientów każdy z towarów!). 2. Znaleźć towary, które były sprzedawane przez Naszą firmę klientom w każdej z miejscowości: Wrocław, Bytom, Białystok. 3. Znaleźć dokumenty, w których występuje każdy z towarów: "Kawa BURG", "Orzeszki solone", "Zupy CHOISE" 4. Podać nazwy firm, które kupowały u nas każdy z towarów sprzedanych nam na podstawie faktury numer R/45/H/92. 5. Znaleźć dni, w których Nasza firma sprzedawała każdy z trzech najlepiej sprzedających się (pod względem sumarycznej kwoty) towarów. 6. Znaleźć klientów, którzy kupili u nas każdy z towarów wymienionych w dokumentach z dnia 1992-10-09 lub z dnia 1992-07-23. 7. Znaleźć towary, które były u nas kupowane przez każdego z klientów z województwa opolskiego.
Temat 6. Teta - złączenie Zadania 1. Znaleźć firmy, które kupiły od Naszej Firmy jakikolwiek pasztet przed firmą o numerze 698. Wskazówki:zadanie można wykonać w dwa kroki:za pomocą kwerendy wybierającej znaleźć,kiedy klient o numerze 698 po raz pierwszy kupił pasztet. W następnej kwerendzie dokonać porównania. 2. Znaleźć firmy, które kupiły od Naszej Firmy wartościowo więcej niż firma o numerze X zadanym parametrem. Wskazówki:zadanie można wykonać w trzy kroki:za pomocą kwerendy wybierającej znaleźć kwotę sumaryczną zakupu wskazanego klienta. Zadać numer parametrem umieszczając w klauzuli HAVING firmy.nr=[podaj numer:] lub dowolny inny tekst. Przy wykonaniu kwerendy ACCESS zapyta o nieznaną wartość. W drugiej kwerendzie należy znaleźć listę firm i ich sumaryczne kwoty zakupu. W następnej kwerendzie dokonać porównania. 3. Znaleźć firmy, które kupowały od Naszej Firmy przed firmą o nazwie X zadanej parametrem. 4. Znaleźć towary typu kawa, które były sprzedane przez Naszą Firmę po cenie wyższej niż najwyższa cena kawy o nazwie X zadanej parametrem w miesiącu zadanym parametrem. 5. Znaleźć transakcje wcześniejsze od transakcji danej numerem dokumentu i numerem firmysprzedawcy. 6. Znaleźć firmy, których sumaryczna kwota zakupów w Naszej Firmie w sierpniu 1992r. była większa niż w lipcu.
Załącznik 1. Wstęp System zarządzania bazą danych (SZBD) jest to oprogramowanie przeznaczone do tworzenia i użytkowania aplikacji z bazą danych. Przez aplikację rozumie się tu gotowe do użycia oprogramowanie użyteczne w konkretnym zastosowaniu, np. w firmie: ewidencja i rozliczanie sprzedaży, ewidencja zamówień, ewidencja pracowników oraz w domu: mini książka telefoniczna, ewidencja użytecznych w domu firm usługowych itp. Aplikacja z bazą danych powinna zawierać następujące elementy: - bazę danych jest to podstawowy element aplikacji, - procedury wyszukiwania i przetwarzania danych, - interfejs użytkownika (język wymiany danych i poleceń między aplikacją i użytkownikiem). - procedury administrowania aplikacją. By użytkować aplikację z bazą danych należy ją najpierw zaprojektować i wykonać. Polega to na: - zdefiniowaniu i utworzeniu bazy danych, - zdefiniowaniu i wprowadzeniu procedur wyszukiwania i przetwarzania danych, - zdefiniowaniu i wprowadzeniu definicji interfejsu użytkownika. - zdefiniowaniu i wprowadzeniu parametrów procedur ochrony. Aplikacja w systemie ZBD jest pamiętana w komputerze w pliku o identyfikatorze: xxxxx...xxx.mdb gdzie: xxxxx...xxx jest nazwą zgodną z regułami systemu operacyjnego, mdb jest rozszerzeniem charakterystycznym dla aplikacji MS ACCESS w wercji 2003 iwcześniejszych. W wersji 2007 accdb. Aplikacje MS ACCESS mogą być zawarte w jednym lub wielu plikach. Pliki te zawierają bazę danych i definicje potrzebne do funkcjonowania aplikacji. Uruchomienie systemu MS ACCESS odbywa się zgodnie mechanizmami MS Windows. Po uruchomieniu opcjonalnie pojawia się okno systemu z menu o pozycjach, między innymi: Plik i Pomoc. Utworzenie nowego pliku polega na wyborze opcji Nowa baza danych z menu. Gdy pojawi się okno dialogowe, należy podać nazwę pliku aplikacji oraz miejsce (urządzenie i katalog) jego zapamiętania. Po podaniu tych danych następuje utworzenie nowego pliku o rozszerzeniu mdb (accdb) i w oknie systemu pojawia się okno aplikacji z bazą danych. W oknie widzimy z lewej strony tzw. eksplorator obiektów, prezentujący obiekty aktualnie zdefiniowane w bazie danych. Tymi obiektami mogą być: Tabela, Kwerenda (żądanie, zapytanie)
Formularz Raport Makro Moduł Utworzenie aplikacji, o którym była mowa wyżej polega na zdefiniowaniu i utworzeniu obiektów aplikacji wyżej nazwanych typów (wszystkich lub niektórych). Obiekty typu Tabela są podstawowe dla aplikacji, ponieważ stanowią one bazę danych. Wiele tabel może składać się na bazę danych aplikacji. Obiekty typu Kwerenda zawierają definicje procedur wyszukiwania i przetwarzania danych umieszczonych w tabelach. Obiekty typu Formularz zawierają definicje sposobów prezentacji danych z tabel na ekranie monitora Obiekty typu Raport zawierają definicje sposobów prezentacji danych z tabel na ekranie monitora lub papierze drukarki Obiekty typu Makro zawierają definicje makropoleceń, czyli definicje sekwencji poleceń jakie MS ACCESS ma wykonać by zrealizować określona funkcję użytkową. Obiekty typu Moduł zawierają definicje procedur i funkcji zapisanych w języku programowania ACCESS BASIC. 2. Wybrane typy danych (dziedzin wartości) i ich właściwości. Typ danych Rozmiar Opis BIT 1 bajt Wartości Tak i Nie oraz pola zawierające tylko jedną z dwóch wartości. BYTE 1 bajt Liczba całkowita z przedziału od 0 do 255. MONEY 8 bajtów Liczba całkowita z przedziału od [ 922 337 203 685 477,5808; 922 337 203 685 477,5807] DATETIME 8 bajtów Wartość daty lub godziny z przedziału lat od 100 do 9999. REAL FLOAT 4 bajtów 8 bajtów Wartość rzeczywista o pojedynczej precyzji mieszcząca się w przedziale [ 3,402823E38; 1,401298E-45] dla wartości ujemnych i [ 1,401298E-45; 3,402823E38] dla wartości dodatnich oraz 0. Wartość rzeczywista o podwójnej precyzji należąca do zakresu [ 1,79769313486232E308; 4,94065645841247E-324] dla wartości ujemnych i [ 4,94065645841247E-324; 1,79769313486232E308] dla wartości dodatnich oraz 0. SMALLINT 2 bajtów Liczba całkowita z przedziału [ 32 768; 32 767]. INTEGER 4 bajtów Liczba całkowita z przedziału [ 2 147 483 648; 2 147 483 647].
TEXT 2 bajty na znak Od zera do maksymalnie 2,14 gigabajta. CHARACTER 2 bajty na znak Od zera do 255 znaków. 3. Budowa wyrażeń w instrukcjach SQL W wyrażeniach można użyć: operatory, identyfikatory, nazwy funkcji, literały, stałe. Operatory arytmetyczne: Operator Znaczenie + Suma dwóch liczb. - różnica miedzy dwoma liczbami i oznaczenie liczby ujemnej. * iloczyn dwóch liczb. / iloraz dwóch liczb. \ Mod zaokrąglij do całkowitych dzielną i dzielnik, oblicz iloraz oraz z ilorazu odrzuć część ułamkową. oblicz resztę dzielenia dwóch liczb. ^ podnieś do potęgi. Operatory porównania: Operator Znaczenie < dla x<y zwraca wartość TRUE, gdy x jest mniejsze od y <= dla x<=y zwraca wartość TRUE, gdy x jest mniejsze lub równe y > dla x>y zwraca wartość TRUE, gdy x jest większe od y >= dla x>=y zwraca wartość TRUE, gdy x jest większe lub równe y = dla x=y zwraca wartość TRUE, gdy x jest równe y <> dla x<>y zwraca wartość TRUE, gdy x nie jest równe y Operatory logiczne: Operator Znaczenie And Or Eqv Not zwraca TRUE gdy wyrażenie1 i wyrażenie2 są prawdziwe. zwraca TRUE gdy wyrażenie1 lub wyrażenie2 jest prawdziwe. zwraca TRUE gdy oba wyrażenie1 i wyrażenie2 są prawdziwe lub oba wyrażenie1 i wyrażenie2 są nieprawdziwe zwraca TRUE gdy wyrażenie nie jest prawdziwe Xor Operatory napisowe: Operator Znaczenie zwraca TRUE gdy albo wyrażenie1 albo wyrażenie2 są prawdziwe. & dla napis1&napis2 wynikiem jest napis1, po którym następuje bezpośrednio napis2. + jak dla &, ale gdy jeden lub oba napisy są NULL to wynik jest NULL.
Operatory specjalne: Operator Znaczenie Is Null lub Is Not Null Like "wzorzec" dla x Is Null zwraca wartość TRUE, gdy x jest nieokreśone. dla x Is Not Null zwraca wartość TRUE, gdy x jest okreśone. dla x like wzorzec zwraca TRUE, gdy x pasuje do wzorca. We wzorcu znak? reprezenytuje dowlną pozycję znakową a * - reprezentuje dowolny ciąg znaków. Between wartość1 And wartość2 dla x Between a And b zwraca TRUE a <= x <= b. In (wartość1, wartość2,...) Niektóre funkcje: Funkcja Date() Now() Year(data) dla x IN (wartość1, wartość2,...) zwraca TRUE gdy x {wartość1, wartość2,...}. Znaczenie zwraca bieżącą datę z zegara komputera. zwraca bieżącą datę i czas z zegara komputera wymaga argumentu typu Data i zwraca rok jako 4-cyfrową liczbę. Month(data) wymaga argumentu typu Data i zwraca miesiąc jako liczbę z zakresu 1-12. Right(arg1,arg2) Left(arg1,arg2) Mid(arg1,arg2,arg3) Len(napis) zwraca prawą część napisu (arg1), licząc tyle znaków od prawej na ile wskazuje arg2. zwraca lewą część napisu (arg1), licząc tyle znaków od lewej na ile wskazuje arg2. zwraca podnapis napisu arg1 od znaku w pozycji arg2 i długości arg3. zwraca liczbę znaków w napisie (długość napisu). Avg(kol) średnia wartości z kolumny 'kol'. Count(kol) First i Last(kol) Min i Max(kol) liczba wartości w kolumnie 'kol'. pierwsza i ostatnia wartość w kolumnie 'kol'. najmniejsza i największa wartość w kolumnie 'kol'. Sum(kol) suma wartości z kolumny 'kol'. Użycie operatora Like. Składnia: Like wzorzec ; operator porównuje wprowadzoną daną ze wzorcem. Przykłady przedstawiają wzorce i dwa łańcuchy dla każdego zgodny i niezgodny ze wzorcem.. Rodzaj porównania Wzorzec Zgodny ( True) Nie zgodny ( False) Wiele znaków "a*a" "aa", "aba", "abbba" "abc" "*ab*" "abc", "AABB", "Xab" "azb", "bac" Wyspecyfikowany znak "a[*]a" "a*a" "aaa" Wiele znaków "ab*" "abcdefg", "abc" "cab", "aab" Pojedynczy znak "a?a" "aaa", "a3a", "aba" "abbba" Pojedyncza cyfra "a#a" "a0a", "a1a", "a2a" "aaa", "a10a"