SQL – od tabulek k pohledům

Dosud jsme v našem seriálu vždy pracovali pouze s tabulkou. Dnes si ukážeme a vysvětlíme si v mnohém podobný objekt – pohled.
Dosud jsme v našem seriálu vždy pracovali pouze s tabulkou. Dnes si ukážeme a vysvětlíme si v mnohém podobný objekt – pohled. Možná ani nevíte, že ve velkém počtu případů v praxi pracujete právě s pohledem a nikoli s tabulkou. Tedy, abych byl přesnější – navenek.

Co že byla tabulka?
Pod tabulkou jsme dosud chápali relaci, pro kterou platí, že jak její definice (tedy atributy s typy a integritními omezeními), tak data jsou fyzicky uložena v databázi. Řekli jsme si, že tabulku můžeme založit jedním z DDL příkazů – CREATE TABLE. V prvním díle našeho seriálu jsme začali používat tabulku osoby, která měla následující podobu:

Jméno Příjmení rodné_číslo datum
Karel Smolný 580815/8777 3.12.1992
Marek Jurda 650404/8956 2.11.1992
Martin Pavlásek 720303/5511 28.3.1990
Pavel Jirásek 551212/7877 26.3.1989
Pavla Nováková 785308/4569 28.6.1997
Pavla Nováková 555111/3042 28.5.1990
Romana Bourková 745226/8820 3.5.1995

Nyní si představme situaci, že k uvedené tabulce přistupují dva uživatelé – ředitel a jeho zástupce. Ředitele vždy zajímají pouze osoby, které nastoupily do zaměstnání (určeno atributem datum) před 1.1.1993, jeho zástupce ti s nástupním datem pozdějším. Jedná se o jediný rozdíl v programu, který používají. Zatím bychom měli dokázat napsat dva rozdílné příkazy SELECT, řešící právě tento požadavek.

SELECT * 
FROM osoby
WHERE datum<’1.1.1993’

a

SELECT *
FROM osoby
WHERE datum>’31.12.1992’

Na první pohled nic složitého – ale pokud bychom měli daný příkaz upravovat na dvaceti místech a nebyl zdaleka tak triviální, může se programování stát noční můrou. A právě řešení takového problému je úkolem (nikoli však jediným) pohledu, kterému v angličtině říkáme view.

View? Co je to?
Pohled je velmi podobný tabulce. Také obsahuje atributy (sloupce), řádky (záznamy) či se může používat v SQL příkazech (existují však určitá omezení, jak si ukážeme později). Jeden rozdíl je však podstatný – v databázi je uložena pouze definice pohledu, nikoli data. Ta jsou čerpána přímo z tabulky (či tabulek), nad kterou je pohled definován. Pohled je tedy jakousi virtuální tabulkou, která pracuje s daty uloženými v tabulce jiné. Pohled zdánlivě „materializuje“ příkaz SELECT do tabulky.

Pohled vytvoříme obdobně jako tabulku – pomocí příkazu CREATE VIEW, který má (ve zjednodušené podobě) následující syntaxi:

  CREATE VIEW [(atributy)]
<jméno_pohledu>
AS <dotaz>

kde na místě dotazu může být příkaz SELECT ve všech nám známých variantách (normy SQL nekladou žádná omezení na použití konstruktu SELECT při vytváření pohledu – bohužel totéž nelze říci o jednotlivých SŘBD). Pokud specifikujeme atributy, musí být jejich počet shodný s počtem atributů (včetně vypočítávaných, například pomocí agregačních funkcí) ve vlastním příkazu SELECT. Ve druhém díle jsme si uvedli, že tento příkaz může obsahovat tzv. aliasy (zde ve smyslu přejmenování atributů). Tuto metodu je nutno použít při vytváření pohledu (opomeneme-li vyjmenovat atributy) právě v případě vypočítávaných hodnot či v případě nejednoznačnosti (pohled může být vytvořen pomocí příkazu SELECT spojujícího více tabulek).

Ale zpět k našemu příkladu – variantu pro pana ředitele můžeme vytvořit takto:

CREATE VIEW osoby_red
AS SELECT *
FROM osoby
WHERE datum<’1.1.1993’

Příkaz

SELECT *
FROM osoby_red

nám vybere pouze záznamy vyhovující podmínce uplatněné při vytváření pohledu:

jméno  příjmení  rodné_číslo  datum 
---------------------------------------
Karel Smolný 580815/8777 3.12.1992
Marek Jurda 650404/8956 2.11.1992
Martin Pavlásek 720303/5511 28.3.1990
Pavel Jirásek 551212/7877 26.3.1989
Pavla Nováková 555111/3042 28.5.1990

Při tvorbě programu nám pak stačí změnit pouze jméno použitého pohledu (v některém z následujících dílů si ukážeme, že by nemuselo být nutné ani to – stačilo by vhodným způsobem použít tzv. synonyma).

Zopakujme si, že pohled je pouze virtuální tabulkou, která žádná fyzická data neobsahuje. O aktualizaci se nemusíme starat – každá změna v původní tabulce se automaticky projeví i v pohledu. Musíme si ale dát pozor především na komplikované pohledy pro rozsáhlé tabulky – záleží sice na konkrétním systému, ale lze říci, že při každém dotazu nad pohledem se tento znovu vyhodnocuje, není-li v dočasné paměti od posledního použití a současně nedošlo v původní tabulce ke změně.

Pohled zrušíme pomocí příkazu DROP VIEW <jméno_pohledu>. V našem případě tedy

DROP VIEW osoby_red

Odstranění původní tabulky by mělo automaticky vyvolat i zrušení pohledů, můžeme se však v praxi setkat s určitými odlišnostmi.

Pár pravidel
V některých systémech můžeme vytvořit pohled i nad tabulkou, která v okamžiku vytváření neexistuje. Uplatnění můžeme nalézt zejména v případech, kdy jsou pohledy vytvářeny nad dočasnými tabulkami. K problémům také dochází v případě, kdy chceme data v pohledu měnit či vkládat data nová. Obecně můžeme říci, že pohledy jsou určeny pouze pro výběr dat. Naštěstí v mnoha případech nemusí být toto omezení nutné. Stoprocentně platí pouze tehdy, je-li pohled vytvořen za pomoci agregačních funkcí (změna dat by neměla smysl) či za pomoci spojení z více tabulek. Pokud je pohled definován pouze s omezením na záznamy (viz. pohled osoby_red), jediným problémem může být zaktualizování pohledu (při změně hodnot omezujících atributů či vkládání nových záznamů nevyhovujících podmínce z definice pohledu). Máme-li dotaz definující pohled omezen na jednotlivé atributy (hovoříme o projekci), změna hodnot je povolena pouze tehdy, zůstanou-li platná omezení (null hodnoty, referenční integrita, primární klíče) v původní tabulce.

Závěrem
Pohledy jsou v praxi používány velmi často, proto je pro odborníky nezbytné, aby se je naučili správně používat. Nezapomeneme-li na výše uvedená omezení, mohou nám ušetřit mnoho problémů. Odpověď na zatím nepoloženou otázku, jak poznat, zda se jedná o tabulku či pohled, není vůbec jednoduchá – záleží na konkrétním systému. A co bude příště? Podíváme se na integritní omezení, mezi které patří již zmíněné klíče (primární, cizí atd.).
Váš názor Další článek: Od Sybase celé Studio

Témata článku: Software, Programování, Složité pravidlo, Tab, Pohled, Jediný rozdíl, From, Pre, View, Primární data, SQL, Drop, Podobná hodnota, Původní data, Select, Zjednodušený příklad


Určitě si přečtěte

Bankovní identita bude jednotná. K České spořitelně, ČSOB a KB se připojí menší banky
Lukáš Václavík
Portál občanaBankaeGovernment
Archivovat data do cloudu, na HDD, SSD, DVD, nebo Blu-ray? Co je nejvýhodnější?

Archivovat data do cloudu, na HDD, SSD, DVD, nebo Blu-ray? Co je nejvýhodnější?

** Kam doma natrvalo uložit data? Vyplatí se ještě optická média? ** Jaké kapacity disků a médií má smysl koupit? ** Cenovou výhodnost si ukážeme na příkladech s 2TB úložištěm

Lukáš Václavík | 125

Lukáš Václavík
ZálohováníÚložištěPevné disky
Elon Musk už není nejbohatší na světě. Během jediného dne přišel o 324 miliard korun
Karel Kilián
Jeff BezosTesla MotorsElon Musk
Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

** Testujeme Apple Macbook Air s procesorem M1 ** Zajímá nás nejen výkon, ale zejména kompatibilita aplikací ** Článek je průběžně doplňován na základě vašich dotazů

Jiří Kuruc | 209

Jiří Kuruc
Apple
Vážně dnes ještě někdo krade Adobe? Video můžete stříhat zdarma v Resolve a fotky i vektory zvládne Affinity

Vážně dnes ještě někdo krade Adobe? Video můžete stříhat zdarma v Resolve a fotky i vektory zvládne Affinity

** Kde jsou ty doby, kdy měl skoro každý doma Photoshop ** Photoshop a Premiere Pro od kamaráda nebo z warezu ** Dnes už to nemá smysl, existuje totiž hromada laciných alternativ

Jakub Čížek | 92

Jakub Čížek
Grafický editorStřih videa