Aplikační a programové vybavení

Slides:



Advertisements
Podobné prezentace
Aplikační a programové vybavení
Advertisements

KIV/ZIS Cvičení 6 SQL - SELECT.
SQL Další dotazy a pohledy
Tabulky v MS ACCESS Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Mgr. Jiří Novák.
Základy jazyka SQL Jan Tichava
A5M33IZS – Informační a znalostní systémy Dotazovací jazyk SQL - I.
SQL: DDL v ORACLE CREATE TABLE jméno_tabulky (atribut datový_typ [DEFAULT][attribut_constraint] [, atribut datový_typ [DEFAULT] [attribut_constraint]],...
Aplikační a programové vybavení
Jazyk SQL Ing. Zdena DOBEŠOVÁ. SQL Structured Query Language 1974 SEQUEL (Structured English Query Language) neprocedurální relační dotazovací jazyk norma.
DB1 – 9. cvičení Optimalizace dotazu Konkurenční přístup a deadlock Indexace Transakce.
Databázové systémy SQL Výběr dat.
YDASYS1 Ing. Monika Šimková.
Fakulta elektrotechniky a informatiky
Informační systémy Realizace uložených procedur a spouští, jejich praktické využití.
Informační systémy Nástroje pro sběr dat, návrh a realizace databáze.
AGREGACE Distinct, Group By, Having, SUM, …. DISTINCT  Slučování stejných řádků ve výsledku dotazu. AGREGACE 2 JménoPříjmeníID FrantišekVomáčka1 JosefPokorný2.
Další dotazy SQL Structured Query Language. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
SQL Structured Query Language
Informatika pro ekonomy II přednáška 11
Databázové systémy 1 Cvičení č. 4 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy 1 Cvičení č. 2 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy 1 Cvičení č. 3 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
1 BUMI Úvod do medicínské informatiky Počítačové cvičení č. 3 Ing. Vratislav Čmiel.
Temporální databáze a TSQL
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
Radek Špinka Přepínače MSSQL výběr.
SQL Přednáška DB1. Literatura CONNOLLY, T.M.-BEGG,C.E.-STRACHAN,A.D.: Database Systems – A Practial Approach to Design, Implementation and Management.
MySQL - Vytvoření nové tabulky  create table jméno_tabulky (jméno_položky typ_položky,... ) Přehled nejběžnějších datových typů Přehled nejběžnějších.
Databázové systémy Štěpán Šípal.
Databázové systémy II Přednáška č. 8 – Pohledy (Views)
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Fakulta elektrotechniky a informatiky
Databázové systémy I Cvičení č. 9 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Aplikační a programové vybavení
KIV/ZIS cvičení 6 Tomáš Potužák. Pokračování SQL Klauzule GROUP BY a dotazy nad více tabulkami Stáhnout soubor studenti_dotazy_sql.mdb.
Databázové systémy I Cvičení č. 6 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Databázové systémy Přednáška č. 6.
SQL – základní pojmy Ing. Roman Danel, Ph.D.
SQL PVA Jan Hora. SQL „graficky“ Grafický vs. pravý SQL SELECT ORDED BY WHERE.
Rauer Luboš Kopic Petr Blažek Tomáš. Structured Query Language - dotazovací jazyk -> pracuje s dotazy - neprocedurální jazyk - mocný, ale přitom jednoduchý.
Databázové systémy 2 Cvičení č. 6 Ing. Tomáš Váňa Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Tabulky – vyhledávání (v dalších tabulkách pomocí relací)
Číslo šablony: III/2 VY_32_INOVACE_P4_3.8 Tematická oblast: Aplikační software pro práci s informacemi II. Databáze – základy SQL Typ: DUM - kombinovaný.
Architektury a techniky DS Cvičení č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Aplikační a programové vybavení
Databázové systémy I Cvičení č. 7 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Informatika II PAA DOTAZOVACÍ JAZYKY
Aplikační a programové vybavení
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B13 Autor Ing. Jiří Kalousek Období vytvoření březen.
Základní obeznámení s jazykem SQL Databázové systémy.
Databázové systémy SQL Výběr dat.
TEMPORÁLNÍ DATABÁZE A TSQL2
Použití dotazu jako zdroj dat pro pohled Vypracovala: Procházková Petra.
Aplikační a programové vybavení
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B15 Autor Ing. Jiří Kalousek Období vytvoření březen.
SQL Další dotazy a pohledy Databázové systémy. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
Teorie zpracování dat RELAČNÍ DATOVÝ MODEL.
Databázové systémy I Přednáška č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Příkazy jazyka SQL ve VFP a na SQL Serveru
SQL – příkaz SELECT Ing. Roman Danel, Ph.D.
Databázové systémy I Přednáška 5 Databázové systémy 1 – KIT/IDAS1
Databázové systémy I Přednáška 8 Databázové systémy 1 – KIT/IDAS1
Dotazovací jazyk SQL I.
Databázové systémy a SQL
Databázové systémy a SQL
Šablona 32 VY_32_INOVACE_038.ICT.34
Optimalizace SQL dotazů
Přednáška 7 SQL – JOIN.
Přednáška 9 Triggery.
Databázové systémy a SQL
Transkript prezentace:

Aplikační a programové vybavení Databáze – jazyk SQL, spojování tabulek

Krok 1: vytvoření databáze příkaz CREATE Syntaxe je poměrně složitá a v mnoha ohledech velmi závisí na konkrétním databázovém systému. Viz. příslušný manuál oblíbeného databázového systému. Při použití vhodných nástrojů se SQL příkazy vygenerují automaticky z návrhu databáze. Pokud používáte databázi MySQL, tak se mezi vhodné nástroje počítá zcela jistě MySQL workbench. Pokud používáte databázi PostgreSQL, tak není volba tak jednoznačná, za vyzkoušení určitě stojí DBeaver a PowerArchitect.

Krok 1: vytvoření databáze V této přednášce zatím přeskakujeme fázi návrhu databáze. Tj. máte k dispozici navrženou strukturu databáze (tabulky a jejich sloupce) a nyní se s ní učíte pracovat. Jak se databáze vytváří je popsané v následující přednášce.

Krok 1: vytvoření databáze osoby id_osoby prezdivka jmeno prijmeni datum_narozeni id_aadresy kontakty id_kontakty id_osoby id_typy_kontaktu kontakt vztahy id_vztahy id_osoby1 id_osoby2 poznamka id_typy_vztahu schuzky typy_vztahu id_schuzky datum misto poznamka id_typy_vztahu nazev osoby_schuzky typy_kontaktu id_osoby id_schuzky id_typy_kontaktu nazev

Krok 2: naplnění databáze příkaz INSERT logika: INSERT kam VALUES co INSERT INTO tabulka (seznam_sloupců) VALUES (seznam_hodnot) INSERT [ IGNORE ] [ INTO ] tabulka [ ( sloupec1, sloupec2, … ) ] VALUES ( { výraz1 | DEFAULT | NULL }, … ) INSERT INTO osoby (jmeno, prijmeni) VALUES (‘Chlastislav’, ‘Peruňka’); Pořadí sloupců musí být stejné jako pořadí hodnot v seznamu hodnot (tedy musí být stejný počet položek v obou seznamech). Pořadí sloupců v INSERT dotazu nemusí vůbec odpovídat pořadí sloupců v definici tabulky. V SQL se (narozdíl od PHP a HTML) musí používat jednoduché uvozovky pro řetězce, dvojité uvozovky se používají pro názvy sloupců (pokud je to z potřeba, např. když název sloupce je klíčové slovo SQL). Klíčové slovo INTO nemá vůbec žádný význam, jeho cílem je jen zlepšovat čitelnost SQL dotazu (INSERT INTO = vlož do).

Krok 2: naplnění databáze Nemusí se vkládat všechny hodnoty INSERT INTO osoby (jmeno, prijmeni, prezdivka, datum_narozeni, id_adresy); VALUES ('Chlastislav', 'Peruňka', 'Chlastík', NULL, DEFAULT); Velmi zkrácený zápis: INSERT osoby VALUES ('Chlastislav', 'Sosna', 'Chlastík'); Vložení data (PgSQL): INSERT INTO osoby (jmeno, prijmeni, prezdivka, datum_narozeni) VALUES ('Chlastislav', 'Sosna', 'Chlastík', TO_TIMESTAMP('5.1.1984', 'DD.MM.YYYY'), ); Vložení data (MySQL): INSERT INTO osoby( jmeno, prijmeni, prezdivka, datum_narozeni) VALUES ('Chlastislav', 'Sosna', 'Chlastík' STR_TO_DATE('5.1.1984', '%d.%m.%Y' ), ); Velmi zkrácený zápis nedoporučuji používat, protože je poněkud nejednoznačný, závisí na pořadí sloupců v definici tabulky a to obecně vzato nemusí být zajištěno. Pokud jsou sloupce uvedeny, tak je SQL dotaz odolný proti změnám struktury DB (buď funguje pořád stejně nebo nefunguje vůbec). Velmi zkrácený zápis používejte v administračním rozhraní databáze, pro psaní okamžitých (ad-hoc) dotazů. V kódu aplikace, sloupce vždy vyjmenujte, tím zajistíte, že aplikace bude fungovat vždy. Při vkládání data je nutné uvádět datum buď ve formátu databáze (což je typicky Y-M-D, ale záleží na konfiguraci serveru!), nebo použít převodní funkci. Převodní funkce mají na různých databázových serverech různé názvy, ale v principu fungují vždy stejně. Jeden parametr funkce je libovolný řetězec a druhý parametr funkce je řetězec ve speciálním tvaru, který databázovému systému říká v jakém formátu je zapsaný první řetězec.

Krok 2: naplnění databáze Pravidla vkládání dat nevkládá se hodnota automaticky generovaného klíče: auto_increment (MySQL), serial (PgSQL) výjimkou je hromadný import dat do více tabulek pokud to definice sloupce (vlastnost NULL) umožňuje, není nutné hodnotu vkládat neuvedení sloupce má stejný efekt jako uvedení DEFAULT (vloží se výchozí hodnota z definice sloupce) uvedení hodnoty NULL nevloží žádnou hodnotu) datum se musí vkládat ve formátu DB serveru nebo se do něj musí převést formátovací funkce se liší pro různé DB servery

