Zadanie 8a


Do tabelek relacyjnej bazy danych realizującej poniższy diagram ER (zadanie 6) ...

... wprowadź następujące fakty/dane:

  1. mamy pracowników o id = 1,2,3,4,5
  2. mamy dzieła o id = 10,11,12
  3. pracownicy 1,2,3 należą do klasy A
  4. pracownicy 3,4,5 należą do klasy B
  5. dzieło 10 wykonali wszyscy pracownicy klasy A
  6. dzieło 11 wykonali pracownicy klasy B oraz pracownik 1
  7. pracownik 1 uczestniczył w pracach nad dziełem 11 oraz 12
  8. pracownik 3 uczestniczył w pracach nad dziełem 10 oraz 12

.....................................................................................

Access/ kwerendy.

Kwerendy (=zapytania [ang. queries]) służą do "wyciągania" użytecznych informacji z zapisanych w tabelkach danych  ...

Okienko kwerend może się znajdować w trybach:

Uwaga: w Accesie nie trzeba koniecznie znać języka SQL gdyż można tworzyć kwerendy w języku wizualnym QBE, a one są automatycznie tłumaczone na SQL !. "Jet" czyli tzw silnik bazodanowy (ang. engine) Accesu rozumie język SQL ...

Istnieją następujące typy kwerend:

Ćwiczenie 9


Opisy kwerend funkcjonalnych są dostępne w "Pomocy" programu Access. Spróbuj wpisać w polu "Wpisz pytanie do Pomocy" (prawy górny róg okna programu Access) hasło "kwerendy", a następnie wybierz opcję "Typy kwerend -- informacje" ...

 

Kwerendy wybierające.

Tworzymy nową kwerendę guzikiem "Nowy" | "Widok projektu" (NIE włączamy żadnego kreatora !).

  1. Wprowadzamy tabele które będą uczestniczyć w kwerendzie
  2. Wybiera się które pola chcemy zobaczyć ("Pole:", "Pokaż:"); to jest rzutowanie
  3. Wybiera się które wiersze chcemy zobaczyć ("Kryteria:", "lub:"); to jest selekcja
  4. Można zmieniać nazwy pól (a także tworzyć pola wyliczane) wpisując w wierszu "Pole:"

Jeśli wprowadzimy taką kwerendę:

to po jej "uruchomieniu" (czyli przejściu do trybu "Widok arkusza danych") dostaniemy:

 

Zadanie 9a


W magazynowej bazie danych realizującej poniższy diagram ER ...

... postaraj się utworzyć kwerendy (w siatce projektowe) dające opisane niżej efekty.
Zapisuj każdą utworzoną kwerendę pod nazwą "Zadanie 9a (pkt ?)".
(Kto nie ma własnej bazy może użyć "bd02.mdb").

  1. chcę zobaczyć wszystkich klientów (poprzez kwerendę a nie tabelę !);
  2. chcę zobaczyć wszystkie zamówienia ze wszystkimi dostępnymi informacjami;
    czyli coś w tym rodzaju (zwróć uwagę na zmienioną etykietkę 3 kolumny !):
  3. chcę zobaczyć zamówienia (i wszystkie dostępne informacje o nich) klientów:
        "Jan Kowalski1" oraz  "Jan Kowalski2"
  4. chcę zobaczyć zamówienia (i wszystkie dostępne informacje o nich) klientów:
        "Jan Kowalski1" oraz  "Jan Kowalski2"
    złożone po dacie:
        #2/12/2003#
  5. chcę zobaczyć zamówienia (i wszystkie dostępne informacje o nich) klientów:
        "Jan Kowalski1" oraz  "Jan Kowalski2"
    na towary:
        "qqq1" lub "qqq2" lub "qqq3"
  6. chce zobaczyć jakie towary zamawiali poszczególni klienci;
    rekordy nie mają się powtarzać mimo że dany klient mógł wielokrotnie zamawiać ten sam towar - w tym celu ustaw właściwość Wartości unikatowe kwerendy na "tak"; sortuj względem klientów, aby towary danego klienta były "zgrupowane" !

 

Kwerendy wybierające z podsumowaniem.

