Podstawowe pojęcia z teorii budowy baz danych.
Komputerowa baza danych to system dla strukturalnego przechowywania różnych spisów, np.: studentów
Nr indeksu |
Nazwisko |
Imie |
53 |
Małysz |
Adam |
55 |
Michałek |
Gosia |
: |
: |
: |
Tabela jest podstawową jednostką strukturalną współczesnych baz danych. Współczesne bazy danych składają się z kilku tabel ( od 3 do 25 ) np.: baza danych uczelni składa się z tabel: studenci, wykładowcy, zajęcia, itd.
Każda tabela ma informacje o konkretnych obiektach. Pojedyncza tabela posiada informacje o obiektach określonej dziedziny np.: tabela studenci posiada informacje o pojedynczych studentach.
Ilość tabel w bazie danych jest uzależniona od projektanta, gdyż musi on mieć na uwadze przeznaczenie bazy danych.
Baza danych spełnia swoje funkcje w oparciu o oprogramowanie, zwane systemem zarządzania bazą danych ( Data Base Managment System ). W ten sposób komputerowa baza danych składa się z dwóch części:
danych lub informacji
systemu zarządzania bazą danych
Dane są wartościami statycznymi w bazie danych, tzn. zachowują swój stan aż do zmodyfikowania ich ręcznie lub przez jakiś automatyczny proces.
System zarządzania bazą danych pełni następujące funkcje:
tworzy bazy danych ( tworzenie pliku lub plików bazy danych )
tworzy tabele
wprowadza i modyfikuje ( zmienia wartości ) dane
pobiera informacje ( wybiera dane ) np.: użytkownik ma uzyskać informacje o studentach pierwszego roku SI
usuwa dane
usuwa całe tabele i bazy danych
Dla spełnienia tego systemu stworzony został język zapytań. Najczęściej wykorzystywany jest tutaj język SQL ( Structured Query Language - język zapytań strukturalnych ). Ten język wypełnia funkcje w oparciu o standardowe operacje:
Create - stwórz
Update - zmodyfikuj
Select - wybierz dane
Delete - usuń informację
Informacje w bazie danych powinny mieć taki wygląd, aby czas pobierania danych był minimalny. Dlatego podstawowymi operacjami wykonywanymi przez bazy danych są: sortowanie i wyszukiwanie danych.
Sortowanie to kolejność rozmieszczenia obiektu w tabeli. Aby to rozmieszczenie uzyskać trzeba obowiązkowo podać kryterium sortowania np.: od minimalnego do maksymalnego numeru indeksu.
Podstawowe metody sortowania danych:
metoda kolejnych minimów ( maksimów )
metoda bąbelkowa
metoda kubełkowa
metoda QuickSort
Głównym parametrem charakteryzującym każdą z tych metod jest ilość porównań elementów ze sobą i ilość przestawień liczb.
Metoda kolejnych minimów polega na porównaniu ze sobą wszystkich elementów tablicy. Pierwsza pętla tych porównań skończy się tym, że pod numerem 1 będzie umieszczony minimalny element. Druga pętla tych porównań skończy się tym, że pod numerem 2 będzie umieszczony minimalny element wśród pozostałych, itd.
Załóżmy zbiór A = {30, 2, 345, 8, 53, 120 }
I pętla - wykonamy n - 1 porównań i zamienimy 1 element { 2, 30, 345, 8, 53, 120 }
II pętla - wykonamy n - 2 porównań i zamienimy 1 element { 2, 8, 30, 345, 53, 120 }
Suma wszystkich porównań wynosi n - 1 + n - 2 + ... + 1 =
Metoda bąbelkowa polega na porównaniu par sąsiednich elementów ze sobą i przestawieniu elementów według podanego kryterium.
Załóżmy zbiór A = {30, 2, 345, 8, 53,120 }
I pętla 30 porównujemy z 2 i przestawiamy {2, 30, 345, 8, 53, 120 }
II pętla 30 porównujemy z 345 i pozostawiamy {2, 30, 345, 8, 53, 120 }
Metoda bąbelkowa charakteryzuje się taką samą ilością porównań ( n - 1 ) jak metoda kolejnych minimów, lecz ma ona większą ilość przestawień elementów. Tak więc im większa liczba elementów, tym większa różnica w wielkości przestawień.
Metoda kubełkowa polega na utworzeniu wirtualnych kieszeniu do umieszczania w nich odpowiednich danych. Dla każdego rzędu liczby ( jednostek, dziesiątek, itd. ) powinno być utworzonych 10 kubełków. Zastosowanie tej metody jest efektywne, jeżeli liczby po sortowaniu mają mocno różniące się ilości cyfr.
Załóżmy zbiór A = {30, 2, 345, 8, 53,120 }
I 0 1 2 3 4 5 6 7 8 9
II 0 1 2 3 4 5 6 7 8 9
III 0 1 2 3 4 5 6 7 8 9
Metody wyszukiwania danych i typy baz danych.
Istnieją dwie metody wyszukiwania danych:
metoda blokowa
metoda dzielenia binarnego ( bisekcji )
W metodzie blokowej dane powinny być najpierw posortowane w celu zmniejszenia
czasu poszukiwania. Metoda ta polega na uprzednim podzieleniu tablicy obiektów na ustaloną ilość bloków. Ilość elementów w każdym bloku ( oprócz ostatniego ) zawsze musi być taka sama, a w bloku ostatnim musi być mniejsza od bloków poprzednich.
W pierwszym kroku szukany obiekt ( np.: numer indeksu ) będzie porównany z numerem indeksu ostatniego obiektu w pierwszym bloku. W zależności od wyniku poszukiwania szukany element może być:
w pierwszym bloku, gdy poszukiwany indeks jest mniejszy od ostatniego
w następnych blokach, gdy poszukiwany indeks jest większy od ostatniego
ostatnim elementem bloku, gdy szukany indeks jest równy ostatniemu w bloku
Jeżeli szukany element jest wśród elementów pierwszego bloku, to może być znaleziony przez metodę kolejnych porównań. W drugim przypadku indeks szukanego elementu porównujemy analogicznie z indeksem ostatniego elementu bloku drugiego, trzeciego, itd.
W metodzie tej szybkość wyszukiwania zależy od ilości porównań, a nie ilości przestawień, a maksymalna ilość porównań wynosi
,a minimalna 1.
Optymalna ilość porównań zależy od miejsca rozmieszczenia szukanego elementu, ilości bloków i ilości elementów.
Metoda dzielenia binarnego polega na początkowym dzieleniu tablicy elementów na połowę i porównaniu indeksu szukanego elementu z indeksem ostatniego elementu w pierwszej połowie tablicy. W takiej sytuacji mogą wystąpić następujące wyniki, od których uzależniony jest dalszy tok poszukiwań:
szukany indeks jest równy ostatniemu elementowi pierwszej połowy tablicy, to przerywamy poszukiwania
szukany indeks jest mniejszy od ostatniego elementu pierwszej połowy tablicy, to tablicę dzielimy znowu na połowę i postępujemy analogicznie
szukany indeks jest większy od ostatniego elementu pierwszej połowy tablicy, to drugą połowę tablicy dzielimy na połowę i postępujemy analogicznie
Maksymalna ilość porównań w tej metodzie jest większa, bądź równa log2 n.
Wybór tej lub innej metody wyszukiwania zależy od ilości obiektów w bazie danych i jest też uzależniony od zaleceń projektanta.
Wszystkie bazy danych możemy podzielić na dwie klasy:
operacyjne bazy danych np.: uczelni, szpitali
analityczne bazy danych np.: informacje o pogodzie, długoterminowych kursach walut, itp.
Informacje w pierwszej klasie baz danych w odróżnieniu od klasy drugiej podlegają zmianom. Natomiast operacyjne bazy danych przeznaczone są przede wszystkim do wypracowania prognozy zmian, rozwoju elementu.
Elementy strukturalne i logiczne baz danych.
Tabela jest podstawową jednostką strukturalną bazy danych. Każda tabela ma swoją nazwę, pisaną najczęściej dużymi literami, ze względu na możliwość jej importowania do innych systemów baz danych. Nazwa tabeli powinna odpowiadać przechowywanym w niej obiektom. Każda tabela składa się z pól ( kolumn ) i rekordów ( wierszy ).
Pole to taka jednostka strukturalna tabeli, która przeznaczona jest do przechowywania jednakowej informacji o wszystkich obiektach rozmieszczonych w tabeli.. Każde pole posiada informacje tego samego typu, np.: dane liczbowe, data, itd. Każde pole ma swoją nazwę, odpowiadającą przechowywanej informacji. W nazwach pól i tabel nie należy stosować znaków spacji, itp.
Rekord jest jednostką strukturalną tabeli przechowującą informację o pojedynczym obiekcie.
Baza danych zawierająca kilka tabel będzie jednostką w logicznym i integralnym sensie, tylko wtedy, kiedy wszystkie tabele będą powiązane ze sobą, czyli wtedy, gdy będą zdefiniowane relacje między tabelami. Żadna z tabel nie może nie mieć relacji, w związku z tym maksymalna ilość relacji odpowiada ilości tabel w bazie danych. Istnieją trzy podstawowe typy relacji między tabelami:
1:1 ( jeden do jednego )
1:w ( jeden do wielu )
w:w ( wiele do wielu )
Relacja jeden do jednego odpowiada sytuacji, gdy pojedynczemu rekordowi jednej
Tabeli odpowiada pojedynczy rekord drugiej tabeli i na odwrót.
Relacja jeden do wielu odpowiada sytuacji, kiedy pojedynczy rekord pierwszej tabeli powiązany jest z jednym lub kilkoma rekordami drugiej tabeli, natomiast jeden rekord drugiej tabeli powiązany jest tylko z jednym rekordem pierwszej tabeli.
Ze strony pierwszej tabeli w odniesieniu do tabeli drugiej występuje relacja jeden do wielu, a ze strony tabeli drugiej relacja wiele do jednego.
Relacja wiele do wielu odpowiada sytuacji, gdy pojedynczy rekord pierwszej tabeli odpowiada jednemu lub kilku rekordom drugiej tabeli, natomiast pojedynczemu rekordowi drugiej tabeli odpowiada jeden lub kilka rekordów pierwszej tabeli.
W relacyjnych bazach danych zdefiniowanie relacji wiele do wielu jest możliwe tylko z pomocą dodatkowej tabeli ( mieszającej ).
Modele baz danych.
Istnieją cztery podstawowe modele baz danych:
hierarchiczny
sieciowy
relacyjny
obiektowy:
obiektowo orientowany
obiektowo relacyjny
Model bazy danych wskazuje nam na logiczną i fizyczną zasadę opisu obiektów bazy danych, relacji pomiędzy nimi i sposobu wyszukiwania danych.
W modelu hierarchicznym dane ułożone są w strukturę o wyglądzie odwróconego drzewa. Jedna z tabel pełni tu rolę korzenia, a pozostałe maja postać gałęzi mających swój początek w korzeniu lub w innej gałęzi. Relacje pomiędzy tabelami noszą tu nazwę ojciec-syn i są odpowiednikami relacji jeden do wielu.
Korzeń
Gałęzie poziom 1
Gałęzie
poziom 2
W przytoczonej bazie danych manager może mieć jednego lub kilku klientów i jednego lub kilku muzyków. Klient zawiera umowę z muzykiem poprzez managera.
Ten typ relacji ojciec-syn oznacza, że pojedyncza tabela ze strony ojca może by powiązana z jedną lub kilkoma tabelami ze strony syna, a pojedyncza tabela ze strony syna może mieć tylko pojedynczego ojca.
Główną wadą tego modelu jest to, że każdy użytkownik powinien dokładnie znać strukturę powiązań, gdyż w celu odnalezienia informacji musi chodzić po gałęziach. W modelu tym wbudowano automatyczną kontrolę integralności danych, tzn. że pomiędzy obiektami powiązanych tabel zawsze obowiązkowo istnieje relacja. Zaletą jest tutaj wysoka szybkość wyszukiwania danych. Teoretyczną bazą tego modelu teoria grafów. Niektóre bazy danych odpowiadające temu modelowi można transformować w relacyjny model, tzn. umożliwia to zastosowanie ODBC ( Open Data Base Connetivity ).
Model sieciowych baz danych został stworzony w celu rozwiązania problemów związanych z modelem hierarchicznym. Strukturę tego modelu można także przedstawić jako odwrócone drzewo, jednak różnica między tymi modelami polega na tym, że w modelu sieciowym kilka drzew może dzielić ze sobą gałęzie. Relacje występujące w tym modelu są zdefiniowane przez kolekcję. Jest to niejawna konstrukcja łącząca ze sobą przez przypisanie jednej roli właściciela, a dwóch członków. Między dwoma tabelami można zdefiniować dowolną ilość kolekcji, czyli powiązań. Kolekcje umożliwiają relację jeden do wielu.
Korzeń
Gałęzie poziom 1
Gałęzie
poziom 2
Zaletą tego modelu jest duża szybkość odczytu informacji oraz możliwość utworzenia o wiele większej liczby zapytań do bazy danych przez użytkownika. Model ten ma podobną wadę do modelu hierarchicznego, gdyż użytkownik także powinien znać strukturę powiązań.
Obydwa modele charakteryzują się dużą nadmiarowością danych, czyli powtarzaniem tych samych danych w różnych tabelach.
Model relacyjnych baz danych różni się od poprzednich doskonałą bazą teoretyczną opartą na dwóch gałęziach matematyki: teorii mnogości i rachunku prawdopodobieństwa.
Dane w relacyjnych bazach danych istnieją tylko w wyglądzie tabelarycznym. Bazy danych relacyjne różnią się od wcześniej omówionych między innymi:
kolejność pól i rekordów w bazach relacyjnych może być dowolna, tzn. użytkownik nie musi znać fizycznej struktury bazy danych
w modelu relacyjnym między tabelami mogą wystąpić wszystkie trzy typy relacji
W relacyjnych bazach danych może wystąpić wartość zerowa ( NULL ), co oznacza, że dane pole pozostawiamy puste. Pożądane jest aby żadna z tabel nie zawierała wartości NULL.
W bazach danych wyróżniamy następujące typy pól:
pole segmentowe-zawiera więcej niż jeden typ tej samej wartości(nazwisko i imię)
pole wyliczalne - wartością tego pola jest wynik operacji przeprowadzanymi nad kilkoma innymi polami ( koszt = ilość * cena )
pole wielowartościowe - pole które zawiera dane różnego typu np.:adres:Garbary2
Modyfikując już istniejące bazy danych należy mieć na uwadze typy pól.
Poprzez pojęcie integralności danych rozumiemy ich spójność i dokładność. Rozróżniamy typy integralności danych:
integralność na poziomie tablicy - gwarantuje, że pole identyfikujace każdy rekord danej tabeli, ma unikalną wartość i nigdy nie jest wartością zerową
integralność na poziomie pól - gwarantuje, że struktura każdego pola jest poprawna, a zawarte wartości są logiczne oraz wszystkie dane w tym polu są tego samego typu
integralność na poziomie relacji ( integralność referencyjna ) - gwarantuje, że wszystkie relacje są poprawnie zdefiniowane i że dane w powiązanych tabelach są ze sobą zsynchronizowane.
Klucz tabeli - identyfikator obiektów bazy danych. Każda tabela posiada swój klucz. Klucz jest to kilka lub jedno pole identyfikujące jednoznacznie rekordy tabeli. Za pomocą kluczy definiujemy relacje pomiędzy tabelami. Definiowanie relacji odbywa się poprzez przeniesienie klucza z jednej do drugiej tabeli. Rozróżniamy relacje obowiązkowe i opcjonalne. Jeśli pole jest kluczem podstawowym, to mówimy że jest to pole unikatowe.
Poprzez pojęcie atrybutu pola rozumiemy zbiór cech określających każdą jego wartość. Wyróżniamy trzy podstawowe grupy atrybutów:
atrybuty ogólne
atrybuty fizyczne
atrybuty logiczne
Do atrybutów ogólnych zaliczamy między innymi nazwę pola, która jest unikatowym
identyfikatorem danego pola. Tabela, z której pochodzi dane pole jest nazywana tabelą matką. Jedno pole może występować w innych tabelach, pod warunkiem, że łączy tabele w podzbiory lub jest przeznaczone do definiowania relacji.
Indeks jest elementem zarządzania bazą danych, czyli elementem strukturalnym. Indeks i klucz są różnymi pojęciami, gdyż indeks nie jest związany z logiczną strukturą bazy danych. Indeks jest elementem fizycznym, przeznaczonym do usprawnienia wykonywania operacji na tabelach, natomiast klucz jest elementem logicznym przeznaczonym do identyfikacji rekordów w tabeli.
Architektura systemu baz danych.
Architektura systemu baz danych jest najczęściej opisana za pomocą architektury ANSI/SPARC. W architekturze tej istnieją trzy poziomy architektury:
wewnętrzny
zewnętrzny
koncepcyjny
poziom zewnętrzny
poziom koncepcyjny
poziom wewnętrzny
Na poziomie wewnętrznym następuje przedstawienie poziomu przechowywania danych.
Na poziomie koncepcyjnym następuje ogólne przedstawienie się użytkowników, a na poziomie zewnętrznym następuje przedstawienie pojedynczego użytkownika z punktu widzenia tego w jakim wyglądzie otrzymuje on informacje z bazy danych.
W ten sposób zewnętrzny poziom odpowiada za indywidualną reprezentację pojedynczego użytkownika, czyli może istnieć dowolna ilość takich reprezentacji. Można to przedstawić na przykładzie bazy danych personelu napisanej w dwóch językach programowania: PL / 1 i COBOL.
Poziom zewnętrzny |
Użytkownik 1 ( PL / 1 )
|
Użytkownik 2 ( COBOL )
01 EMPC 02 EMPNO PICX (6) 03 DEMPNO PICX (4) |
Poziom koncepcyjny |
EMPLOYEE EMPLOYEE_N CHAR (6) DEPART_N CHAR (4) SALARY NUMERIC (5)
|
|
Poziom wewnętrzny |
STORED_EMP BYTES (20), PREFIX TYPE = BYTE (6), EMP_N TYPE = BYTE (8), INDEX = EMPX, DEPT_N TYPE = BYTE(4), PAY TYPE =FULLWORD
|
Na poziomie koncepcyjnym baza posiada informacje o typie obiektów i ma nazwę EMPLOYEE. Każdy obiekt tabeli EMPLOYEE posiada pola:
numer pracownika ( EMPLOYEE_N) typu CHAR i długości 6 symboli
numer działu (DEPART_N) typu CHAR i długości 4 symboli
pensji (SALARY) typu NUMERIC o długości 5 cyfr dziesiątkowych
Na poziomie wewnętrznym pracownicy są reprezentowani przez typ rekordu STORED_EMP o długości 20 bajtów. Każdy z rekordów posiada 4 pola:
6 bajtowy prefiks, który może posiadać informację zarządzającą wyglądem flag
3 pola danych, które reprezentują pracownika ( EMP_N, EMPX, DEPT_N )
Na poziomie zewnętrznym analizujemy dwóch użytkowników. Użytkownik 1 w celu otrzymania informacji z bazy danych stosuje język PL/1, a drugi użytkownik stosuje język COBOL. W pierwszym przypadku każdy pracownik będzie reprezentowany przez dwa pola: numer pracownika i pensję. W drugim przypadku użytkownik otrzymuje informacje o numerze pracownika i wydziale, w którym on pracuje.
Nazwy pól na każdym poziomie architektury mogą być różne, np.: N_EMP i EMPLOYEE_N. Systemowi zarządzania bazy danych wymienione różnice powinny być znane, tak jak i odpowiadające sobie pola na każdym poziomie, zwane odwzorowaniami.
Trzy poziomy architektury w modelu relacyjnych baz danych.
Na zewnętrznym poziomie architektury każdy z użytkowników otrzymuje informacje z bazy danych w innym wyglądzie. Użytkownikiem bazy może być także administrator bazy danych lub programista. Zwykły użytkownik komunikuje się z bazą za pomocą specjalnego języka zapytań ( np.: SQL ) lub za pomocą języka bazowanego na poleceniach i menu (C++ Builder)
Te języki kontaktów z bazą muszą posiadać podjęzyk danych ( podzbiór operatorów, które odnoszą się tylko do obiektów baz danych i wykonywanych operacji nad tymi obiektami ). Standardowym językiem zapytań jest język SQL. Podjęzyk danych jest kombinacją dwóch podrzędnych języków:
języka definiowanego danych DLL ( Data Definition Language )
języka manipulowania danych DML ( Data Manipulation Language )
Według terminologii ANSI / SPARC przedstawienie pojedynczego użytkownika bazie danych nazywa się zewnętrznym przedstawieniem. Każde zewnętrzne przedstawienie definiujemy za pośrednictwem zewnętrznego schematu, co polega na definiowaniu każdego pola w tym przedstawieniu.
Na poziomie koncepcyjnym przedstawiamy wszystkie informacje z bazy danych w formie abstrakcyjnej.
Poziom wewnętrzny to nisko poziomowe przedstawienie całej bazy. Wewnętrzne przedstawienie nie jest całkiem adekwatne fizycznemu poziomowi, gdyż na tym poziomie nie analizujemy fizycznych rekordów, które nazywamy stronami lub blokami.
Schemat architektury ANSI / SPARC.
I - podstawowy język + podjęzyk danych pojedynczego użytkownika.
Zewnętrzne przedstawienie, czyli interfejs użytkowników grup A i B.
II - poziom koncepcyjny bazy danych
III - dane na poziomie wewnętrznym bazy danych
Przejścia między poziomami są odwzorowaniami danego poziomu dla użytkowników grup.
Każdym elementem i odwzorowaniem zarządza system zarządzani bazą danych. Jak widzimy odwzorowanie to pełne przekształcenie, czyli bufor.
Administrator bazy danych.
Administrator bazy danych jest fizyczną osobą, która odpowiada za realizację techniki polityki ochrony danych i organizacji dostępu do nich, według wypracowanych praw dostępu. Często dodatkowo istnieje także administrator danych, który odpowiada za to, jakie dane są przechowywane w bazie. Najczęściej administratorem danych jest kierownik zakładu, a administratorem bazy jest programista.
Funkcje administratora bazy danych:
definiowanie schematu koncepcyjnego bazy danych
definiowanie wewnętrznych połączeń pomiędzy obiektami bazy danych. Proces definiowania połączeń nazywa się fizycznym projektowaniem bazy danych.
definiowanie współdziałania bazy danych z pojedynczym użytkownikiem. Mogą to być jakieś formy, podjęzyki lub jakieś graficzne interfejsy.
definiowanie zabezpieczeń w celu ochrony informacji
definiowanie procedur tworzenia kopii zapasowych baz danych ( każda baza danych powinna posiadać kopię zapasową )
Architektura klient - serwer.
Zwykła architektura bazy danych może być podzielona na dwie części:
serwer, czyli wewnętrzny komponent lub maszyna bazy danych
klienci, czyli zewnętrzny komponent lub zewnętrzny interfejs
Taka struktura może mieć schemat:
Rozproszone opracowanie danych.
Rozproszone opracowanie danych oznacza, że różne serwery połączone są ze sobą w celu równoległego wykonywania zadań. Jednym z wariantów rozproszonego opracowania danych jest ten, kiedy serwer i klient znajdują się na innych komputerach. Główną cechą rozproszonego opracowania danych jest zmniejszenie czasu opracowania problemu.
Architektura klient - serwer daje możliwość skoncentrowania całej bazy na jednym komputerze o większych możliwościach od komputerów użytkowników. Do jednego serwera może mieć dostęp jednocześnie kilku klientów, co jest bardzo istotną rzeczą.
Dla systemów klient - serwer istnieją systemy zarządzania takie jak:
Oracle
Informix
InterBase
DB2
MS SQL
Pozwalają one eksportować i importować bazy danych w innych formatach.
Podstawy algebry relacyjnej.
Dla opisania operacji nad danymi w bazach komputerowych stosuje się 8 operatorów:
suma relacyjna
iloczyn ( z teorii mnogości )
różnica
iloczyn kartezjański ( Decart )
wybór ( selekcja, określenie )
projekcja
splot lub konkatenacja
dzielenie
Operacja sumy relacyjnej może być wykonana nad dwoma tabelami. Wynikiem operacji jest tablica, która posiada wszystkie rekordy, które należą do pierwszej lub drugiej tablicy lub jednocześnie do obu tablic.
W operacji iloczynu wynikiem jest tabela, która posiada tylko te kolumny, które zawiera zarówno pierwsza, jak i druga tabela.
Wynikiem operacji różnicy jest tabela posiadająca tylko rekordy, które należą do jednej z tabel i nie należące do drugiej tabeli.
Wynikiem iloczynu kartezjańskiego jest tabela, która posiada wszystkie możliwe kombinacje rekordów obu podanych tabel, np..:
A |
|
B |
|
C |
|
A1 B1 C1 D1 |
n1 |
A2 B2 |
n2 |
A1 A1 B1 B1 C1 C1 D1 D1 |
A2 B2 A2 B2 A2 B2 A2 B2 |
Ilość rekordów w tabeli wynikowej jest iloczynem n1 x n2. Ilość pól w każdym z rekordów tabeli wynikowej jest równa sumie pól w obu podanych tabelach. Operacja ta musi być wykonywana przynajmniej nad dwoma tabelami.
Operacja wyboru jest wykonywana zwykle nad jedną tabelą. Wynikiem jej jest nowa tabela, która posiada część rekordów z podanej tabeli, odpowiadających podanym kryteriom. Ilość rekordów w wynikowej tabeli nie może przekroczyć ilości rekordów podanej tabeli.
Wynikiem operacji projekcji jest tabela, która posiada wszystkie lub część rekordów z podanej tabeli, ale ma mniejszą ilość pól.
Operacja splotu jest wykonywana nad dwoma tabelami. Wynikiem jest tabela posiadająca wszystkie możliwe rekordy, będące kombinacją pól dwóch rekordów będących obiektami dwóch tabel pod warunkiem, że w dwóch kombinowanych rekordach są obecnie jednakowe wartości w jednym lub kilku ogólnych rekordach z podanych tabel. Ponadto te ogólne znaczenia w rekordzie wynikowym mogą się pojawić tylko raz.
A1 A2 A3 |
B1 B2
|
|
B1 B2 B3 |
C1 C2 C3 |
|
A1 A2 A3 |
B1 B2 B3 |
C1 C2 C3 |
pole ogólne
Operacja dzielenia jest wykonywana nad dwoma unarnymi tabelami ( posiadającymi jedno pole ) i jedną tabelą binarną ( posiadającą dwa pola ). Wynikiem będzie tabela, która posiada wszystkie rekordy z pierwszej unarnej tabeli, które posiada binarna tabela i odpowiadają one rekordom z drugiej unarnej tabeli.
Ex. 1
Wykonaj operacje nad tabelami:
Tabela A - Spis producentów z Bydgoszczy
|
|||
ID_p |
Imię_p |
Status_p |
Adres_p |
S1 S2 |
Aaab Bcd |
20 20 |
Bydgoszcz Bydgoszcz |
|
|
|
|
Tabela B - producenci narzędzia „p”
|
|||
ID_p |
Imię_p |
Status_p |
Adres_p |
S1 S4 |
Aaab Mcd |
20 10 |
Bydgoszcz Toruń |
A union B ( A suma B )
Wynikiem będą nie powtarzające się rekordy obu tabel, czyli wynikiem będą rekordy S1, S2 ( z pierwszej tabeli ), S4 ( z drugiej tabeli ).
A intersset B ( A iloczyn mnogościowy B )
Wynikiem będzie rekord będący częścią obu tabel, czyli rekord S1.
A minus B
Wynikiem będą te rekordy, które są obiektami tabeli A, ale nie są obiektami tabeli B, czyli wynikiem będzie rekord S2 z tabeli A.
B minus A = S4
Ex. 2.
Wykonaj operację iloczynu kartezjańskiego, selekcji i projekcji nad tabelami:
Tabela A |
Tabela B |
|||
ID_p |
Imię_p |
|
Nazwisko_p |
Adres_p |
S1 S2 |
Aaab Bcd |
|
Mnk Opr |
Bydgoszcz Bydgoszcz |
A times B ( iloczyn kartezjański )
Tabele A i B nie posiadają żadnych ogólnych pól. W ten sposób wynikiem tej operacji będzie tabela posiadająca wszystkie kombinacje rekordów obu tabel
ID_p |
Imię_p |
Nazwisko_p |
Adres_p |
S1 S1 S2 S2 |
Aaab Aaab Bcd Bcd |
Mnk Opr Mnk Opr |
Bydgoszcz Bydgoszcz Bydgoszcz Bydgoszcz |
Selekcja
Operacji selekcji zawsze dokonujemy za pomocą polecenia select w języku SQL pod warunkiem where np.: select* from A where Adres_p='Bydgoszcz”; Wynikiem takiej operacji będzie cała tabela A, gdyż * oznacza wybór właściwości wszystkich pól.
Projekcja
Select ID_p, Imię_p from A; Wynikiem takiej operacji będzie tabela:
ID_p |
Imię_p |
S1 S2 |
Aaab Bcd |
We frazie where w operacji selekcji może być podane kilka kryteriów wyboru. Mogą one być łączone ze sobą poprzez operatory logiczne ( OR, AND, NOT ) np.:
select*from B where Adres_p='Bydgoszcz' OR Status_p<20;
Splot
Niech tabela A i B posiadają pola A-> { X1. X2, ... XM; Y1, Y2, ... , YN }
B-> { Y1, Y2, ..., YN; Z1, Z2, ..., ZP }, czyli pola Y są ogólne dla obu tabel. Operację tego łączenia zapisujemy w SQL za pomocą operatora join, np.: A join B.
Podsumowując operacje selekcji i projekcji polegają na zastosowaniu zdania select z języka SQL. Wynikiem jest tabela, która posiada całą lub częściową zawartość podanej tabeli. Zdanie select może posiadać operację join, czyli za pomocą całego zdania select można pobierać dane z połączonych tabel.
Bazy danych w środowiskach Delphi i C++ Builder.
Wspólnym dla tych środowisk jest system poleceń i graficzny interfejs, czyli wspólnym jest odwzorowanie między zewnętrznym a koncepcyjnym poziomem bazy danych.
Przeanalizujmy bazy danych tworzone w środowisku Delphi. Istnieją trzy wersje Delphi:
Delphi Desktop ( Builder Desktop )
Delphi Developer
Delphi Client - Server
Bezpośrednie środowisko Delphi umożliwia połączenie z bazami danych MS Access i innymi.
Delphi Desktop za pomocą specjalnego narzędzia Borand DataBase Engine umożliwia kontaktowanie ( połączenie ) za pomocą zestawu bibliotek DLL w wersji Delphi Desktop.
W Delphi Developer istnieje możliwość połączenia z bazami danych innych formatów za pomocą narzędzia ODBC ( Open DataBase Connectivity ). ODBC to specjalizowany sterownik, który posiada specjalny zestaw oprogramowania zwany API ( Application Programing Interface ).
Delphi Client - Server polega na zastosowaniu języka SQL i oprogramowania SQL - Links.
Ważniejsze terminy i komponenty interfejsu w C++ Builder i Delphi:
tabela, rekord, kolumna, pole
kontrolki dostępu do danych - komponenty wizualne zgrupowane na zakładce DataAccess. Należą do nich komponenty:
TTable
TDataSource
TDataBase
TDataSet - zapewnia dostęp do tabel i zbiorów danych będących wynikami zapytań SQL
TQuery
TStoredProc
Komponent TTable umożliwia skojarzenie tego komponentu z tabelą, co odbywa się za pośrednictwem TTableName, który znajduje się w Object Inspectorze.
Komponent TQuery umożliwia konstruowanie, wykonywanie i opracowanie zapytań SQL.
Komponent DataSource łączy zbiory danych i kontrolki powiązane z tymi danymi.
Komponent TStoredProc umożliwia uruchomienie skomplikowanych procedur SQL - owych.
Kontrolki powiązane z danymi są to komponenty graficzne, które za pomocą narzędzi graficznych umożliwiają przeglądanie i modyfikację bazy danych. Są one zgrupowane na zakładce DataControls. Nowa klasa obiektów TField zapewnia możliwości dostępu środowisku do pól.
Formularz tworzony przez kreatora DataBase Form Wizard powinien być zaopatrzony we własne komponenty TTable i TDataSource, a także w zestaw kontrolek powiązanych z danymi.
Jeżeli myszą klikniemy na komponent TTable oraz naciśniemy F11, to przejdziemy do okna Object Inspectora, które zawiera dwie części.
Atrybut DataSet komponentu TDataSource zawiera odwołanie do komponentu TTable. Oznacza to, że komponent TDataSource przekazuje dane z kontrolek i do kontrolek powiązanych z danymi i odczytuje te dane z tabeli wskazanej w komponencie TTable.
Atrybut AutoEdit ma automatycznie nadaną wartość logiczną TRUE, tzn. że jakakolwiek modyfikacja danych w skojarzonej kontrolce spowoduje przełączenie komponentu TDataSource w tryb edycji.
Komponent TDataBaseEdit ma dwa atrybuty:
DataSource - wskazuje on na komponent TDataSource otworzony na formularzu
TDataField - wskazuje z którym polem tabeli związana jest dana kontrolka
Komponenty TDataSource, TTable, TDataBaseEdit są ściśle powiązane ze sobą. Komponent TTable jest podstawowym łącznikiem między formularzem a tabelami. Komponent TDataSource pełni funkcję pośrednika pomiędzy komponentem TTable i powiązanymi z nim kontrolkami. Natomiast komponent TDataBaseEdit dostarcza i pobiera dane z komponentu TDataSource.
Definiowanie relacji pomiędzy tabelami.
Relacja 1:1 tworzona jest pomiędzy dwoma tabelami. Wymaga ona utworzenia kopii klucza podstawowego z tabeli nadrzędnej w tabeli podrzędnej, w której to ten klucz będzie kluczem obcym.
Relacja 1:wielu wymaga również utworzenia kopii klucza podstawowego z tabeli ze strony 1 w tabeli ze strony wielu. Tabelą nadrzędną jest tu tabela za strony 1.
Projektowanie baz danych.
Projektowanie baz danych składa się z 3 etapów:
analiza wymagań bazy
modelowanie danych
normalizacja i testowanie utworzonej bazy
Na etapie analizy wymagań osoba projektująca bazę powinna zastanowić się nad:
dla kogo będzie przeznaczona baza danych
w jakim celu tworzymy bazę danych
kategoriami użytkowników i poziomem ich wiedzy
możliwościami finansowymi firmy zlecającej
stopniem bezpieczeństwa informacji zamieszczonych w bazie
Na podstawie powyższej analizy tworzymy cel projektu, a następnie modelujemy dane. Proces ten składa się z kilku etapów:
definiowanie tabeli - ile i jakie tabele są nam potrzebne w bazie
przypisanie pól tabelom - definiowanie: typów pól tabeli, kluczy podstawowych dla każdej z tabel, relacji między tabelami
Normalizacja to proces zmiany właściwości tabel w celu wyeliminowania nadmiarowości danych i spełnienia potrzeb integralności danych na różnych poziomach. Normalizacja często polega na podzieleniu tabeli na mniejsze tabele.
Testowanie ma na celu sprawdzenie w jakim stopniu zaprojektowana baza odpowiada kryteriom poprawności działania, integralności danych, bezpieczeństwa danych oraz w jakim stopniu interfejs bazy jest przyjazny użytkownikowi. Wynikiem testowania będzie wniosek w jakim stopniu zaprojektowana baza odpowiada celom projektu. Jeżeli baza odpowiada celom to proces projektowania będzie zakończony, natomiast w przeciwnym wypadku należy powrócić do któregoś z etapów i poprawić błędy. Dowolny proces projektowania jest procesem iteracyjnym ( pętlowym ). Testowanie powinno być przeprowadzone razem z użytkownikiem, bądź przez osoby niezależne.
Schemat łączenia tabel na każdym z etapów może być wykonany w różny sposób. Na przykład na początku procesu projektowania może to być szkic o wyglądzie:
Środkowy stan struktury może być przedstawiony przy pomocy ER-diagramów.
lub
Często podajemy także typ uczestnictwa:
opcjonalny - obiekt tabeli A niekoniecznie musi być przypisany obiektowi tabeli B Ten typ uczestnictwa oznaczamy
obowiązkowy
Ostateczny wygląd projektu bazy danych ma postać:
Nazwa tabeli |
|
|
|
Nazwa tabeli |
Pole 2 : : |
|
|
|
Pole 1 KP Pole 2 KO : : |
|
|
Nazwa tabeli |
|
|
|
|
Pole 1 KO Pole 2 KP Pole 3 : |
|
|
Normalizacja.
Przedmiotem i celem normalizacji jest opracowanie zagadnienia „w każdym miejscu tylko jeden fakt”, które można scharakteryzować jako maksymalne zmniejszenie nadmiarowości danych, które zawiera każda tabela.
Proces normalizacji bazuje na koncepcji 5 postaci normalnych, z których analizujemy jednak tylko 3 początkowe. Tabela znajdująca się w odpowiedniej postaci normalnej powinna odpowiadać zdefiniowanym kryteriom. Zakładamy, że każda zaprojektowana tabela z zdefiniowanymi elementami zarządzania danymi odpowiada pierwszej postaci normalnej. Dlatego aby tabela odpowiadała drugiej postaci normalnej powinna ona odpowiadać pierwszej postaci normalnej oraz pewnym dodatkowym kryteriom, itd.
Pierwsze trzy postacie normalne były opisane przez Codda. Podkreślił on, że postać o większym numerze jest lepsza od poprzedniej.
Z normalizacją jest związana zasada odwrotności danych. Oznacza to, że jakiekolwiek przekształcenia tabel nie powinno skutkować w żadnym stopniu utratą informacji.
Rozważmy to na przykładzie tabeli producentów „S”.
Nr_S |
Status_S |
Miasto_S |
S3 S5 |
30 30 |
Paryż Londyn |
W takim przypadku mamy dwa warianty normalizacji. Tabelę S możemy zastąpić tabelami:
SST |
Nr_S |
Status_S |
SC |
Status_S |
Miasto_S |
|
S3 S5 |
30 30 |
|
30 30 |
Paryż Londyn |
lub
SST |
Nr_S |
Status_S |
NC |
Nr_S |
Miasto_S |
|
S3 S5 |
30 30 |
|
S3 S5 |
Paryż Londyn |
W drugim przypadku informacja nie będzie stracona, gdyż tabele SST i NC zawierają dane, że producent S3 ma status 30 i ma siedzibę w Paryżu. Jest to dekompozycja bez strat, gdyż pole Nr_S jest ogólne dla obu tabel. Wynika z tego, że odwrotna konkatenacja tabel jest tu możliwa i otrzymamy w jej wyniku tabelę początkową S, w tym samym wyglądzie, czyli bez strat informacji.
W przypadku pierwszym mamy sytuację odwrotną i niektóre informacje mogą być stracone, gdyż obaj producenci mają status 30 i nie można określić, który ma siedzibę w Paryżu, a który w Londynie.
Postacie normalne.
Pole niekluczowe to pole nie będące częścią klucza podstawowego danej tabeli.
Nawzajem niezależne pola to takie pola, w których żadne z pól funkcjonalnie nie zależy od dowolnej kombinacji innych pól. W praktyce oznacza to, że każde pole może być modyfikowane niezależnie od zawartości innych pól.
Mówimy, że tabela jest w postaci normalnej pierwszej wtedy i tylko wtedy, gdy każde jej pole w każdym z rekordów posiada tylko jeden typ i jedno znaczenie. Tabela jest w postaci normalnej pierwszej jeżeli nie posiada pól segmentowych, wielowartościowych i wyliczalnych.
Załóżmy, że informacja o producentach i towarach jest podana w jednej tabeli o nazwie First składającej się z pól Nr_S, Status_S, Miasto_S, Nr_P, QTY. Klucz podstawowy składa się tu z pól Nr_S i Nr_P. W tej sytuacji pole status funkcjonalnie zależy od miejsca zamieszkania producenta, biorąc pod uwagę, że status zależy od miejsca zamieszkania. W tej tabeli nie wszystkie pola nie kluczowe są nawzajem niezależne, dlatego atrybuty Status_S i Miasto_S zależą od pola Nr_S. Ten stan nazywa się nierozkładalną zależnością od klucza. Aby spełnić potrzebę integralności danych tabela First może mieć wygląd:
Nr_S |
Status_S |
Miasto_S |
Nr_P |
QTY |
S1 S1 S1 S2 S2 |
20 20 20 10 10 |
Londyn Londyn Londyn Paryż Paryż |
P1 P2 P3 P1 P2 |
300 200 100 300 400 |
Widzimy tu dużą nadmiarowość, co utrudnia spełnienie operacji wstawiania, usuwania i modyfikowania danych w tej tabeli. W celu rozwiązania tego problemu należy rozdzielić tabelę First na dwie tabele Second i SP. Tabela Second będzie miała pola Nr_S, Status_S, Miasto_S, a tabela SP pola: Nr_P, Nr_S, QTY. Celem tego rozdzielenia było zlikwidowanie zależności pól, które nie są nierozkładalnymi.
W tabeli Second nie wszystkie pola są nawzajem niezależne, gdyż pole Status_S zależy od pola Nr_S. Oznacza to, że dowolny wpis w pole Nr_S definiuje pole Status_S. W celu rozwiązania tego problemu tabelę Second należy zastąpić dwiema tabelami S.C. zawierającą pola Nr_S i Miasto_S otraz tabelą CS o polach Miasto_S, Status_S.
Mówimy, że tabela jest w postaci normalnej drugiej wtedy i tylko wtedy, gdy znajduje się ona w postaci normalnej pierwszej i każde jej kluczowe pole nierozkładalne zależy od klucza. Obydwie tabele Second i SP znajdują się w drugiej postaci normalnej. Pierwsza tabela ma klucz Nr_S, a druga ma klucz złożony z dwóch pól Nr_S i Nr_P. Proces transformacji tabeli z postaci normalnej pierwszej w postać normalną drugą polega na zamianie tabeli z postaci normalnej pierwszej odpowiednim zbiorem projekcji w tym sensie, że odwrotna operacja nie prowadzi do strat informacji. W ten sposób pierwszy etap procedury normalizacji posiada tworzenie projekcji umożliwiającej wyłączenie funkcjonalnych zależności nie będących nierozkładalnymi.
Załóżmy, że mamy tabelę R składającą się z pól A, B, C, D o kluczu złożonym z pól A i B. Zakładamy, że istnieje funkcjonalna zależność między polem A i D. Procedura normalizacji polega na zamianie tabeli R na tabelę R1 o polach A i D z kluczem w polu A oraz tabelę R2 o polach A, B, C i kluczu podstawowym w polu B oraz kluczu obcym w polu A.
Mówimy, że tabela jest w postaci normalnej trzeciej wtedy i tylko wtedy, gdy tabela ma tylko jeden potencjalny klucz, który jest kluczem podstawowym oraz nie ma innych kluczy kandydujących. Tabela jest w postaci normalnej trzeciej wtedy i tylko wtedy, gdy jest ona w postaci normalnej drugiej i każde pole niekluczowe bezpośrednio zależy tylko od pola kluczowego. Tabele S.C., CS i Second znajdują się w postaci normalnej trzeciej.
Analiza praktycznych projektów baz danych.
Ex. 1. Przeanalizujmy projekt bazy danych szkoły:
analiza wymagań - baza danych przeznaczona do ułatwienia procesu zarządzania szkołą. Od bazy wymaga się możliwości:
dodawania, usuwania i modyfikowania informacji o:
uczniach i nauczycielach
klasach
dodatkowych zajęciach
przydzielania lub odwoływania obowiązków nauczyciela
projekt bazy danych - na początek wymieńmy obiekty naszej bazy:
Obiekt |
Atrybut |
Uwagi |
Uczeń |
Imię Nazwisko Data urodzenia |
Adresu nie potrzeba, gdyż jest taki sam jak opiekuna |
Pracownik |
Imie Nazwisko Data urodzenia Wykształcenie Ulica Numer domu Numer mieszkania Kod pocztowy Miejscowość Numer telefonu |
Pracownicy, którzy mają zajęcia z uczniami są nauczycielami |
Rodzice |
Imię Nazwisko Numer domu Numer mieszkania Kod pocztowy Miejscowość Numer telefonu |
Opiekun odpowiedzialny za ucznia |
Klasy |
Nazwa Profil Opis |
W szkołach z profilowaniem |
Przedmioty |
Nazwa Opis |
|
Sale |
Opis |
|
Miejsce zajęć |
Czas rozpoczęcia Czas zakończenia |
|
Przykładowe związki między obiektami i ich cechy:
przynależność do klasy - uczniowie należą do klas. W jednej klasie jest wielu uczniów, ale jeden uczeń należy tylko do jednej klasy. Każda klasa powinna składać się z pewnej liczby uczniów. Jest to relacja 1:wielu, w której uczestnictwo jest obowiązkowe z obu stron
dzieci i rodzice - każde dziecko ma rodziców ( 1 lub 2 ) lub opiekunów w sensie prawnym. Jednocześnie rodzice mogą mieć wiele dzieci w danej szkole. Jest to więc także relacja 1: wielu
zajęcia i klasy - jest to powiązanie między klasą, przedmiotem i nauczycielem, czyli analizujemy łącznie trzy typy obiektów. Każde zajęcie charakteryzuje dokładnie jedna klasa, jeden przedmiot i jeden nauczyciel prowadzący. Jest to więc relacja 1:1:1.
Opis bazy danych na podstawie ER-diagramów.
.
:
1
n
n 1 n 1
1 1
.......
n
1 n n
n
n
Widzimy, że tabela miejsce zajęć ma relację wiele do wielu i dlatego powinniśmy ją zastąpić dwoma tabelami z relacjami 1:wielu i wiele:1.
Ostateczny wygląd projektu bazy danych ma postać:
Rodzice |
|
Uczniowie |
|
Pracownicy |
|
Przedmioty |
Imie_rod Nazwisko_rod Telefon_rod Ulica_rod Nrdomu_rod Nrmieszk_rod Kodpoczt_rod Miasto_rod |
|
Id_ucz KP Id_rod KO Id_kl KO Imie_ucz Nazwisko_ucz Dataur_ucz |
|
Imie_pr Nazwisko_pr Dataur_pr Wykszt_pr Ulica_pr Nrdomu_pr Nrmieszk_pr Kopoczt_pr Miasto_pr |
|
Id_p KP Nazwa_p Opis_p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sale |
|
|
|
|
|
|
Id_s KP Numer_s Opis_s |
|
|
|
|
|
|
|
|
|
Klasy |
|
|
|
|
|
|
Nazwa_kl Profil_kl Opis_kl |
|
|
|
|
|
|
|
|
|
|
Lokalizacja |
|
|
|
|
|
|
Id_lok KP Id_z KO Id_s KO Czaspocz_lok Czaskon_lok |
|
|
|
|
Zajęcia |
|
|
|
|
|
|
Id_zaj KP Id_pr KO Id_p KO Id_kl KO |
|
|
|
|
|
|
|
|
|
Tworzenie tabel i formularzy autorskich w środowisku Delphi i C++ Builder.
Do tworzenia tabel stosuje się program DataBase Desktop lub tworzy się formularze autorskie, czyli projektuje się formularze przez rozmieszczenie na formie odpowiednich komponentów. Najczęściej używanymi komponentami są TTable, TDataSource i TDBNavigator. Proces tworzenia formy dzielimy na dwa etapy:
przygotowanie graficznej struktury formularza
umieszczenie na formularzu odpowiednich komponentów
Podczas przygotowania graficznego należy załadować formularz pusty, a następnie umieścić na nim dwa komponenty TPanel, które znajdują się na zakładce Standard. Jeden z tych komponentów jest przeznaczony do rozmieszczenia obiektów zarządzających opracowaniem danych, a drugi służy do rozmieszczenia pól.
Aby umożliwić dostęp użytkownikom do większej liczby komponentów, czyli atrybutów, które nie muszą się mieścić na formularzu na danym panelu umieścimy kontrolkę TScrollBox znajdującą się na zakładce Edit paska narzędzi.
Podczas umieszczania komponentów na formularzu, oprócz komponentów TTable i TDataSource, rozmieszczamy na formularzu kontrolki powiązane z danymi, które będą pełniły rolę interfejsu użytkownika. Rolę tę pełni TDBNavigator z zakładki DataControls, który powinien być umieszczony na górnym elemencie formularza. Atrybutowi DataSource tego komponentu należy przypisać znaczenie TDataSource1.
Komponent TField przeznaczony jest do modyfikowania i edycji struktury pól za pomocą elementu FieldsEditor, który można uruchomić po dwukrotnym kliknięciu komponentu TTable.
Tworzenie systemu zarządzania bazą danych.
Tworzenie aplikacji do obsługi bazy wymaga rozwiązania problemów polegających na:
zastosowaniu komponentu TDataBase w aplikacji
definiowaniu aliasów BDE ( w Delphi )
tworzeniu modułów danych
tworzeniu formularzy dla powiązania tabel typu nadrzędnego z podrzędnymi
umożliwienia generowania raportów
Budowa bazy danych oparta jest przede wszystkim na komponencie TTable, bądź aplikacji do obsługi TQuery.
Komponent TDataBase służy do ułatwienia dostępu do danych. Ten stopień dostępu można zmieniać za pomocą atrybutu TtransIsolation. Aby wykorzystać domyślną sekwencję logowania można dołączyć odpowiedni fragment kodu do procedury obsługi zdarzenia OnLogin komponentu TDataBase. Aby określić specyficzne parametry do obsługi bazy należy wypełnić wpis do atrybutu Params.
Definiowanie aliasów BDE.
Dostęp do baz odbywa się poprzez BDE. Ten termin oznacza, że nazwa bazy danych jest tylko pseudonimem. Alias BDE można przyrównać do źródła danych ODBC. Stanowi on zestaw parametrów sposobu podłączenia do bazy lub systemu zarządzania bazą.
Moduły danych ( data module )- specjalny typ formularzy przeznaczony do przechowywania komponentów do kontroli danych. Umożliwia on rozmieszczenie wszystkich reguł, tabel bazy danych w jednym miejscu, co daje możliwość ich wspólnego zastosowania przez oddzielne instrukcje. W bibliotece VCL moduły danych są zawarte w klasie TDataModule.
Relacje w tabeli można tworzyć przy pomocy kreatora opartego na:
komponentach TTable ( MasterSource, MasterField)
zastosowaniu kreatora DataBase Form Wizard
Kreator DataBase Form Wizard jest oparty na komponentach TQuery. W celu przyłączenia tabeli należy uruchomić kreatora, który znajduje się w menu DataBase i wykonać odpowiednie czynności. Następnie należy wybrać alias, czyli katalog, w którym znajdują się podlegające łączeniu tabele i dawać odpowiedzi na pytania kreatora. Ważne jest tu jakie pole będzie kluczem podstawowym w tabeli nadrzędnej, gdyż powinno ono być łączone z kopią klucza w tabeli podrzędnej.
Indeks jest to element logicznej struktury bazy danych przeznaczony do sortowania i wyszukiwania elementów tabeli. Relacyjne tabele posiadające klucz nie muszą posiadać indeksu.
Pola wyliczalne.
W fizycznych tabelach nie należy stosować pól wyliczalnych. Pola takie tworzymy przez pobieranie danych z jednej lub kilku tabel. Do tworzenia tego typu pola zastosujemy komponent TTable, a mianowicie jego pole FieldsEditor.
Głównym krokiem jest tu napisanie procedury, która powinna znajdować się w obsłudze zdarzeń. Pola wyliczalne często umieszczamy w raportach.
Kontrola wprowadzania danych.
Kontrola wprowadzania danych ma na celu kontrolować typy i długość wprowadzanych danych. Istnieją następujące metody kontroli:
maski wejściowe - służą do wprowadzania danych typu data, czas. Aby nałożyć maskę należy zastosować komponent TField i jego właściwość EditMaske (TField-EditMaske)
określenie na poziomie bazy danych - właściwość EditMaske jest efektywna przy zastosowaniu pojedynczej aplikacji ( tabeli )
Cancel - polega ona na procedurach autorskich
Kontrola właściwości na poziomie pól i tabel - przeznaczona do analizy właściwości będących rozwiązaniem operacji nad innymi polami. Ta metoda polega na zastosowaniu zdarzeń i wyjątków
Wyjątki w metodach kontroli wprowadzania danych stanowią:
dublowanie kluczy
błąd kontroli bazy danych
Programy obsługi ODBC.
Do tworzenia i zarządzania ODBC służy aplikacja ODBC administrator z panelu sterowania Windows. Sterownik ODBC zawiera kod, który rozumie specyfikę konkretnej bazy danych i umożliwia dostęp do niej przez standardowe elementy.
Aby połączyć Buildera z Delphi należy stworzyć sterownik Borland DataBase Engine. ODBC posiada także sterowniki danych. Sterownik bazy danych należy tak skonfigurować, aby można było uruchomić sterownik ODBC. Polega to na następujących ruchach:
uruchomieniu administratora ODBC
kliknięciu zakładki config, Draywers, ODBC i wybraniu polecenia new
ustaleniu nazwy sterowników ODBC
wybraniu sterownika ODBC
Sposoby podłączenia do baz danych.
Zbiory danych mogą być dołączane do serwerów baz danych za pomocą komponentu Connection. Komponenty tej klasy n-kapsulują metody dołączenia do serwera baz danych i w ten sposób pełnią rolę punktu dołączenia dla wszystkich zbiorów danych w aplikacji. Komponent Connection jest n-kapsulowany w komponencie klasy TCustomConnection, od którego pochodzą klasy pozostałych komponentów. Dla wszystkich typów przechowywania danych stosuje się następujące komponenty dostępu do danych:
komponent TDataBase - przeznaczony do podłączenia zbiorów danych Borland DataBase Engine ( BDE ). Do tych zbiorów danych należą komponenty: TTable, TQuery, TStoreProc
komponent TADOConnection ( używany w Delphi 6.0 ) - przeznaczony jest do podłączenia baz danych ADO, MSAccess i MSSQL. Występują tu następujące zbiory danych: TADODataSet, TADOTable, TADOStoredProc
komponent TSQLConnection - przeznaczony do podłączenia zbiorów danych orientowanych na DBExpress ( w Delphi ). Zbiory danych DBAccess są specjalnymi jednostronnymi zbiorami danych. Do tych zbiorów danych zaliczamy: TSQLDataSet, TSQLTable, TSQLQuery, TSQLStoredProc
komponent TIBDataBase - przeznaczony do podłączenia zbiorów danych orientowanych na InterBase Express.
Każdy z tych czterech zbiorów danych posiada możliwości pochodzące od klasy TCustomConnection. Do tych możliwości należą:
dołączanie do danych i odłączanie tego połączenia
manipulowanie zbiorem danych
podtrzymywanie trybu ochrony danych
Korporacja Microsoft opracowała strategię uniwersalnego dostępu do danych. Ta strategia składa się z 3 elementów:
OLE DB
ADO - ActiveX DataObjects - obiekty danych ActiveX
ODBC
OLE DB jest to interfejs poziomu systemowego, w którym w celu dostępu do
danych wykorzystuje się model komponentów obiektowych COM. Dzięki temu wzięte pod uwagę będą również relacyjne i nierelacyjne komponenty danych.
Większość providerów OLE DB umożliwia dostęp do takich danych jak Paradox, Oracle, Microsoft SQL Serwer, ODBC.
ADO jest to interfejs poziomu aplikacji, który stosują twórcy aplikacji dostępu do danych. W odróżnieniu od OLE DB posiadających ponad 60 różnych interfejsów.
W technologii ADO zastosowano tylko kilka interfejsów dla współdziałania z twórcami aplikacji
Technologię ODBC stosuje się w celu dostępu do relacyjnych i niektórych nierelacyjnych baz danych. Jeden z interfejsów OLE DB polega na zastosowaniu ODBC.
Zastosowanie możliwości programów obsługi ODBC do podłączania do baz danych.
Delphi i C++ Builder łączą się z systemem obsługi baz danych za pośrednictwem
32-bitowych sterowników ODBC. Do tworzenia i zarządzania źródłami danych typu ODBC, które można porównać do aliasów BDE, służy aplikacja ODBC Administrator z panelu sterowania Windows.
Sterownik ODBC zawiera kod, który rozumie specyfikę konkretnej bazy danych i umożliwia dostęp do niej poprzez standardowe elementy. Przykład zastosowania ODBC:
do tworzonej aplikacji w środowisku C++ Builder lub Delphi należy podłączyć istniejący zbiór danych, np.: listy pracowników będące na SQL serwerze InterBase. Trzeba zatem utworzyć interfejs użytkownika w celu połączenia wyżej wymienionych aplikacji z tym zbiorem danych. Zastosowanie ODBC rozwiązuje ten problem
trzeba importować w środowisko Delphi aplikację bazodanową przygotowaną w innym środowisku ( na innej platformie językowej ). ODBC umożliwia rozwiązanie tego problemu.
W celu zastosowania w środowiskach Delphi i C+ Builder sterownika ODBC i generowania połączenia przez ten sterownik ze zbiorem danych, czy zewnętrzną aplikacją należy stworzyć nowy sterownik Borland DataBase Engine. ODBC posiada także sterowniki danych. Sterownik bazy danych należy tak skonfigurować, aby można było uruchomić sterownik ODBC. Polega to na następujących ruchach:
uruchomieniu administratora ODBC
kliknięciu zakładki Configure/ Drivers/ ODBC
prawym przyciskiem kliknąć na ODBC i wybrać polecenie New
wpisaniu nazwy sterownika ODBC dla dalszego zastosowania
wybraniu sterownika ODBC, który będzie stosowany do zbiorów danych przez aliasy ODBC.
Dostęp do baz danych MSAccess przez ODBC.
Dołączenie do bazy polega na wykonaniu czynności:
określeniu źródła danych ODBC. Uruchomić aplikację ODBCAD32 znajdującą się w katalogu Windows\System32
na zakładce System DSN kliknąć przycisk Add. Pojawi się spis dostępnych sterowników danych ODBC
wybrać zakładkę Access Data *.mdb i przycisk Finish
podać nazwę i opisać źródło danych Access. W naszym przypadku wykorzystamy nazwę TestAccess
kliknąć na Select. Pojawi się spis plików z rozszerzeniem mdb
z spisu wybrać plik Accessa i zamknąć ODBCAD32 przez przycisk OK.
Ten program ustalony w C++ Builder i Delphi jest wgrywany podczas instalacji. Jeżeli
BDE Administrator działa, to każde nowe źródło danych ta aplikacja dodaje do spisu sterowników ODBC. Aby później można było zastosować to nowe źródło te zmiany trzeba zachować.
BDE Administrator automatycznie wybiera sterowniki ODBC tylko, gdy właściwość Auto ODBC jest ustawiona na True. Aby właściwość ta odpowiadała True należy wykonać kolejne procedury:
uruchomić BDE Administratora
wybrać zakładkę Confoguration\ Drivers\ System\ Init
w prawej części okna Init ustawić właściwość Auto ODBC
Drugi etap podłączenia polega na zastosowaniu stworzonego aliasu ODBC do podłączenia danych. W tym celu należy wykonać kroki:
stworzyć nowy formularz, na którym musi być umieszczony komponent TTable
właściwość tego komponentu DataBase ustawić na TestAccess
podać jeżeli istnieją identyfikator i hasło dla dostępu do Accessa lub kliknąć OK.
wybrać potrzebną tabelę i skonfigurować aplikację
Jeżeli we właściwości TableName wybrano źródło danych ODBC i dla komponentu TTable właściwość Active jest ustawiona na True, może ukazać się powiadomienie Object not found. Oznacza to, że użytkownik zapomniał uruchomić Administratora BDE w celu zmiany konfiguracji BDE.
Technologia dostępu do zbiorów danych DBExpress.
Ta technologia dostępu do danych ma zalety:
DBExpress jest łatwiejszy od BDE ( ODBC ) w instalacji
technologia DBE jest technologią międzyplatformową, tzn. że opracowane aplikacje mogą być zastosowane na platformie Linux w środowisku Kylix
dla tworzenia nowych sterowników wystarczającym jest zastosowanie istniejących interfejsów uzupełnionych potrzebnymi bibliotekami
Podstawą struktury DBExpress są sterowniki baz danych. Te sterowniki współdziałają
z aplikacjami poprzez komponent DataCLX, podobnie jak komponenty TDataBase współdziałają ze sterownikami BDE. W celu dostępu do danych DBExpress stosuje tzw. jednostronne zbiory danych.
Jednostronne zbiory danych w odróżnieniu od zbiorów zastosowanych w BDE posiadają tylko dwie metody nawigacyjne ( poszukiwania ): First, Next. Dodatkowo tych zbiorów nie można redagować i nie można filtrować danych.
W odróżnieniu od BDE DBExpress nie potrzebuje zasobów serwera do przechowywania zapytań zewnętrznych i danych. DBExpress potrzebuje mniej zasobów klienta, gdyż nie potrzebuje keszowania danych. W odróżnieniu od BDE w DBExpress nie istnieje potrzeba tworzenia wewnętrznych zapytań w celu rozwiązania problemów nawigacji.
Podsumowując DBExpress jest łatwiejszy do obsługi dla użytkownika.
Opracowanie informacji na bazie języka SQL.
Podstawowe zasady działania tego języka są takie same jak działanie komponentu TQuery. Technologia zastosowania SQL umożliwia otrzymanie informacji w wyglądzie raportów będących wynikiem działania zapytań. Już znamy 4 formy przedstawienia informacji w bazach danych:
tabela
forma
zapytanie, czyli kwerenda
raport
SQL jest standardowym językiem używanym we wszystkich systemach bazo - danowych, do pobierania, przechowywania i manipulowania danymi. SQL nie zależy do platformy, natomiast nieznacznie zależy od systemu zarządzania bazą danych. Twórcy systemów zarządzania dodają do standardowego języka SQL nowe, dodatkowe możliwości.
Ogólne zasady zastosowania SQL.
Utwórzmy przykładową tabelę „Studenci”:
ID |
Nazwisko |
Imię |
Stypendium |
Adres |
Telefon |
1 2 3 4 5 |
Abc Bcd Mnk Abc Opr |
Aab Lkm Lkm Spr |
85 0 200 150 100 |
Bydgoszcz Bydgoszcz Toruń Inowrocław Aleksandrów |
25-0 38-1 28-7 33-5 26-7 |
Uzyskać informację będącą częścią tabeli można za pomocą poleceń SQL. Oprócz tego SQL umożliwia rozwiązanie następujących problemów:
tworzenie i usunięcie tabel i bazy danych
wprowadzenie, modyfikacja i usunięcie wierszy
ustawienie praw dostępu użytkowników do informacji
Aby wykonać dowolną z tych operacji należy użyć odpowiedniego polecenia SQL.
Odróżnieniem tego języka od innych języków programistycznych, jest to że działającą jednostką tego języka jest polecenie, a nie program składający się z poleceń.
Polecenie składa się z 3 fraz:
select
from
where
Polecenia SQL są niewrażliwe na wielkość liter.
Najbardziej typowym przykładem zastosowania SQL jest wybór tylko kilku kolumn z tabeli źródłowej. Dokonamy tego przy pomocy polecenia:
select Nazwisko, Imię from Studenci ;
W wyniku tej operacji otrzymamy tabelę:
Nazwisko |
Imię |
Abc Bcd Mnk Abc Opr |
Aab Lkm Lkm Spr |
W większości wypadków poleceń SQL ważna jest interpunkcja. Najczęściej używanym znakiem jest przecinek lub średnik na końcu polecenia.
W większości implementacji SQL średnik na końcu polecenia informuje interpretera, że dane polecenie jest skończone. Przykładowo system zarządzania SQL+ firmy Oracle nie wykonuje zapytania dopóki nie napotka średnika. W innych implementacjach SQL wśród ISQL, MSSQL średnik nie jest obowiązkowy.
W odpowiedzi na zapytanie SQL porządek kolumn tabeli może być zmieniony, np.:
select Nazwisko, ID from Studenci ;
Nazwisko |
ID |
Abc Bcd Mnk Abc Opr |
1 2 3 4 5 |
W operacjach selekcji z podanych wyżej przykładów w odpowiedzi otrzymujemy taką ilość wierszy, jaką posiada tabela źródłowa ( z powtarzaniem tych samych wartości ) np.: chcąc uzyskać tylko różne nazwiska należy zastosować operator distinct
select distinct Nazwisko from Studenci ;
Nazwisko |
Abc Bcd Mnk Opr |
W niektórych implementacjach SQL obowiązkowo musimy przypisać operator wyboru niepowtarzających się wartości( distinct ) lub wszystkich wartości ( all ) np.:
select all Nazwisko from Studenci ;
Słowo kluczowe - jest indywidualnym podstawowym elementem języka.
Zdanie - to ciąg słów zaczynając od pierwszego słowa kluczowego ( pierwszej frazy ) do
znaku średnika lub naciśnięcia klawisza ENTER.
Fraza SQL - to część zapytania, która posiada indywidualne znaczenie i oparta jest na
oddzielnym słowie kluczowym.
Warunki i operatory w SQL.
Warunki w SQL polegają na zastosowaniu frazy where np.:
select * from Studenci where Stypendium > 200 ;
warunek
Warunek jest to sprawdzenie wykonania operacji logicznej, która zwraca 2 wartości: TRUE lub FALSE. W przypadku FALSE wynikiem będą nie znalezione obiekty ( 0 rows selected ). Najczęściej używane warunki składają się z 3 części:
zmiennej
stałej
operatora porównania
Stała może być liczbą, tekstem, datą, czasem lub innym typem danych.
Operatory jak i w innych językach dzielą się na grupy:
operatory arytmetyczne: +, -, /, *, modulo ( % - reszta z dzielenia ) np.:
select Stypendium*2 Styp from Studenci ;
nazwa nowej tabeli
W odpowiedzi powstanie tabela Styp
Styp |
170 0 400 300 200 |
Wśród operatorów arytmetycznych operator „-” może być zastosowany w celu zmiany znaku właściwości liczbowych np.: select -Stypendium from Studenci ;
operatory porównania ( występujące we frazie where ): =, >, <. >=. <=, <>(!=). Jeżeli wartość jakiegoś pola jest zerowa, to należy pisać where zaw is NULL. Operatory porównania mogą być zastosowane do liczb i łańcuchów znakowych select Imię from Studenci where Imię > `Lkm' ;
operatory znakowe: like, || ( konkatenacja - połączenie właściwości kilku pól ). Operator like przeznaczony jest do wyboru z bazy danych spełniających podany warunek np.: select * from Studenci where Nazwisko like `A%'; Operator % oznacza dowolną ilość symboli, natomiast operator „_” oznacza 1 dowolny znak na danej pozycji. Argument operatora like ( pomiędzy ` ` ) jest wrażliwy na wielkość liter.
operatory logiczne OR, AND, NOT - przeznaczone są do tworzenia skomplikowanych warunków w zdaniach SQL. Najczęściej te operatory stosujemy we frazie where
operatory mnogościowe union all, union, intersect, minus - przeznaczone są do pobierania informacji z kilku tabel ( przynajmniej z 2 jednocześnie )
operatory dodatkowe in ( ), between < > - operatory dodatkowe zwykle stosujemy we frazie where jako kryterium wyboru informacji. Operatory te upraszczają zdania SQL z operatorami logicznymi.
Załóżmy, że mamy dwie tabele:
Pracownicy |
|
Studenci |
|||||||
ID |
Nazwisko |
Staż |
Odpracowano |
Płaca_dz |
|
ID |
Nazwisko |
Rok_studiów |
Kierunek |
1 2 3 4 5 |
Aab Bcd Bam Abc Bam |
5 15 8,5 25 10 |
18 20 21 21 15 |
30 35 40 50 25 |
|
11 12 13 14 |
Bcd Mnk Aab Opr |
2 3 3 1 |
SI ZTH SI SI |
Chcąc uzyskać informacje o nazwiskach pracowników zaczynających się na A o stażu pracy większym od 10 i ich płacach musimy zastosować frazę:
select Nazwisko, Odpracowano*Płaca_dz Płaca_brutto from Pracownicy where
Staż>10 and Nazwisko like `A%” ;
Nazwisko |
Płaca_brutto |
Abc |
1050 |
W odpowiedzi otrzymamy tabelę:
Chcąc uzyskać informacje o nazwiskach pracowników nie posiadających w nazwisku litery A o stażu pracy większym od 10 i ich płacach musimy zastosować frazę:
select Nazwisko, Odpracowano*Płaca_dz Płaca_brutto from Pracownicy where
Staż>10 and Nazwisko not like `%A” ;
Nazwisko |
Płaca_brutto |
Bcd |
700 |
W odpowiedzi otrzymamy tabelę:
Chcąc uzyskać informacje o nazwiskach pracowników nie posiadających w nazwisku litery A lub o stażu pracy większym od 10 i ich płacach musimy zastosować frazę:
select Nazwisko, Odpracowano*Płaca_dz Płaca_brutto from Pracownicy where
Staż>10 or Nazwisko not like `%A” ;
Nazwisko |
Płaca_brutto |
Bcd Bam Abc |
700 840 1050 |
W odpowiedzi otrzymamy tabelę:
Operator union all przeznaczony jest do pobierania właściwości z dwóch tabel. Wynikiem jest tabela zawierająca wszystkie obiekty odpowiadające podanym kryteriom, w tym powtarzające się. W zdaniach z operatorem union all musimy zastosować co najmniej dwie frazy select np.:
select Nazwisko from Pracownicy union all select Naziwsko from Studenci;
Nazwisko |
Aab Bcd Bam Abc Bcd Mnk Aab Opr |
W odpowiedzi otrzymamy tabelę:
Operator union przeznaczony jest do pobierania właściwości z dwóch tabel. Wynikiem jest tabela zawierająca wszystkie obiekty nie powtarzające się w podanych tabelach ( obiekty mogą się powtarzać w jednej tabeli - jeśli chcemy tego uniknąć należy zastosować operator distinct ), odpowiadające podanym kryteriom.
select Nazwisko from Pracownicy union select Naziwsko from Studenci;
Nazwisko |
Aab Bcd Bam Abc Bam Mnk Opr |
W odpowiedzi otrzymamy tabelę:
Operator intersect przeznaczony jest do zwrócenia właściwości pól powtarzających się w dwóch tabelach
select Nazwisko from Pracownicy intersect select Naziwsko from Studenci;
Nazwisko |
Bcd Aab |
W odpowiedzi otrzymamy tabelę:
Operator in ma argumenty podane w ( ) po przecinku np.: in (a, b, ..., j). Argumentami operatora in mogą być dowolne typy danych podanych po przecinku. Ilość argumentów operatora in jest nieokreślona. Wynikiem działania operatora in jest tabela z obiektami, których podana właściwość jest argumentem operatora in.np.:
select * from Pracownicy where Staż in(5,10,15,20)
ID |
Nazwisko |
Staż |
Odpracowano |
Płaca_dz |
1 2 5 |
Aab Bcd Bam |
5 15 10 |
18 20 15 |
30 35 25 |
W odpowiedzi otrzymamy:
Podobne działanie ma operator between. Zwraca on obiekty, których właściwość jest zawarta pomiędzy skrajnymi argumentami operatora np.:
select * from Pracownicy where Staż between 5 and 20
ID |
Nazwisko |
Staż |
Odpracowano |
Płaca_dz |
1 2 3 5 |
Aab Bcd Bam Bam |
5 15 8,5 10 |
18 20 21 15 |
30 35 40 25 |
W odpowiedzi otrzymamy:
Funkcje w SQL.
Funkcje w języku SQL przeznaczone są do przekształcenia informacji zawartych w tabelach. Jest 6 typów funkcji:
funkcje agregujące
funkcje do opracowania danych typu daty i czasu
funkcje arytmetyczne
funkcje znakowe
funkcje konwertujące
funkcje dodatkowe
Funkcje agregujące.
Funkcje tego typu nie działają we frazie where. Jest 5 funkcji agregujących:
count ( )
arg ( )
min ( )
max ( )
sum ( )
Zasady stosowania tych funkcji:
każda z tych funkcji zwraca tylko jedno znaczenie
funkcje arg ( ) i sum ( ) działają tylko na polach liczbowych
funkcje min ( ) i max ( ) działają na polach liczbowych i tekstowych
funkcja coun ( ) operuje nie typami danych, a obiektami zawartymi w tabeli
Argumentami funkcji count mogą być nazwy jednego, kilku lub wszystkich pól tabeli. Najczęściej spotykamy się z przypadkiem jednego(count (pole)) lub wszystkich pól(count(*)). Funkcja count zwraca ilość obiektów ( wierszy ) odpowiadających argumentom lub dodatkowym warunkom podanym we frazie where.
select count(*) from Pracownicy ;
count(*) |
4 |
Odpowiedzią systemu będzie:
select count(*) from Pracownicy where Nazwisko like `%a%';
count(*) |
2 |
Odpowiedzią systemu będzie:
select count(Nazwisko) from Pracownicy ;
count(Nazwisko) |
4 |
Odpowiedzią systemu będzie:
Zdanie select * count(*) from Pracownicy ; jest niepoprawne.
Funkcja arg zwraca średnią wartość argumentu. Argumentem funkcji może być nazwa pola lub operacja arytmetyczna wykonana nad właściwościami pól lub liczbami.
select arg(Staż) from Pracownicy ;
arg(Staż) |
13,375 |
Odpowiedzią systemu będzie:
select arg(Staż+5) Nowy_staż from Pracownicy ;
Nowy_staż |
18,32 |
Odpowiedzią systemu będzie:
select arg(Odpracowano*Płaca_dz) Średnia_pensja from Pracownicy ;
Średnia_pensja |
701 |
Odpowiedzią systemu będzie:
Funkcja min zwraca minimalny argument funkcji. Jeżeli zastosujemy funkcję min mając za argument pola stringowe, to nie możemy stosować operacji arytmetycznych jako argumentów danej funkcji. Natomiast jeżeli argumentem jest właściwość pól liczbowych, to możemy stosować dowolne operacje arytmetyczne jako argumenty funkcji.
select min(Staż) from Pracownicy ;
min(Staż) |
5 |
Odpowiedzią systemu będzie:
select min(Nazwisko) from Pracownicy ;
min(Nazwisko) |
Aab |
Odpowiedzią systemu będzie:
select min(Staż+5) from Pracownicy ;
min(Staż+5) |
10 |
Odpowiedzią systemu będzie:
Funkcja max ma te same zasady działania i te same ograniczenia jak funkcja min, z tym wyjątkiem, że zwraca ona maksymalną wartość argumentu.
select max(Staż) from Pracownicy ;
max(Staż) |
25 |
Odpowiedzią systemu będzie:
select max(Nazwisko) from Pracownicy ;
min(Nazwisko) |
Bcd |
Odpowiedzią systemu będzie:
Funkcja sum zwraca sumę zawartości argumentów funkcji. Funkcja ta działa tylko na polach liczbowych. Argumentem tej funkcji może być pole, bądź operacja arytmetyczna nad polami i liczbami.
select sum(Staż) from Pracownicy where Nazwisko=”Bam”
sum(Staż) |
18,5 |
Odpowiedzią systemu będzie:
W jednym zdaniu SQL mogą być zastosowane zastosowane kombinacje funkcji arytmetycznych oraz operacje arytmetyczne nad różnymi funkcjami np.:
select min(Staż), max(Staż) from Pracownicy ;
min(Staż) |
max(Staż) |
5 |
25 |
Odpowiedzią systemu będzie:
select max(Staż) - min(Staż) Różnica_stażu from Pracownicy ;
Różnica_stażu |
20 |
Odpowiedzią systemu będzie:
Funkcje związane z datą i czasem.
W celu rozważenia funkcji związanych z datą i czasem zbudujmy tabelę „Projekt BD”.
Etap |
Początek |
Koniec |
Analiza Projektowanie_tab Projektowanie_pól Tworzenie_relacji Kodowanie Tetowanie Obrona |
02-january-03 06-january-03 21-january-03 01-february-03 16-february-03 01-april-03 20-april-03 |
05-january-03 20-january-03 31-january-03 15-february-03 31-march-03 15-april-03 30-april-03 |
Najczęściej używanymi funkcjami związanymi z datą i czasem są funkcje:
add_month ( )
last_day ( )
month_between ( )
new_time ( ) - służy do użycia czasu odpowiadającego danej strefie czasowej
next_day ( ) - zwraca pierwszy dzień tygodnia, który jest większy od podanej daty
sysdate - zwraca systemową zawartość daty i czasu komputerowego na moment opracowania zaytania
Funkcja add_month dodaje podaną liczbę miesięcy jako argument funkcji, do
określonej daty np.:
select Etap, Koniec, add_month(koniec, 2) Koniec_zmieniony from Projekt_BD ;
Etap |
Koniec |
Koniec_zmieniony |
Analiza Projektowanie_tab Projektowanie_pól Tworzenie_relacji Kodowanie Tetowanie Obrona |
05-january-03 20-january-03 31-january-03 15-february-03 31-march-03 15-april-03 30-april-03 |
05-march-03 20-march-03 31-march-03 15-april-03 31-may-03 15-june-03 30-june-03 |
Odpowiedzią systemu będzie:
Funkcja add_month działa tylko nad polami o formacie daty. Dlatego, aby działała ona poprawnie nad danymi liczbowymi lub tekstowymi należy zastosować funkcję konwertującą: to_char lub to_date.
Funkcja last_day zwraca ostatni dzień miesiąca podanego jako argument. Ilość odpowiedzi funkcji jest równa ilosci wierszy w tabeli. Aby temu zapobiec należy zastosować operator distinct.
select distinct last_day(Koniec) Ostatni_dzień from Projekt_BD;
Ostatni_dzień |
31-january-03 28-february-03 31-march-03 30-april-03 |
Odpowiedzią systemu będzie:
Funkcja month_between zwraca różnicę przedstawioną w liczbach pomiędzy argumentami x i y ( x-y ) np.:
select Etap, Początek, Koniec, month_between(Koniec, Początek) Czas_trwania from Projekt_BD;
Odpowiedzią systemu będzie
Etap |
Początek |
Koniec
|
Czas_trwania |
Analiza Projektowanie_tab Projektowanie_pól Tworzenie_relacji Kodowanie Tetowanie Obrona |
02-january-03 06-january-03 21-january-03 01-february-03 16-february-03 01-april-03 20-april-03 |
05-january-03 20-january-03 31-january-03 15-february-03 31-march-03 15-april-03 30-april-03 |
4/31 15/31 11/31 16/28 44/59 16/30 11/30 |
Funkcje arytmetyczne.
Najczęściej używanymi funkcjami arytmetycznymi są funkcje:
abs ( )
ceil ( )
floor ( )
sin ( )
cos ( )
tan ( )
exp ( )
ln ( )
log (a, b)
mod (a, b)
power (a, b)
sign ( )
Utwórzmy przykładową tabelę „Liczby”:
Pensja |
Premia |
Dług |
1500 2000 |
300 150 |
0 -20 |
Funkcja abs zwraca wartość bezwzględną podanej liczby np.:
select abs(Dług) from Liczby;
abs(dług) |
0 20 |
Odpowiedzią systemu będzie:
Funkcja ceil ( ) zwraca najmniejszą liczbę całkowitą, większą bądź równą od podanego argumentu ( jeśli mamy do czynienia z ułamkiem to zaokrąglamy go w górę ).
Funkcja floor ( ) jest funkcją odwrotną do ceil i zwraca największą liczbę całkowitą, mniejszą bądź równą od podanego argumentu ( jeśli mamy do czynienia z ułamkiem to zaokrąglamy go w dół ).
Funkcje sin, cos, tan zwracają wartości kątów poszczególnych argumentów, przy czym argumenty muszą być podawane w radianach.
Funkcja log posiada 2 argumenty i zwraca logarytm pierwszego argumentu przy podstawie odpowiadającej drugiemu argumentowi.
Funkcja mod zwraca resztę z dzielenia dwóch liczb, będących argumentami tej funkcji(a/b).
Funkcja power zwraca podniesioną liczbę będącą pierwszym argumentem do określonej potęgi będącej drugim argumentem funkcji ( ab ).
Funkcja sign jest często stosowana przy opracowywaniu sygnałów komputerowych i zwraca następujące wartości: -1 , gdy a<0
0 , gdy a = 0
1 , gdy a>0
Funkcja sqrt zwraca pierwiastek kwadratowy z podanego argumentu.
Funkcje arytmetyczne można zastosować również we frazach select i where oraz jako argumenty innych funkcji, w tym funkcji agregujących lub innych funkcji arytmetycznych sum(abs()), abs(ceil()).
Funkcje znakowe.
Funkcji chr odpowiada znak z tabeli kodów ASCII, który odpowiada liczbie podanej jako argument, czyli jest numerem symbolu w kodzie ASCII np.: chr(87) = w.
Funkcja concat(arg1, arg2) odpowiada operatorowi konkatenacji || np.: chcąc połączyć kolumny nazwisko i imię z tabeli Studenci napiszemy:
select concat( Nazwisko, Imię ) ”Nazwisko i imię” from Studenci;
Ważne w tej funkcji jest to, że wielkość odstępu pomiędzy nazwiskiem i imieniem zależy od długości pola Nazwisko np.: gdy pole nazwisko ma długość 12 mamy: Kowalczyk_ _ _Jan.
Funkcja initcap powoduje zamianę pierwszej litery właściwości pola podanego jako argument na dużą literę, a pozostałych na małe np.:
select Imię, initcap(Imię) from Studenci;
Imię |
Initcap(Imię) |
Marek MAREK mAREK |
Marek Marek Marek |
Odpowiedzią systemu będzie:
Funkcja lower umożliwia zamianę wszystkich liter argumentu na małe litery, bez uwzględniania wielkości liter w oryginalnym słowie.
Funkcja upper zamienia wszystkie litery argumentu na duże, bez uwzględniania wielkości liter w oryginalnym słowie.
Funkcja replace(arg1, arg2, arg3 ) przeznaczona jest do zastępowania znaków w fragmentach tekstu, przy czym: arg1 - nazwa pola ;
arg2 - szukany fragment tekstu ;
arg3 - zastępujące znaki;
select Nazwisko, replace( Imie, ”ajte”, ”ienie”) Nowe_nazwisko from Tabela;
Nazwisko |
Nowe_nazwisko |
Kozlowskjte |
Kozlowskienie |
Odpowiedzią systemu będzie:
Funkcja instr (arg1, arg2, arg3, arg4 ) wskazuje gdzie w ciągu znakowym występuje określony wzorzec, przy czym: arg1 - nazwa pola, arg2 - źródłowy ciąg znakowy ( wzorzec ), arg3 - liczba, która mówi nam od którego znaku należy rozpoczynać poszukiwanie,
arg4 - liczba, która mówi nam o którym wystąpieniu we wzorcu powinna funkcja informować np.:
select Nazwisko, instr(Nazwisko, ”u”, 1, 1) Informacja from Tabela1;
Nazwisko |
Informacja |
Urbanowicz Gurski Kapusta Małysz |
1 2 4 0 |
Odpowiedzią systemu będzie:
Funkcja length zwraca ilość znaków będących argumentem funkcji.
Funkcje konwertujące.
Funkcja to_char konwertuje liczby z pola podanego jako argument funkcji w ciąg znakowy.
Funkcja to_number wykonuje odwrotną konwertację, czyli zamienia ciąg liczbowy znaków na liczbę.
Funkcje dodatkowe.
Wynik działania funkcji dodatkowych nie zależy od danych przechowywanych w tabeli. Ilość wierszy w odpowiedzi na zapytanie jest równa ilości wierszy w tabeli.
Funkcja greatest(arg1, arg2, ..., arg n) ma podobne działanie do funkcji max. Wyszukuje ona w przypadku argumentów tekstowych najbliższe słowo końcu alfabetu, przy czym, argumenty funkcji mogą być też liczbami np.:
select greatest(`Dudek', `Smolarek', `Olisadebe') from Tabela2;
Odpowiedzią funkcji na zapytanie będzie: Smolarek.
Funkcja user zwraca nazwę bieżącego użytkownika bazy danych. User nie jest kolumną bazy danych, choć nazwa użytkownika będzie podana do każdego rekordu tabeli.
select user from Studenci;
Frazy w SQL.
Oprócz fraz select, where, from istnieją w języku SQL jeszcze inne frazy:
starting with
order by
group by
having
Fraza starting with zwykle działa w spółce z frazą where i działa tak samo jak
operator like. Aby ukazać działanie tej frazy stwórzmy tabelę Studenci:
ID |
Nazwisko |
Imię |
Wydział |
Stypendium |
3 7 1 25 13 |
Abc Dog Abc Mnk Abc |
Marek Zbyszek Jurek Wacek Witek |
Matematyka Filozofia Matematyka Historia Matematyka |
150 200 0 150 300 |
Fraza select Nazwisko, Stypendium from Studenci where Nazwisko like `A%' jest równoważna z:
select Nazwisko, Stypendium from Studenci where Nazwisko starting with(`A');
Nazwisko |
Stypendium |
Abc Abc Abc |
150 0 300 |
Odpowiedzią systemu będzie:
Operator like i fraza starting with mogą być zastosowane razem w tym samym zdaniu:
select Nazwisko, Stypendium from Studenci where Nazwisko like'A%' and Wydział starting with(`M');
Dotychczas we wcześniejszych odpowiedziach na zapytania kolejność wierszy była taka sama jak w tabeli, z której pobieraliśmy dane. Fraza order by umożliwia posortowanie wierszy w kolejności alfabetycznej. Dodaj po frazie order by skróty ASC lub DESC możliwe jest posortowanie tabeli w porządku alfabetycznym lub też w porządku przeciwnym (sortowanie odwrotne) np.:
select Nazwisko from Studenci order by Nazwisko DESC;
Nazwisko |
Mnk Dog Abc Abc Abc |
Odpowiedzią systemu będzie:
We frazie order by może występować nie jedno, a kilka pól. W takim przypadku priorytet sortowania zmniejsza się w kolejności od pierwszego podanego pola.
select Nazwisko, Imię from Studenci order by Nazwisko, Imię ;
Nazwisko |
Imię |
Abc Abc Abc Dog Mnk |
Jurek Marek Witek Zbyszek Wacek |
Odpowiedzią systemu będzie:
Kryterium sortowania we frazie order by nieobowiązkowo powinno odpowiadać nazwie pól we frazie select. Jeżeli występuje kilka kryteriów sortowania, to każde może mieć inny algorytm sortowania np.:
select Nazwisko, Imię from Studenci order by Nazwisko ASC, Imię DESC;
Nazwisko |
Imię |
Abc Abc Abc Dog Mnk |
Witek Marek Jurek Zbyszek Wacek |
Odpowiedzią systemu będzie:
Fraza group by działa tak samo jak fraza where w odróżnieniu do poszczególnych rekordów. Różnica polega na tym, że fraza group by analizuje tylko jednakowe wartości w podanych polach. Kryterium grupowania w tej frazie przypisuje różne priorytety przy grupowaniu, tak jak to było przy innych frazach. W celu wyjaśnienia działania frazy stwórzmy tabelę Sklep:
Klient |
Kasjer |
Kwota |
Aab Mkl Cde Mkl Nbd Cde Aab |
Zosia Gosia Marysia Zosia Zosia Marysia Gosia |
55,30 21,20 10,00 115,55 4,10 8,25 25,15 |
Przykładem może być zastosowanie w celu zsumowania kwoty, którą zapłacili klienci o tym samym nazwisku lub kwoty którą przyjął każdy kasjer:
select Klient, sum(kwota) from Sklep group by Klient;
Klient |
Sum(Kwota) |
Aab Mkl Cde Nbd |
30,45 136,45 18,25 4,10 |
Odpowiedzią systemu będzie:
select Kasjer, sum(kwota) Suma_pobrana from Sklep group by Kasjer;
Kasjer |
Suma_pobrana |
Zosia Gosia Marysia |
174,95 46,35 18,25 |
Odpowiedzią systemu będzie:
Frazę group by możemy poszerzyć o funkcję count, która zwraca sumę liczby pobranych wierszy np.:
select Klient, sum(kwota) Kwota_razem, count(Klient) from Sklep group by Klient;
Klient |
Kwota_razem |
count(Klient) |
Aab Mkl Cde Nbd |
30,45 136,45 18,25 4,10 |
2 2 2 1 |
Odpowiedzią systemu będzie:
select Klient, sum(kwota) Kwota_razem, count(Klient) from Sklep group by Klient, Kasjer;
Klient |
Kwota_razem |
count(Klient) |
Aab Aab Cde Mkl Mkl Nbd |
55,30 25,15 18,25 21,20 115,55 4,10 |
1 1 2 1 1 1 |
Odpowiedzią systemu będzie:
Fraza having pozwala używać funkcji agregujących w podawanym warunku, dając analogicznie możliwość użycia funkcji grupujących jak fraza where do poszczególnych rekordów. Fraza having działa też bez funkcji agregujących. Działanie tej frazy pokażemy na przykładzie tabeli Pracownicy:
Nazwisko |
Wydział |
Płaca |
Abc Bcd Mnk Dce Omn |
Matematyczny Filozoficzny Matematyczny Historyczny Historyczny |
1200 3000 3000 2500 1500 |
W celu otrzymania informacji, na jakim wydziale średnia płaca przekroczy 2000 należy zastosować zdanie:
select Wydział, arg(Płaca) from Pracownicy group by Wydział having arg(Płaca)>2000;
Wydział |
arg(Płaca) |
Matematyczny Filozoficzny |
2100 3000 |
Odpowiedzią systemu będzie:
Mamy pobrać informacje o średniej płacy na wydziale pod dodatkowym warunkiem, że płaca jest nie mniejsza niż 1500 zł.
select Wydział, arg(Płaca) from Pracownicy group by Wydział having Płaca>=1500;
Wydział |
arg(Płaca) |
Matematyczny Filozoficzny |
2100 3000 |
Odpowiedzią systemu będzie:
We frazie having można rónież stosować funkcje agregujące, które nie występują we frazie select:
select Wydział, arg(Płaca) from Pracownicy group by Wydział having count(Wydział)>1;
Wydział |
arg(Płaca) |
Matematyczny Historyczny |
2100 2000 |
Odpowiedzią systemu będzie:
We frazie having mogą być zastosowane operatory logiczne, które łączą kilka kryteriów pobierania danych.
select Wydział, min(Płaca), max(płaca) from Pracownicy group by Wydział having arg(Płaca)>2500 and Płaca>2000;
Wydział |
min(Płaca) |
max(Płaca) |
Filozoficzny |
3000 |
3000 |
Odpowiedzią systemu będzie:
Łączenie tabel w SQL.
Podstawową operacją pobierania danych z kilku tabel jest operacja join, czyli łączenie. Mechanizm działania poleceń w SQL do pobierania danych z dwóch tabel jest następujący: wiersz z tabeli A po kolei porównuje się z każdym wierszem tabeli B według podanych kryteriów porównania. Wynikiem tego jest tabela z liczbą wierszy równą iloczynowi wierszy tabel A i B, które są kombinacjami wierszy tabel A i B.
Pobierając dane z kilku tabel często spotykamy się z sytuacją, gdy w tych tabelach są pola o tej samej nazwie. Aby wyróżnić pola o tych samych nazwach zastosujemy pseudonimy tabel, które będą nazwami tabeli lub pierwszą literą nazwy. Utwórzmy dwie tabele:
Towary Zamówienia
T_ID |
Nazwa |
Cena |
|
Data |
Klient |
ID_T |
Ilość |
54 10 76 23 |
Chleb Mąka Cukier Cukierki |
1,50 2,35 3,50 19,20 |
|
21.03.03 17.03.03 10.03.03 10.03.03 10.03.03 |
Abc Abc Mnk Opr Opr |
54 23 23 10 54 |
10 1 2 10 20 |
Pisząc select Towary.ID_T, Zamówienia.ID_T from Zamówienie, Towary; lub
select T.ID_T, Z.ID_T from Zamówienia Z, Towary T; otrzymamy to samo.
Pseudonimy obowiązkowo należy przypisać do pól o tych samych nazwach. Do innych pól nie trzeba przypisywać pseudonimów, choć lepiej jest je wykonać.
W odróżnieniu od poprzednich przypadków ważnym jest przypisanie frazy where z warunkiem połączenia. W naszym przypadku będziemy łączyć wiersze mające te same właściwości pola ID_T.
select Z.Data, Z.Klient, Z.ID_T, T.ID_T, T.Nazwa, from Zamówienia Z, Towary T where Z.ID_T = T.ID_T;
Z.Data |
Z.Klient |
Z.ID_T |
T.ID_T |
T.Nazwa |
21.03.03 17.03.03 10.03.03 10.03.03 10.03.03 |
Abc Abc Mnk Opr Opr |
54 23 23 10 54 |
54 23 23 10 54 |
Chleb Cukierki Cukierki Mąka Chleb |
W odpowiedzi mamy:
We frazie where podany jest typ łączenia tabel zwany równołączeniem tabel.
We frazie where mogą być podane dodatkowe kryteria pobierania danych:
select Z.Data, Z.Klient, Z.ID_T, T.ID_T, T.Nazwa, from Zamówienia Z, Towary T where Z.ID_T = T.ID_T and ID_T = 54;
Z.Data |
Z.Klient |
Z.ID_T |
T.ID_T |
T.Nazwa |
21.03.03 10.03.03 |
Abc Opr |
54 54 |
54 54 |
Chleb Chleb |
W odpowiedzi mamy:
select Z.Data, Z.Klient, Z.ID_T, T.ID_T, T.Nazwa, from Zamówienia Z, Towary T where Z.ID_T = T.ID_T and Z.Klient like `A%';
Z.Data |
Z.Klient |
Z.ID_T |
T.ID_T |
T.Nazwa |
21.03.03 17.03.03 |
Abc Abc |
54 23 |
54 23 |
Chleb Cukierki |
W odpowiedzi mamy:
select sum(Z.Ilość*T.Cena) from Zamówienia Z, Towary T where Z.ID_T = T.ID_T and T.Nazwa='Chleb';
sum(Z.Ilość*T.Cena) |
45,00 |
W odpowiedzi mamy:
select T.Nazwa, Z.Ilość*T.Cena, Towar_Total from Zamówienia Z, Towary T where Z.ID_T = T.ID_T order by T.Nazwa;
T.Nazwa |
Towar_Total |
Chleb Mąka Cukier Cukierki |
45,00 23,50 00,00 57,60 |
W odpowiedzi mamy:
Przy nierównołączeniu tabel we frazie where używa się innych dowolnych operatorów porównania oprócz operatora równości.
select T.Nazwa, Z.Ilość Towar_Total from Zamówienia Z, Towary T where Z.ID_T>=T.ID_T ;
T.Nazwa |
Towar_Total |
Chleb Mąka Cukierki Mąka Cukierki |
10 10 10 1 1 |
W odpowiedzi mamy:
Połączenia zewnętrzne i wewnętrzne w języku SQL.
Połączenia zewnętrzne i wewnętrzne działają tylko z bazami InterBase i MSSQL. Procedura połączenia jest wykonywana przy pomocy polecenia join. Tabela wymieniona po lewej stronie znaku równości nazywana jest tabelą zewnętrzną, zaś tabela po prawej stronie - tabelą wewnętrzną. Ze względu na zajmowane pozycje przez tabele, często mówimy o tabelach lewych i prawych, natomiast złączenie nazywamy prawostronnym ( lewostronnym ) lub prawa do lewej ( lewa do prawej ). Drugi typ łączenia jest nazywany łączeniem wewnętrznym.
W połączeniach zewnętrznych stosuje się operatory join w formie:
left outer join <arg1> on <arg2>
right outer join <arg1> on <arg2>
full outer join <arg1> on <arg2>
gdzie: arg1 - nazwa tabeli, która będzie dołączana do innej tabeli
arg2 - kryterium połączenia
W połączeniu na bazie join ( lewo lub prawostronnym ) jeżeli nie zostaną znalezione pasujące wiersze w tabeli wewnętrznej, to kolumny z tej tabeli będą dołączone z wartością null.
W zależności od typu złączenia lewo lub prawostronnego, wartość null będzie zapisana w lewej lub prawej tabeli.
Załóżmy że mamy tabele o polach podanych niżej i mamy wykonać łączenia lewe, prawe i pełne:
Departament { Dep, Typ }
Personel { ID, Dep, Nazwisko, Imie, Ur } i Nazwiska: Aab, Bcd
Chefs { ID, Nazwisko, Imię } i Nazwiska: Bcd, Mnk
select * from Personel left outer join Chefs on Personel.Nazwisko = Chefs.Nazwisko;
Personel |
Chefs |
Aab Bcd |
NULL Bcd |
W odpowiedzi mamy:
select * from Personel right outer join Chefs on Personel.Nazwisko = Chefs.Nazwisko;
Personel |
Chefs |
Bcd NULL |
Bcd Mnk |
W odpowiedzi mamy:
select * from Personel full outer join Chefs on Personel.Nazwisko = Chefs.Nazwisko;
Personel |
Chefs |
Aab Bcd NULL |
NULL Bcd Mnk |
W odpowiedzi mamy:
Podzapytania w SQL.
Podzapytanie jest to zapytanie, którego wyniki działania są przekazywane jako argumenty do innego zapytania. Ogólna składnia polecenia z podzapytaniem może mieć następujący wygląd:
select <co pobierać> from <skąd pobierać> where <tabela1.kolumna> = (select<co pobierać> from <tabela2> where <tabela2> = wartość;
Na podstawie wcześniejszych tabel Towarów przeanalizujmy sytuację, w której nie znamy identyfikatora towaru i chcemy uzyskać dane o konkretnym towarze:
select Z.Data, Z.Klient, Z.ID_T, T.ID_T, T.Nazwa, from Zamówienia Z, Towary T where Z.ID_T = T.ID_T and Z.ID_T = ( select ID_T from Towary where Nazwa = `Cukier');
Wynikiem tego zapytania jest 0 wierszy.
Tak więc podsumowując, możemy stwierdzić, że podzapytanie występuje zawsze po operatorze porównania lub po innym operatorze ( in ). W podzapytaniach możemy też używać funkcji agregujących, np.:
select arg(Z.Ilość*T.Cena) Śr_Zam from Zamówienia Z, Towary T where Z.ID_T=T.ID_T;
arg(Z.Ilość*T.Cena) |
25,22 |
W odpowiedzi mamy:
Modyfikacja danych za pomocą SQL.
Do modyfikacji danych przy pomocy SQL służą 3 polecenia:
INSERT - do wstawiania wierszy lub zawartości poszczególnych kolumn w tablicy
UPDATE - do modyfikacji zawartości tabeli
DELETE - do usunięcia zawartości tabeli
Wstawianie danych polega na zastosowaniu jednego z dwóch wariantów operacji INSERT:
INSERT ... VALVES - podane polecenie wpisuje 1 rekord danych zaczynając od pierwszej kolumny. Wstawiane wartości powinny odpowiadać typom pól, w które powinny być one wprowadzone, a rozmiar danych nie może przekroczyć rozmiaru kolumny.
insert into <nazwa tabeli> values <wartości> lub
insert into <nazwa tabeli> (pole1, ..., pole n) values <wartości> np.:
insert into Towary values(18,'Bwd',3.50);
INSERT ... SELECT - umożliwia wstawienie kilku rekordów danych lub też przekopiowanie danych. W większości implementacji SQL polecenie to umożliwia rozmieszczenie kopiowanych danych w tymczasowej tabeli.
insert into <nazwa tabeli> (pole1, ..., pole n) select pole1, ..., pole n from <nazwa tabeli> where <warunek> np.:
insert into Towary1(ID_T, Nazwa_T, Cena_T) select ID_T, Nazwa, Cena from Towary;
Modyfikacja zawartości tabel odbywa się przy pomocy polecenia UPDATE. Przypisanie wartości odbywa się tu automatycznie we wszystkich wierszach:
upadate <nazwa tebeli> set Kolumna1=Wartość1; ... ; Kolumna n = Wartość n;
upadate Towary set ID_T = 51; Cena = 15.30 ;
upadate <nazwa tebeli> set Kolumna1=Wartość1, ... , Kolumna n = Wartość n where <warunek>;
upadate Towary set Cena = Cena / 2 where Nazwa = Cukier ;
Do usuwania wybranych wierszy służy polecenie DELETE, którym jednak nie możemy usunąć całej tabeli lub całej bazy danych ( w przeciwieństwie do zdania DROP ).
delete from <nazwa tabeli> where <warunki> ;
W zależności od użytej frazy where możliwe są rezultaty:
będzie usunięty pojedynczy wiersz np.: delete from Towary where ID_T = 54;
będzie usuniętych kilka wierszy np.: delete from Towary where ID_T > 54;
będą usunięte wszystkie wiersze tabeli np.delete from Towary where Cena>=1.5;
nie będzie nic usunięte np.: delete from Towary where Cena < 1.0;
Zdanie DELETE nie usuwa zawartości oddzielnych pól, lecz usuwa całe wiersze.
Podsumowując: stosując frazy należy pamiętać o możliwości naruszenia potrzeby integralności danych ( delete, insert ).
Zastosowanie zdań UPDATE, DELETE prowadzi do modyfikacji i usuwania wszystkich wierszy.
Zdanie INSERT może łączyć kilka tabel, a jego wyniki mogą być dołączone do innej tabeli. Przy użyciu tego zdania nie można skopiować danych do tej samej tabeli, lecz można je umieścić w tabeli tymczasowej.
Zdanie UPDATE modyfikuje wartość dowolnej ilości kolumn. Wpisane wartości mogą być też wynikiem operacji arytmetycznych.
SQL nie posiada obowiązkowych poleceń umożliwiających eksport i import plików.
Tworzenie obiektów bazo - danowych i zarządzanie nimi za pomocą SQL.
Tworzenie obiektów polega na zastosowaniu zdania CREATE:
1) tworzenie bazy danych create DataBase <nazwa bazy danych>;
W InterBase mamy:
create DataBase ”ścieżka do bazy danych” user <nazwa użytkownika> password <hasło>;
2) tworzenie tabeli Towary o polach ID, Nazwa, Cena
create Table Towary ( ID Number not null, Nazwa Char(30) not null, Cena Number);
Tabela może być utworzona na podstawie już istniejącej tabeli:
create Table <nazwa nowej tabeli> (pole 1, ..., pole n) as ( select pole 1, ..., pole n
from <nazwa tabeli istniejącej> where <warunek> ) ;
W tej formule ni podajemy typów pól, gdyż pola będą takie same jak pola pobierane. Nazwa pól w nowej tabeli może być inna niż w tabeli źródłowej.
Modyfikacja tabel polega na zastosowaniu zdania Alter table:
dodajemy pola do tabeli
alter table <nazwa tabeli> add <nazwa kolumny> <typ danych>;
alter table Towary add ID_sprzed number;
modyfikacja istniejącej kolumny
alter table <nazwa tabeli> modify <nazwa pola> <typ danych>;
alter table Towary modify Nazwa char(40);
Do usunięcia tabeli lub całej bazy danych służy zdanie drop <nazwa tabeli lub bazy danych>;
Tworzenie widoków
Perspektywa ( widok ) jest tabelą wirtualną, nie istniejącą fizycznie na dysku, przez co nie zajmuje miejsca na dysku. Widoki są przeznaczone do:
otrzymania i analizy skomplikowanych danych
częściowego rozwiązania problemu ochrony informacji bazo - danowej
Do utworzenia widoku mogą być zastosowane dowolne polecenia jak w odniesieniu do zwykłej tabeli. Składnia tworzenia widoku wygląda następująco:
create view <nazwa widoku> ( kolumna 1, ..., kolumna n ) as select <nazwa tabeli>
kolumna 1, ..., kolumna n from <nazwa tabeli> where <warunek>;
create view Skład as select * from Towary;
W celu pobierania informacji z kilku tabel należy zastosować pseudonimy tabel.
Przy tworzeniu widoków we frazie from mogą być zastosowane inne frazy związane z tabelą ( group by, having ), lecz z wyłączeniem frazy order by, która w widokach nie działa.
W przypadku utworzenia widoku z kilku tabel nie możemy zastosować polecenia delete, lecz musimy zastosować polecenie drop view <nazwa widoku>;
Tworzenie indeksów za pomocą SQL.
Głównym przeznaczeniem indeksów jest zwiększenie szybkości poszukiwania danych. Indeks jest elementem fizycznej struktury bazy danych. Im więcej mamy indeksów, tym nasza baza danych będzie zajmować więcej miejsca na twardym dysku.
Jeżeli wywołamy zdanie select z frazą order by i jeżeli podane pola w tej frazie będą takie same jak w zdefiniowanym indeksie, to sortowanie danych będzie wykorzystywało indeks i będzie wykonane bardzo szybko. W innym przypadku indeks nie może być zastosowany do sortowania danych. Odrębnym przypadkiem jest wywołanie indeksu tylko z kilkoma polami: np.: indeks posiada pola p1, p2, p3. Jeżeli wywołamy frazę order by p1, p2 to indeks będzie zastosowany do operacji sortowania, natomiast jeżeli nastąpi wywołanie order by p1, p3 to indeks nie zostanie wykorzystany.
Tworzenie indeksu polega na zastosowaniu polecenia create index <nazwa indeksu> on <nazwa tabeli> (pole 1, ..., pole n ); np.: create index ID_index n Towary (ID);
Do usunięcia indeksu posłuży polecenie drop index nazwa tabeli.nazwa indeksu;
Jeżeli tabelę modyfikuje się wielokrotnie i wpisuje nowe rekordy to od początku utworzone indeksy mogą być mniej efektywne. W takich przypadkach korzystne jest powtórne zdefiniowanie indeksów przez ich dodatkowe balansowanie ( deaktywację i ponowną aktywację ) zdaniami:
alter index <nazwa indeksu> deactive;
alter index <nazwa indeksu> active;
Tworzenie baz danych, dodawanie informacji i rejestracje baz danych w InterBase.
Kod w SQL przeznaczony do wykonania tych procedur może być wykonany na dwa sposoby:
za pomocą edytora C++ Builder ( Text Edit )
w Wordzie ( zachowany plik z rozszerzeniem *.sql )
Po napisaniu skryptu należy uruchomić program InterBase Interactive z pliku winsql32.exe znajdującego się w katalogu Program Files \ InterBase Corp \ InterBase \ Bin.
W tym programie należy wykonać komendę File \ Run an sql script na stworzonym pliku. Pojawi się okno dialogowe IB SQL z zapytaniem save output to a file. Należy na to zapytanie odpowiedzieć Nie. Po wykonaniu tych dwóch kroków rozpoczyna się praca nad tworzeniem bazy danych.
Jeżeli skrypt nie posiada błędów w domowym oknie zobaczymy tekst pliku, za pomocą którego była stworzona baza. Jeżeli tekst posiada błędy, pojawi się nowe okno posiadające informację o błędach, które należy poprawić.
Tworzenie skryptu.
Celem tworzenia skryptu jest utworzenie bazy danych mającej dwie tabele:
Personel o polach Num, Dep, Naz, Imie, Year_b
Dept o polach Dep, Typ_dep
Najpierw musimy utworzyć bazę danych:
create DataBase ”d:\database\IB\nasza_baza.gdb” user Jan password ABC!123;
Kolejnym krokiem jest utworzenie tabel:
create table Dept ( Dep char(15) not null Promary Key, Typ_dep char(1) not null );
create table Personel ( Num smallint not null Primary Key, Dep char(15) default ”Nieznany”, Nazwa char (20) not null, Imie char (20) not null,
Year_b smallint default 1981, Foreign Key ( Dep ) References Dept );
Następnie należy wpisać dane do obu tabel:
insert into Dept ( Dep, Typ_dep ) values ( ”Kwestura”, ”K” );
insert into Personel ( Num, Dep, Nazw, Imie, Year_b) values ( 1, ”Kwestura”, ”Kowalski”, ”Jan”, 1955 );
Do wyświetlenia obu tabel możemy posłużyć się poleceniem :
select * from Personel; select * from Dept;
Następnie utworzymy indeksy:
create index Nazw_Im on Personel Nazw, Imie;
create Year on Personel Year_b;
Do tabeli Dept nie ma sensu tworzyć indeksów.
Utwórzmy teraz tabele wirtualne przeznaczone dla każdego działu:
create view Kwest as select Nazw, Imie, Year_b Num from Personel
where Dep = ”Kwestura”;
Ze stworzonej bazy danych może korzystać tylko osoba mająca identyfikator Jan i odpowiednie hasło. Innych użytkowników można dodać programem IB Server Manager. W celu dodania nowego użytkownika należy wykonać następujące etapy rejestracji:
uruchomić program IB Server Manager
wykonać komendę File \ Server login
w oknie należy wprowadzić nazwę użytkownika i hasło. Domyślnym administratorem bazy danych jest SYNDBA z hasłem masterkey
wykonać poleceni Tasks \ User Security
w oknie o użytkownikach nacisnąć przycisk Add user i wpisać informacje o użytkowniku ( w tym o Janie z hasłem ABC!123 )
Bezpieczeństwo bazy danych.
System zarządzania bazą danych MS FoxPro jest systemem o dużych możliwościach , lecz używa ograniczonego zbioru poleceń SQL. Ponadto ten system nie zapewnia elementów bezpieczeństwa i dlatego bazy danych FoxPro sa przeznaczone do umieszczenia na pojedynczym komputerze jako autonomiczne bazy danych. Ważne jest to, że w FoxPro każda tabela, indeks, widok to oddzielny plik.
System zarządzania bazą danych MSAccess implementuje więcej poleceń SQL i zawiera podstawowy system bezpieczeństwa. Baza danych i wszystkie jej obiekty, w tym zapytania SQL są zawarte w 1 pliku. Wersja Access 2000 zapewnia bardzo dobry system bezpieczeństwa.
System zarządzania bazą danych Paradox bazuje na zastosowaniu tzw. Hasła głównego. Użytkownik, który ma prawo dostępu do bazy danych może mieć prawo definiowania praw dostępu innym użytkownikom.
Wśród istniejących systemów najbardziej rozwinięty system bezpieczeństwa posiadają bazy danych Oracle. System zarządzania tą bazą zaczynając od wersji 7 pozwala na posługiwanie si prawie wszystkimi poleceniami. System bezpieczeństwa bazuje tu na 3 podstawowych elementach:
użytkownik
rola
przywileje
Analiza systemu bezpieczeństwa baz danych Oracle.
Użytkownicy posiadają nazwy kont uprawniających do łączenia się z bazą danych. W Oracle do utworzenia nowego użytkownika należy użyć polecenia:
create user <nazwa użytkownika> identified by <hasło>;
create user <nazwa użytkownika> identified by <hasło> externally;
W drugim przypadku osoba otrzymująca dostęp do systemu operacyjnego na komputerze, bądź serwerze otrzymuje również dostęp do bazy danych Oracle.
Do usunięcia danego użytkownika z listy mających dostęp do bazy zastosujemy polecenie:
drop user <nazwa użytkownika>;
Rola to uprawnienie lub zestaw uprawnień użytkownika, które pozwalają mu wykonywać określone funkcje w bazie danych. Aby przydzielić użytkownikowi jakąś rolę należy użyć polecenia grant.
grant <rola> to <nazwa użytkownika >;
Używając opcji poniżej przypisujemy użytkownikowi możliwość administrowania bazą danych i zmiany ról innych użytkowników:
grant <rola> to <nazwa użytkownika > with admin option;
Do usunięcia roli użytkownika służy polecenie:
revoke <nazwa roli> from <nazwa użytkownika>
W bazach danych Oracle osoba może być zarejestrowana jako użytkownik tylko w przypadku, gdy będzie przyznana jej jedna z trzech ról:
rola Connect - rola ta posiada wstępny poziom uprawnień. Użytkownik z taką rolą może pracować z bazą danych i wykonywać polecenia select, insert, update,delete.
rola Resource - zwiększa ona uprawnienia użytkownika Connect i dodatkowo pozwala tworzyć indeksy i procedury
rola DBA - obejmuje wszystkie możliwe uprawnienia
Alfabetyczny indeks haseł.
A
Administrator bazy danych, 10
Administrator danych, 10
ADO, 27
Aliasy BDE., 25
Analityczne bazy danych, 3
Architektura ANSI/SPARC, 7
Architektura klient - serwer., 10
Atrybut pola, 7
B
Baza danych, 1
D
Dane, 1
DBExpress, 29
Dzielenie, 13
F
Frazy SQL, 31:
group by, 43
having, 44
order by, 42
starting with, 42
Funkcje SQL:
agregujące( count, arg, min, max, sum), 35
arytmetyczne(abs, ceil, floor, sqrt)., 39
dodatkowe(greatest, user)., 41
konwertujące ( to_char, to_number)., 41
znakowe( chr, concat, initcap), 40
związane z datą i czasem( add_month, last_day, month_between), 37
I
Iloczyn, 12
Iloczyn kartezjański, 12
Indeks, 25
Integralności danych, 6
K
Klucz tabeli, 7
M
Metoda sortowania danych:
bąbelkowa, 2
blokowa, 3
dzielenia binarnego, 3
kolejnych minimów, 2
kubełkowa, 2
Modele baz danych, 5:
model hierarchiczny, 5
model relacyjnych baz danych, 6
model sieciowy bazy danych, 5
N
Nawzajem niezależne pola, 19
Nierównołączenie tabel, 47
Normalizacja, 17
O
ODBC., 26
OLE DB, 27
Oeracja join, 45
Operacja wyboru, 12
Operacyjne bazy danych, 3
Operatory w bazach danych:
distinct, 31
dodatkowe in ( ), between < >, 32
logiczne OR, AND, NOT, 32
mnogościowe union all, union, intersect, minus, 32
porównania =, >, <. >=. <=, <>(!=)., 32
znakowe like, || ( konkatenacja), 32
P
Podjęzyk danych, 9
Pola wyliczalne., 25
Pole, 4
Pole niekluczowe, 19
Postacie normalne, 19
Projekcja, 12, 14
R
Rekord, 4
Relacja w bazach danych:
jeden do jednego, 4
jeden do wielu, 4
wiele do wielu, 4
Rozproszone opracowanie danych, 11
Równołączenie tabel, 46
Różnica, 12
S
Schemat architektury ANSI / SPARC., 9
Selekcja, 14
Słowo kluczowe, 31
Sortowanie, 1
Splot, 13, 14
SQL, 1, 9, 11, 14, 15, 27, 28, 30, 31, 32, 35, 37, 42
Suma relacyjna, 12
System zarządzania bazą danych, 1, 24
T
Tabela, 1
Tabela matka, 7
Technologia ODBC, 27
Terminy i komponenty interfejsu w C++ Builder i Delphi:, 15
Testowanie, 17
Typy relacji, 4
W
Wartość zerowa ( NULL ), 6
Z
Zdanie, 31
Spis treści:
59
2
53
345
8
120
30
08
02
53
345
30
120
053,030
002,008
120
345
Manager
Muzycy
Klienci
Terminy
Umowy
Rozliczenia
Manager
Klienci
Muzycy
Rozliczenia
Umowy
Terminy
Użytkownik A1
I
Użytkownik A2
I
Użytkownik B1
I
Użytkownik B2
I
Zewnętrzne przedstawienie użytkowników A
I
Zewnętrzne przedstawienie użytkowników B
I
II
III
System zarządzania bazą danych (SZBD)
Użytkownicy - fizyczne osoby
System zarządzania bazą danych
Aplikacje
Serwer ( dane )
Serwer ( dane )
PC klient 1
PC klient 3
PC klient n
PC klient 2
Delphi
Aplikacja
MS Acces dBase
FoxPro
ODBC
Tabela uczniowie
Nauczyciele
ID
Adres
Klasa
ID
Adres
Adres
ID
Tabela 3
Uczniowie
Nauczyciele
w : w
1 : w
Tabela 3
Tabela 3
Imię
Nazwisko
Nauczyciele
Uczniowie
Telefon
rodzic
Dzieci rodziców
uczeń
Telefon
Nazwisko
Imię
Uczniowie w klasie
klasa
pracownik
Uczniowie w klasie
Nazwa
Profil
Opis
Imię
Nazwisko
Miasto
Prowadzący zajęcia
zajęcia
Zajęcia z przedmiotów
przedmiot
zajęcia dla klasy
Opis
Nazwa
Miejsce zajęć
sale
Rozpoczęcie
Zakończenie
Opis
Sieć telekomunikacyjna