EE.9: Programowanie, tworzenie i administrowanie stronami internetowymi i bazami danych.

Cześć! Dziś utworzymy sobie bazę danych.
Dokładnie tę, którą zamodelowaliśmy w poprzednim temacie.
Czas urzeczywistnić diagram ERD.

STWÓRZMY NASZĄ BAZĘ DANYCH

Stworzymy bazę danych znaną ze stworzonego w poprzednim temacie diagramu ERD - rezerwacje lotnicze.

Język SQL - Tworzenie

Po uruchomieniu konsoli mysql logujemy się lokalnie wykorzystując polecenie:

mysql -u username -p

gdzie po -u podajemy nazwę użytkownika, a po -p hasło. Bądź zdalnie podając dodatkowo adres hosta.

mysql -h localhost -u username -p

Po zalogowaniu się tworzymy nową bazę danych.

CREATE DATABASE nazwa_bazy;

Możemy również jednocześnie ustawić kodowanie znaków dla naszej bazy na UTF8 (utf8_general_ci, utf8_polish_ci), by poprawnie zapisywały się polskie znaki.

CREATE DATABASE nazwa_bazy DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

Stwórzmy zatem naszą bazę:

CREATE DATABASE rezerwacje_lotnicze DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

Aby wyświetlić aktualną listę dostępnych baz danych wykorzystamy polecenie:

SHOW DATABASES;

Aby rozpocząć działania na naszej bazie wybierzmy ją:

USE rezerwacje_lotnicze;

W każdej chwili możemy sprawdzić, na jakiej bazie aktualnie pracujemy:

SELECT database();

Możemy również wyświetlić jakie tabele zawiera nasza baza.

SHOW TABLES;

Póki co efektem naszego polecenia pokazującego tabele w bazie będzie zbiór pusty

Empty set (0.00 sec)

Utwórzmy zatem pierwszą tabelę. Wykorzystamy do tego polecenie CREATE TABLE, w którym podamy wszystkie pola, ich nazwy, typ, dodatkowe właściwości. Tabele tworzymy od najbardziej 'brzegowych' na naszym diagranmie ERD, czyli takich, od których nie ma już dalszych powiązań (nie zawierają kluczy obcych). W przypadku rozrysowania struktury naszej bazy w postaci drzewa rozpoczynalibyśmy od liści i podążali wgłąb, docierając do korzenia, który utworzymy na końcu (tabela rezerwacja).

CREATE TABLE adres(
	id int NOT NULL AUTO_INCREMENT,
	wojewodztwo varchar(45) NOT NULL,
	powiat varchar(45) NOT NULL,
	miejscowosc varchar(45) NOT NULL,
	ulica varchar(45) NOT NULL,
	numer_domu varchar(45) NOT NULL,
	numer_lokalu varchar(45),
	PRIMARY KEY (id)
);

Nasza pierwsza tabela to tabela adres. Do nazwenictwa tabel starajmy używać się jedynie małych liter. Do tego nie może być w nazwach spacji, nie zaczynamy nazw od cyfry, nie używamy również polskich znaków.

Tabela zawiera pole id będące kluczem głównym (PRIMARY KEY), liczbą całkowitą (INT), nie może być puste (NOT NULL) oraz jest automatycznie numerowane podczas dodawania kolejnych rekordów (AUTO_INCREMENT). Pozostałe pola będą zwierały informacje tekstowe (VARCHAR) o długości do 45 znaków.

Sprawdźmy teraz jakie tabele zawiera nasza baza danych.

SHOW TABLES;
+-------------------------------+
| Tables_in_rezerwacje_lotnicze |
+-------------------------------+
| adres                         |
+-------------------------------+

Zobaczmy również jak zbudowana jest nasza tabela adres

DESCRIBE adres;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| wojewodztwo  | varchar(45) | NO   |     | NULL    |                |
| powiat       | varchar(45) | NO   |     | NULL    |                |
| miejscowosc  | varchar(45) | NO   |     | NULL    |                |
| ulica        | varchar(45) | NO   |     | NULL    |                |
| numer_domu   | varchar(45) | NO   |     | NULL    |                |
| numer_lokalu | varchar(45) | YES  |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

Stwórzmy kolejne tabele. Część z nich będzie zawierała klucze obce, będące odnośnikami do kluczy głównych innych tabel.

CREATE TABLE pasazer(
	id int NOT NULL AUTO_INCREMENT,
	imie varchar(45) NOT NULL,
	nazwisko varchar(45) NOT NULL,
	pesel varchar(45) NOT NULL,
	telefon varchar(45) NOT NULL,
	mail varchar(45) NOT NULL,
	adres_id int,
	PRIMARY KEY (id),
	FOREIGN KEY (adres_id) REFERENCES adres(id)
);

Odpowiada za to linia FOREIGN KEY (adres_id) REFERENCES adres(id). Utworzone pole adres_id tabeli pasazer odpowiada polu id tabeli adres.

CREATE TABLE rezerwacja(
	id int NOT NULL AUTO_INCREMENT,
	numer_siedzenia int NOT NULL,
	bagaz varchar(45) NOT NULL,
	pasazer_id int,
	lot_numer_lotu int,
	status_rezerwacji_id int,
	PRIMARY KEY (id),
	FOREIGN KEY (pasazer_id) REFERENCES pasazer(id),
	FOREIGN KEY (lot_numer_lotu) REFERENCES lot(numer_lotu),
	FOREIGN KEY (status_rezerwacji_id) REFERENCES status_rezerwacji(id)
);

Tabela rezerwacja zawiera kilka kluczy obcych.