Krok 3: aktualizace databáze příkaz UPDATE logika: UPDATE kde SET jak WHERE co UPDATE tabulka SET seznam_modifikací WHERE vyhledávací_podmínka UPDATE tabulka SET sloupec1 = hodnota1 [,sloupec2 = hodnota2 ...] [ WHERE vyhledávací_podmínka ] UPDATE osoby SET vyska = '196' WHERE id_osoby=42; Kde = v jaké tabulce aktualizovat Jak = konkrétní změny, které se mají provést Co = které řádky aktualizovat Vyhledávací podmínka je výraz, který se vyhodnotí pro každý záznam v tabulce jako TRUE nebo FALSE. V jednom UPDATE dotazu se dá provést více modifikaci současně a to i na sloupce, které jsou použité ve vyhledávací podmínce (změna se provede až po vyhledání záznamu). Tj. je možné napsat i UPDATE osoby SET jmeno = ‘Josef’, prijmeni = ‘Novák’ WHERE jmeno = ‘Pepa’ Modifikace sloupce nemusí být jen hodnota, ale může to být v podstatě jakýkoliv výraz (jehož výsledkem je jedna hodnota). Tj. lze psát UPDATE osoby SET vyska = vyska * 100 WHERE vyska < 10 Čísla se mohou a nemusí vkládat do uvozovek, nemá to na nic vliv. Pokud se spouští více SQL dotazů současně, oddělují se středníkem. Pokud se spouští jeden, není nutné středník psát (středník je oddělovač, nikoliv ukončovač).

