2. Samouczek Firebird
Zanim przejdziemy do omówienia podstaw języka SQL, przedstawimy czytelnikowi sposób instalacji serwera Firebird SGBD oraz graficznego klienta IB-Expert.
2.1. Gdzie znaleźć Firebird?
Główna strona serwisu poświęcona Firebirdowi to [http://firebird.sourceforge.net/]. Strona z plikami do pobrania zawiera następujące linki (kwiecień 2005 r.):

Należy pobrać następujące pliki:
plik SGBD dla systemu Windows | |
bibliotekę klas dla aplikacji .NET, która umożliwia dostęp do SGBD bez konieczności korzystania ze sterownika ODBC. | |
sterownik ODBC dla Firebirda |
Zainstaluj te elementy. SGBD jest zainstalowany w folderze, którego zawartość wygląda mniej więcej tak:
![]() |
Pliki binarne znajdują się w folderze [bin]:
![]() |
umożliwia uruchomienie/zatrzymanie pliku SGBD | |
klient liniowy służący do zarządzania bazami danych |
Należy zauważyć, że domyślnie administrator SGBD nosi nazwę [SYSDBA], a jego hasło to [masterkey]. W [Démarrer] zainstalowano następujące menu:

Opcja [Firebird Guardian] pozwala uruchomić/zatrzymać SGBD. Po uruchomieniu ikona SGBD pozostaje na pasku zadań systemu Windows:
![]() |
Aby tworzyć i obsługiwać bazy danych Firebird za pomocą klienta wiersza poleceń [isql.exe], należy zapoznać się z dokumentacją dołączoną do produktu w folderze [doc].
2.2. dokumentacja Firebird
Dokumentacja dotycząca Firebirda oraz języka SQL jest dostępna na stronie internetowej Firebirda (styczeń 2006 r.):

Dostępne są różne podręczniki w języku angielskim:
aby rozpocząć pracę z FB | |
aby zrozumieć kody błędów zwracane przez FB |
Dostępne są również podręczniki szkoleniowe dotyczące języka SQL:

aby dowiedzieć się, jak tworzyć tabele, jakie typy danych można wykorzystać itp. | |
przewodnik referencyjny do nauki języka SQL z wykorzystaniem Firebirda |
Szybkim sposobem na pracę z Firebirdem i naukę języka SQL jest użycie klienta graficznego. Takim klientem jest IB-Expert, opisany w następnym akapicie.
2.3. Praca z Firebirdem w języku SGBD za pomocą IB- Expert
Główna strona serwisu IB-Expert to [http://www.ibexpert.com/]. Strona z plikami do pobrania zawiera następujące linki:

Wybierzemy darmową wersję [Personal Edition]. Po jej pobraniu i zainstalowaniu otrzymujemy folder podobny do poniższego:

Plik wykonywalny to [ibexpert.exe]. Skrót jest zazwyczaj dostępny w menu [Démarrer]:

Po uruchomieniu program IBExpert wyświetla następujące okno:

Skorzystajmy z opcji [Database/Create Database] „ ” (Utwórz bazę danych), aby utworzyć bazę danych:
może to być [local] lub [remote]. W tym przypadku nasz serwer znajduje się na tym samym komputerze co [IBExpert]. Wybieramy zatem [local] | |
użyj przycisku typu [dossier] z listy rozwijanej, aby wskazać plik bazy danych. Firebird umieszcza całą bazę danych w jednym pliku. Jest to jedna z jego zalet. Bazę danych przenosi się z jednego komputera na drugi poprzez proste skopiowanie pliku. Sufiks [.gdb] jest dodawany automatycznie. | |
SYSDBA jest domyślnym administratorem w aktualnych dystrybucjach Firebirda | |
masterkey to hasło administratora SYSDBA w aktualnych dystrybucjach Firebirda | |
dialekt, którego należy używać: SQL | |
jeśli pole jest zaznaczone, IBExpert wyświetli link do utworzonej bazy danych po jej utworzeniu |
Jeśli po kliknięciu przycisku tworzenia [OK] pojawi się następujące ostrzeżenie:

oznacza to, że nie uruchomiono programu Firebird. Należy go uruchomić. Pojawi się nowe okno:

Rodzina czcionek do użycia. Chociaż powyższy zrzut ekranu nie zawiera żadnych informacji, zaleca się wybranie z listy rozwijanej rodziny czcionek [ISO-8859-1], która umożliwia użycie znaków łacińskich z akcentami. |
[IBExpert] obsługuje różne wersje SGBD pochodzące z Interbase. Należy wybrać wersję Firebirda, którą masz zainstalowaną: |
Po zatwierdzeniu tego nowego okna przez [Register] otrzymujemy następujący wynik:

Aby uzyskać dostęp do utworzonej bazy danych, wystarczy dwukrotnie kliknąć jej link. IBExpert wyświetla wówczas drzewo folderów, umożliwiające dostęp do właściwości bazy danych:

2.4. Tworzenie tabeli danych
Utwórzmy tabelę. Klikamy prawym przyciskiem myszy na [Tables] (patrz okno powyżej) i wybieramy opcję [New Table]. Pojawia się okno definiowania właściwości tabeli:
![]() |
Zacznijmy od nadania tabeli nazwy [ARTICLES], korzystając z pola wprowadzania danych [1]:
![]() |
Skorzystajmy z pola wprowadzania danych [2], aby zdefiniować klucz główny [ID]:
![]() |
Pole można ustawić jako klucz główny, klikając dwukrotnie pole [PK] (Primary Key) w danym polu. Dodajmy pola za pomocą przycisku znajdującego się nad polem [3]:

Dopóki nie „skompilujemy” naszej definicji, tabela nie zostanie utworzona. Użyjmy przycisku [Compile] powyżej, aby zakończyć definiowanie tabeli. IBExpert przygotowuje zapytania SQL służące do wygenerowania tabeli i prosi o potwierdzenie:

Co ciekawe, IBExpert wyświetla zapytania SQL, które wykonał. Pozwala to na zapoznanie się zarówno z językiem SQL, jak i z ewentualnie stosowanym, zastrzeżonym dialektem SQL. Przycisk [Commit] służy do zatwierdzenia bieżącej transakcji, a [Rollback] – do jej anulowania. W tym przypadku akceptujemy ją za pomocą [Commit]. Po wykonaniu tej czynności IBExpert dodaje utworzoną tabelę do struktury drzewa naszej bazy danych:

Po dwukrotnym kliknięciu na tabelę uzyskujemy dostęp do jej właściwości:

Panel [Constraints] pozwala nam dodać nowe ograniczenia integralności do tabeli. Otwórzmy go:

Widzimy tu utworzone przez nas ograniczenie klucza głównego. Można dodać inne ograniczenia:
- klucze obce [Foreign Keys]
- ograniczenia integralności pól [Checks]
- ograniczenia unikalności pól [Uniques]
Należy zaznaczyć, że:
- pola [ID, PRIX, STOCKACTUEL, STOKMINIMUM] muszą mieć wartość >0
- Pole [NOM] musi być niepuste i unikalne
Otwórzmy panel [Checks] i kliknijmy prawym przyciskiem myszy w obszarze definiowania ograniczeń, aby dodać nowe ograniczenie:

Zdefiniujmy żądane ograniczenia:

Należy zauważyć, że w powyższym przykładzie ograniczenie [NOM<>''] wykorzystuje dwa apostrofy, a nie cudzysłowy. Skompilujmy te ograniczenia za pomocą przycisku [Compile] powyżej:

Również w tym przypadku IBExpert pełni funkcję edukacyjną, wskazując zapytania SQL, które wykonał. Przejdźmy teraz do panelu [Constraints/Uniques], aby zaznaczyć, że nazwa musi być unikalna. Oznacza to, że w tabeli nie może występować dwukrotnie ta sama nazwa.

Zdefiniujmy ograniczenie:

Następnie skompilujmy ją. Po zakończeniu otwórzmy panel [DDL] (Data Definition Language) tabeli [ARTICLES]:

Z panelu tego otrzymujemy kod SQL służący do wygenerowania tabeli wraz ze wszystkimi jej ograniczeniami. Kod ten można zapisać w skrypcie, aby móc go później ponownie uruchomić:
SET SQL DIALECT 3;
SET NAMES NONE;
CREATE TABLE ARTICLES (
ID INTEGER NOT NULL,
NOM VARCHAR(20) NOT NULL,
PRIX DOUBLE PRECISION NOT NULL,
STOCKACTUEL INTEGER NOT NULL,
STOCKMINIMUM INTEGER NOT NULL
);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_ID check (ID>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_PRIX check (PRIX>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKACTUEL check (STOCKACTUEL>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_STOCKMINIMUM check (STOCKMINIMUM>0);
ALTER TABLE ARTICLES ADD CONSTRAINT CHK_NOM check (NOM<>'');
ALTER TABLE ARTICLES ADD CONSTRAINT UNQ_NOM UNIQUE (NOM);
ALTER TABLE ARTICLES ADD CONSTRAINT PK_ARTICLES PRIMARY KEY (ID);
2.5. Wprowadzanie danych do tabeli
Nadszedł czas, aby wprowadzić dane do tabeli [ARTICLES]. W tym celu skorzystajmy z jej panelu [Data]:

Dane wprowadza się poprzez dwukrotne kliknięcie pól wprowadzania danych w każdym wierszu tabeli. Nowy wiersz dodaje się za pomocą przycisku [+], a wiersz usuwa się za pomocą przycisku [-]. Operacje te są wykonywane w ramach transakcji, którą zatwierdza się przyciskiem [Commit Transaction] (patrz powyżej). Bez tego zatwierdzenia dane zostaną utracone.
2.6. Edytor SQL z [IB-Expert]
Język SQL (Structured Query Language) umożliwia użytkownikowi:
- tworzyć tabele, określając typ danych, które będą w nich przechowywane, oraz ograniczenia, które dane te muszą spełniać
- wstawianie do nich danych
- modyfikować niektóre z nich
- usuwanie niektórych danych
- wykorzystywać zawartość tabel w celu uzyskania informacji
- ...
IBExpert umożliwia użytkownikowi wykonywanie czynności od 1 do 4 w sposób graficzny. Właśnie to widzieliśmy. Gdy baza zawiera wiele tabel, z których każda ma setki wierszy, potrzebne są informacje trudne do uzyskania wizualnie. Załóżmy na przykład, że wirtualny sklep internetowy ma tysiące kupujących miesięcznie. Wszystkie zakupy są rejestrowane w bazie danych. Po sześciu miesiącach okazuje się, że produkt „X” ma wadę. Chcemy skontaktować się ze wszystkimi osobami, które go kupiły, aby zwróciły produkt w celu bezpłatnej wymiany. Jak znaleźć adresy tych kupujących?
- Można przejrzeć wszystkie tabele i ręcznie wyszukać tych klientów. Zajmie to kilka godzin.
- Można wygenerować polecenie SQL, które w ciągu kilku sekund wygeneruje listę tych osób
Język SQL jest przydatny już
- gdy ilość danych w tabelach jest duża
- gdy istnieje wiele powiązanych ze sobą tabel
- gdy informacje, które chcemy uzyskać, są rozproszone w wielu tabelach
- ...
Przedstawiamy teraz edytor SQL programu IBExpert. Dostęp do niego można uzyskać poprzez opcję [Tools/SQL Editor] lub [F12]:

Otrzymujemy wówczas dostęp do zaawansowanego edytora zapytań SQL, za pomocą którego można testować zapytania. Wpiszmy zapytanie:

Wykonujemy zapytanie SQL za pomocą przycisku [Execute] znajdującego się powyżej. Otrzymujemy następujący wynik:

Powyżej zakładka [Results] przedstawia tabelę wyników zlecenia SQL [Select]. Aby złożyć nowe zlecenie SQL, wystarczy powrócić do zakładki [Edit]. Znajdziemy tam wówczas zlecenie SQL, które zostało już zrealizowane.
![]()
Przydatnych jest kilka przycisków na pasku narzędzi:
- przycisk [New Query] pozwala przejść do nowego zapytania SQL:

W ten sposób otrzymujemy pustą stronę edycji:

Można wtedy wpisać nowe polecenie SQL:

i wykonać go:

Wróćmy do zakładki [Edit]. Poszczególne wydane polecenia SQL są zapamiętane przez [IB-xpert]. Przycisk [Previous Query] pozwala powrócić do wcześniej wygenerowanego zlecenia SQL:

W ten sposób powraca się do poprzedniego zapytania:

Przycisk [Next Query] pozwala natomiast przejść do następnego zlecenia SQL:

Następnie odnajdujemy zlecenie SQL, które znajduje się w liście zapisanych zleceń SQL:

Przycisk [Delete Query] pozwala usunąć zlecenie SQL z listy zapisanych zleceń:

Przycisk [Clear Current Query] pozwala wyczyścić zawartość edytora dla wyświetlonego zlecenia SQL:

Przycisk [Commit] pozwala na ostateczne zatwierdzenie zmian wprowadzonych w bazie danych:

Przycisk [RollBack] pozwala cofnąć zmiany wprowadzone w bazie od ostatniego naciśnięcia przycisku [Commit]. Jeśli od momentu połączenia z bazą nie naciśnięto przycisku [Commit], cofnięte zostaną zmiany wprowadzone od momentu tego połączenia.

Weźmy przykład. Dodajmy nowy wiersz do tabeli:
![]()
Polecenie SQL zostało wykonane, ale nie pojawił się żaden wynik. Nie wiadomo, czy wstawienie się powiodło. Aby to sprawdzić, wykonajmy polecenie SQL następujące po [New Query]:

Otrzymujemy następujący wynik dla [Execute]:

Wiersz został więc pomyślnie wstawiony. Przyjrzyjmy się teraz zawartości tabeli w inny sposób. Kliknijmy dwukrotnie na tabelę [ARTICLES] w eksploratorze baz danych:

Otrzymujemy następującą tabelę:

Przycisk ze strzałką powyżej pozwala odświeżyć tabelę. Po odświeżeniu powyższa tabela nie ulega zmianie. Wydaje się, że nowy wiersz nie został wstawiony. Wróćmy do edytora SQL (F12), a następnie zatwierdźmy zlecenie SQL wysłane za pomocą przycisku [Commit]:

Po wykonaniu tej czynności wróćmy do tabeli [ARTICLES]. Możemy zauważyć, że nic się nie zmieniło, nawet po użyciu przycisku [Refresh]:

Powyżej otwórzmy kartę [Fields], a następnie wróćmy do karty [Data]. Tym razem wstawiony wiersz wyświetla się poprawnie:

Gdy rozpoczyna się wysyłanie poszczególnych poleceń SQL, edytor otwiera w bazie tzw. transakcję. Zmiany wprowadzone przez te polecenia SQL w edytorze SQL będą widoczne tylko tak długo, jak długo pozostajemy w tym samym edytorze SQL (można otworzyć kilka edytorów). Wszystko przebiega tak, jakby edytor SQL pracował nie na rzeczywistej bazie danych, ale na własnej kopii. W rzeczywistości nie dzieje się to dokładnie w ten sposób, ale ten obraz może pomóc nam zrozumieć pojęcie transakcji. Wszystkie zmiany wprowadzone w kopii w trakcie transakcji będą widoczne w rzeczywistej bazie danych dopiero po ich zatwierdzeniu za pomocą operacji [Commit Transaction]. Wówczas bieżąca transakcja zostaje zakończona i rozpoczyna się nowa transakcja.
Zmiany wprowadzone w trakcie transakcji można cofnąć za pomocą operacji o nazwie [Rollback]. Przeprowadźmy następujący eksperyment. Rozpocznijmy nową transakcję (wystarczy wykonać [Commit] na bieżącej transakcji) z następującym poleceniem SQL:

Wykonajmy to polecenie, które usuwa wszystkie wiersze z tabeli [ARTICLES], a następnie wykonajmy [New Query], czyli nowe polecenie SQL:

Otrzymujemy następujący wynik:

Wszystkie wiersze zostały usunięte. Przypomnijmy, że operacja ta została przeprowadzona na kopii tabeli [ARTICLES]. Aby to sprawdzić, kliknijmy dwukrotnie na tabelę [ARTICLES] poniżej:

i wyświetlmy zakładkę [Data]:

Nawet po użyciu przycisku [Refresh] lub przejściu do zakładki [Fields], a następnie powrocie do zakładki [Data], powyższa zawartość pozostaje niezmieniona. Zostało to już wyjaśnione. Znajdujemy się w innej transakcji, która działa na własnej kopii. Teraz wróćmy do edytora SQL (F12) i użyjmy przycisku [RollBack], aby cofnąć usunięcia wierszy, które zostały wykonane:

Zostaniemy poproszeni o potwierdzenie:

Potwierdzamy. Edytor SQL potwierdza, że zmiany zostały cofnięte:

W celu weryfikacji ponownie uruchommy powyższe zapytanie SQL. Znajdujemy w nim wiersze, które zostały usunięte:

Operacja [Rollback] przywróciła kopię, nad którą pracuje edytor SQL, do stanu, w jakim znajdowała się na początku transakcji.