Aby kwerenda wybierająca stała się "kwerendą wybierającą z podsumowaniem" trzeba spowodować aby się pojawił wiersz "Podsumowanie:" - włącza się go guzikiem w okienku projektowym kwerendy.
 
Zasada: Można pogrupować rekordy tabeli i w każdej grupie rekordów obliczać funkcje agregującą danego pola lub wyrażenia

Grupy rekordów definiuje się przez podanie pola (lub pól) które są równe w grupie (pod polem grupującym, w linii "Podsumowanie:" wybierz "Grupuj według").

Istnieją następujące funkcje agregujące:

patrz też pomoc Accesu:
       
podsumowanie
        Obliczenia w kwerendzie -- informacje
        Funkcje agregujące ...

Przykład 1:

Obliczamy ile jest zamówień na dany towar ([id towaru]):

Po uruchomieniu kwerendy dostaniemy:

 

Przykład 2:

To samo co poprzednio, dodatkowo użyjemy "Wyrażenia" w podsumowaniu";
(oczywiście jest to przykład "teoretyczny")

 

Zadanie 9b


W magazynowej bazie danych utwórz kwerendy dające opisane niżej efekty.
Zapisuj każdą utworzoną kwerendę pod nazwą "Zadanie 9b (pkt ?)".
(Można użyć magazynowej bazy danych bd02.mdb).

  1. chce zobaczyć łączną ilość zamówień dla każdego towaru
  2. chce zobaczyć łączną wartość zamówień dla każdego klienta
  3. chce zobaczyć łączną wartość zamówień dla każdego towaru
  4. chce zobaczyć zamówienia pewnego (dowolnego) klienta; ma to być tzw kwerenda parametryczna (patrz też tutaj), po jej uruchomieniu powinno się pojawić pytanie o imię i nazwisko klienta, aby to osiągnąć w polu "Kryteria:" wpisz [Podaj imię i nazwisko klienta] - nie ma pola o takiej nazwie w żadnej z tabel !
  5. chce zobaczyć tabelę zawierającą klientów i ich zamówienia w tym także klientów którzy nie złożyli żadnego zamówienia (patrz też tutaj); zmień właściwość linii złączającej tabele (prawy guzik myszy na linii + "Właściwości sprzężenia"):
        Klienci/Zamówienia - tutaj mają być dostępne wszystkie rekordy tabeli Klienci
        Zamówienia/Towary - tutaj mają być dostępne wszystkie rekordy tabeli Zamówienia (?)
    spodziewam się że dla klientów bez zamówienia pola opisujące zamówienie będą miały wartość NULL; efekt końcowy powinien być taki:
  6. policz ile jest towarów w tabeli Towary; w tym celu wprowadź do kwerendy tylko tabelę Towary, wstaw pole [id towaru] i wybierz dla niego "Policz" w linii "Podsumowanie:"
    1. następnie dodaj tabelę Zamówienia i znów uruchom tę kwerendę; porównaj otrzymane wyniki !
    2. zmień typ złączenia tak aby były pokazywane wszystkie rekordy tabeli Towary (nawet te na które nie ma żadnego zamówienia); znów porównaj otrzymane wyniki !
    3. uwaga: grupownie+agregowanie działa na złączeniu tabel, dlatego wprowadzanie dodatkowych tabelek MA WPŁYW na wynik obliczeń (w punktach a i b jest on oczywiście nieprawidłowy !)
       

Zadanie 9c (;-);)


Na przykładzie kwerendy obliczającej "łączną wartość zamówień danego klienta" pokaż, że jest różnica gdy tę wartość obliczmy na następujące sposoby:

  1. SUMA(ilosc * cena)
  2. SUMA(ilosc) * SUMA(cena)

Obliczaj łączną wartość zamówień na dwa sposoby w tej samej kwerendzie i tak dobierz dane w tabelach żeby było widać że coś jest nie tak ...

 

Kwerenda parametryczna.

Aby utworzyć kwerendę parametryczną wystarczy użyć w kryteriach identyfikatora który nigdzie nie występuje.

Można zdefiniować typ parametrów kwerendy (menu kontekstowe obok tabelek | Parametry ...); wtedy nie da się wprowadzić wartości nieodpowiedniego typu.