Krok 3: aktualizace databáze Pokud není uvedená podmínka WHERE, aktualizují se všechny záznamy v tabulce UPDATE osoby SET datum_narozeni=NULL; V podmínce se nejčastěji používá klíč: UPDATE osoby SET prezdivka = 'Chlastík' WHERE id=42 UPDATE osoby SET prezdivka = 'Chlastík' WHERE jmeno='Chlastislav' AND prijmeni='Peruňka' AND prezdivka='Chlastik'; pokud je klíč složený, musí se uvádět všechny složky při vynechání složky klíče se může stát něco nepěkného Podmínka WHERE je sice nepovinná, ale nejčastěji se aktualizace aplikuje s podmínkou WHERE, která obsahuje konkrétní hodnotu klíče, neboli nejčastěji se aktualizuje jeden záznam v tabulce. Hromadné aktualizace jsou sice možné, ale poměrně vzácné. Z toho vyplývá obrovská výhoda umělých (dumb) klíčů – zjednodušují práci s aktualizačními dotazy, protože u složených klíčů se neustále musí uvádět všechny složky klíče (složený klíč identifikuje každou kombinaci složek jako unikátní). Proto se tedy v tabulkách obvykle používají alespoň dva klíče – jeden je jednoduchý a umělý pro vnitřní potřebu aplikace, druhý je obvykle složený (vychází z reality) a je pro potřebu uživatele.

