Databáze I Přednáška 4
Definice dat v SQL Definice tabulek CREATE TABLE jméno_tab (jm_atributu typ [integr. omez.], jm_atributu typ [integr. omez.], ); integritní omezení lze dodefinovat později
Definice dat v SQL Definice tabulek CREATE TABLE CTENAR (RC VARCHAR(11) PRIMARY KEY, JMENO VARCHAR(20), PRIJMENI VARCHAR(30) NOT NULL );
CREATE TABLE SI_VYPUJCIL (PRIR_C INTEGER UNIQUE, RC VARCHAR(11) NOT NULL, DATUM_VYP DATE );
Datové typy SQL má předefinované datové typy, mohou se lišit v detailech podle používaného SŘBD datové typy: numerické celočíselné přesné pohyblivá řádová čárka aproximativní znakové řetězce bitové řetězce časy (temporální) časové intervaly
Celočíselné typy INTEGER zpravidla 4 Byty SMALLINT zpravidla 2 Byty, DECIMAL(p,q) celé číslo s p ciframi, desetinnou čárkou a q desetinnými místy NUMERIC(p,q) obdoba DECIMAL, implementace se liší v SŘBD BIGINT pouze v některých implementacích
Aproximativní typy REAL reálné číslo s pevně danou přesností implementací FLOAT(p) reálné číslo s přesností parametrizovanou počtem bitů DOUBLE PRECISION reálné číslo s pevně danou přesností implementací, větší než REAL
Řetězce CHARACTER(n) řetězec znaků pevné délky n doplněné zprava mezerami CHARACTER VARYING(n) řetězec znaků proměnné délky max. délky n znaků
Bitové řetězce definovány ve standardu SQL:1999, ale ve standardu SQL:2003 již nejsou BIT(n) řetězec bitů pevné délky n BIT VARYING(n) řetězec bitů proměnné délky max. délky n
Zkratky typů některé identifikátory typů lze zkracovat CHAR(n) VARCHAR(n) INT
Časové datové typy DATE TIME TIMESTAMP, resp. DATETIME v některých SŘBD ukládá datum a čas společně TIME WITH TIME ZONE TIMESTAMP WITH TIME ZONE
Intervaly INTERVAL kvalifikátor: INTERVAL YEARS TO MONTH interval v rocích a měsících, roky jsou standardně 2 ciferné např. hodnota 123 let a 2 měsíce (musíme specifikovat počet cifer roků): příklad literálu: INTERVAL '123-2' YEAR(3) TO MONTH INTERVAL DAY TO SECOND
logické hodnoty: TRUE FALSE UNKNOWN BOOLEAN
Změna tabulek ALTER TABLE přidání sloupce ADD COLUMN zrušení sloupce DROP COLUMN změna definice sloupce ALTER přidání integritního omezení ADD CONSTRAINT odstranění integritního omezeni DROP CONSTRAINT
Změna tabulek ALTER TABLE jméno_tab příkaz změny ; ALTER TABLE CTENAR ADD COLUMN PSC CHAR(5);
Změna tabulek ALTER TABLE CTENAR DROP COLUMN PSC RESTRICT; RESTRICT hlídá referenční integritu, tj. příkaz se neprovede, pokud se na sloupec odkazuje nějaké integritní omezení
Změna tabulek ALTER TABLE CTENAR DROP COLUMN PSC CASCADE; odstraní sloupec a s ním všechny objekty, které se na něj odkazovaly Poznámka: SŘBD mají různá další rozšíření příkazu ALTER, např. přejmenování tabulky, změna typu atributu,
Zrušení tabulek DROP TABLE CTENAR [CASCADE, RESTRICT]; odstraní tabulku z databáze chování CASCADE a RESTRICT je analogické odstraňování sloupců
Integritní omezení v SQL SQL v původní podobě (1986) nenabízí mnoho možností omezení na unikátnost hodnoty požadavek na neprázdnost hodnoty postupně byla integritní omezení rozšiřována a zobecňována
Integritní omezení sloupců NOT NULL hodnota políčka nesmí být prázdná (nutnost zadání hodnoty) UNIQUE jedinečná hodnota v tabulce PRIMARY KEY označení primárního klíče může být v tabulce pouze jedenkrát významově shodné s NOT NULL a UNIQUE
Integritní omezení sloupců DEFAULT specifikuje implicitní hodnotu, kterou SŘBD do sloupce dosadí, není-li hodnota zadána CHECK integritní omezení specifikované logickým výrazem
příklad: CREATE TABLE SI_VYPUJCIL (PRIR_C INTEGER PRIMARY KEY, RC CHAR(11) PRIMARY KEY, DATUM DATE DEFAULT now() ); integritní omezení je možné specifikovat i pomocí ALTER TABLE ADD CONSTRAINT
CREATE TABLE SI_VYPUJCIL (PRIR_C INTEGER NOT NULL, RC VARCHAR(11) NOT NULL, DATUM DATE DEFAULT now() ); ALTER TABLE SI_VYPUJCIL ADD CONSTRAINT si_vypujcil_pk PRIMARY KEY ( PRIR_C, RC ) ; si_vypujcil_pk jméno omezení
CREATE TABLE ZAMESTANEC (ID INTEGER PRIMARY KEY, RC VARCHAR(11) NOT NULL, JMENO VARCHAR(20), PRIJMENI VARCHAR(20) NOT NULL, PLAT DECIMAL(7,2) CHECK (plat<50000), USERNAME VARCHAR(10) UNIQUE );
příklad složitějšího omezení CONSTRAINT maximalni_plat CHECK (plat< (SELECT MAX(horni_hranice) FROM PLATOVE_TRIDY))
Referenční integrita v SQL příklad: CREATE TABLE SI_VYPUJCIL (PRIR_C INTEGER PRIMARY KEY, RC VARCHAR(11) PRIMARY KEY, DATUM DATE DEFAULT now() ); ALTER TABLE SI_VYPUJCIL ADD CONSTRAINT SI_VYP_CTEN_FK FOREIGN KEY ( RC ) REFERENCES CTENAR ( RC ) ;
pokud není specifikován u nadřízené tabulky atribut, na který se odkazuje cizí klíč, automaticky se jedná o primární klíč: ALTER TABLE SI_VYPUJCIL ADD CONSTRAINT SI_VYP_CTEN_FK FOREIGN KEY ( RC ) REFERENCES CTENAR; ALTER TABLE SI_VYPUJCIL ADD CONSTRAINT SI_VYP_EXEMP_FK FOREIGN KEY ( PRIR_C ) REFERENCES EXEMPLAR;
Chování SŘBD pro zajištění referenční integrity vložení dat (INSERT) SŘBD nevloží do podřízené tabulky záznam, pokud vkládaná hodnota cizího klíče neexistuje v nadřízené tabulce výmaz dat (DELETE) nebo změna (UPDATE) v hlavní tabulce chování lze nastavit pomocí SQL v definici cizího klíče klauzulí ON DELETE akce, resp. ON UPDATE akce
Chování SŘBD pro zajištění referenční integrity ALTER TABLE SI_VYPUJCIL ADD CONSTRAINT SI_VYP_EXEMP_FK FOREIGN KEY ( PRIR_C ) REFERENCES EXEMPLAR ON DELETE CASCADE;
Chování SŘBD pro zajištění akce: CASCADE referenční integrity při odstranění řádku v nadřízené tabulce se odstraní všechny řádky v podřízené tabulce, u kterých cizí klíč odkazuje na nadřízený záznam SET NULL hodnota cizího klíče se nastaví na hodnotu NULL SET DEFAULT hodnota cizího klíče se nastaví implicitní hodnotu
Chování SŘBD pro zajištění akce: NO ACTION referenční integrity pokud existuje v podřízené tabulce záznam, u kterého cizí klíč odkazuje na nadřízený záznam, operace se neprovede tato volba je implicitní, není-li při definici cizího klíče nic zadáno
Integritní omezení tabulek kromě integritních omezení sloupců lze zadat integritní omezení jako omezení celé tabulky zadává se za definici sloupců některá omezení sloupců mohou být zapsaná i jako omezení tabulky
integritní omezení pro výši maximálního platu jako omezení sloupce CREATE TABLE ZAMESTNANEC (ID INTEGER PRIMARY KEY, RC VARCHAR(11) NOT NULL, JMENO VARCHAR(20), PRIJMENI VARCHAR(20) NOT NULL, PLAT INT CHECK (plat<50000), USERNAME VARCHAR(10) UNIQUE );
integritní omezení pro výši maximálního platu jako omezení tabulky CREATE TABLE ZAMESTNANEC (ID INTEGER PRIMARY KEY, RC VARCHAR(11) NOT NULL, JMENO PRIJMENI PLAT USERNAME VARCHAR(20), VARCHAR(20) NOT NULL, INT, VARCHAR(10) UNIQUE, CONSTRAINT max_plat CHECK (plat<50000) );
Integritní omezení tabulek integritní omezení tabulek se testuje na neprázdné tabulce při vkládání dat, mazání, změně dat problém: integritní omezení typu požadavek na neprázdnost tabulky se po výmazu posledního záznamu neotestuje po vytvoření tabulky při vzniku databáze je samozřejmě prázdná, první záznam, po založení databáze musí nějaká procedura vložit alespoň jeden záznam
Integritní omezení tabulek řešení: zadat omezení ve tvaru tvrzení (ASSERTION) až po vzniku tabulky a vložení prvního záznamu CREATE ASSERTION jeden_ctenar CHECK (SELECT COUNT(*) FROM CTENAR > 0);
Vytvoření vlastních domén v SQL lze definovat vlastní domény a specifikovat tak vlastní datový typ např. omezením rozsahu hodnot CREATE DOMAIN rok_20_stoleti AS NUMERIC CHECK (VALUE BETWEEN 1900 AND 1999); porovnávání a kontrola legitimity spojení se provádí na základních typech
Vytvoření schématu schéma databáze kolekce tabulek, indexů, pohledů, uživatelských práv pojmenované schéma umožní logické seskupení tabulek, lze mít tabulky se stejným názvem v různých schématech, odkazujeme se na ně pomocí tečkové notace
Vytvoření schématu CREATE SCHEMA název_schématu [AUTHORIZATION username] seznam objektů schématu username jméno uživatele, který je vlastníkem schématu
Vytvoření schématu CREATE SCHEMA knihovna CREATE TABLE ctenar ( ) CREATE TABLE kniha ( ) ; na tabulky se můžeme odkazovat knihovna.ctenar
Vytvoření schématu lze zadat také jen CREATE SCHEMA knihovna; všechny další příkazy (CREATE TABLE, ), které SŘBD zadáváme, se automaticky provádějí v rámci schématu knihovna
Vytvoření schématu lze zadat také jen CREATE SCHEMA knihovna; všechny další příkazy (CREATE TABLE, ), které SŘBD zadáváme, se automaticky provádějí v rámci schématu knihovna
Vytvoření schématu v různých SŘBD se definice databáze mohou lišit v MySQL existuje ekvivalentní příkaz CREATE DATABASE, který musíme zadat jako první před tvorbou tabulek Microsoft SQL Server zná oba příkazy: CREATE DATABASE, CREATE SCHEMA jedna databáze může obsahovat několik schémat
Vytvoření indexů indexy jsou záznamy o tabulkách umožňující rychlé vyhledávání realizovány B-stromy pro jednu tabulku může být definováno více indexů, i podle více sloupců praktická představa: provede se seřazení řádků tabulky dle přílušných kritérií v indexu a tato informace o pařadí se zapíše vlastní data v tabulce se nepřehazují
Vytvoření indexů CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky ( jméno_atrib_1 [uspořádání], jméno_atrib_2 [uspořádání], ) [CLUSTER]; jako CLUSTER může být definován pro tabulku pouze jeden index data jsou podle něj uspořádány v tabulce
Vytvoření indexů uspořádání: ASC: vzestupně (implicitní) DESC: sestupně UNIQUE unikátní index, tj. žádné dva řádky dle tohoto indexu nesmí mít stejné hodnoty sloupcu(ů) v tomto indexu
Vytvoření a zrušení indexů CREATE INDEX prijmjmdat ON CTENAR ( prijmeni, jmeno, dat_nar DESC ); vytvoří index pro seřazení dle příjmení, jména vzestupně a data narození sestupně (od nejmladších) zrušení indexů DROP INDEX prijmjmdat