Zadanie 9d


W magazynowej bazie danych chce zobaczyć zamówienia pewnego (dowolnego) klienta które zostały złożone w podanym okresie od-do; ma to być kwerenda parametryczna; po jej uruchomieniu powinno się pojawić pytanie o imię i nazwisko klienta oraz o okres od-do; użyj operatora "between ? and ?"; ustaw odpowiednio typ parametrów kwerendy !.
 

Kwerenda krzyżowa.

Jeśli w kwerendzie wybierającej z podsumowaniem:

  1. grupujemy względem dwóch pól P1 i P2
  2. w każdej grupie rekordów obliczamy zagregowaną wartość W (np. W=Suma(P3))

to można wynik takiej kwerendy przedstawić w postaci "arkusza kalkulacyjnego", przy czym:

(w poniższej tabelce zakładamy że P1 przyjmuje wartości A, B, C oraz że P2 przyjmuje wartości 1,2,3,4)

P1 1 2 3 4
A W dla grupy rekordów w której P1=A oraz P2=1 ? ? ?
B ? W dla grupy rekordów w której
dla P1=B oraz P2=2
? ?
C ? ? ? ?

Trzeba zmienić typ kwerendy na kwerendę krzyżową, pojawi się linia "Krzyżowe:" w projekcie kwerendy;
a następnie w linii "Krzyżowe:"
    wybrać które pole grupujące ma być nagłówkiem wiersza,
    wybrać które pole grupujące ma być nagłówkiem kolumny,
    wybrać które zagregowane pole ma być wartością.

Zadanie 9e


W magazynowej bazie danych utwórz kwerendę krzyżową pokazującą wartość zamówień na poszczególne towary z podziałem na miesiące. Kwerenda ta powinna wyglądać tak:

Wskazówki do zadania 9e:
Na początku utwórz taką kwerendę::

nazwa towaru miesiąc suma zamówień
qqq1 01/2003 1232
qqq1 02/2003 100
qqq2 01/2003 1232
qqq2 02/2003 100
qqq2 03/2003 2000
...    

aby to osiągnąć musisz grupować wg:
     Towary.[id towaru] i Towary.nazwa (ale pokazywać tylko nazwę towaru !)
oraz wg pola wyliczanego następującej postaci:
    miesiąc : Format([data];"mm/rrrr");
    (funkcja Format() przedstawia datę w wybranym przez nas formacie, "mm" - miesiąc, "rrrr" - rok)
ponadto dla każdej grupy rekordów musisz zagregować sumę iloczynów ilosc*cena, czyli:
    suma zamówień : Suma([cena]*[ilosc])

Następnie zamień powyższą kwerendę na kwerendę krzyżową - w tym celu:
1. zmień typ kwerendy z wybierającej na krzyżową (w trybie projektowania kwerendy, menu kontekstowe, opcja "Typ kwerendy"); pojawi się linia "Krzyżowe:" ...
2. jako nagłówek wiersza (w linii "Krzyżowe:") wybierz nazwę towaru;
jako nagłówek kolumny wybierz miesiąc;
jako wartość wybierz sumę zamówień.

Powinno to wyglądać tak:

a po uruchomieniu kwerendy ...

(koniec wskazówek do zadania 9e.)



 

QBE a SQL - przykłady.

SQL to "tekstowy" język do zapisywania kwerend (w przeciwieństwie do QBE który jest "wizualny") ...

Dlaczego QBE musi być tłumaczone na SQL ?
Odp: gdyż Jet - czyli silnik bazodanowy Accesu - "rozumie" tylko SQL-a !

SQL to standard używany przez wszystkie relacyjne bazy danych;
istnieją następujące wersje SQL-a:

Najważniejsze polecenie języka SQL to polecenie SELECT ...
ogólna postać polecenia SELECT:

SELECT [predykat] { * | tabela.* | [tabela.]pole1 [AS alias1] [, [tabela.]pole2 [AS alias2] [, ...]] }
        FROM wyrażenie_tabelowe [, ...] [IN zewnętrzna_baza_danych]
        [WHERE... ]
        [GROUP BY... ]
        [HAVING... ]
        [ORDER BY... ]