SHOW TABLES;
+-------------------------------+
| Tables_in_rezerwacje_lotnicze |
+-------------------------------+
| adres                         |
| lot                           |
| pasazer                       |
| rezerwacja                    |
| samolot                       |
| status_rezerwacji             |
+-------------------------------+

W ten oto sposób utworzymy wszystkie tabele naszej bazy.

WPROWADŹMY DO TABEL DANE

Wprowadzania do tabel danych rozpoczniemy w tej samej kolejności, co ich tworzenie. Czyli od tabel brzegowych, od których nie wychodzą już dalsze powiązania: adres, status_rezerwacji, samolot.
Do wprowadzania danych wykorzystamy polecenie INSERT INTO. Można je wykonać w dwóch odmianach: podając nazwy konkretnych kolumn i wprowadzając do nich wartości (VALUES), bądź bez podawania nazw kolumn, podając wszystkie dane.

INSERT INTO nazwa_tabeli
VALUES (watość1,watość2,watość3,...);

INSERT INTO nazwa_tabeli (kolumna1,kolumna2,kolumna3,...)
VALUES (watość1,watość2,watość3,...);

Różnicę pomiędzy nimi pokażmy na przykładzie:

INSERT INTO status_rezerwacji VALUES(NULL, 'wstepna');

INSERT INTO status_rezerwacji (status) VALUES('wstepna');

W pierwszym przypadku musimy podać wartości wszystkich pól, w tym również pola id, które przyjmuje wartość NULL, a podczas wprowadzenia do tabeli zostanie mu przypisany kolejny numer, o jeden większy od ostatnio wprowadzonego (AUTO_INCREMENT). W drugim podajemy jedynie wymagane wartości wraz z nazwami kolumn. Wprowadźmy zatem kilka wartości:

INSERT INTO status_rezerwacji VALUES(NULL, 'wstepna');
INSERT INTO status_rezerwacji VALUES(NULL, 'nieoplacona');
INSERT INTO status_rezerwacji VALUES(NULL, 'zarezerwowano');
INSERT INTO status_rezerwacji VALUES(NULL, 'archiwalna');

Wyświetlmy aktualną zawartość tabeli status_rezerwacji. Wykorzystamy polecenie SELECT służące do wybierania danych z bazy. Wypiszmy wszystko wykorzystując do tego symbol *.

SELECT * FROM status_rezerwacji;
+----+---------------+
| id | status        |
+----+---------------+
|  1 | wstepna       |
|  2 | nieoplacona   |
|  3 | zarezerwowano |
|  4 | archiwalna    |
+----+---------------+

Wprowadźmy dane tabel połączonych ze sobą relacją. Wykorzystajmy fakt, że tabela jest świeżo utworzona, a więc pierwsze wpisy dostaną numery id będące kolejnymi liczbami począwszy od 1.

INSERT INTO adres VALUES(NULL, 'pomorskie', 'lęborski', 'Lębork', 'Marcinkowskiego', '1', NULL);
INSERT INTO pasazer VALUES(NULL, 'Jan', 'Kowalski', '66110012121', '66677712345', 
'jank@ilovetechnikinformatyk.pl', '1');
INSERT INTO adres VALUES(NULL, 'pomorskie', 'lęborski', 'Lębork', 'Warszawska', '112', NULL);
INSERT INTO pasazer VALUES(NULL, 'Jan', 'Nowak', '86110045455', '12312312312', 
'jann@ilovetechnikinformatyk.pl', '2');
INSERT INTO adres VALUES(NULL, 'pomorskie', 'lęborski', 'Lębork', 'Pionierów', '997', 999);
INSERT INTO pasazer VALUES(NULL, 'Tadeusz', 'Nowak', '46120023232', '45678901332', 
'tadzio@ilovetechnikinformatyk.pl', '3');

Wprowadziliśmy adres Jana Kowalskiego do tabeli adres i dodaliśmy samego Jana do tabeli pasażer podając w kluczu obcym (adres_id) numer 1 będący wartością id pola rekordu tabeli adres. Podobnie w dwóch pozostałych przypadkach. Spójrzmy teraz jak wyglądają obie tabele:

+----+-------------+----------+-------------+-----------------+------------+--------------+
| id | wojewodztwo | powiat   | miejscowosc | ulica           | numer_domu | numer_lokalu |
+----+-------------+----------+-------------+-----------------+------------+--------------+
|  1 | pomorskie   | lęborski | Lębork      | Marcinkowskiego | 1          | NULL         |
|  2 | pomorskie   | lęborski | Lębork      | Warszawska      | 112        | NULL         |
|  3 | pomorskie   | lęborski | Lębork      | Pionierów       | 997        | 999          |
+----+-------------+----------+-------------+-----------------+------------+--------------+

+----+---------+----------+-------------+-------------+----------------------------------+----------+
| id | imie    | nazwisko | pesel       | telefon     | mail                             | adres_id |
+----+---------+----------+-------------+-------------+----------------------------------+----------+
|  1 | Jan     | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl   |        1 |
|  2 | Jan     | Nowak    | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl   |        2 |
|  3 | Tadeusz | Nowak    | 46120023232 | 45678901332 | tadzio@ilovetechnikinformatyk.pl |        3 |
+----+---------+----------+-------------+-------------+----------------------------------+----------+

Podobnie wypełniamy pozostałe tabele.

Utworzyliśmy dziś bazę danych, tabele, wypełniliśmy je danymi. W kolejnych tematach zajmiemy się wyszukiwaniem informacji w bazie danych, modyfikacją danych, struktury tabel oraz bazy. Na koniec usuniemy wszystko ;)