Aplikační a programové vybavení Databáze – jazyk SQL (úvod)
Relace – definice Množina n-tic ve tvaru (a1, a2, a3, ..., an) ai – hodnota atributu v dané n-tici, ai in Di Di – doména atributu (množina hodnot, kterých může atribut nabývat) Ai – jméno i-tého atributu (textový řetězec) Příklad: OSOBA(RČ: STRING, VĚK: INTEGER, JMÉNO: STRING) klíč atribut je podtržen domény není povinné uvádět n-tice – to je třeba dvojice, trojice,... Neplést s entitou. Z toho, že je relace množina vyplývá, že muže obsahovat každý prvek pouze jednou (všimněte si, že tento požadavek se bude dále mnohokrát opakovat při definici tabulky). Relační algebra je teoretickým základem relačních databázových systémů, takže ji nesmíme opomenout, nicméně podrobnostmi se zabývají předměty Databázové systémy a Databázové systémy II.
Relace Na chvíli budeme předpokládat, že platí: relace – tabulka schéma / relační schéma – jméno a záhlaví tabulek (definice tabulek) pojmy relace, schéma a tabulka jsou v praxi často zaměňovány, ale neznamenají totéž prvek relace – řádek tabulky atribut – sloupec tabulky doména atributu – datový typ sloupce tabulky příklad: OSOBA(RČ: STRING, VĚK: INTEGER, JMÉNO: STRING) OSOBA(RČ, VĚK, JMÉNO) Pro začátek si je možné představit, že relace je nějaká tabulka, je to zjednodušení, jak bude později patrné z vlastností relace.
Relační algebra popis datových struktur pomocí matematické logiky úsporný, jednoduchý a ověřený koncept umožňuje pracovat s daty (tabulkami) před vytvořením programu postavený na množinových operacích součin, sjednocení, průnik, rozdíl, … základ pro dotazovací jazyk SQL Relační algebra, je podstatnou součástí jazyka SQL, tj. v průběhu dalších přednášek a cvičení budete její způsob uvažování velmi často potřebovat. Kromě toho jazyk SQL má řadu dalších funkcí, které v relační algebře nejsou, ale také se bez nich dá celkem dlouho žít.
Relační algebra – operace standardní množinové operace: kompatibilní sloupce: sjednocení (union) rozdíl (difference) průnik (intersection) kartézský součin (Cartesian product) speciální operace projekce (projection) selekce (selection) / restrikce (restriction) Θ-spojení (Θ-join) přirozené spojení (natural join) Kartézský součin dvou množin je množina kombinací všech prvků z obou množin. Tj. pokud máme množiny A = {Blivajz, Humus, Kentus} a B = {Babica, Hruška}, tak kartézský součin C = A × B je: C = {(Blivajz, Babica), (Blivajz, Hruška), (Humus, Babica), (Humus, Hruška), (Kentus, Babica), (Kentus, Hruška)} Θ-join se čte „theta spojení“
Relační algebra – množinové operace Barva Vzhled bílá tučně zelená kurzívou červená podtržené růžová KAPITÁLKY Barva Vzhled bílá tučně zelená kurzívou červená podtržené Barva Vzhled růžová KAPITÁLKY zelená kurzívou Barva Vzhled bílá tučně červená podtržené Toto jsou základní množinové operace, jen se pokuste neplést průnik (∩) a sjednocení (∪). Barva Vzhled zelená kurzívou
Relační algebra – operace Barva Vzhled bílá tučně zelená kurzívou červená podtržené Barva bílá zelená červená Barva Vzhled bílá tučně zelená kurzívou červená podtržené Barva Vzhled růžová KAPITÁLKY zelená kurzívou Barva Vzhled bílá tučně červená podtržené 𝑅1[𝐵𝑎𝑟𝑣𝑎, 𝑉𝑧ℎ𝑙𝑒𝑑] je projekce. 𝑅1[ 𝐵𝑎𝑟𝑣𝑎=𝑏í𝑙á ⋁ (𝐵𝑎𝑟𝑣𝑎=č𝑒𝑟𝑣𝑒𝑛á) je selekce, znak ⋁ znamená v matematické logice „nebo“. Projekce je omezení počtu sloupců, selekce je omezení počtu řádků a dá se to spolu kombinovat, jak je vidět v posledním příkladu. Vzhled kurzívou
Relační algebra – operace Barva1 Vzhled zelená tučně kurzívou červená podtržené Barva2 Velikost Písmo růžová 17 Arial červená 20 Times 10 zelená Courier Barva1 Vzhled Barva2 Velikost Písmo zelená tučně 20 Courier kurzívou červená podtržené 24 Times Arial Kartézský součin dvou množin – všechny kombinace všech prvků z obou množin. theta join – podmnožina kartézského součinu zadaná podmínkou natural join – stejné jako theta join, ale podmínka je rovnost stejně pojmenovaných sloupců. Tabulka uprostřed stránky zobrazuje výsledek theta spojení relací R1 a R2 s podmínkou Barva1 = Barva2. Z kartézského součinu těchto množin se vyberou pouze ty řádky, které splňují uvedenou podmínku. Pokud byste chtěli něco takového implementovat v procedurálním jazyce, budu to dva vnořené cykly – v jednom by se procházely řádky R1 a pro každý řádek by se procházela množina R2. Pokud je splněna podmínka, tak se vytvoří nový řádek výstupu, tak, že se vezmou sloupce z R1 a vedle nich se na stejný řádek připojí sloupce z R2 (toto je naivní implementace, ve skutečnosti se to implementuje jinak a chytřeji). Písmo Times
http://kantorek.webzdarma.cz/
Klíč Definice relace vyžaduje jednoznačnou identifikaci. Klíč je minimální množina vlastností, které jednoznačně identifikují každou entitu. Příklad – identifikace osoby: jméno + příjmení + datum narození (složený klíč) rodné číslo (jednoduchý klíč) číslo osoby (jednoduchý klíč) Obecně je nejbezpečnější využívat umělé (nevlastní, dumb) atributy, i když to představuje více práce. Klíč je nejzákladnější integritní omezení – tj. každá relace musí mít klíč. Slabý entititní typ má pouze nevlastní klíč. „Klíč je minimální množina...“ je potřeba chápat tak, že klíč obsahuje co nejmenší počet sloupců, které ještě stačí k jednoznačné identifikaci každé entity (tedy každého řádku tabulky), neboli klíč nesmí obsahovat zbytečné sloupce. Umělé atributy se používají zpravidla ke zjednodušení práce s relací, zejména pokud je přirozený klíč složený z více sloupců (např. jméno + příjmení + rodné číslo). Je potřeba myslet na to, že jakákoliv aplikace je jen modelem reality, nikoliv realitou. Tedy je vždy neúplná a nepřesná. Z toho vyplývá, že klíč je má být jednoznačný identifikátor v rámci potřeb aplikace, nejedená se o nějaký univerzální identifikátor. Často tedy jako klíč může stačit kombinace jméno a příjmení nebo e-mail nebo telefonní číslo apod. Pokusy o univerzální klíč jsou předem odsouzeny k neúspěchu – jednoznačně identifikovat kohokoliv na celém světě je nemožné. Přesněji, je to nemožné pomocí jednoduchých atributů, skládáním atributů dohromady to lze (Franta Vomáčka, ročník 1967, z Evropy, z ČR, ze Lhotky u Dolních Kotěhůlek, který bydlí za prvním stromem v za kapličkou vpravo a jeho bratr je fíra a má bradku). Poučení: některé věci jdou přímo proti sobě – například univerzalita a jednoduchost, univerzalita a rychlost nebo bezpečnost a komfort ovládání nebo univerzalita a spolehlivost atd...). Výraz „Slabý entitní typ“ označuje takové relace u nichž je klíč tvořen pouze nevlastními atributy (tj. atributy získanými z jiných relací), příkladem jsou záznamy v propojovacích tabulkách M:N relací. Například údaj o bydlišti osoby – sám o sobě nemá žádný identifikátor, ale je tvořen kombinací identifikátoru osoby a identifikátoru adresy a kromě toho může mít další atributy (např. od kdy do kdy na dané adrese daná osoba bydlí). V projektu APV je slabý entitní typ relace osoby_schuzky.
Klíč Klíčů může být v tabulce více: OSOBY(ID, RČ, JMÉNO, PŘÍJMENÍ, ČOP) Jeden z klíčů označíme jako primární. Volba primárního klíče není důležitá z hlediska analýzy, ale z hlediska implementace. primární klíč by měl být co nejmenší (z hlediska ukládání) hodnoty primárního klíče by měly být snadno porovnatelné nejvhodnější volbou je jeden atribut typu integer nejvýhodnější pro stroje, lidé s databázemi nepracují Prakticky se jako primární klíč tedy nejčastěji používá nějaké číselné ID, což je jednoznačný identifikátor, který každému záznamu v tabulce přiřadí databázový systém. Je důležité si ale uvědomit, že je to klíč umělý, tabulka by tedy měla vždy obsahovat ještě minimálně jeden klíč přirozený. Příklad: Databáze zaměstnanců obsahuje sloupce jméno a příjmení. Jméno a příjmení není jednoznačná identifikace osoby, je tedy potřeba buď přidat sloupce (rodné číslo), nebo zavést logickou identifikaci osob (zaměstnanecké číslo), to vše je potřeba bez ohledu na to jestli databáze obsahuje umělý automaticky generovaný primární klíč, nebo nikoliv. Je potřeba myslet na to, že umělý klíč slouží pouze pro vnitřní potřebu systému a nikoliv pro uživatele (hodnotu nesmí změnit a ani by ji neměl číst, naproti tomu zaměstnanecké číslo je možné změnit). Výjimkou mohou být speciální databáze, například databáze výsledků anonymního hlasování, nebo databáze přístupů, ty z podstaty věci neobsahují přirozený primární klíč a je nutné vždy doplnit klíč umělý, aby bylo možné vytvořit relaci.
Cizí klíč referenční integritní omezení (foreign key) atribut jedné relace (R2), který je označen jako cizí klíč, musí mít: prázdnou hodnotu hodnotu primárního klíče jiné relace (R1) R1 – hlavní relace (master, parent) R2 – vedlejší relace (detail, dependent) Příklad: VZTAHY(ID_VZTAHY, ID_OSOBY1, ID_OSOBY2, DATUM) ID_OSOBY1 a ID_OSOBY2 jsou cizí klíče Cizí klíč v přikladu říká, že vztah může existovat jen mezi dvěma existujícími (v databázi) osobami. Tedy že ID osoby ve vztahu nemůže být vymyšlené libovolné, ale musí to být odkaz na konkrétní záznam v tabulce osob. Cizí klíč vždy zahrnuje dvě relace, ale je vždy definován jen v jedné, tedy jedna relace se odkazuje na druhou.
http://kantorek.webzdarma.cz/
Jazyk SQL SQL je programovací jazyk, pomocí kterého je možné komunikovat s relačním DBS. SQL je vychází z relační algebry, ale je bohatší. Pomocí SQL je možné: „dotazovat se databáze na její stav“ – získávat data z databáze „zasílat databázi požadavky na aktualizaci“ – měnit stav databáze definovat tabulky (definovat schémata) Jazyk SQL je velice odlišný od „běžných“ programovacích jazyků. Programovací jazyky se dají rozdělit například na procedurální (C, Pascal, Java, Javascript. Php, VB, C++, C#, atd...) funkcionální (LISP, Haskell, ...) a deklarativní (SQL, Prolog, ...)
Předpoklady Data jsou uložena v databázi ve formě tabulek. Program, který zaslal dotaz, se nemusí starat o fyzickou strukturu dat a jejich uložení. Pořadí tabulek ani sloupců v databázi není důležité, protože jsou identifikovány jménem. Pořadí řádků není důležité, protože jednotlivé řádky jsou identifikované hodnotou klíče. Deklarativní jazyk: definujeme, CO chceme udělat (procedurální jazyk definuje, jak se něco udělá – proceduru) Důležitá je identifikace všech prvků pomocí jména, to je jediný správný způsob. Často se lze setkat s příklady (zejména v PHP), kde se používá identifikace pomocí indexu, ta ale není nijak zajištěna. Je to jen dobrá vůle některých databázových rozhraní, že ji umožňují. Jazyk SQL zahrnuje DDL (Data Definition Language – jazyk pro definici struktury dat) a DML (Data Manipulation Language – jazyk pro manipulaci s daty (to zahrnuje i výběr dat)).
Historie první prototyp v r. 1974 – jazyk Sequel standardizace ANSI a ISO v roce 1986 a 1987 – SQL-86 nový standard ANSI a ISO v roce 1992 – SQL-92 a další SQL:1999 a další SQL:2003 a další SQL:2008 – rozšíření o XML a další SQL:2011 – zpracování časových řad SQL:2003 má 3606 stran Pro zajímavost, jazyk C byl standardizován v roce 89, tedy později než jazyk SQL. V současnosti je ve většině RDBS implementované něco mezi SQL-92 a SQL:1999, skutečnost je taková, že implementace jazyka SQL v RDBS zaostávají za standardem o mnoho let a pravděpodobně vždy budou. Některé implementace totiž již dlouho obsahují prvky nekompatibilní se standardem.
Jména bez speciálních znaků → A...Z, a...z, 0...9, _ název (sloupce, tabulky, databáze, ...) ne příliš dlouhý (30 znaků) pokud možno anglicky dodržovat jednotnou konvenci velikosti písmen: id_person (C) idPerson (Java, C++) IdPerson (Delphi) Id_Person (exoti) název by měl vystihovat obsah Při pojmenovávání je dobré myslet na to, že mínus (pomlčka) je operátor a tudíž se obvykle nedá použít ve jméně. Bohužel, některé méně přívětivé databázové systémy neberou ohledy na velikost písmen (např. převádí vše na malá písmena), což znamená, že pojmenování s podtržítky je zdaleka nejspolehlivější způsob.
Jména Název by neměl obsahovat zbytečné údaje u tabulky není nutné uvádět, že je to tabulka je zbytečné k názvu sloupce přidávat název tabulky/databáze používat zavedené zkratky id / person_id / id_person item_count / item_cnt id_person se v tabulce „persons“ může zdát zbytečné, ale může se využít při NATURAL JOIN je dobré vyhnout se klíčovým slovům jazyka Seznam klíčových slov PostgreSQL: http://www.postgresql.org/docs/8.2/interactive/sql-keywords-appendix.html MySQL: http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html Vyhnout se všem klíčovým slovům jazyka SQL a všech implementací je prakticky nemožné.
SQL Zapomeňte procedurální programování. Pomocí SQL se definuje co má DBS udělat, SQL server požadavek zpracuje (převede na procedurální kód) a vyhodnotí. K dílčím prvkům databáze se přistupuje přes operátor „.“ (tečka) databáze.tabulka.sloupec (schéma.tabulka.sloupec) project.persons.id_person databáze se zpravidla neuvádí (během spuštění programu se nemění) tabulku je vhodné uvádět vždy SQL má vysokou redundanci (mnoho možností) Tečková notace je podobná jako např. u objektů v C++, Js apod. Vysokou redundanci mají i ostatní jazyky, např. jakýkoliv procedurální jazyk si vystačí s podmínkou a skokem. Ostatní příkazy však zpravidla zkracují a/nebo zjednodušují zápis programu, případně zefektivňují zpracování. SQL je zajímavé tím, že má množství příkazů a klíčových slov, která jsou naprosto stejná. Motivací za tímto je možnost dát programátorovi na výběr takovou logiku jazyka, která mu nejvíce vyhovuje.
Datové typy - úvod základní datové typy více o datových typech později řetězce varchar(mohutnost) – standardní řetězec, omezený délkou text – „neomezený“ řetězec čísla int(mohutnost) / number – celé číslo, např. int(4) signed / unsigned float datum datetime / date více o datových typech později Mohutnost datového typu se udává vždy v bajtech, jestli se udává nebo ne, záleží na konkrétním datovém typu a konkrétní implementaci. Int (4) má rozsah 32bitů, protože 8*4 = 32 Velikost „neomezeného řetězce“ bývá zpravidla minimálně několik GB.
Tabulka × Relace Tabulky mohou být skutečné – odpovídají databázovém schématu. Tabulky mohou být virtuální – pohledy (externí schémata). Výsledkem libovolného dotazu je také tabulka (dočasná). Pohled (view): je definován dotazem je zpravidla jen pro čtení umožňuje zjednodušení dotazů vytváří „uživatelské verze“ databáze umožňuje odstínit jednotlivé programové moduly aktualizuje se automaticky ze základních tabulek Výsledek dotazu (ani pohled) obecně není relace Výsledek dotazu není relace, protože může obsahovat stejné řádky – tedy nesplňuje základní podmínku relace – tj. že množina musí obsahovat unikátní prvky. Pohled je dobrý k tomu, že se tváří jako tabulka, a přitom nezvyšuje redundanci dat (je vždy vytvořen spojením skutečných tabulek), může se tedy s výhodou použít k rekonstrukci původního DB schématu. Klíčový poznatek je, že tabulka je buď skutečná tabulka, nebo výsledek dotazu, nebo pohled (což je výsledek dotazu), nebo výsledek spojení tabulek (JOIN).
Syntaxe zápisu syntaxe funkce a klíčová slova jazyka VELKÝMI PÍSMENY kurzívou se značí rozvinutí (zástupný symbol) DELETE FROM tabulka; [ ] – nepovinný prvek { } – množina prvků | – vyloučení prvků [ LEFT | RIGHT ] JOIN LEFT JOIN RIGHT JOIN JOIN a { = | < | > } b a = b nebo a < b nebo a > b Syntaxe = pravidla zápisu něčeho. Tento způsob zápisu se často používá i jinde, napříkla pro syntaxi příkazů shellu.
Příkazy SQL pro definici struktury dat (tabulek) – DDL (data definition language): CREATE (SCHEMA | TABLE | INDEX ) ALTER TABLE DROP TABLE pro manipulaci s daty – DML (data manipulation language): INSERT SELECT UPDATE DELETE mezi jednotlivými DBS jsou v některých oblastech značné rozdíly! Někdy se používá také DQL (Data Query Language), který obsahuje jen příkaz SELECT, ve skutečnosti se, ale zkratka DQL nevztahuje k SQL. Prakticky vzato má jazyk 4 příkazy bez kterých se nedá obejít.
http://kantorek.webzdarma.cz/
Otázky? Proč většinou není dobré zobrazovat uživateli hodnotu umělého ID? Když má jedna relace X řádků a druhá relace Y řádků, kolik řádků maximálně může mít výsledek theta spojení těchto relaci? Musí mít každá relace klíč? Jaký je rozdíl mezi relací a (databázovou) tabulkou? K čemu slouží tečka v jazyku SQL? Musí mít každá relace cizí klíč? Je možné v SQL napsat sjednocení množin?