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 arthur.dent@hhgttg.net Graham Chapman chap@python.org Samuel Wimes sw@discworld.uk
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 arthur.dent@hhgttg.net 2 Graham Chapman chap@python.org 3 Samuel Wimes sw@discworld.uk
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 Email3... 1 Arthur Dent arthur.dent@hhgttg.net ad@gmail.com 2 Graham Chapman chap@python.org 3 Samuel Wimes sw@discworld.uk 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í 1 Arthur Dent 2 Graham Chapman 3 Samuel Wimes ID človeka Email 1 arthur.dent@hhgttg.net 1 ad@gmail.com 2 chap@python.org 3 sw@discworld.uk
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 1 1 2 1 2 2 3 2 ID filmu ID Jméno 1 The Holy Grail 2 Life of Brian
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 filmu Role 1 1 Sir Bevedere 2 1 King Arthur 2 2 Brian 3 2 Pontius Pilate 3 2 Ex-Leper ID Jméno 1 The Holy Grail 2 Life of Brian
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 arthur.dent@hhgttg.net 2 Graham Chapman chap@python.org 3 Samuel Wimes sw@discworld.uk
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, rd@nature.net ); INSERT INTO Lidi (Jméno,Příjmení,Email) VALUES ( Richard, Dawkins, rd@nature.net ); 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= new@gmail.com WHERE ID=1; UPDATE Lidi SET Email= new@gmail.com WHERE Příjmení= Dent ; UPDATE Lidi SET Email= new@gmail.com WHERE Email= old@gmail.com ;
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 ID Jméno Příjmení 1 Arthur Dent 2 Graham Chapman 3 Samuel Wimes Maily ID človeka Email 1 arthur.dent@hhgttg.net 1 ad@gmail.com 2 chap@python.org 3 sw@discworld.uk
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 ID Jméno Příjmení 1 Arthur Dent 2 Graham Chapman 3 Samuel Wimes Maily ID človeka Email 1 arthur.dent@hhgttg.net 1 ad@gmail.com 2 chap@python.org 3 sw@discworld.uk
Více o SELECT Join Herci 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 ID Jméno Příjmení 1 Terry Jones 2 Graham Chapman 3 Michael Palin ID herce ID filmu Role 1 1 Sir Bevedere 2 1 King Arthur 2 2 Brian 3 2 Pontius Pilate 3 2 Ex-Leper Filmy ID Jméno 1 The Holy Grail 2 Life of Brian
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% ;