Datab ze standardu SQL, d¡l 17. Ka§dì jen trochu chytrì nepoý dn¡k okam§itØ odpov¡ sv‚ hrd‚ ANO. Nav¡c na pýilepçenou dod , pro koho je ten poý dek urŸen. Pokud by byl opravdu chytrì, bude radØji mlŸet, neboœ t¡m podle psycholog… deklaruje sv…j vysokì individualismus, a nikoli vysok‚ IQ. Zvl daj¡ inteligenti chaos? Posad¡te-li do jedn‚ kancel ýe nebo k jednomu projektu dva chytr‚ zast nce chaosu na nØkolik dn…, ani jeden z nich nebude hovoýit o r ji. Podobn  situace vznik  i na SQL serveru. Pokud jsme jedinìm individuem, kter‚ aktualizuje data, a vybiŸujeme sv‚ duçevn¡ schopnosti na maximum, podaý¡ se n m udr§et v datech poý dek a nikdo zvenku nepozn , §e m me nepoý dek ve struktuýe tabulek. Jednou vçak realiz tora datab ze m…§e pýestat poýizov n¡ dat bavit, jeho chaos se dostane do rukou jinìch jedinc…, kteý¡ ho pak u§ nikdy nezvl dnou, a to t¡m sp¡ç, Ÿ¡m jich bude v¡ce. V pýedchoz¡ch d¡lech seri lu jsem se pý¡liç nestaral o zvl d n¡ chaosu, neboœ v SQL DML k tomu nebyla pý¡le§itost a vìklad DDL jsem trochu odlehŸil pro snadnØjç¡ porozumØn¡. Nyn¡ nastal Ÿas tvrd‚ho z sahu proti chaosu v datech. Hlavn¡ smysl takov‚ho poŸ¡n n¡ je v tom, aby s daty mohli pracovat i ti lid‚, kteý¡ chaos prostØ nezvl daj¡. Vedlejç¡ efekty jsou týi. Zabr n¡me pýedem rozvlekl‚mu reklamaŸn¡mu ý¡zen¡ pýi pýed v n¡ syst‚mu. D le zabr n¡me tØm u§ivatel…m syst‚mu, kteý¡ by chtØli na naçem chaosu vydØlat prachy, aby tak uŸinili okam§itØ. V neposledn¡ ýadØ t¡m pýevychov me svou chaotickou analytickou duçi. SQL server se br n¡ A proto je tak prima, jak se to zp¡v  ve zn m‚ p¡sni. V datab zov‚ teorii nalezneme z kladn¡ definici datab zov‚ho syst‚mu jako mno§iny entit (tabulek) a integritn¡ch omezen¡. Integrita po Ÿesku je celistvost neboli schopnost tvoýit jeden bezespornì celek. Pokud m  SQL server souŸasnØ slou§it v¡ce klient…m, mus¡ buÔ vçem dovolit vçechno (a tak umo§nit dokonalì chaos), nebo odm¡tat vçechny rozporupln‚ po§adavky na zmØnu dat (a tak tvrdØ ochromit pr ci vçech bordel ý…). SQL server m  obecn‚ mo§nosti ochrany celistvosti dat a vy je budete muset v souladu se svou analìzou konkr‚tnØ naplnit. Pýitom riskujete, §e v s okol¡ bude kamenovat za to, §e nelze vydat zbo§¡, kter‚ nen¡ na skladØ, §e nelze poslat dopis firmØ, jej¡§ adresa nen¡ zn ma, nebo §e pen¡ze nejdou poslat na £Ÿet, jeho§ majitel nen¡ zn m. Nebojte se jich. Stejn¡ lid‚ v s odsoud¡ i v pý¡padØ, §e se podaý¡ zadat prodej milionu kus… n kladn¡ho automobilu, §e budou muset ps t adresu podruh‚ i kv…li faktuýe nebo §e dolary zmiz¡ týeba do Alp. Nav¡c bych se k nim v druh‚m pý¡padØ pýidal i j . Pokud tedy pl nujete, co vçechno chcete zak zat, nezabouchnØte sami sobØ zadn¡ vr tka. Proto pl nujte v§dy minim ln¡ poŸet integritn¡ch omezen¡, kterì ji§ umo§åuje obranu proti chaosu. Bude--li omezen¡ pý¡liç mnoho, bude v nich mo§n  tak‚ chaos, kterì neunesete. Lepç¡ heslo by mo§n  bylo: Chaos v SQL m…§e vzniknout i bez integritn¡ch omezen¡ - rozumnì analytik dr§¡ nejen u§ivatele, ale i s m sebe na uzdØ. Dom‚nov  integrita Dom‚novou integritu u§ nap…l zn te z CREATE TABLE. U ka§d‚ho sloupce tabulky se m…§eme vyj dýit o dom‚nØ (mno§inØ dovolenìch hodnot), v n¡§ se mus¡ nal‚zat zad van‚ hodnoty. Pokud JMENO nesm¡ bìt NULL, CISLO_BOT nesm¡ bìt menç¡ ne§ 40 a OKRES m…§e bìt pouze DC, UL nebo TP, staŸ¡ napsat uvnitý pý¡kazu CREATE TABLE týi vnitýn¡ deklarace sloupc…: JMENO VARCHAR(30) NOT NULL, CISLO_BOT DECIMAL(2,0) CHECK (CISLO_BOT>=40), OKRES VARCHAR(2) CHECK (SPZ IN("DC","UL","TP")); Jen si uvØdomte, v kolika tabulk ch se m…§e vyskytnout rodn‚ Ÿ¡slo s povinnìm lom¡tkem a nepovinnou posledn¡ cifrou. Proto je lepç¡ nejprve vytvoýit tzv. dom‚nu a v n¡ na jednom m¡stØ hl¡dat pravidla z pisu. Na takovou dom‚nu se pak m…§eme odvol vat jej¡m jm‚nem jako na novì datovì typ, kterì vznikl omezen¡m jin‚ho datov‚ho typu. Jedinì h Ÿek je v tom, §e pýi vytv ýen¡ dom‚ny nev¡me, jak se budou jmenovat sloupce pýi konkr‚tn¡m a rozmanit‚m pou§it¡ v CREATE TABLE. PodobnØ jako nØkteý¡ mu§i ý¡kaj¡ vçem §en m BERUæKO, aby se to nepletlo, budeme uvnitý dom‚ny nazìvat jej¡ sloupec jako VALUE. N sleduje vytvoýen¡ nØkolika jednoduchìch dom‚n: CREATE DOMAIN SLOVO AS VARCHAR(30) NOT NULL; CREATE DOMAIN RODNE AS VARCHAR(11) CHECK (VALUE LIKE "______/___%"); CREATE DOMAIN NAZEV AS SLOVO CHECK (VALUE NOT LIKE " %"); CREATE DOMAIN MERITKO AS DECIMAL(3,0) CHECK (VALUE BETWEEN 30 AND 300); Prvn¡ dom‚na SLOVO je urŸena pro hl¡d n¡ maxim lnØ týicetiznakovìch nepr zdnìch slov. Druh  dom‚na RODNE hl¡d  jeden ctiznakovì text, zda po çesti znac¡ch n sleduje lom¡tko a za n¡m týi nebo Ÿtyýi znaky. Z toho automaticky plyne, §e hodnota VALUE nem…§e bìt NULL, neboœ vìsledek oper toru LIKE by nebyl YES. Týet¡ dom‚na NAZEV vych z¡ z dom‚ny SLOVO a upýesåuje, §e VALUE nesm¡ zaŸ¡nat mezerou. Podobnì trik se v m bude velmi Ÿasto hodit. Posledn¡ dom‚na MERITKO bude prospØçn  pýi ukl d n¡ hodnot vìçky lid¡ v centimetrech. M me-li dom‚ny pýipraveny, staŸ¡ je struŸnØ a pýehlednØ pou§¡t pýi zajiçœov n¡ dom‚nov‚ integrity a z roveå ke struŸnØjç¡mu vytv ýen¡ tabulky. N sleduj¡c¡ tabulka CLOVEK sice jeçtØ nem  kl¡Ÿ, ale jeçtØ chv¡li vydr§te do vìkladu entitn¡ integrity: CREATE TABLE CLOVEK (JMENO NAZEV, PRIJMENI NAZEV, RC RODNE, VYSKA MERITKO); Pokud nØjakou dom‚nu nepotýebujeme, m…§eme ji zlikvidovat pý¡kazem DROP DOMAIN MERITKO; Tak‚ v m vad¡, §e nØkteý¡ lid‚ maj¡ stejn‚ kýestn¡ jm‚no jako pý¡jmen¡? V kr lovstv¡ EXTRA s t¡m zatoŸili hned od zaŸ tku, a pak si marnØ l mali hlavu, jak pomoc¡ dom‚ny, kter  zn  jen tu svou VALUE, porovnat hodnoty ve dvou r…znìch sloupc¡ch. Pomoc¡ dom‚n to nejde. Druhì zp…sob realizace dom‚nov‚ integrity v SQL DDL spoŸ¡v  v uveden¡ podm¡nky CHECK uvnitý CREATE TABLE, ale a§ za definic¡ vçech sloupc… tabulky. ObecnØ toti§ plat¡, §e integritn¡ omezen¡, kter  nebyla naps na pý¡mo pýi definici sloupc…, lze ps t a§ na konec pý¡kazu CREATE TABLE. Tìk  se to nejen CHECK, ale i PRIMARY KEY, UNIQUE a FOREIGN KEY. Probl‚m z EXTRA kr lovstv¡ lze ýeçit n sledovnØ: CREATE TABLE EXTRA (JMENO NAZEV, PRIJMENI NAZEV, CHECK (JMENO<>PRIJMENI)); Entitn¡ integrita Entitn¡ integritu tak‚ zn me z poŸ teŸn¡ch d¡l… seri lu. Chceme-li zajistit jednoznaŸnì pý¡stup k ý dku v r mci jedn‚ entity (tabulky), mus¡ existovat jednoduchì nebo slo§enì kl¡Ÿ jako jeden sloupec tabulky nebo skupina sloupc…, kter‚ nabìvaj¡ unik tn¡ch hodnot. Pýi definici sloupce RC, kterì m  bìt unik tn¡, v tabulce CLOVEK staŸ¡ kombinovat dom‚novou a entitn¡ integritu uvnitý pý¡kazu CREATE TABLE: RC RODNE UNIQUE; Pokud si vzpomeneme na unik tnost dodateŸnØ, um¡me vytvoýit unik tn¡ indexovì soubor pý¡kazem CREATE UNIQUE INDEX RCCLO ON CLOVEK(RC); Unik tn¡ kl¡Ÿ m  pro entitu (tabulku) dvoj¡ vìznam. Prvotn¡ vìznam pro tabulku v 5NF je v pý¡m‚m pý¡stupu k dat…m. Pak t‚§ hovoý¡me o prim rn¡m kl¡Ÿi, anglicky PRIMARY KEY. Ka§d  tabulka v 5NF mus¡ m¡t pr vØ jeden prim rn¡ kl¡Ÿ. Druhì vìznam unik tn¡ch kl¡Ÿ… je v kontroln¡ funkci dalç¡ch souvislost¡ mezi hodnotami v r…znìch ý dc¡ch jedn‚ tabulky. Pak pou§¡v me tradiŸn¡ n zev UNIQUE. Takovìch unik tn¡ch kl¡Ÿ… m…§e m¡t tabulka nØkolik, tedy i § dnì. Pokud by v kr lovstv¡ EXTRA pou§¡vali kombinaci jm‚na a pý¡jmen¡ k jednoznaŸn‚ identifikaci osob, staŸ¡ v CREATE TABLE pýidat PRIMARY KEY: CREATE TABLE EXTRA (JMENO NAZEV, PRIJMENI NAZEV, CHECK (JMENO<>PRIJMENI), PRIMARY KEY (JMENO, PRIJMENI)); V ý¡çi SUPER musel m¡t jeçtØ ka§dì obŸan tajnou pýezd¡vku, nesouvisej¡c¡ ani se jm‚nem, ani s pý¡jmen¡m, a nav¡c kombinace kýestn¡ho jm‚na a pýezd¡vky musela v‚st k jednoznaŸn‚mu osloven¡ agenta. Zde proto vyu§ijeme jak dom‚nu NAZEV, tak týi pý¡davn‚ dom‚nov‚ integrity, jeden prim rn¡ kl¡Ÿ a jedno unik tn¡ omezen¡. Jde o sklouben¡ dom‚nov‚ a entitn¡ integrity: CREATE TABLE SUPER (JMENO NAZEV, PRIJMENI NAZEV, PREZDIVKA NAZEV, CHECK (JMENO<>PRIJMENI), CHECK (JMENO<>PREZDIVKA), CHECK (PREZDIVKA<>PRIJMENI), PRIMARY KEY (JMENO, PRIJMENI), UNIQUE (JMENO, PREZDIVKA)); ReferenŸn¡ integrita Tabulka SUPER je evidentnØ Ÿ¡seln¡kem, kterì se na nic neodkazuje. Jinak tomu bude s tabulkou MZDA, ve kter‚ pl nujeme sloupec RC z dom‚ny RODNE, jeho§ hodnoty mus¡ bìt ve vztahu k hodnot m sloupce RC z dom‚ny RODNE v tabulce JEDINEC, kter  m  RC jako PRIMARY KEY. Nejde o nic jin‚ho ne§ o realizaci relace A : 1 MZDA PRO CLOVEKa. Tabulka JEDINEC je dokonalou datab z¡ zamØstnanc… v 5NF s potýebnìmi osobn¡mi £daji. Tabulka MZDA, obsahuj¡c¡ pouze rodn‚ Ÿ¡slo, mØs¡c, rok a mzdov‚ £daje, se pomoc¡ rodn‚ho Ÿ¡sla spojuje s ciz¡ tabulkou JEDINEC, na kterou se odkazuje. Pr vØ pýedstavØ o omezen¡ch pýi spojen¡ tabulek se ý¡k  referenŸn¡ integrita. Omezen¡ tohoto typu pom h  zajistit nekonfliktnost obsahu dvojice tabulek v r mci ka§d‚ jednotliv‚ relace. Nejl‚pe bude formulovat nejpý¡snØjç¡ mo§nou pýedstavu o nespornosti obsahu tabulek MZDA a JEDINEC. Pýedevç¡m je zcela zbyteŸn‚ hl¡dat referenŸn¡ integritou ruçen¡ jednotlivìch mezd, neboœ t¡m, §e nØkdo nØkdy nedostane mzdu, nevznikne rozpor v datab zi. Pýid v n¡ nov‚ho zamØstnance do tabulky JEDINEC staŸ¡ hl¡dat pomoc¡ dom‚nov‚ a entitn¡ integrity a referenŸn¡ integrita nehraje roli. Pýid v n¡ nov‚ polo§ky do tabulky MZDA je hl¡d no referenŸn¡ integritou. Existuje-li stejn‚ rodn‚ Ÿ¡slo v tabulce JEDINEC, probØhne pýid n¡ ý dku bez probl‚m…. Pokud stejn‚ rodn‚ Ÿ¡slo v tabulce JEDINEC neexistuje, referenŸn¡ integrita je povinna zajistit, aby nedoçlo ke sporu v datech. Z toho plyne, §e nepýid  pomìlenou polo§ku do tabulky MZDA. To je u§iteŸn‚ pro zamezen¡ vìplaty mrtvìm duç¡m. OpaŸn  situace nast v  pýi ruçen¡ zamØstnanc… v tabulce JEDINEC. ReferenŸn¡ integrita opØt pom h  hl¡dat n sledky naçeho poŸ¡n n¡. Ruç¡me-li zamØstnance, kterì jeçtØ nikdy nedostal vìplatu, je situace jasn  a zruçen¡ v tabulce JEDINEC probØhne. Na ruçen¡ zamØstnance, kterì ji§ vìplatu alespoå jednou dostal, m…§eme nahl¡§et r…znØ extr‚mnØ. Nejtvrdç¡ je takovì postup zak zat. JedinØ tak lze zamezit anonymitØ pý¡jm… bìvalìch zamØstnanc…. O dalç¡ch m¡rnØjç¡ch mo§nostech bude pojedn no d le. Na opravu rodn‚ho Ÿ¡sla v tabulce JEDINEC nebo v tabulce MZDA mus¡me pohl¡§et jako na kombinaci ruçen¡ a vytv ýen¡. ZmØna rodn‚ho Ÿ¡sla v tabulce JEDINEC je mo§n , pokud dotyŸnì jeçtØ nikdy nic nebral. ZmØna rodn‚ho Ÿ¡sla v tabulce MZDA je mo§n , pokud nov‚ rodn‚ Ÿ¡slo existuje v tabulce JEDINEC. Realizace takto pý¡sn‚ referenŸn¡ integrity se provede pýi vytvoýen¡ tabulky MZDA, kde na konec pýid me FOREIGN KEY(RC) REFERENCES JEDINEC(RC); T¡m je definov n vztah mezi sloupcem RC z naç¡ tabulky MZDA a sloupcem RC z ciz¡ tabulky JEDINEC; jde o nejtvrdç¡ formu referenŸn¡ integrity. Je-li v ciz¡ tabulce UCET tvoýen prim rn¡ kl¡Ÿ sloupci CU a CODE, pýedstavuj¡c¡mi Ÿ¡slo £Ÿtu a k¢d banky, pak se z tabulky STAV, obsahuj¡c¡ CUCTU, BANKA, DATUM, PRIJEM a VYDEJ, mus¡me odkazovat deklarac¡ v posledn¡m ý dku CREATE TABLE: FOREIGN KEY(CUCTU,BANKA) REFERENCES UCET(CU,CODE); Extr‚mn¡ tvrdost nen¡ v§dy na m¡stØ. Co kdy§ nØkomu spletou rodn‚ Ÿ¡slo v tabulce JEDINEC a zjist¡ se to a§ po mnoha mØs¡c¡ch vypl cen¡ mzdy? Pak po§adavek z kazu zmØny RC v tabulce JEDINEC asi prakticky neobstoj¡. L‚pe je si pý t, aby se to vçude pýeŸ¡slovalo samo. N sleduj¡c¡ deklarace v tabulce MZDA ji Ÿin¡ m¡rnØ nesv‚pr vnou, neboœ zmØna RC v ciz¡ tabulce JEDINEC v n¡ nedobrovolnØ vynut¡ zmØny RC. K tomu slou§¡ klauzule ON UPDATE CASCADE: FOREIGN KEY(RC) REFERENCES JEDINEC(RC) ON UPDATE CASCADE; Pokud budeme jeçtØ benevolentnØjç¡, je na m¡stØ pýemìçlet, jak umo§nit ruçen¡ polo§ek v tabulce JEDINEC. Tak týeba firma v tabulce ZAKAZKA vede i RC zamØstnance, kterì za ni odpov¡d , a m…§e se st t, §e pracovn¡k d  vìpovØÔ. Pak zruçen¡ pracovn¡ka m…§e bìt dovoleno s t¡m, §e na zak zce bude uvedena m¡sto rodn‚ho Ÿ¡sla hodnota NULL. T¡m zahlad¡me stopy po zamØstnanci, ale jeho zak zky se neztrat¡. To se vyplat¡ i kv…li mo§nosti v‚st evidenci zak zek, kter‚ vis¡ ve vzduchu. Do tabulky ZAKAZKA mus¡me tedy napsat odkaz na tabulku JEDINEC, a to s dvØma klauzulemi ON UPDATE CASCADE a ON DELETE NULL: FOREIGN KEY(RC) REFERENCES JEDINEC(RC) ON UPDATE CASCADE ON DELETE NULL; Nestoj¡me-li o zak zky, kter‚ zamØstnanec mØl na krku, provedeme i ruçen¡ kask dnØ: FOREIGN KEY(RC) REFERENCES JEDINEC(RC) ON UPDATE CASCADE ON DELETE CASCADE; Oznamka - malì projekt Seri l o SQL se bl¡§¡ ke sv‚mu rozuzlen¡. Proto by neçkodilo zabìvat se a§ do konce seri lu jednou n zornou £lohou od stadia analìzy pýes dom‚ny, tabulky, integrity a view a§ po ulo§en‚ procedury, kter‚ budou pýedmØtem jeho posledn¡ Ÿ sti. Seznamku neboli seznamovac¡ kancel ý analyzovat nebudeme. Mnohem v¡ce se toho d  nauŸit analìzou "oznamky", tj. instituce, kam se chod¡ splåovat Ÿestn  oznamovac¡ povinnost za £platu. C¡lem m‚ analìzy je pýesvØdŸit v s, §e j dro oznamky tvoý¡ týi tabulky: CLOVEK, CIN a UDANI. Pokud v m chyb¡ tabulka UDAVAC, pak asi nev¡te, §e udavaŸ je tak‚ jenom (bohu§el) ŸlovØk a lid‚ se mohou ud vat vz jemnØ u jedn‚ a t‚§e instituce. Bylo by analytickou chybou to nedovolit. Ka§dì typ Ÿinu m  sv…j n zev a cenu pro pý¡pad bاn‚ho ud n¡. Ud -li konkr‚tn¡ osoba jinou konkr‚tn¡ osobu, §e v urŸitì den sp chala sledov n¡ hodnì Ÿin, m…§e dostat i vyçç¡ odmØnu, jde--li o prominentn¡ho udavaŸe nebo prominentn¡ obØœ ud n¡. Z toho potom plyne, §e u ka§d‚ho ŸlovØka mus¡ bìt zn m jeho koeficient udavaŸe a koeficient obØti jako Ÿ¡sla vØtç¡ nebo rovn  jedn‚. JedniŸky by se mØly samy doplåovat v pý¡padØ nezn mìch koeficient…. OdmØna za jedno konkr‚tn¡ ud n¡ je rovna souŸinu koeficientu udavaŸe, koeficientu obØti a z kladn¡ ceny Ÿinu. Celkov  mØs¡Ÿn¡ odmØna se tìk  pouze udavaŸ… a je rovna souŸtu cen za mØs¡c. U ka§d‚ obØti se naopak sleduje intenzita sledov n¡ ve finanŸn¡ch jednotk ch. Vìkonnost agent…, mohutnost Ÿin… Ÿi sledovanost obØt¡ lze sledovat nejen po str nce ekonomick‚, ale i statistick‚. Existuj¡ vçak nØkter  z sadn¡ omezen¡ oznamovac¡ho re§imu. Nikdo nesm¡ ud vat s m sebe a nav¡c nesm¡ v jednom dni udat jinou konkr‚tn¡ osobu v souvislosti s jedn¡m typem Ÿinu v¡c ne§ jedenkr t. Anonymn¡ ud n¡, ud n¡ nezn m‚ osoby a ud n¡ nespecifikovan‚ho Ÿinu jsou zak z ny. Analìza konŸ¡ dalç¡mi datab zovìmi omezen¡mi spojenìmi s konkr‚tn¡m n vrhem tabulek. Tabulka CIN m  sloupce CIC, NAZEVC a CENAC. Prim rn¡m kl¡Ÿem je CIC jako Ÿ¡slo Ÿinu. N zev Ÿinu NAZEVC mus¡ bìt unik tn¡ a z kladn¡ cena Ÿinu CENAC nesm¡ bìt z porn . Tabulka CLOVEK m  jako prim rn¡ kl¡Ÿ rodn‚ Ÿ¡slo osoby RC. N sleduj¡ sloupce JMENO, PRIJMENI, KOEUD a KOEOB, kde posledn¡ dva pýedstavuj¡ koeficient udavaŸe a koeficient obØti. Posledn¡ tabulka UDANI se odvol v  na £daje z pýedchoz¡ch dvou tabulek. Obsahuje denn¡ z znamy ve sloupc¡ch DEN, RCUD, RCOB a CICINU. Prim rn¡ kl¡Ÿ je urŸen celou Ÿtveýic¡ sloupc…. Nen¡ divu, kdy§ tabulka UDANI je spojovac¡ entitou v 5NF a z roveå m  umo§åovat opakovan‚ ud n¡ jinì den. Sloupce RCUD a RCOB nesou informaci o rodn‚m Ÿ¡sle udavaŸe a obØti, a proto mus¡ bìt ciz¡mi kl¡Ÿi pro dvojit‚ spojen¡ s tabulkou CLOVEK. Sloupec CICINU obsahuje Ÿ¡slo ozn men‚ho Ÿinu a je ciz¡m kl¡Ÿem pro spojen¡ s tabulkou CIN. Sloupec DEN obsahuje pouze datum ud n¡. Mezi tabulkami tedy existuj¡ týi relace A : 1, a to UDANI POSKYTL CLOVEK, UDANI O CLOVEKu a UDANI O CINu. Analìza nepýedpokl d  evidenci m¡st, kde byly Ÿiny sp ch ny nebo hl çeny. CREATE DOMAIN KOEFICIENT AS DECIMAL(6,3) DEFAULT 1 CHECK (VALUE >=1); CREATE DOMAIN PRACHY AS DECIMAL(10,2) DEFAULT 0 CHECK (VALUE>=0); CREATE DOMAIN CISLO AS INTEGER CHECK (VALUE >0); Dalç¡ dvØ dom‚ny RODNE a NAZEV m me ji§ hotov‚ z pýedchoz¡ho textu. Nyn¡ s vyu§it¡m dom‚nov‚ a entitn¡ integrity vytvoý¡me oba Ÿ¡seln¡ky CIN a CLOVEK: CREATE TABLE CIN (CIC CISLO, NAZEVC NAZEV, CENAC PRACHY, PRIMARY KEY (CIC), UNIQUE (NAZEVC)); CREATE TABLE CLOVEK (RC RODNE, JMENO NAZEV, PRIJMENI NAZEV, KOEUD KOEFICIENT, KOEOB KOEFICIENT, PRIMARY KEY (RC)); Pýi vytvoýen¡ tabulky UDANI vyjdeme z existence tabulek CIN A CLOVEK a pou§ijeme vçechny typy integrit: CREATE TABLE UDANI (DEN DATETIME, RCUD RODNE, RCOB RODNE, CICINU CISLO, PRIMARY KEY (DEN, RCUD, RCOB, CICINU), CHECK (RCUD<>RCOB), FOREIGN KEY (RCUD) REFERENCES CLOVEK(RC), FOREIGN KEY (RCOB) REFERENCES CLOVEK(RC), FOREIGN KEY (CICINU) REFERENCES CIN(CIC)); PokraŸujeme pý¡çtØ. Jarom¡r Kukal CREATE VIEW OBET(RC, JMENO, PRIJMENI, KOEFICIENT, POCET, CELKEM, UPRAVENO) AS SELECT RCO, JMENOO, PRIJMENIO, KOEO, COUNT(*), SUM(PRACHY),SUM(FINAL) FROM UDANICKO GROUP BY RCO; CREATE VIEW PRECIN(CISLO, NAZEV, CENA, POCET, CELKEM,UPRAVENO) AS SELECT CIC, NAZEVC, PRACHY, COUNT(*), SUM(PRACHY),SUM(FINAL) FROM UDANICKO GROUP BY CIC; Pod vlivem minulìch d¡l… seri lu snadno vytvoý¡me pohledy na rodn  Ÿ¡sla udavaŸ… a obØt¡: CREATE VIEW RCUDAV(RC) AS SELECT RCU FROM UDANI GROUP BY RCU; CREATE VIEW RCOBET(RC) AS SELECT RCO FROM UDANI GROUP BY RCO; Posledn¡ view je pro v s malìm r‚busem: CREATE VIEW MEDAILE(RC, JMENO, PRIJMENI) AS SELECT RC, JMENO, PRIJMENI FROM OBET WHERE RC NOT IN RCUDAV; Pro zavrçen¡ trpk‚ho humoru se vraœme do DML a zadejme nØkolik pý¡kaz… SELECT, kter‚ provØý¡ d…kladnost pýedchoz¡ pý¡pravy: SELECT TOP 10 PERCENT * FROM UDAVAC ORDER BY POCET DESC; SELECT * FROM UDANICKO WHERE RCU IN RCOBET OR RCO IN RCUDAV; SELECT COUNT(*) POCET_KUSU FROM MEDAILE;