Krok 4: mazání dat z databáze příkaz DELETE logika DELETE FROM kde WHERE co DELETE FROM tabulka WHERE vyhledávací_podmínka DELETE FROM osoby WHERE id_osoby = 42 DELETE maže celé řádky Pro smazání jednotlivé hodnoty je nutné použít UPDATE Pokud není uvedená podmínka WHERE, aktualizují se všechny záznamy v tabulce. Příkaz: DELETE FROM tabulka; je nejrychlejší způsob, jak přijít o veškerá data v tabulce. Dobrý postup pro psaní (týká se i UPDATE) je ten, že si zvyknete psát DELETE WHERE (nebo UPDATE WHERE) a potom se vrátíte k dopisování zbytku SQL dotazu. Pro mazání jednotlivých hodnot se použije UPDATE například takto: UPDATE osoby SET datum_narozeni = NULL; Což vymaže všem osobám datum narození.

Krok 4: získání dat z databáze příkaz SELECT logika: SELECT co FROM odkud WHERE jak co – jaká data chceme, nejčastěji jaké sloupce odkud – zdroj dat, nejčastěji tabulka nebo kombinace tabulek jak – jakým způsobem data získat, tedy jaké podmínky pro požadovaná data platí příkaz SELECT je nejpoužívanější a také nejsložitější příkaz jazyka SQL Důležité je že SELECT umí z databáze získat data v původním DB schématu (před normalizací), spojování tabulek tedy souvisí s návrhem databáze, normalizací a s definicí cizích klíčů (což je obsahem další přednášky). Co = jaká data, neboli jaké sloupce Odkud = zdroj dat – tabulky, pohledy, poddotazy Jak = jakým způsobem vybrat data, podmínky které musí být splněné