opis polecenia SELECT dialektu SQL Access-u - patrz tutaj
dokumentacja języka SQL Postgres-u i InterBase-a - patrz tutaj
proste przykłady poleceń SQL - patrz tutaj

Przykład 1:

Następująca kwerenda w języku wizualnym QBE:

Dająca w wyniku:

Po przetłumaczeniu na SQL wygląda tak:

SELECT 	Towary.nazwa, 
	Sum(Zamowienia.ilosc) AS SumaOfilosc, 
	Sum(Towary.cena) AS SumaOfcena, 
	Sum([ilosc]*[cena]) AS wartość, 
	Sum([ilosc])*Sum([cena]) AS [zła wartość]
FROM Towary INNER JOIN 
        (Klienci INNER JOIN Zamowienia 
         ON Klienci.[id klienta] = Zamowienia.[id klienta])
     ON Towary.[id towaru] = Zamowienia.[id towaru]
WHERE (((Klienci.[imie i nazwisko])="Jan Kowalski1")) 
   OR (((Klienci.[imie i nazwisko])="Jan Kowalski2"))
GROUP BY Towary.nazwa
HAVING (((Towary.nazwa)="qqq3")) OR (((Towary.nazwa)="qqq4"))
ORDER BY Towary.nazwa;

Uwaga 1: warunek WHERE działa na złączeniu tabel; warunek HAVING działa po grupowaniu/agregowaniu (czyli na tabeli z "podsumowaniami" grup rekordów).

Uwaga 2: w HAVING możemy się odwoływać do pól grupujących, jak i do zagregowanych wartości !.

Zadanie 10


Do powyższej kwerendy dodaj warunek wybierający wiersze dla których "wartość > 1000". Zobacz jak taka kwerenda wygląda po (automatycznym) przetłumaczeniu na SQL !.
 

Różne rodzaje "złączeń" tabel.

Do tej pory gdy złączaliśmy tabele Zamówienia i Klienci to widzieliśmy tylko tych klientów którzy złożyli przynajmniej jedno zamówienie ...

Można zmienić typ złączenia tak że zobaczymy także klientów bez zamówień, a pola tabeli Zamówienia będą miały dla takich klientów wartość NULL. W widoku projektu kwerendy kliknij na linię łączącą dwie tabele i wybierz "Właściwości sprzężenia", następnie kliknij odpowiedni guzik ...

 

Zadanie 10a


Utwórz kwerendę pokazującą klientów i ich zamówienia, w tym także klientów którzy nie złożyli żadnego zamówienia (ale bez informacji o towarach - NIE wprowadzaj tabeli towary !). Zobacz jak ta kwerenda wygląda w SQLu (LEFT/RIGHT JOIN); zajrzyj także tutaj.

Zadanie 10b


Chce zobaczyć tabelę zawierającą klientów i ich zamówienia w tym także klientów którzy nie złożyli żadnego zamówienia ORAZ informacje o towarach występujących na tych zamówieniach. Zauważ że nie można mieszać różnych rodzajów złączeń tabel w dowolny sposób ! (musi powstać "ścieżka skierowana" w okienku projektowym kwerendy). Zobacz jak ta kwerenda wygląda w SQLu.

 

Kwerendy złożone.

Kwerendy złożone to takie w których używa się nie tylko tabel, ale także wcześniej zdefiniowanych kwerend ...

Kwerendy złożone pozwalają budować bardzo skomplikowaną kwerendę "z klocków" (każdy klocek budowli sam w sobie jest prosty, ale cała budowla - niekoniecznie !).

Zadanie 11
Przypuśćmy że do magazynowej bazy danych dodaliśmy tabelę:

Ceny (id ceny, cena, data, id towaru)

Chcemy otrzymać tabelę w której dla każdego towaru jest widoczna jego bieżąca cena (czyli ta z maksymalną datą).

Wskazówki do zadania 11:
1. sporządź kwerendę z podsumowaniem, opartą na tabeli Ceny, w której grupujemy wg pola [id towaru] i obliczamy maksymalną datę; nazwij tę kwerendę Cena2;
2. sporządź kwerendę w której występują tabele: Ceny, Towary i kwerenda Cena2; złącz odpowiednio te tabele/kwerendy aby otrzymać wynikową tabelę następującej postaci:

id towaru nazwa towaru aktualna cena data
1 qqq1 15zl 1/10/2003
2 qqq2 25zl 5/10/2003
       

Uwaga: problemu z zadania 11 nie da się rozwiązać bez "zagnieżdżania" kwerend ...

 

Jak wybrać z tabeli podzbiór rekordów określony w innej tabeli ?

Powiedzmy że z tabeli Zamówienia chcemy wybrać zamówienia klientów których id znajdują się w tabeli:

Wybrani_kli (id klienta)

Wystarczy złączyć tabelę Zamówienia i Wybrani_kli na polu [id klienta] (złączenie naturalne typu INNER JOIN) !.
W takim złączeniu z iloczynu kartezjańskiego obu tabel wybieramy tylko te tylko te rekordy w których pola [id klienta] są równe, tak więc w szczególności wybieramy tylko te zamówienia których [id klienta] figuruje w tabeli Wybrani_kli (a że [id klienta] w Wybrani_kli jest kluczem, każde zamówienie wystąpi tylko raz).
 


Zadanie 12


Mamy następujący diagram:

Zdefiniuj odpowiednie tabele, następnie sporządź kwerendę:
  1. wyszukującą książki zawierające zadany zbiór słów kluczowych (zbiór słów kluczowych znajduje się w pomocniczej tabeli Poszukiwane_słowa (slowo))
  2. pokazującą ranking książek wg liczby zawieranych poszukiwanych słów

Wskazówki do zadania 12 (... a właściwie kompletne rozwiązanie tego zadania):
Na powyższym ERD brak kluczy [id ksiazki] i [id slowa], które należało dodać.
Diagram realizujemy przy pomocy 3 tabelek: Ksiazki, Slowa_kluczowe, Ksiazki_o (reprezentuje związek wiele-do-wielu).
Zadanie to można rozwiązać przy pomocy następujących kwerend:

Uwaga 1: sposób użycia tabeli Poszukiwane_slowa w kwerendzie "Książki 1" to opisana wyżej metoda wybierania z tabeli podzbioru rekordów, który jest określony w innej tabeli (właśnie w tabeli Poszukiwane_slowa); warto nałożyć indeks na [słowo] w tabeli Słowa_kluczowe !
Uwaga 2
: w "Ksiązki 2", w kryteriach, użyto kwerendy zwracającej pojedynczą wartość !
Uwaga 3: jak uaktualniać otwartą kwerendę po modyfikacji tabeli Poszukiwane_slowa ? Odp: klawisz Shift+F9

Aby sporządzić kwerendę pokazującą ranking książek wg liczby zawieranych poszukiwanych słów wystarczy zmodyfikować kwerendę "Ksiazki 2" - usunąć kryteria i sortować wzg "ilosc" (malejąco).

(Koniec wskazówek do zadania 12.)
 

Zadanie 12a


Wypróbuj rozwiązanie powyższego zadania dla następujących danych:

książka zawiera słowa kluczowe
k1 a
k2 a,b
k3 a,b,c

Poszukaj książek z następującymi zbiorami słów kluczowych:

  1. {a, b}
  2. {a}
  3. {c}

Zadanie 12b (?)


Rozwiąż zadanie 12 stosując zagnieżdżone kwerendy z parametrem. Kwerendy powinny mieć nazwy "Slowa 1", "Slowa 2", ...; jeśli szukamy książki z "k" słowami kluczowymi, to powinniśmy uruchomić kwerendę "Slowa k" !.


.....................................................................
 

Zadanie X1 (długie)


Pewna przychodnia lekarska gromadzi następujące informacje o pacjentkach w takich arkuszach kalkulacyjnych:

Przenieś dane z arkusza do tabeli Access-u:

Oraz skonstruuj następujące kwerendy:

  1. sprawdzającą czy poprawnie wprowadzono dane, tj:
  2. zliczającą ilość wizyt danej pacjentki:
  3. Pokazującą ile pacjentek z danym schorzeniem zgłosiło się w kolejnych miesiącach;
    oraz ile było wizyt: