Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Databáze – jazyk SQL, spojování tabulek. 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.

Podobné prezentace


Prezentace na téma: "Databáze – jazyk SQL, spojování tabulek. 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."— Transkript prezentace:

1 Databáze – jazyk SQL, spojování tabulek

2 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.

3

4 id_typy_kontaktunazev id_typy_vztahunazev id_osobyprezdivkajmenoprijmenidatum_narozeniid_aadresy id_vztahyid_osoby1id_osoby2poznamkaid_typy_vztahu id_kontaktyid_osobyid_typy_kontaktukontakt id_schuzkydatummistopoznamka osoby typy_kontaktu kontakty typy_vztahu vztahy schuzky id_osobyid_schuzky osoby_schuzky

5 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’);

6 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(' ', 'DD.MM.YYYY'), ); Vložení data (MySQL): INSERT INTO osoby( jmeno, prijmeni, prezdivka, datum_narozeni) VALUES ('Chlastislav', 'Sosna', 'Chlastík' STR_TO_DATE(' ', '%d.%m.%Y' ), );

7 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

8 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;

9 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

10 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.

11 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

12 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 } [ ASC | DESC ], … ] ]

13 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

14 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 } [ ASC | DESC ], … ] ]

15 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) –

16 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; –

17

18 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 } [ ASC | DESC ], … ] ]

19 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)

20 … 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;

21 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ý

22 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).

23 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é.

24 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; Ekvivalentní dotazy: SELECT * FROM kontakty INNER JOIN typy_kontaktu ON kontakty.id_typy_kontaktu = typy_kontaktu.id_typy_kontaktu; SELECT * FROM kontakty NATURAL JOIN typy_kontaktu;

25 … 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ů.

26

27 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?


Stáhnout ppt "Databáze – jazyk SQL, spojování tabulek. 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."

Podobné prezentace


Reklamy Google