Databáze
Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu
Bedřich Košata
K čemu jsou databáze ●
Ukládání dat ve strukturované podobě
●
Možnost ukládat velké množství dat
●
Rychlý přístup k datům a vyhledávání podle různých kritérií
Jak vypadá databáze ● ●
Základem databáze je tabulka Databáze může obsahovat libovolný počet tabulek
●
Tabulka se skládá ze sloupců a řádek
●
Každý sloupec představuje údaj určitého druhu
●
Každý řádek představuje jeden záznam
●
Řádek jde přirovnat k pythonímu slovníku (s pevně danými klíči), tabulku k listu takových slovníků
Jak vypadá tabulka ●
●
Tabulka má pevnou strukturu definovanou sloupci Sloupce mají jméno a typ (text, integer, float, apod.). (speciální hodnota NULL slouží jako None v Pythou, ale sloupec jí musí podporovat) Jméno
Příjmení
Email
Arthur
Dent
[email protected]
Graham
Chapman
[email protected]
Samuel
Wimes
[email protected]
Primární klíče ●
●
●
Jeden ze sloupců je tzv. primární klíč, který je unikátní v celé tabulce Jako primární klíč se často používá automaticky se zvyšující integer Primární klíč slouží jako ID, které umožňuje odkazování z jiných tabulek ID
Jméno
Příjmení
Email
1
Arthur
Dent
[email protected]
2
Graham
Chapman
[email protected]
3
Samuel
Wimes
[email protected]
Propojení tabulek ●
Co dělat, když nevím kolik dat patří k jednomu záznamu? ●
např. člověk může mít víc emailových adres
ID
Jméno
Příjmení
Email1
Email2
1
Arthur
Dent
[email protected] [email protected]
2
Graham
Chapman
[email protected]
3
Samuel
Wimes
Email3...
[email protected] Co když se najde někdo se čtyřmi adresami?
Propojení tabulek ●
Řešení jsou dvě tabulky propojené pomocí ID
●
Neplýtvám místem v prázdných sloupcích
●
Můžu mít emailů kolik chci
●
Tzv. vztah one-to-many ID
Jméno
Příjmení
ID človeka
Email
1
Arthur
Dent
1
[email protected]
2
Graham
Chapman
1
[email protected]
3
Samuel
Wimes
2
[email protected]
3
[email protected]
Složitější propojení ●
●
Např. herec–film: ve filmu hraje mnoho herců, herec hraje v mnoha filmech (vztah many-tomany) Řešení je propojovací tabulka
ID
Jméno
Příjmení
1
Terry
Jones
2
Graham
Chapman
3
Michael
Palin
ID herce
ID filmu
ID
Jméno
1
1
1
The Holy Grail
2
1
2
Life of Brian
2
2
3
2
Ještě složitější propojení ●
●
●
Herec hraje v každém filmu jinou roli. Herec může mít ve filmu víc rolí. Role nesouvisí s hercem, ani s filmem ale s kombinací herec–film. Řešení: rozšíříme propojovací tabulku
ID
Jméno
Příjmení
1
Terry
Jones
2
Graham
Chapman
3
Michael
Palin
ID herce
ID Role filmu
ID
Jméno
1
1
Sir Bevedere
1
The Holy Grail
2
1
King Arthur
2
Life of Brian
2
2
Brian
3
2
Pontius Pilate
3
2
Ex-Leper
Jak vypadá typická databáze ●
●
●
●
Databázový server (program) běží na serveru (počítač) :) Klienti běží na jiných počítačích, připojují se pomocí TCP Většina programů obsahuje defaultně pouze textového klienta Různá grafická rozhraní jsou dostupná navíc
Nejznámější databázové programy ●
Oracle Database
●
MySQL
●
PostgreSQL
●
SQLite
●
MS Access
Jak pracujeme s daty v databázi ●
●
Různé programy nabízejí možnost klikacích klientů, např. MS Access SQL - “Structured Query Language” ●
● ●
Standardizovaný jazyk určený speciálně pro databáze Implementovaný všemi databázovými programy Data lze z databáze vyexportovat jako sérii SQL příkazů a poté opět nahrát zpátky.
SQL úvod – SELECT ● ●
●
●
Nejčastější operace – výběr dat z databáze SELECT Email FROM Lidi WHERE Příjmení=”Dent”; SELECT ID,Email FROM Lidi WHERE Jméno=”Arthur” AND Příjmení=”Dent”; SELECT * FROM Lidi;
Tabulka Lidi:
ID
Jméno
Příjmení
Email
1
Arthur
Dent
[email protected]
2
Graham
Chapman
[email protected]
3
Samuel
Wimes
[email protected]
SQL úvod – INSERT ●
●
●
Používá se pro vkládání nových záznamů (řádek) INSERT INTO Lidi (ID,Jméno,Příjmení,Email) VALUES (4,”Richard”,”Dawkins”,”
[email protected]”); INSERT INTO Lidi (Jméno,Příjmení,Email) VALUES (”Richard”,”Dawkins”,”
[email protected]”); ●
Pokud je primární klíč automaticky přiřazen k novým záznamům
SQL úvod – UPDATE ●
●
●
●
Používá se pro modifikaci existujících záznamů (řádek) UPDATE Lidi SET Email=”
[email protected]” WHERE ID=1; UPDATE Lidi SET Email=”
[email protected]” WHERE Příjmení=”Dent”; UPDATE Lidi SET Email=”
[email protected]” WHERE Email=”
[email protected]”;
SQL úvod – DELETE ●
Používá se pro mazání řádků
●
DELETE FROM Lidi WHERE Příjmení=”Dent”;
●
DELETE FROM Lidi WHERE ID=1;
●
DELETE FROM Lidi WHERE ID>3;
●
DELETE FROM Lidi;
Některé zajímavé funkce ●
●
Aggregate functions: ●
Pracují s mnoha záznamy
●
SUM, COUNT, AVG, MIN, MAX
●
SELECT SUM(Cena) FROM Sklad;
Scalar functions: ●
Pracují s jednou hodnotou
●
UCASE, LCASE, LEN, ROUND...
●
SELECT LEN(Příjmení),Příjmení FROM Lidi WHERE Jméno=”John”;
Více o SELECT – řazení a limit ● ●
●
●
●
SELECT * FROM Lidi ORDER BY Příjmení; SELECT * FROM Lidi ORDER BY Příjmení,Jméno; SELECT * FROM Lidi WHERE Age>18 ORDER BY Age DESC; SELECT * FROM Lidi WHERE Age>18 ORDER BY Age DESC LIMIT 10; (jen 10) SELECT * FROM Lidi WHERE Age>18 ORDER BY Age DESC LIMIT 5,10; (10 od pátého)
Více o SELECT – Join ●
● ●
Join slouží pro vyhledávání ve více tabulkách najednou Nejčastěji použijeme implicit join SELECT Jméno, Email FROM Lidi, Maily WHERE Maily.ID_člověka=Lidi.ID AND Lidi.Příjmení=”Dent”; Lidi
Maily
ID
Jméno
Příjmení
ID človeka
Email
1
Arthur
Dent
1
[email protected]
2
Graham
Chapman
1
[email protected]
3
Samuel
Wimes
2
[email protected]
3
[email protected]
Více o SELECT – Join ● ●
Join má i explicitní vyjádření SELECT Jméno, Email FROM Lidi JOIN Maily ON Maily.ID_člověka=Lidi.ID WHERE Lidi.Příjmení=”Dent”; Lidi
Maily
ID
Jméno
Příjmení
ID človeka
Email
1
Arthur
Dent
1
[email protected]
2
Graham
Chapman
1
[email protected]
3
Samuel
Wimes
2
[email protected]
3
[email protected]
Více o SELECT – Join ●
SELECT Herci.Jméno,Herci.Příjmení,Role,Filmy.Jméno FROM Herci, Herec_To_Film, Filmy WHERE Herci.ID=Herec_To_Film.ID_herce AND Filmy.ID=Herec_To_Film.ID_filmu; Herec_To_Film
Herci ID
Jméno
Příjmení
1
Terry
Jones
2
Graham
Chapman
3
Michael
Palin
ID herce
ID Role filmu
Filmy ID
Jméno
1
1
Sir Bevedere
1
The Holy Grail
2
1
King Arthur
2
Life of Brian
2
2
Brian
3
2
Pontius Pilate
3
2
Ex-Leper
Vyhledávání v textu ●
●
●
SELECT * FROM Lidi WHERE Příjmení LIKE “D%”; SELECT * FROM Lidi WHERE Příjmení LIKE “%ata”; SELECT * FROM Dokument WHERE Text LIKE “%brabenci%”;