- Podstawowe pojęcia.
- Zapytania wyszukujące dane.
- Zapytania modyfikujące dane.
- Zapytania raportujące.
- Zapytania łączące kolumny.
- Zapytania modyfikujące strukturę tabeli.
- Zapytania tworzące tabelę.
- Operacje na użytkownikach.
- Diagramy ERD.
Dane w bazie danych są przechowywane w obiektach bazy danych, które są nazywane tabelami. Ta tabela jest w zasadzie zbiorem powiązanych wpisów danych i składa się z wielu kolumn i wierszy
Można powiedzieć, że encje to rzeczowniki wyjęte z opisu bazy danych ;). Encje to rodzaje “obiektów” przechowywanych w bazie. Na przykład towar, czy producent. Odpowiednikiem encji w programowaniu obiektowym jest klasa. Zatem w przypadku bazy danych opisującej magazyn występuje pięć rodzajów encji.
Każda z encji ma swoje właściwości. Na przykład opiekun handlowy ma numer telefonu, imię czy nazwisko. Każdy z tych elementów to atrybut. Podobnie jak w programowaniu obiektowym instancje mają swoje atrybuty. Podobnie jak w języku programowania tak i tutaj atrybuty mają swoje typy. Relacyjne bazy danych obsługują różne typy. W większości przypadków typy z języków programowania mają swoje odpowiedniki w typach w bazie danych. Na przykład:
- string
- bool
- double
- enum
- varchar
- int
- datetime
Krotka to zbiór atrybutów. Upraszczając można powiedzieć, że krotka w modelu relacyjnym odpowiada instancji obiektu w programowaniu obiektowym2. Krotki często prezentowane są w postaci wiersza w tabeli gdzie każda kolumna odpowiada poszczególnym atrybutom.
Nazwa | Stan magazynowy | Cena |
---|---|---|
trampki | 10 | 99.99 |
W relacyjnym modelu bazy danych relacją określamy zbiór krotek. Skoro pojedyncza krotka to wiersz w tabeli, to zbiór krotek to cała tabela :). Istnieją różne konwencje nazywania relacji. W dalszej części artykułu będę używał liczby mnogiej od nazwy encji. Dla przykładu relacja przechowująca krotki towar będzie nazywała się towary.
Nazwa | Stan magazynowy | Cena |
---|---|---|
trampki | 10 | 99.99 |
sweter | 0 | 299.99 |
lizak | 2500 | 0.5 |
spinacz | 500 | 0.01 |
W modelu relacyjnym krotki w relacji nie mogą się powtarzać (elementy w zbiorze są unikalne). W praktyce relacyjne bazy danych posługujące się SQL pozwalają na duplikaty wierszy w tabelach. Sam język SQL pozwala na pobranie unikalnych elementów z danej tabeli.
Każda tabela jest podzielona na mniejsze jednostki zwane polami. Przykładowo w tabeli klienci możemy mieć takie pola jak: imie, nazwisko, adres, wiek
Rekord jest również nazywany wierszem danych, to każdy pojedynczy wpis istniejący w tabeli.
Kolumna to pionowa jednostka w tabeli, która zawiera wszystkie informacje powiązane z określonym polem w tabeli.
Wartość NULL w tabeli to wartość w polu, które wydaje się być puste, co oznacza, że pole z wartością NULL jest polem bez wartości.
Zbiór atrybutów (kolumn w tabeli) tworzy klucz główny. Klucz główny to unikalny identyfikator dla każdego wiersza w tabeli. W większości przypadków tabele zawierają dodatkową kolumnę, która zawiera identyfikator w postaci liczby:
Id | Nazwa |
---|---|
1 | trampki |
2 | sweter |
3 | lizak |
4 | spinacz |
W tabeli wyżej kolumna Id
jest kluczem głównym (ang. primary key). Tworzenie kluczy głównych przy pomocy liczby pozwala na automatyczne tworzenie nowej wartości klucza dla nowego wiersza. Wystarczy podnieść o 1 największą wartość klucza głównego. Klucze główne składające się z wielu kolumn nazywa się kluczami złożonymi.
Bazy danych optymalizują dostęp do danych przy pomocy klucza głównego. Oznacza to tyle, że pobranie wiersza z tabeli towary
na podstawie kolumny Id
będącej kluczem głównym może być bardziej wydajne niż pobranie tego samego wiersza na podstawie wartości kolumny Nazwa
.
Tabele mogą być ze sobą powiązane. Te zależności pomiędzy tabelami pokazane są przez klucze obce (ang. foreign key). Klucz obcy to dodatkowa kolumna (lub kolumny), która pokazuje zależność. Na przykład tabela producenci może wyglądać następująco:
Id | Siedziba | Rok założenia |
---|---|---|
1 | Wrocław | 2007 |
2 | Warszawa | 1980 |
3 | Kraków | 1948 |
Dodatkowa kolumna producent_id
znajdująca się wewnątrz tabeli towary
pokazuje zależność pomiędzy towarami a producentami:
Id | Nazwa | Producent id |
---|---|---|
1 | trampki | 1 |
2 | sweter | 2 |
3 | lizak | 3 |
4 | spinacz | 3 |
Taka tabela pokazuje, że trampki produkowane są przez producenta z Wrocławia, swetry przez producenta z Warszawy. Producent z Krakowa produkuje lizaki i spinacze.
Tabele mogą mieć trzy rodzaje zależności.
Przykładem takiej zależności może być samochód – numer rejestracyjny. Każdy numer rejestracyjny przypisany jest do jednego samochodu, podobnie każdy samochód ma tylko jeden numer rejestracyjny. W przypadku magazynu relacją tego typu może być opiekun handlowy – producent. Zależność tego typu reprezentuje dodatkowa kolumna w tabeli:
Tabela producenci
Id | Siedziba | Rok założenia |
---|---|---|
... | ... | ... |
Tabela opiekunowie |
||
Id | Nazwisko | Producent Id |
---- | ------ | - |
... | ... | ... |
Kolumna Producent id
w tabeli opiekunowie
wskazuje na producenta, za którego jest odpowiedzialny dany opiekun.
Przykładem takiej zależności może być producent – towar. Każdy producent produkuje wiele towarów. Innymi słowy każdy towar produkowany jest przez jednego producenta. Podobnie jak w przypadku relacji jeden do jednego zależność tego typu uzyskuje się poprzez dodanie odpowiedniej kolumny:
Tabela producenci
Id | Siedziba | Rok założenia |
---|---|---|
... | ... | ... |
Tabela towary |
||
Id | Nazwa | Producent Id |
---- | ------ | - |
... | ... | ... |
Zarówno zależność jeden do wielu, jak i jeden do jednego możliwa jest przy pomocy pojedynczej kolumny.
Zależność wiele do wielu może występować pomiędzy hurtownikami i towarami. Oznacza ona tyle, że wielu hurtowników zaopatruje się w wiele towarów. Ten sam towar pobierany jest przez wielu hurtowników. W przypadku takiej zależności niezbędna jest dodatkowa tabela, która połączy ze sobą dwie tabele:
Tabela towary
Id | Nazwa | Producent id |
---|---|---|
... | ... | ... |
Tabela hurtownicy |
||
Id | Nazwa hurtowni | |
---- | ------ | |
... | ... | |
Tabela towary_hurtownicy |
||
Towary id | Hurtownik id | |
---- | ------ | |
... | ... |
W tym przypadku tabela towary_hurtownicy
ma dwa klucze obce. Jeden z nich pokazuje na tabelę towary
drugi na hurtownicy
. W przypadku tej tabeli kluczem głównym, który identyfikuje każdy wiersz może być para tych kolumn. Jest to tak zwany klucz złożony.
Formularz służy do wygodnego wprowadzania, edytowania i usuwania danych w tabeli. Wymienione operacje wykonuje się za pomocą okna w którym użytkownik obsługuje pola. Znaczenie pól opisane jest za pomocą etykiet, czyli nazw pól. Jest on wizytówką bazy.
Raportem nazywamy konstrukcję systemu bazy danych, która służy do definiowania postaci i zawartości danych pobieranych z tabel, a następnie umieszczanych na wydruku. Jest to dokument przedstawiający w sposób przejrzysty i zorganizowany, wybrane i posortowane przez nas dane.
SELECT
*FROM
books;
SELECT DISTINCT
rentals;
SELECT
name, surnameFROM
authorsWHERE
1;SELECT
*FROM
authorsWHERE
id > 1AND
id < 7;SELECT
*FROM
authorsWHERE
id < 5OR
name = "Jan";SELECT
*FROM
authorsWHERE NOT
name = "Jan";SELECT
*FROM
booksWHERE
id_category = 3AND
(id_author = 1OR
id_author = 2);
SELECT
*FROM
readersORDER BY
id;SELECT
*FROM
readersORDER BY
nameDESC
;SELECT
*FROM
readersORDER BY
nameASC
, surnameDESC
;
-
SELECT
titleFROM
booksLIMIT
0, 10; -
% (znak procenta) jest znakiem, który reprezentuje 0, 1 lub więcej znaków
- _ (podkreślenie) jest specjalnym znakiem, które reprezentuje jeden znak
SELECT
nazwa_kolumnyFROM
nazwa_tabeliWHERE
nazwa_kolumnyLIKE
pattern;LIKE
‘a%’ (znajdź każdą komórkę, która zaczyna się na “a”)LIKE
‘%a’ (znajdź każdą komórkę, która kończy się na “a”)LIKE
‘%or%’ (znajdź każdą komórkę, w której znajduje się fraza “or” na dowolnej pozycji)LIKE
‘_r%’ (znajdź każdą komórkę, która ma literę “r” na drugiej pozycji)LIKE
‘a_%_%’ (znajdź każdą komórkę, która zaczyna się na “a” i posiada co najmniej 3 znaki długości)LIKE
‘[a-c]%’ (znajdź każdą komórkę, która zaczyna się na “a”, “b”, lub “c”)
SELECT
nameFROM
authorsWHERE
nameIN
("Jan", "Joanna", "Leon");
SELECT
titleFROM
booksWHERE
id_categoryBETWEEN
1AND
2;SELECT
*FROM
booksWHERE
(id_publisherBETWEEN
2AND
3)AND NOT
id_authorIN
(3, 6);SELECT
*FROM
rentalsWHERE
return_dateBETWEEN
#2017-12-10# AND #2018-01-13#;
SELECT
*FROM
readersWHERE
codeIS NULL
;SELECT
*FROM
readersWHERE
codeIS NOT NULL
;
SELECT
nameAS
authorFROM
authors;SELECT
id_authorFROM
booksAS
bookcase;SELECT
id_bookAS
bookId, id_readerAS
readerIdFROM
rentals;
GROUP BY: instrukcja często używana z funkcjami agregującymi (COUNT, MAX, MIN, SUM, AVG) do grupowania zbioru wyników według jednej lub więcej kolumn
SELECT
title, COUNT(id_publisher)FROM
booksWHERE
1GROUP BY
id_authorORDER BY
id_author DESC;
INSERT INTO
readers (id, name, surname, code)VALUES
(11, "Jakub", "Złotek", "JZ");INSERT INTO
readersVALUES
(12, "Daniel", "Kamiński", "DK");
UPDATE
publishersSET
name = "Polska księgarnia"WHERE
id = 1;UPDATE
publishersSET
name = "Brak wydawnictwa";
DELETE FROM
booksWHERE
id_publisher = 3;DELETE
*FROM
rentals;
SELECT COUNT (DISTINCT
id_reader)
;
SELECT MIN (
id_author) FROM
books;SELECT MAX (
id_publisher) FROM
books;
SELECT AVG (
rental_date) FROM
rentalsWHERE
id > 1;
SELECT SUM (
id) FROM
rentalsWHERE
id > 4;
SELECT
idFROM
booksINNER JOIN
rentalsON
books.id=rentals.id_book;
LEFT (OUTER) JOIN: zwraca wszystkie rekordy z lewej tabeli(tabela1), oraz dopasowane rekordy z prawej tabeli(tabela2)
SELECT
*FROM
rentalsLEFT JOIN
booksON
rentals.id_book=book.id;
RIGHT (OUTER) JOIN: zwraca wszystkie rekordy z prawej tabeli(tabela2), oraz dopasowane rekordy z lewej tabeli(tabela1)
SELECT
titleFROM
booksRIGHT JOIN
authorsON
books.id_author=authors.id;
SELECT
*FROM
booksFULL OUTER JOIN
categoriesON
books.id_category=categories.id;
ALTER TABLE
authorsADD
born_date datetime;
ALTER TABLE
authorsMODIFY
name longtext;
ALTER TABLE
authorsDROP kolumna
born_date;
CREATE TABLE
authors(
id
int(11)
,name
varchar(15)
,surname
varchar(30)
,born_date
datetime
,);
Nadawanie uprawnień systemowych odbywa się poprzez polecenie SQL:
GRANT [nazwa_uprawnienia] TO [nazwa_użytkownika]
; odbieranie natomiastREVOKE [nazwa_uprawnienia] FROM [nazwa_użytkownika]
;
Aby utworzyć nowego użytkownika, który będzie się logował z komputera lokalnego, stosujemy polecenie:
CREATE USER 'uzytkownik'@'localhost' [IDENTIFIED BY 'haslo']
; Parametr ujęty w nawias kwadratowy jest opcjonalny, czyli można utworzyć konto bez hasła.CREATE USER 'user01'@'localhost' IDENTIFIED BY 'zsbelzyce'
; Zostało utworzone konto o nazwie user01 zabezpieczone hasłem zsbelzyce. Hasła użytkowników są przechowywane w postaci zaszyfrowanej. Można je uzyskać, stosując polecenie:SELECT PASSWORD('haslo')
; Aby dany użytkownik mógł logować się z dowolnego komputera w wybranej domenie, używamy symbolu %:CREATE USER user01@' %.szkola_belzyce' IDENTIFIED BY 'zsbelzyce'
; Jeśli w nazwie użytkownika lub w nazwie domeny nie występują znaki specjalne - lub %, to w poleceniu można opuścić apostrofy. Zastosowanie symbolu % oznacza dowolny komputer:CREATE USER uzytkownik@' %' IDENTIFIED BY 'hasło'
; Nazwa hosta może być również podawana w postaci adresu IP:CREATE USER 'user'@'192.168.0.1' IDENTIFIED BY 'hasło'
Wykorzystywane są do tworzenia modelu graficznego schematu bazy danych. Pozwalają na modelowanie struktur danych oraz związków zachodzących między tymi strukturami. Nadają się szczególnie do modelowania relacyjnych baz danych, ponieważ umożliwiają prawie bezpośrednie przekształcenie diagramu w schemat relacyjny.
Diagramy ERD składają się z trzech rodzajów elementów:
- zbiorów encji (tabel)
- atrybutów encji (kolumn)
- związków zachodzących między encjami (relacji)
W tworzeniu diagramów wykorzystujemy poniższe elementy:
[obrazek1.png]
Diagramy ERD możemy tworzyć za pomocą różnych notacji. Najpopularniejsze są diagramy w zapisie według Martina i Chena.
[obrazek2.png]
Przykład:
[obrazek3.png]