SELECT – struktura příkazu SELECT [ ALL | DISTINCT ] výběrový_výraz1, výběrový_výraz2, … [ FROM odkazy_na_tabulky [ WHERE vyhledávací_podmínka ] [ GROUP BY { jméno_sloupce | výraz } [ ASC | DESC ], … ] [ HAVING vyhledávací_podmínka ] [ ORDER BY { jméno_sloupce | výraz } ] Toto je základní struktura příkazu SELECT, po rozvinutí zástupných symbolů a po zahrnutí méně používaných klauzulí by syntaxe příkazu SELECT vydala na několik stran A4.

SELECT – příklad nejjednodušší struktura: SELECT seznam_sloupců FROM tabulka [ WHERE podmínka ] SELECT id_osoby, jmeno, prijmeni FROM osoby WHERE vyska > 190 Co (operace projekce): hodnoty ve sloupcích jmeno a prijmeni Odkud: z tabulky osoby Jak (operace selekce): všechny osoby vyšší než 190 cm Nejjednodušší SELECT je z jedné tabulky, nicméně prakticky to není příliš časté. Konstrukce podmínky WHERE je úplně stejná jako u příkazu UPDATE.

SELECT – struktura příkazu SELECT [ ALL | DISTINCT ] výběrový_výraz1, výběrový_výraz2, … [ FROM odkazy_na_tabulky [ WHERE vyhledávací_podmínka ] [ GROUP BY { jméno_sloupce | výraz } [ ASC | DESC ], … ] [ HAVING vyhledávací_podmínka ] [ ORDER BY { jméno_sloupce | výraz } ]

SELECT – výběrový výraz SELECT [ ALL | DISTINCT ] { * | tabulka.* | [tabulka.]sloupec1 [AS alias1] [,tabulka.]sloupec2 [ AS alias2] [,…] } FROM … * – vybere všechny sloupce, které se objeví v části FROM tabulka.* – vybere všechny sloupce zadané tabulky tabulka.sloupec – vybere sloupec ze zadané tabulky AS – přiřadí dočasně sloupci jiný název (alias) – Název tabulky je vhodné psát vždy když se v části FROM vyskytuje více tabulek. A to i tehdy pokud to není vysloveně nutné (tabulky nemají shodné sloupce). Pokud jsou totiž názvy tabulek uvedeny, tak je SQL dotaz odolný vůči změnám v DB, tedy pokud se přidá do nějaké tabulky sloupec, jehož název je náhodou stejný jako název sloupce v jiné tabulce, pak výsledek SQL dotazu nezmění. Pokud by však názvy tabulek nebyly uvedeny, mohlo by se stát, že najednou začne vracet obsah jiné tabulky (té, ve které byl vytvořen nový sloupec). Jinými slovy, uvedením tabulky zjednodušujete údržbu aplikace, protože při změnách v aplikaci se toho míň pokazí.

SELECT – výběrový výraz Varianty téhož dotazu: SELECT schuzky.id_schuzky, schuzky.datum, schuzky.misto, schuzky.poznamka FROM schuzky; SELECT id_schuzky, datum, misto, poznamka FROM schuzky; SELECT schuzky.* FROM schuzky; SELECT * FROM schuzky; Výběr všech míst na kterých se koná nějaká schůzka: SELECT misto FROM schuzky; SELECT ALL misto FROM schuzky; Bez duplicitních řádků (tabulka × relace) SELECT DISTINCT misto FROM schuzky; – Obecně je opět výhodnější vybírat jen ty sloupce, které jsou v aplikaci potřeba a vyhnout se používání *. V případě SELECTu sice obvykle nemůže dojít k funkčním problémům, ale může dojít k výkonovým problémům. Pokud by se například do tabulky osob přidalo pole s fotkou osoby, tak by každý dotaz, který pracuje s osobami a který používá * místo seznamu sloupců z databáze přenesl (zbytečně) několik MB fotek. Výsledek dotazu, který vybere všechna místa na kterých se koná nějaká schůzka je tabulka, ale není relace. Protože definice relace říká, že relace je množina tak to znamená, že relace nesmí obsahovat stejné prvky. Výsledek dotazu 'SELECT misto FROM schuzky;' by tedy nemělo být možné uložit do databáze (nelze z něj vytvořit relaci s klíčem), je však možné z něj vytvořit pohled. Naproti tomu výsledkem posledního dotazu je relace, protože neobsahuje duplicitní řádky. Klíčové slovo ALL znamená, že do řádku jsou zahrnuty i duplicity, což je výchozí stav, není tedy nutné jej uvádět. Smysl to může mít v rámci dokumentace kódu pro zdůraznění toho, že zpracování aplikace trvá na tom, aby ve výsledku duplicity byly.

http://kantorek.webzdarma.cz/

SELECT – struktura příkazu SELECT [ ALL | DISTINCT ] výběrový_výraz1, výběrový_výraz2, … [ FROM odkazy_na_tabulky [ WHERE vyhledávací_podmínka ] [ GROUP BY { jméno_sloupce | výraz } [ ASC | DESC ], … ] [ HAVING vyhledávací_podmínka ] [ ORDER BY { jméno_sloupce | výraz } ]

SELECT – odkazy na tabulky Výběr dat z jedné tabulky není příliš užitečný. Data je možné získat současně z více tabulek jejich spojením. Spojením tabulek (Θ - join) dochází k rekonstrukci původního schématu DB. Tabulkou může být: relace (skutečná tabulka ve schématu) pohled (virtuální tabulka ve schématu) výsledek dotazu (virtuální tabulka) (rekurze) výsledek spojení tabulek (virtuální tabulka) Pro spojování tabulek je obecně možné použít dva přístupy (nebo jejich kombinaci) jednak je to operátor JOIN a jednak je to vnořený dotaz. Vnořený dotaz (poddotaz) je možné používat protože výsledkem dotazu je tabulka a v části FROM v SELECT dotazu se očekává také tabulka. Definice struktury SELECTu tedy je rekurzivní a rekurzi dobře podporuje.

SELECT – JOIN … FROM tabulka1 [AS alias1] [ LEFT | RIGHT | INNER ] JOIN tabulka2 [AS alias1] ON spojovací_podmínka [ WHERE … Na levé i pravé straně operátoru JOIN je tabulka Pro spojení je nutné zadat spojovací podmínku, která platí pro všechny řádky výsledné tabulky NATURAL JOIN (přirozené spojení) předpokládá spojovací podmínku automaticky – rovnost hodnot ve stejně pojmenovaných sloupcích Kartézský součin (všechny kombinace): SELECT * FROM osoby, adresy; Spojovací podmínka je výraz, který se vyhodnotí jako TRUE nebo FALSE pro každý řádek tabulky. Je však podstatně významnější než vyhledávácí podmínka. Z definice spojení relací (viz předchozí přednáška) vyplývá, že výsledek spojení relací je podmnožina jejich kartézského součinu. Např. pokud si spustíte SQL dotaz: SELECT * FROM osoby, adresy; zjistíte, že skutečně vypíše všechny kombinace všech záznamů z obou tabulek. Tj. ke každé osobě vypíše všechny adresy, které jsou v databázi zadané. Většina z těchto záznamů nedává smysl, protože každá osoba bydlí pouze na jediné adrese. Tato adresa (odkaz na ni) je uložena ve sloupci id_adresy v tabulce osoby. Můžete se podívat na libovolnou osobu a když zjistíte, že má ve sloupci id_adresy uvedenou např. hodnotu 42, tak se můžete podívat do tabulky adresy o jakou adresu se jedná. Pokud se znovu podíváte na výsledek kartézkého součinu, zjistíte, že jsou v něm uvedeny všechny sloupce z tabulky osoby a potom všechny sloupce z tabulky adresy. To znamená, že je ve výsledku dvakrát sloupce id_adresy s různými hodnotami. Záznamy, ve kterých je hodnota v obou sloupcích stejná, jsou ty správné, které dávají smysl. Tj. k osobě s id_adresy = 42 se přiřadí adresa s id_adresy = 42. Spojovací podmínka v tomto případě zní: osoby.id_adresy = adresy.id_adresy. Výsledek je možné si ověřit podle struktury databáze – v tabulce osoby je cizí klíč na sloupci id_adresy, který se odkazuje na tabulku adresy na sloupec id_adresy.

INNER JOIN Pomocí kartézského součinu lze tabulky spojit, ale JOIN je flexibilnější. SELECT * FROM osoby INNER JOIN kontakty ON osoby.id_osoby = kontakty.id_osoby; Vybere z obou tabulek takové kombinace záznamů pro které platí podmínka (1:1 nebo 1:1..N). Vybere všechny osoby, které mají nějaký kontakt, každá osoba je uvedena tolikrát kolik má kontaktů. SELECT * FROM osoby JOIN kontakty USING (id_osoby); Zkrácená verze, použitelná pokud jsou sloupce stejně pojmenované. JOIN je INNER JOIN a je symetrický Lze používat kartézský součin a spojovací podmínku zadávat do WHERE. Je to však bad-practice, v části WHERE se zadávají vyhledávací podmínky (filtry definované uživatelem) a při nevhodném souběhu podmínek se může uživateli zobrazit nesmysl. Kromě toho nelze tímto způsobem zadat nesymetrické spojení (viz následující slajdy). NATURAL JOIN, zmíněný na předchozím, funguje tak, že předpokládá, že spojovací podmínka je rovnost stejně pojmenovaných sloupců. Dotaz na tomto slajdu lze tedy napsat také jako SELECT * FROM osoby NATURAL JOIN kontakty Co vypadá jako krásná zkratka, se změní v peklo, pokud se v tabulce objeví více stejně pojmenovaných sloupců a proto vám doporučují NATURAL JOIN nepoužívat. Klíčové slovo INNER je zbytečné, protože výchozí stav je INNER, znamená to, že to není ani LEFT, ani RIGHT.

LEFT/RIGHT JOIN SELECT * FROM osoby LEFT JOIN kontakty ON osoby.id_osoby = kontakty.id_osoby; Vybere z levé tabulky vše a z pravé všechny záznamy, pro které platí podmínka (1:0..1 nebo 1:0..N) Vybere všechny osoby a pokud má osoba kontakty, tak vypíše i kontakty (1:0..1 nebo 1:0..N) SELECT * FROM osoby RIGHT JOIN kontakty ON osoby.id_osoby = kontakty.id_osoby; Vybere z pravé tabulky vše a z levé záznamy, pro které platí podmínka. Vybere všechny kontakty a ke každému vypíše osoby (v tomto konkrétním případě je stejné jako INNER JOIN). Podstata nesymetrického spojení je v tom, že „zvýhodňuje“ jednu tabulku. LEFT JOIN tabulku vlevo od operátoru JOIN, RIGHT JOIN tabulku vpravo od operátoru JOIN. Z této tabulky se vyberou vždy všechny záznamy. To znamená, že LEFT/RIGHT JOIN vybere vždy minimálně stejně záznamů jako INNER JOIN a k tomu může vybrat nějaké záznamy navíc (pokud existují záznamy, které nesplňují spojovací podmínku). To lze vyjádřit také tak, že výsledek INNER JOIN dotazu je průnik výsledků dotazů LEFT JOIN a RIGHT JOIN. Nesymetrické spojení (LEFT/RIGHT) se využije v případě, že něco někde není povinné (osoba nemusí mít adresu, osoba nemusí mít kontakt, apod.). Pouze v tomto případě má smysl vybírat záznamy, které spojovací podmínku nesplňují (např. vybrat všechny osoby, i ty které nemají kontakt). K poslední odrážce: uvedené dotazy jsou stejné proto, že je v tabulce kontakty definované integritní omezení - cizí klíč na tabulku osoby sloupec id_osoby a sloupec kontakty.id_osoby je povinný (NOT NULL). Což znamená, že id_osoby v tabulce kontakty musí obsahovat hodnotu a tato hodnota musí být existující ID osoby v tabulce osoby. Tedy nemůže existovat kontakt, pro který by podmínka osoby.id_osoby=konktakty.id_osoby nebyla splněna, proto osoby RIGHT JOIN kontakty v tomto případě dává stejný výsledek jako osoby INNER JOIN kontakty. Osoby LEFT JOIN kontakty dává jiný výsledek, protože může existovat osoba pro kterou výše uvedená podmínka splněná není (osoba nemá kontakt).

LEFT/RIGHT JOIN SELECT * FROM vztahy LEFT JOIN typy_vztahu ON vztahy.id_typy_vztahu = typy_vztahu.id_typy_vztahu; Vybere všechny vztahy a ke každému přiřadí typ vztahu. Vypíše i vztahy, které nemají žádný typ (neměly by existovat). SELECT * FROM vztahy RIGHT JOIN typy_vztahu ON vztahy.id_typy_vztahu = typy_vztahu.id_typy_vztahu; Vybere všechny typy vztahů a ke každému přiřadí vztahy, které mají daný typ. Vypíše i typy vztahů, které nejsou použité. LEFT JOIN vybere z levé tabulky (z tabulky která je vlevo od slova JOIN) všechny záznamy a z druhé jen ty záznamy, pro které platí daná podmínka. RIGHT JOIN vybere z pravé tabulky vše a z levé jen ty pro které platí podmínka. První dotaz tedy nemá smysl (vybírá navíc záznamy, které v DB nemohou existovat). Druhý dotaz smysl má, ale sám o sobě není moc praktický (praktický začne být například v kombinaci s agregací) – nepoužité typy vztahů uživatele nejspíš nezajímají.

JOIN – příklady Ekvivalentní dotazy: SELECT * FROM kontakty LEFT JOIN typy_kontaktu ON kontakty.id_typy_kontaktu = typy_kontaktu.id_typy_kontaktu; SELECT * FROM typy_kontaktu RIGHT JOIN kontakty ON kontakty.id_typy_kontaktu = typy_kontaktu.id_typy_kontaktu; SELECT * FROM kontakty INNER JOIN typy_kontaktu ON kontakty.id_typy_kontaktu = typy_kontaktu.id_typy_kontaktu; SELECT * FROM kontakty NATURAL JOIN typy_kontaktu; První dva dotazy jsou stejné, protože platí a LEFT JOIN b je totéž jako b RIGHT JOIN a Druhé dva dotazy jsou stejné protože INNER JOIN je totéž co JOIN (bez LEFT nebo RIGHT) a platí, že NATURAL JOIN je JOIN u kterého se automaticky jako spojovací podmínka předpokládá rovnost hodnot ve stejně pojmenovaných sloupcích z obou tabulek (čili kontakty.id_typy_kontaktu=typy_kontaktu.id_typy_kontaktu).

JOIN – shrnutí … FROM { tabulka1 [AS alias1] | pod_dotaz [ AS alias2] } [ [ LEFT | RIGHT | INNER | NATURAL ] JOIN tabulka2 [ ON tabulka_1.sloupec1 { > | >= | < | <= | = | <> } tabulka_2.sloupec2] ] [ WHERE … Nejčastěji se spojení používá k rekonstrukci původního schématu. Spojovací podmínka je tedy nejčastěji rovnost hodnot dvou sloupců, které zajišťují vazbu mezi relacemi. Spojovací podmínka může být i exotičtější, ale potom je obvykle výhodnější použít WHERE. Spojovat je možné tabulky – tedy relace i pohledy i výsledky jiných dotazů.

http://kantorek.webzdarma.cz/

Otázky? Je možné spojit více jak dvě tabulky dohromady? Co se stane, pokud spustíte DELETE bez WHERE? Dá se spojit relace v databázi s výsledkem SELECT dotazu? K čemu slouží alias a jak se zapisuje? Musí se spojovací podmínka uvádět u spojení každých dvou tabulek? Jakou výhodu má uvádění názvů sloupců v INSERTu? Lze vložit do databáze datum v libovolném formátu? Jaké jsou nejpoužívanější způsoby spojení tabulek? Proč není vhodné spojování kartézským součinem?