Do Baz Danych
Zawsze byłem zdania, że najlepiej rozmawia się o rzeczach konkretnych,
a jeszcze lepiej o takich, które istnieją w rzeczywistości (więc może
dlatego zostałem inżynierem a nie filozofem).
Każdy z nas chodził lub chodzi do szkoły. A w szkole jak to w szkole,
dostajemy stopnie, z każdego przedmiotu po kilka podczas semestru.
Zabawmy się projektanta baz danych budującego bazę danych dla szkoły.
Ażeby za bardzo nie zagmatwać sprawy zrobimy sobie bazę dla jednej klasy
Nasza klasa składa się z kilku osób i tworzy tabelę Uczniowie:
ID |
Imię |
Nazwisko |
1 |
Jasio |
Kowalski |
2 |
Ania |
Nowak |
3 |
Zosia |
Kowal |
4 |
Tomek |
Iksiński |
5 |
Janek |
Zetowski |
Każdy uczeń identyfikowany jest w tabeli jednym numerem,
który nie powtarza się: Jasio to "1" Ania to "2" itd.. Kolumna"ID"
jest to tzw. klucz podstawowy.
Oprócz uczniów są w szkole także przedmioty. A jeżeli są przedmioty
(mniej i bardziej lubiane w zależności od tego co dany osobnik lubi)
to jest i następna tabela. (Nie denerwujcie się!. Za parę minut będzie
wszystko wiadomo.). Aby łatwiej nam się uczyło, weźmiemy pod uwagę tylko
kilka przedmiotów i stwórzmy tabelę Przedmioty
Przedmiot |
OpiniaOPrzedmiocie |
Matematyka |
królowa nauk |
Fizyka |
bardzo praktyczna |
Chemia |
nie cierpię |
Angielski |
prosty |
Niemiecki |
praktyczny |
Pierwsza kolumna to wspomniany wcześniej klucz podstawowych. W tej
kolumnie wartości muszą być unikatowe.
Druga kolumna tabeli to obraz prywatnej opinii autora tej strony.
Proszę więc nie przywiązywać do tego wagi. A kolumna "nr 2" przyda się nam
później - w zapytaniach
W szkole, jak to w szkole, uczniowie są oceniani za swoje postępy w nauce
Stworzymy więc kolejną tabelę Ocena, w której będą wypisane rodzaje ocen
Ocena |
OpisOceny |
1 |
Pała |
2 |
Mierny |
3 |
Dostateczny |
4 |
Dobry |
5 |
Bardzo dobry |
6 |
Celujący |
Są uczniowie, są przedmioty, są oceny, więc musi być i jakieś połączenie między
nimi. W szkole są dzienniki ze stronami na odpowiednie przedmioty,
a w bazie jest tabela wiążąca uczniów z przedmiotami.Załóżmy, że jest
środek semestru. Na każdej lekcji różni uczniowie byli pytani na stopnie
z różną częstotliwością.Jasio ma np. 2 stopnie z matematyki, 1 z fizyki itd..
Nasza tabela PrzedmiotUczeńOcena będzie wyglądać tak:
IDP |
Przedmiot |
Uczeń |
Ocena |
1 |
Matematyka |
1 |
3 |
2 |
matematyka |
1 |
5 |
3 |
Fizyka |
3 |
2 |
4 |
Angielski |
5 |
3 |
5 |
Chemia |
5 |
4 |
6 |
Niemiecki |
5 |
6 |
7 |
Niemiecki |
4 |
1 |
Z tabeli tej można odczytać:
"Nr 1" - Jasio ma z matematyki 3(dostateczny) i 5(b. dobry)
"Nr 3" - Zosia nie ma głowy do fizy i ma tylko 2(mierny)
"Nr 5" - Janek ma z "anglika" 3(dostateczny), z chemii 4(dobry)
a z "niemca" 6(celujący), bo ma dziadka w Reich'u
"Nr 4" - Tomek uznaje tylko języki słowiańskie i z "niemca" ma 1(pałę)
Mam nadzieję, że jak dotąd wszystko było oczywiste.
Relacyjna baza danych to pewien program do przechowywania danych
A dane trzeba tak przechowywać, aby zajmowały jak najmniej miejsca
w pamięci komputera oraz aby możliwie najmniej razy wpisywać tę samą daną
co wiąże się także z możliwością powstania nieścisłości
Ażeby teraz jakoś zastosować te nasze tabele najlepiej będze jeżeli
zbudujemy formularze. Formularze są bardzo pomocne w procesie wypełniania tabel.
Zbudowanie prostego formularza dla jednej tabeli nie jest żadnym
problemem w znanych mi programach (Borland Delphi, Borland Builder C,
Microsoft Access). W programach tych istnieją kreatorzy, którzy
automatyzują cały proces tworzenia formularza. Jedynym problemem
jest fakt iż wygląd formuarza stworzonego przez taki kreator może odbiegać
od naszego wyobrażenia. Tworzenie formularza "na piechotę" jest powolniejsze, ale
jesteśmy w stanie ukształtować od razu nasz formularz takim, jaki nam się podoba.
W przypadku budowy formularza złożonego (tabela nadrzędna - tabela podrzędna)
istnieje tylko możliwość zawarcia w nim tylko jednej relacji używając kreatora.
W przypadku bardziej złożonych formularzy musimy wykonywać je "na piechotę".
W naszym konkretnym przypadku utworzylibyśmy następujące formularze:
Formularz główny (Przedmiot-PrzedmiotUczeńOcena)
Uczniowie
Ocena
Formularz główny może wyglądać np jak poniżej:
Tworzenie tabel i formularzy Ocena i Przedmioty jest działaniem
"na wyrost" w naszym przypadku (mamy tylko 6 ocen i 5 przedmiotów,
ale w przypadku baz danych gdzie tabele zawierałyby setki lub tysiące
danych, które powinny być zapisywane w bazie danych bez pomyłek
powyższe tabele byłyby bardzo uzadadnione.
Ażeby nasze dany były wiarygodne i przy wykreślaniu np. fizyki z listy
przedmiotów zniknęly z bazy danych wszystki rekordy z innych tabel zawierających
"fizykę" potrzebne jest określenie relacji pomiędzy tabelami (nie mogą przecież
w tabeli PrzedmiotyUczeńOcena istnieć stopnie z fizyki).
Poniżej znajduje się rysunek obrazujący wzajemne relacje tabel w naszej bazie danych:
SELECT | FROM | WHERE | DISTINCT | AND | OR | IN | BETWEEN | LIKE | SUM( ) | AVG() | MIN( ) | MAX( ) | COUNT( ) | CREATE TABLE | DROP TABLE | DELETE | CREATE INDEX | DROP INDEX | INSERT | UPDATE | ALTER TABLE | GROUP BY | ORDER BY | HAVING | CREATE DATABASE | USE | SHOW DATABASES | SHOW TABLES | DESCRIBE | powrót | Przykładowa baza danych
Stworzenie bazy danych o poprawnej strukturze to jeden problem. Poprawnie
skonstruowane tabele i relacje między nimi ułatwiają wprowadzanie
danych oraz utrzymanie porządku w bazie. Stworzone przez nas formularz ułatwiają
nam wprowadzanie danych do poszczególnych tablic. Jednak, aby wybrać z bazy
to czego szukamy, potrzebujemy umiejętności posługiwania się językiem SQL
(tzn. Structured Query Language). Dopiero znając SQL jesteśmy w stanie wydobyć
z bazy dane, które nas interesują w danym momencie.
SQL jest bardzo elastycznym językiem pozwalającym operatorowi bazy danych
wybrać dane zgodne z założonymi wcześniej kryteriami.
W zależności, z jakiego programu korzystamy, istnieją pewne kosmetyczne
różnice w zapisie instrukcji SQL (należy wtedy przejrzeć dokumentację programu,
jednak podstawowy zapis instrukcji SQL jest podobny.
klucz podstawowy - jest to pole tabeli identyfikujące jednoznacznie
dany rekord. Innymi słowy, każde pole w kolumnie klucza podstawowego ma
inną niepowtarzalną wartość. W tabeli Uczniowie będzie to kolumna "ID"
SELECT - jest to podstawowa instrukcja języka SQL i zawsze występuje w parze
z klauzulą FROM. Najprostsza postać instrukcji może wyglądać jak poniżej:
Wynikiem powyższej instrukcji będzie taka sama tabela danych, z której korzystaliśmy
jako ze źródła. Spytacie więc po co taka prosta instrukcja skoro nie daje nam nic.
Jeżeli zamiast * wstawimy nazwę jednego lub kilku pól oddzielonych przecinkami, to
otrzymamy jako wynik zawartość wyszczególnionych tylko pól.
Jeżeli chcemy pobrać dane z kilku tabel to należy:
gdy w różnych tabelach istneją pola o tej samej nazwie, przed nazwą pola umieścić nazwę tabeli z której pochodzi pole i kropkę np.: Uczniowie.Imię
gdy nazwy pól nie powtarzają się w różnych tabelach to wpisywanie przed nie
nazwy tabel, z których pochodzą, nie jest konieczne
*-symbol ten oznacza, że pobierane są wszystkie kolumny z tabeli
FROM-klauzula ta wskazuje, o które tabele nam chodzi tzn. z których tabel
chcemy pobrać dane. W przypadku pobierania danych z kilku tabel, nazwy tabel oddzielamy
przecinkami (,).
WHERE-klauzula ta pozwala ustalić warunek jaki muszą spełniać
rekordy tabeli, aby były wybrane przez zapytanie.
Najprostszy warunek może wyglądać tak:
Z tabeli Uczniowie zostaną wybrane tylko rekordy, w których pole "Imię" będzie
miało wartość "Jasio" (W naszym wypadku będzie to pierwszy rekord tabeli).
Klauzula WHERE może także służyć do prostego połączenia dwóch tabel, w których
istnieją te same pole. Jeżeli chcemy np.: wybrać uczniów, którzy mają z niemieckiego
jakieś stopnie, ale chcemy ponadto znać ich nazwiska i imiona zbudujemy następujące
zapytanie dla tabel "Uczniowie" oraz "PrzedmiotUczeńOcena":
SELECT Uczniowie.Imię, Uczniowie.Nazwisko, PrzedmiotUczeńOcena.Przedmiot,
PrzedmiotUczeńOcena.Ocena
FROM Uczniowie, PrzedmiotUczeńOcena
WHERE PrzedmiotUczeńOcena.Uczeń=Uczniowie.ID
AND PrzedmiotUczeńOcena.Przedmiot='Niemiecki'
Zapytanie wybierze nam dane:
|
Imię |
Nazwisko |
Przedmiot |
Ocena |
Janek |
Zetowski |
Niemiecki |
6 |
Tomek |
Iksiński |
Niemiecki |
1 |
DISTINCT - klauzula ta pozwala na wybranie różnych rekordów z zestawu przez nas
zaporponowaniego. Najlepiej wyjaśni to przykład:
Instrukcja:
wybierze całą tabelę PrzedmiotUczeńOcena.
natomiast instrukcja:
zwróci dane:
Przedmiot |
Uczeń |
Matematyka |
1 |
Fizyka |
3 |
Angielski |
5 |
Chemia |
5 |
Niemiecki |
5 |
Niemiecki |
4 |
Wynika z tego, że klauzula DISTINCT "działa" tylko W WYBRANYM PRZEZ NAS ZAKRESIE
(tzn. porównuje wybrany przez nas zakres!)
AND-jest to operator, dzięki któremu możemy tworzyć warunki złożone.
Jest on odpowiednikiem matematycznej koniunkcji.
OR-jest to operator, dzięki któremu możemy tworzyć warunki złożone.
Jest odpowiednikiem matematycznej alternatywy. Przeciwieństwo "AND"
IN-operator ten sprawdza czy dana wartość jest zawarta w określonym zbiorze
Elementy zbioru są zawarte w parze nawiasów i pooddzielane od siebie przecinkami.
BETWEEN-operator ten sprawdza czy wartość zawiera się w przedziale
przez nas podanym.
LIKE-operator ten jest bardzo przydatnym i elastycznym operatorem
Operator ten służy do odnajdywania tylko pól tekstowych. Możemy też zastosować
w nim maski na jeden lub kilka znaków (tak jak przy wyszukiwaniu plików w komputerze.
W zależności od odmiany SQL z jakiej korzystamy, znaki te mają różną postać
Poniższy przykład zobrazuje nam użycie 5 ostatnich operatorów:
SELECT * FROM PrzedmitUczeńOcena
WHERE
Przedmiot LIKE "%e%" AND (Uczeń BETWEEN 1 AND 4) AND (Ocena IN (1,2,3) OR Ocena=6)
Powyższe zapytanie wybrałoby: wszystkie kolumny tabeli PrzedmiotUczeńOcena
z rekordami, w których nazwa przedmiotu zawierać będzie w swojej nazwie "e",
uczniowie mają numery od "1" do "4" i posiadają oceny "1", "2", "3" lub "6"