RELACYJNE BAZY DANYCH
Podstawową właściwością relacyjnej bazy danych jest to, że informacje przechowywane są w tabelach,
a każda z tabel składa się z wierszy i kolumn. Wiersz tabeli jest pojedynczym rekordem składającym
się z kolumn. Element znajdujący się na przecięciu kolumny i wiersza to pole. Pole zawiera
najmniejszą niepodzielną wartość tzn. taką informację, która nie może być dalej dzielona ze względu
na swoją logiczną wartość.
Model relacyjnych baz danych opracował w końcu lat 60-tych matematyk E. F. Codd.
Struktury danych w modelu relacyjnym
Podstawową strukturą danych jest relacja będąca podzbiorem iloczynu kartezjańskiego dwóch
wybranych zbiorów reprezentujących dopuszczalne wartości. W bazach danych relacja przedstawiana
jest w postaci tabeli. Relacja jest zbiorem krotek posiadających taką samą strukturę, lecz różne
wartości. Każda krotka odpowiada jednemu wierszowi tablicy. Każda krotka posiada co najmniej jeden
atrybut odpowiadający pojedynczej kolumnie tablicy. Każda relacja (tablica) posiada następujące
własności:
krotki (wiersze) są unikalne
atrybuty (kolumny) są unikalne
kolejność krotek (wierszy) nie ma znaczenia
kolejność atrybutów (kolumn) nie ma znaczenia
wartości atrybutów (pól) są atomowe
W przypadku projektowania tabeli w bazie danych należy stosować się do następujących wskazówek:
Używaj nazw opisowych do nazwania kolumn tabeli. Kolumny nie powinny mieć znaczenia
ukrytego, ani reprezentować kilku atrybutów (złożonych w pojedynczą wartość).
Bądź konsekwentny w stosowaniu liczby pojedynczej lub mnogiej przy nazywaniu tabeli.
Twórz tylko te kolumny, które są niezbędne do opisania modelowanej encji lub powiązania -
tabele z mniejszą ilością kolumn są łatwiejsze w użyciu.
Utwórz kolumnę pól kluczowych dla każdej tabeli.
Unikaj powtarzania informacji w bazie danych (normalizacja).
Przetwarzanie danych
Do wykonywania operacji na relacyjnych bazach danych służą operatory relacyjne. Operatory relacyjne
wchodzą w skład zapytań, które z kolei służą do wykonywania jednej bądź wielu operacji relacyjnych
na tabeli lub grupie tabel. Językiem pozwalającym na stosowanie operatorów relacyjnych jest język
SQL, którego odpowiedzią jest zawsze tabela. Nie oznacza to jednak, że użytkownik programu
działającego na bazie danych widzi tabele – wręcz przeciwnie – zazwyczaj dane zawarte w tabeli
wynikowej są wizualizowane w zgoła odmienny sposób i zależy on tylko od fantazji osoby
odpowiedzialnej za efekt wizualizacji i interfejs obsługi pisanej aplikacji.
Jednakże sam fakt, że wynikiem zapytania jest „wirtualna” tabela jest niezmiernie istotny. Dzięki
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione
takiemu podejściu możemy zadać np. dwa pytania, w wyniku, których otrzymamy dwie tabele (czasami
całkiem pokaźne), do których z kolei możemy zadać kolejne pytanie otrzymując jedną (stosunkowo
małą) tabelę, co znacznie ułatwia proces selekcji danych. Oczywiście znając strukturę tabel i wynik
zapytań możemy od razu postawić kilka zapytań do bazy danych. Takie łączenie zapytań nazywane jest
zagnieżdżaniem zapytań i pozwala otrzymać wynik bardzo bliski (równy) oczekiwanej odpowiedzi.
Integralność danych
Zasady integralności wymagają, aby każdy wiersz tabeli zawierał wartość lub grupę wartości, które
określałyby go w sposób jednoznaczny (unikalny). Te wybrane wartości nazywane są kluczem
głównym (primary key), natomiast kolumna bądź grupa kolumn z innej tablicy, która odpowiada
kluczowi głównemu tablicy pierwszej nazywana jest kluczem obcym (foreign key). Dodatkowe reguły
integralności mogą być nałożone na wybrane kolumny.
JĘZYK SQL
SQL – Structured Query Language – Strukturalny Język Zapytań to zbiór komend służący do
wprowadzania, modyfikowania i przeglądania zawartości relacyjnej bazy danych.
Zarządzanie bazą danych
Komendy związane z administracją bazą danych służą do zakładania kont użytkowników, przydzielania
lub odbierania im uprawnień, czyli ustalania zakresu działania na danych oraz do innych zadań
administracyjnych. Większość systemów dostarcza indywidualne, specjalne narzędzia do konfiguracji i
obsługi bazy danych. Bardzo często dane traktujące o charakterze bazy danych są zawarte też w tabeli,
do której jednak dostęp ma tylko administrator systemu.
Standardy języka SQL
Największą zaletą języka SQL jest to, że mimo bardzo wielu komercyjnych i darmowych „silników”
baz danych – podstawowe elementy języka pozostają niezmienne.
Standard języka SQL jest sprawdzany i zatwierdzany przez międzynarodową organizację International
Standards Organization (ISO), natomiast w Stanach Zjednoczonych National Institute of Standards and
Testing (NIST).
Obecnie obowiązuję standard przyjęty w 1992 r. i jest to SQL-92, jednakże żaden komercyjny produkt,
nie jest z nim całkowicie zgodny (chodzi tu głównie o firmowe rozszerzenia).
OPERACJE RELACYJNE
Operacje relacyjne występują we wszystkich relacyjnych bazach danych a ich wynikami zawsze są
tabele.
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione
Tabela „Osoby”.
Id
Nazwisko
Imię
Woj
_id
1
Mikołajczak Rafał
1
2
Nowak
Marek
3
3
Kowalski
Marek
2
4
Frąckowiak
Zdzisław 7
Selekcja
Operacja selekcji zwraca wynik w postaci grupy rekordów z tablicy i najczęściej polega na wybraniu, o
pewne kryteria tylko, grupy rekordów (może też oczywiście zwrócić także całą tablicę).
SELECT * FROM Osoby WHERE Id=2;
Id
Nazwisko
Imię
Woj_i
d
2
Nowak
Marek 3
Projekcja
Projekcja pozwala określić kolumny, które będą zwracane przez zapytanie. To rozwiązanie posiada
dwie zalety – zmniejszenie ilości informacji w odpowiedzi oraz zdecydowane przyspieszenie działania.
SELECT Nazwisko FROM Osoby WHERE Imię = ‘Marek’;
Nazwisko
Nowak
Kowalski
Złączenie
Operacja złączenia ( JOIN ) umożliwia wykorzystanie wielu tabel jako źródła danych dla zapytania.
Tabela „Woj”
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione
Id
Nazwa
1
wielkopolskie
2
śląskie
SELECT Nazwisko, Nazwa FROM Osoby, Woj. WHERE Osoby.Woj_id = Woj.Id;
Nazwisko
Nazwa
Mikołajczak Wielkopolskie
Kowalski
śląskie
Podstawowe zasady modelu relacyjnego to:
1. Dane prezentowane są użytkownikom w postaci tabel;
2. Komórki zawierają wartości niepodzielne na mniejsze porcje informacji
3. Każdy wiersz posiada wartość (lub grupę wartości), która go jednoznacznie identyfikuje (klucz
główny)
4. W przypadku określenia relacji miedzy tabelami dane z kolumny połączonej relacją muszą mieć
swoje odpowiedniki w drugiej tabeli.
Zasady mówiących o zagrożeniach, których należy się wystrzegać a stanowią „podstawy” źle
skonstruowanej bazy danych:
1. Tabele i kolumny mają niejasne nazwy (po n - czasie na pewno zapomnimy o co chodziło)
2. Ta sama informacja musi być wprowadzona kilkakrotnie a jej zmiana musi być dokonywana w
kilku różnych miejscach
3. Działanie bazy danych jest nieproporcjonalnie wolne do ilości obrabianych danych
4. Trudno określić relacje między danymi
5. W tabelach występują duplikujące się wiersze
6. Jest prawdziwą tragedią, kiedy to samo pytanie do tych samych danych zwraca różne wyniki
Etapy projektowania bazy danych to:
1. Określenie wymagań, zadań i celu przeznaczenia projektowanej bazy danych;
2. Określenie rodzaju danych (typów) przechowywanych w konkretnych kolumnach tabel;
3. Przeprowadzenie normalizacji;
4. Napisanie kodu tworzącego bazę i tabele bazy;
5. Zdefiniowanie użytkowników i praw dostępu;
6. Wypełnienie bazy informacjami – ew. przeprowadzenie testów;
INSTRUKCJA SELECT
Projekt przykładowej tabeli.
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione
Tabela Osoby
Id
Imię
Zarobki
Dochody
1
Rafał
100
200
2
Marek
200
250
3
Kamil
50
500
4
Zdzisław
300
120
INSTRUKCJA SELECT
Instrukcja SELECT składa się z wielu klauzul, z których część jest opcjonalna. Prosta składnia tej
funkcji wygląda następująco:
SELECT lista_pol
FROM nazwa_tabeli [,nazwa_innej_tabeli, ...]
[WHERE warunek];
Najprostszą funkcję SELECT można zapisać:
SELECT * FROM nazwa_tabeli;
Znak „*” jest znakiem szczególnym i mówi, że z tabeli mają zostać wybrane wszystkie kolumny w
rzeczywistym porządku.
Używanie znaku „*” w zapytaniu ma jednak dwie wady:
1. Takie zapytanie jest mało przejrzyste (szczególnie bolesne w procesie poprawiania programu
wykorzystującego język SQL), gdyż nie daje nam informacji jakie kolumny są w tym zapytaniu
wykorzystywane;
2. Użycie tego znaku znacznie obniża wydajność (szybkość) wykonania polecenia SELECT.
Nawet, gdy rzeczywiście potrzebujemy pobrać wszystkie informacje z całej tabeli, o wiele
szybciej dostaniemy odpowiedź wypisując nazwy wszystkich kolumn po instrukcji SELECT.
Wykonywanie obliczeń na danych
Wyrażenie wykonywane w zapytaniach nie musi koniecznie zawierać nazw kolumn – można używać
też liczb, wyrażeń algebraicznych bądź łańcuchów znaków np.:
SELECT ‘Cokolwiek’, Imię, 3+6 FROM Osoby;
Cokolwiek
Imię
3+6
Cokolwiek
Rafał
9
Cokolwiek
Marek
9
Cokolwiek
Kamil
9
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione
Cokolwiek
Zdzisław
9
A teraz niewielka zmiana:
SELECT ‘Cokolwiek’, Imię, ‘3+6’ FROM Osoby;
Cokolwiek
Imię
3+6
Cokolwiek
Rafał
3+6
Cokolwiek
Marek
3+6
Cokolwiek
Kamil
3+6
Cokolwiek
Zdzisław
3+6
, bo oczywiście 3+6 ujęte w pojedynczy cudzysłów to już łańcuch znaków a nie wyrażenie
algebraiczne.
W instrukcji SELECT możemy także dokonywać obliczeń na kolumnach:
SELECT Imię, Zarobki, Zarobki*3 FROM Osoby;
Imię
Zarobki
Zarobki*3
Rafał
100
300
Marek
200
600
Kamil
50
150
Zdzisław
300
900
A nawet tak:
SELECT Imię, Zarobki, Dochody, Dochody – Zarobki FROM Osoby;
Imię
Zarobki Dochody Dochody - Zarobki
Rafał
100
200
100
Marek
200
250
50
Kamil
50
500
450
Zdzisła
w
300
120
-180
Operatory arytmetyczne
Język SQL posiada kilka typów operatorów arytmetycznych, które można wykorzystać w obliczeniach,
zapytaniach czy podczas zakładania filtrów. W kolejności wykonywania działań przedstawiają się one
następująco:
( ) - Nawiasy;
/ - Dzielenie;
* - Mnożenie;
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione
- - Odejmowanie;
+ - Dodawanie;
Przykład wykorzystania:
SELECT Imię, (((0.19 * Zarobek) + 100)*2) FROM Osoby;
Imię
(((0.19 * Zarobek) + 100)*2)
Rafał
238
Marek
476
Kamil
219
Zdzisław
714
Instrukcja AS
Instrukcja AS służy do przypisywania kolumnom lub wyrażeniom innych nazw.
Składnia takiej instrukcji wygląda następująco:
SELECT wyrażenie_1 [AS alias], wyrażenie_2 [AS alias] ,...
FROM nazwa_tabeli [lista_tabel]
[WHERE warunek];
Np.:
SELECT Imię, (((0.19 * Zarobek) + 100)*2) AS Podwyżka FROM Osoby;
Imię
Podwyżka
Rafał
238
Marek
476
Kamil
219
Zdzisław
714
Filtrowanie wyników zapytania za pomocą klauzuli WHERE
Operatory do porównań:
= - Równy;
<>, != - Nierówny;
> - Większy;
< - Mniejszy;
>= - Większy lub równy;
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione
<= - Mniejszy lub równy;
Przykłady:
SELECT Imię FROM Osoby WHERE Id=3;
Imię
Kamil
SELECT Id, Imię FROM Osoby WHERE Zarobki < 250;
Id
Imię
1
Rafał
2
Marek
3
Kamil
SELECT Imię FROM Osoby WHERE Imię <> 'Rafał';
Imię
Marek
Kamil
Zdzisław
SELECT Imię, Zarobki, Dochody FROM Osoby WHERE Dochody < Zarobki;
Imię
Zarobki
Dochody
Zdzisław
300
120
SORTOWANIE WYNIKÓW ZAPYTAŃ
Składnia instrukcji SELECT używającej klauzuli ORDER BY wygląda następująco:
SELECT nazwy_kolumn
FROM nazwa_tabeli [ lista_tabel ]
[WHERE warunek]
[ORDER BY { kolumna, alias, pozycja} [ASC | DESC]]
SELECT Id, Imię, Zarobki, Dochody FROM Osoby ORDER BY Imię;
Id
Imię
Zarobki
Dochody
3
Kamil
50
500
2
Marek
200
250
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione
1
Rafał
100
200
4
Zdzisław
300
120
ASC – Ascending – rosnąco;
DESC – Descending – malejąco;
Copyright© mgr inż. Rafał Mikołajczak – Kopiowanie i rozpowszechnianie zabronione