Do odtworzenia bazy i wykonywania zapytań użyjemy lokalnego środowiska XAMPP, zawierającego serwer WWW Apache, bazę danych MariaDB oraz aplikację webową phpMyAdmin działającą w przeglądarce WWW i umożliwiającą obsługę baz danych za pomocą interfejsu graficznego.
Informacje na temat instalacji i korzystania ze środowiska XAMPP i aplikacji phpMyAdmin zamieszczone zostały w e‑materiale Definiowanie schematu bazy danych w języku SQL, etap IVP13C1S35aDefiniowanie schematu bazy danych w języku SQL, etap IV.
Załączony plik szkola2.sql pobieramy i zapisujemy w wybranym katalogu.
Podane dalej polecenia wykonamy za pomocą aplikacji phpMyAdmin, którą uruchamiamy, wpisując w polu adresu przeglądarki internetowej localhost/phpmyadmin. Jeżeli środowisko XAMPP jest uruchomione, widzimy stronę główną, na której klikamy zakładkę SQL. W oknie Uruchom zapytanie/zapytania SQL na serwerze "localhost": wpisujemy lub wklejamy pojedyncze zapytania lub kilka zapytań kończących się znakiem średnika. Zapytania uruchamiamy kliknięciem przycisku Wykonaj (lub Go w niektórych wersjach aplikacji).
Zaczynamy od utworzenia bazy szkola2. Wykonujemy polecenia:
Linia 1. DROP DATABASE IF EXISTS szkola2 średnik.
Linia 2. CREATE DATABASE szkola2 średnik.
DROP DATABASE IF EXISTS szkola2;
CREATE DATABASE szkola2;
Pierwsze polecenie usuwa bazę szkola2, jeżeli wcześniej istniała. Drugie tworzy pustą bazę o takiej samej nazwie.
Kolejną czynnością jest utworzenie tabel i dodanie do nich danych. Odpowiednie polecenia zapisane zostały w pliku szkola2.sql. Wybieramy nazwę utworzonej bazy szkola2 w panelu po lewej stronie, następnie klikamy zakładkę Import. W oknie Importowanie do bazy danych "szkola2" w sekcji Plik do importu naciskamy Przeglądaj i wskazujemy wymieniony plik. Na dole klikamy przycisk Import. Po udanym imporcie zobaczymy komunikat Import zakończony sukcesem, wykonano 49 zapytań. (szkola2.sql).
Do wykonania dotychczasowych czynności można użyć również wiersza poleceń bazy danych. Aby go uruchomić, otwieramy terminal (wiersz poleceń) i przechodzimy do katalogu, w którym zapisaliśmy plik szkola2.sql.
Następnie w systemie Linux wykonujemy polecenia:
Linia 1. prawy ukośnik opt prawy ukośnik lampp prawy ukośnik bin prawy ukośnik mysql minus u root minus p minus e cudzysłów DROP DATABASE szkola2 cudzysłów.
Linia 2. prawy ukośnik opt prawy ukośnik lampp prawy ukośnik bin prawy ukośnik mysql minus u root minus p minus e cudzysłów CREATE DATABASE szkola2 cudzysłów.
Linia 3. prawy ukośnik opt prawy ukośnik lampp prawy ukośnik bin prawy ukośnik mysql minus u root minus p szkola2 otwórz nawias ostrokątny szkola2 kropka sql.
W systemie Windows polecenie /opt/lampp/bin/mysql zastępujemy C:\xampp\mysql\bin\mysql, gdzie C:\xampp jest dyskiem i katalogiem, w którym zainstalowaliśmy środowisko XAMPP. W domyślnej konfiguracji nie musimy podawać hasła, wystarczy nacisnąć ENTER.
Ostatnie polecenie wczyta dane, wykonując instrukcje SQL zawarte w podanym pliku.
Jeżeli kolejne zapytania chcemy wykonywać za pomocą wiersza poleceń bazy danych, uruchamiamy tryb interaktywny, wywołując polecenie /opt/lampp/bin/mysql -u root -p w Linuksie lub C:\xampp\mysql\bin\mysql -u root -p w systemie Windows.
Żeby zapoznać się z bazą danych, wykonujemy polecenia:
Linia 1. USE szkola2 średnik.
Linia 2. SHOW TABLES średnik.
USE szkola2;
SHOW TABLES;
Polecenie USE wskazuje bazę danych, z której chcemy korzystać. W phpMyAdmin można je pominąć, jeżeli wcześniej klikniemy nazwę bazy w lewym panelu, a następnie zakładkę SQL. Polecenie SHOW TABLES wyświetla listę tabel.
Przydatne polecenia, kiedy chcemy sprawdzić poprawność przeprowadzanych zmian w bazie, to:
DESCRIBE uczniowie; – pokazuje nazwy pól, ich typy danych i ograniczenia w podanej tabeli,
SELECT * FROM uczniowie; – wybiera dane zapisane w podanej tabeli.
Zmiany w bazie
W tabeli przedmioty mamy dwie kolumny zawierające imiona i nazwiska nauczycieli. Nie jest to najlepsze rozwiązanie, np. gdybyśmy chcieli z nauczycielami łączyć inne informacje w bazie, np. telefony czy adresy e‑mail, lub też gdyby jeden nauczyciel uczył wielu przedmiotów.
W tabeli uczniowie mamy kolumnę klasa przechowującą powtarzające się nazwy klas. Dane nie powinny się powtarzać, ponadto zazwyczaj z klasami kojarzymy więcej informacji, np. wychowawcę lub funkcje klasowe.
Z powyższych obserwacji możemy wysnuć wniosek, że dobrze byłoby utworzyć dwie dodatkowe tabele – jedną z danymi dotyczącymi nauczycieli, drugą z danymi na temat klas.
Tabela nauczyciele
Tabelę nauczyciele z nazwiskami i imionami nauczycieli tworzymy za pomocą podzapytania wybierającego posortowane dane z tabeli przedmioty.
Linia 1. CREATE TABLE nauczyciele AS.
Linia 2. SELECT naucz podkreślnik nazw przecinek naucz podkreślnik imie FROM przedmioty ORDER BY naucz podkreślnik nazw średnik.
CREATE TABLE nauczyciele AS
SELECT naucz_nazw, naucz_imie FROM przedmioty ORDER BY naucz_nazw;
Zbadajmy strukturę utworzonej tabeli, aby sprawdzić wykorzystane typy danych:
Linia 1. DESCRIBE nauczyciele średnik.
DESCRIBE nauczyciele;
Teraz możemy zmienić nazwy pól:
Linia 1. ALTER TABLE nauczyciele CHANGE naucz podkreślnik nazw nazwisko VARCHAR otwórz nawias okrągły 30 zamknij nawias okrągły średnik.
Linia 2. ALTER TABLE nauczyciele CHANGE naucz podkreślnik imie imie VARCHAR otwórz nawias okrągły 30 zamknij nawias okrągły średnik.
ALTER TABLE nauczyciele CHANGE naucz_nazw nazwisko VARCHAR(30);
ALTER TABLE nauczyciele CHANGE naucz_imie imie VARCHAR(30);
Do zmiany nazw wykorzystujemy klauzulę ALTERTABLE ... CHANGE ..., w której oprócz nowej nazwy pola podajemy jego typ danych.
Tabela z samymi nazwiskami i imionami jest bezużyteczna, nie będziemy w stanie powiązać jej z żadną inną tabelą. Aby utworzyć relacje,relacjarelacje, dodajemy do tabeli klucz głównyklucz głównyklucz główny:
Linia 1. ALTER TABLE nauczyciele.
Linia 2. ADD COLUMN id podkreślnik naucz INT otwórz nawias okrągły 10 zamknij nawias okrągły UNSIGNED PRIMARY KEY AUTO podkreślnik INCREMENT średnik.
Powyższa klauzula pozwala dodawać do tabel nowe pola. Zwróćmy uwagę, że po członie ADD COLUMN podajemy nazwę pola, następnie typ danych i ewentualne ograniczenia.
RbbpcMr6LCzJx
Zrzut ekranu przedstawiający tabelę nauczyciele. Tabela składa się z sześciu kolumn opisanych kolejno: Field, Type, Null, Key, Default, Extra. Dane wpisano w trzech wierszach. W kolumnie Filed podano nazwy pół. W kolumnie Type podano typy pół. Kolumna Null zawiera wartości YES albo NO. W kolumnie Key określono klucz, którym jest id_naucz. W kolumnie Default we wszystkie komórki wpisano NULL. W kolumnie Extra wpisano wartość tylko w ostatniej komórce, jest to auto_increment.
Zmieniony schemat tabeli nauczyciele.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Kolejną czynnością jest dodanie pola klucza obcegoklucz obcyklucza obcego w tabeli przedmioty do przechowywania identyfikatorów nauczycieli.
Linia 1. ALTER TABLE przedmioty ADD COLUMN id podkreślnik naucz INT otwórz nawias okrągły 10 zamknij nawias okrągły UNSIGNED średnik.
Linia 2. ALTER TABLE przedmioty.
Linia 3. ADD FOREIGN KEY otwórz nawias okrągły id podkreślnik naucz zamknij nawias okrągły REFERENCES nauczyciele otwórz nawias okrągły id podkreślnik naucz zamknij nawias okrągły średnik.
ALTER TABLE przedmioty ADD COLUMN id_naucz INT(10) UNSIGNED;
ALTER TABLE przedmioty
ADD FOREIGN KEY (id_naucz) REFERENCES nauczyciele(id_naucz);
Na początku należy utworzyć pole, którego typ musi odpowiadać typowi danych klucza głównego. W drugiej kolejności tworzymy klucz obcy i tym samym definiujemy relację między tabelami.
Wprowadzamy identyfikatory nauczycieli do odpowiednich rekordów z tabeli przedmioty:
Linia 1. UPDATE przedmioty.
Linia 2. SET id podkreślnik naucz znak równości otwórz nawias okrągły SELECT id podkreślnik naucz FROM nauczyciele WHERE nazwisko znak równości naucz podkreślnik nazw AND imie znak równości naucz podkreślnik imie zamknij nawias okrągły średnik.
UPDATE przedmioty
SET id_naucz = (SELECT id_naucz FROM nauczyciele WHERE nazwisko = naucz_nazw AND imie = naucz_imie);
Klauzula aktualizacyjna UPDATE korzysta z podzapytania SELECT wykonywanego dla każdego rekordu z tabeli przedmioty, które wybiera identyfikator nauczyciela poprzez dopasowanie nazwiska i imienia. W tym przypadku w tabeli przedmioty nie ma dwóch nauczycieli, którzy nazywaliby się tak samo.
Na koniec możemy usunąć pola naucz_nazw i naucz_imie z tabeli przedmioty za pomocą klauzuli ALTER TABLE nazwa_tabeli DROP COLUMN nazwa_pola:
Linia 1. ALTER TABLE przedmioty DROP COLUMN naucz podkreślnik nazw średnik.
Linia 2. ALTER TABLE przedmioty DROP COLUMN naucz podkreślnik imie średnik.
ALTER TABLE przedmioty DROP COLUMN naucz_nazw;
ALTER TABLE przedmioty DROP COLUMN naucz_imie;
R10KoHRkXS96Y
Zrzut ekranu przedstawiający tabelę przedmioty. Tabela składa się z sześciu kolumn opisanych kolejno: Field, Type, Null, Key, Default, Extra. Dane wpisano w trzech wierszach. W kolumnie Filed podano nazwy pół. W kolumnie Type podano typy pół. Kolumna Null zawiera wartości YES albo NO. W kolumnie Key określono klucze. W kolumnie Default we wszystkie komórki wpisano NULL. W kolumnie Extra wpisano wartość tylko w pierwszej komórce, jest to auto_increment.
Zmieniony schemat tabeli przedmioty.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Wszystkie omówione powyżej zapytania tworzące i modyfikujące tabelę nauczyciele możemy wykonać za jednym razem:
R1Am2JmVXpu2B
Ilustracja przedstawia zapytania tworzące i modyfikujące tabelę nauczyciele w aplikacji phpMyAdmin. Tu: Wykonanie zapytania/zapytań SQL do bazy danych szkola2. W czternastu rzędach zapis: CREATE TABLE nauczyciele AS SELECT naucz_nazw, naucz_imie FROM przedmioty ORDER BY naucz_nazw; ALTER TABLE nauczyciele CHANGE naucz_nazw nazwisko VARCHAR(30) ; ALTER TABLE nauczyciele CHANGE naucz_imie imie VARCHAR(30); ALTER TABLE nauczyciele ADD COLUMN id naucz INT(10) UNSIGNED PRIMARY KEY AUTO INCREMENT; ALTER TABLE przedmioty ADD COLUMN id naucz INT(10) UNSIGNED; ALTER TABLE przedmioty ADD FOREIGN KEY (id naucz) REFERENCES nauczyciele(id naucz) ; UPDATE przedmioty SET id naucz = (SELECT id naucz FROM nauczyciele WHERE nazwisko = naucz_nazw AND imie = naucz_imie); ALTER TABLE przedmioty DROP COLUMN naucz_nazw; ALTER TABLE przedmioty DROP COLUMN naucz_imie.
Zapytania tworzące i modyfikujące tabelę nauczyciele w aplikacji phpMyAdmin.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Tabela klasy
W tabeli przechowującej informacje o klasach zapiszemy nazwy klas i identyfikatory wychowawców. Kolejność czynności będzie podobna, jak podczas tworzenia poprzedniej tabeli. Zaczynamy od utworzenia tabeli z niepowtarzającymi się nazwami klas. Wykorzystujemy podzapytanie SELECT DISTINCT:
Linia 1. CREATE TABLE klasy AS SELECT DISTINCT klasa FROM uczniowie ORDER BY klasa średnik.
CREATE TABLE klasy AS SELECT DISTINCT klasa FROM uczniowie ORDER BY klasa;
Następnie sprawdzamy typy danych i zmieniamy nazwę pola:
Linia 1. DESCRIBE klasy średnik.
Linia 2. ALTER TABLE klasy CHANGE klasa nazwa CHAR otwórz nawias okrągły 2 zamknij nawias okrągły średnik.
DESCRIBE klasy;
ALTER TABLE klasy CHANGE klasa nazwa CHAR(2);
Klasom trzeba przypisać unikalne identyfikatory, czyli należy utworzyć klucz główny.
Ćwiczenie 1
Wzorując się na tabeli nauczyciele, utwórz klucz główny id_klasy w tabeli klasy.
Linia 1. ALTER TABLE klasy.
Linia 2. ADD COLUMN id podkreślnik klasy INT otwórz nawias okrągły 10 zamknij nawias okrągły UNSIGNED PRIMARY KEY AUTO podkreślnik INCREMENT średnik.
ALTER TABLE klasy
ADD COLUMN id_klasy INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
Kolejną czynnością jest utworzenie pól na dodatkowe dane. Przyjmijmy, że są to identyfikator wychowawcy i rocznik klasy. Odpowiednie instrukcje prezentują się następująco:
Linia 1. ALTER TABLE klasy.
Linia 2. ADD COLUMN id podkreślnik naucz INT otwórz nawias okrągły 10 zamknij nawias okrągły UNSIGNED przecinek.
Linia 3. ADD COLUMN rok CHAR otwórz nawias okrągły 9 zamknij nawias okrągły średnik.
ALTER TABLE klasy
ADD COLUMN id_naucz INT(10) UNSIGNED,
ADD COLUMN rok CHAR(9);
Pozostaje utworzenie relacji między tabelami klasy i nauczyciele.
Ćwiczenie 2
Wykorzystując wcześniej omówiony przykład, utwórz w tabeli klasy klucz obcy w kolumnie id_naucz odnoszący się do identyfikatora nauczyciela w tabeli nauczyciele.
Linia 1. ALTER TABLE klasy.
Linia 2. ADD FOREIGN KEY otwórz nawias okrągły id podkreślnik naucz zamknij nawias okrągły REFERENCES nauczyciele otwórz nawias okrągły id podkreślnik naucz zamknij nawias okrągły średnik.
ALTER TABLE klasy
ADD FOREIGN KEY (id_naucz) REFERENCES nauczyciele(id_naucz);
R19FsdBNIRCTK
Zrzut ekranu przedstawiający tabelę klasy. Tabela składa się z sześciu kolumn opisanych kolejno: Field, Type, Null, Key, Default, Extra. Dane wpisano w czterech wierszach. W kolumnie Filed podano nazwy pół. W kolumnie Type podano typy pół. Kolumna Null zawiera wartości YES albo NO. W kolumnie Key określono klucze. W kolumnie Default we wszystkie komórki wpisano NULL. W kolumnie Extra wpisano wartość tylko w drugiej komórce, jest to auto_increment.
Zmieniony schemat tabeli klasy.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Skoro mamy tabelę klasy, możemy zaktualizować dane w tabeli uczniowie.
Ćwiczenie 3
W tabeli uczniowie utwórz pole id_klasy odpowiadające typowi danych klucza głównego tabeli klasy. Nadaj utworzonemu polu ograniczenie klucza obcego. Przy użyciu klauzuli UPDATE przypisz każdemu uczniowi odpowiedni identyfikator klasy. Usuń kolumnę klasa z tabeli uczniowie.
Linia 1. ALTER TABLE uczniowie.
Linia 2. ADD COLUMN id podkreślnik klasy INT otwórz nawias okrągły 10 zamknij nawias okrągły UNSIGNED średnik.
Linia 3. ALTER TABLE uczniowie ADD FOREIGN KEY otwórz nawias okrągły id podkreślnik klasy zamknij nawias okrągły REFERENCES klasy otwórz nawias okrągły id podkreślnik klasy zamknij nawias okrągły średnik.
Linia 4. UPDATE uczniowie SET id podkreślnik klasy znak równości otwórz nawias okrągły SELECT id podkreślnik klasy FROM klasy WHERE nazwa znak równości klasa zamknij nawias okrągły średnik.
Linia 5. ALTER TABLE uczniowie DROP COLUMN klasa średnik.
ALTER TABLE uczniowie
ADD COLUMN id_klasy INT(10) UNSIGNED;
ALTER TABLE uczniowie ADD FOREIGN KEY (id_klasy) REFERENCES klasy(id_klasy);
UPDATE uczniowie SET id_klasy = (SELECT id_klasy FROM klasy WHERE nazwa = klasa);
ALTER TABLE uczniowie DROP COLUMN klasa;
R1SvDOQdzOqzK
Zrzut ekranu przedstawiający tabelę uczniowie. Tabela składa się z sześciu kolumn opisanych kolejno: Field, Type, Null, Key, Default, Extra. Dane wpisano w sześciu wierszach. W kolumnie Filed podano nazwy pół. W kolumnie Type podano typy pół. Kolumna Null zawiera wartości YES albo NO. W kolumnie Key określono klucze. W kolumnie Default we wszystkie komórki wpisano NULL. W kolumnie Extra wpisano wartość tylko w pierwszej komórce, jest to auto_increment.
Zmieniony schemat tabeli uczniowie.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Wszystkie omówione zapytania tworzące i modyfikujące tabelę klasy:
RWyq2twLSCCBr
Ilustracja przedstawia zapytania tworzące i modyfikujące tabelę klasy i uczniowie w aplikacji phpMyAdmin. Tu zapis: Wykonanie zapytania/zapytań SQL do bazy danych szkola2. W piętnastu kolejnych rzędach zapis: CREATE TABLE klasy AS SELECT DISTINCT klasa FROM uczniowie ORDER BY klasa; ALTER TABLE klasy CHANGE klasa nazwa CHAR(2); ALTER TABLE klasy ADD COLUMN id klasy INT(10) UNSIGNED PRIMARY KEY AUTO INCREMENT; ALTER TABLE klasy ADD COLUMN id naucz INT(10) UNSIGNED, ADD COLUMN rok CHAR(9); ALTER TABLE klasy ADD FOREIGN KEY (id naucz) REFERENCES nauczyciele(id naucz); ALTER TABLE uczniowie ADD COLUMN id klasy INT(10) UNSIGNED; ALTER TABLE uczniowie ADD FOREIGN KEY (id klasy) REFERENCES klasy(id klasy); UPDATE uczniowie SET id klasy = (SELECT id klasy FROM klasy WHERE nazwa = klasa); ALTER TABLE uczniowie DROP COLUMN klasa.
Zapytania tworzące i modyfikujące tabelę klasy i uczniowie w aplikacji phpMyAdmin.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Słownik
klucz główny
klucz główny
(ang. primary key) pole tabeli, w którym wartości liczbowe lub znakowe nie mogą się powtarzać; wykorzystywane do jednoznacznej identyfikacji rekordu (np. w omawianej tu bazie identyfikator ucznia z pola id_ucz)
klucz obcy
klucz obcy
(ang. foreign key) pole tabeli, które tworzy relację (związek) z inną tabelą, czyli przechowuje wartości klucza głównego z innej tabeli; typ danych klucza obcego musi być taki sam jak typ danych klucza głównego
relacja
relacja
tu: zależność między tabelami; wyróżniamy następujące typy relacji:
jeden do jednego (np. w omawianej tu bazie każdego przedmiotu uczy jeden nauczyciel);
jeden do wielu (np. jeden uczeń ma wiele ocen);
wiele do wielu (np. w przypadku, gdy jeden nauczyciel uczy kilku przedmiotów, a jeden przedmiot może być nauczany przez wielu nauczycieli);
w teorii baz danych relacja oznacza zbiór krotek, czyli tabelę