Popis definiční části jazyka SQL,specifikace deklarace primárních a cizích klíčů a příklady na modelu knihovny: Porovnání verzí

m
 
(Není zobrazeno 20 mezilehlých verzí od 4 dalších uživatelů.)
Řádek 1: Řádek 1:
'''Základy SQL''' se zabývají jazykem SQL. Jazyk SQL (Structured Query Language - strukturovaný dotazovací jazyk) je v  případě SQL data bázových serverů rozhraním, které slouží ke zpřístupnění dat. Jazyk SQL byl vyvinut firmou IBM na počátku 70. Let jako dotazovací jazyk pro práci s velkými databázemi na počítačích střediskového typu. Cílem tvůrců SQL bylo vyvinout takový nástroj pro koncové uživatele, který by jim umožnil vybírat [[data]] z [[databáze]] přesně podle jejich individuálních požadavků a byl přitom co nejjednodušší. <ref name="SQL_1">Programování v SQL. In: ''Ucimedatabaze.cz: Podpora výuky databázových systémů na SOŠ, založené na technologiích společnosti ORACLE'' [online]. 2011, s. 55 [cit. 2016-12-16]. Dostupné z: http://ucimedatabaze.cz/wp-content/uploads/2012/02/CZ_programovani_SQL.pdf</ref>
+
[[SQL|'''SQL (Structured Query Language)''']] je databázový [[programovací jazyk]], který se skládá z více částí. Jednou z nich je část definiční ('''Data Definition Language''', DDL), která umožňuje vytvářet, upravovat a mazat objekty [[databáze]].
  
==E-R konceptuální model==
+
==Příkazy==
 +
Data Definition Language obsahuje tyto příkazy<ref>Programování v SQL. In: ''Ucimedatabaze.cz: Podpora výuky databázových systémů na SOŠ, založené na technologiích společnosti ORACLE'' [online]. 2011, s. 55 [cit. 2016-12-16]. Dostupné z: http://ucimedatabaze.cz/wp-content/uploads/2012/02/CZ_programovani_SQL.pdf</ref>: <br/>
 +
# CREATE - vytvoří objekt (databázi, tabulku)
 +
# ALTER - změní definici objektu
 +
# DROP - smaže objekt
 +
# RENAME - přejmenuje objekt
 +
# TRUNCATE - vymaže data z tabulky, ale ne tabulku samotnou
  
[[File:ERD Representation.svg|thumb|upright 2|right|Alternativní konvence pro psaní diagramů]]
+
===Syntax příkazů===
 +
Obecná syntax základních tří příkazů vypadá takto:
 +
====CREATE====
 +
Vytvoření databáze
 +
  CREATE DATABASE nazev_databaze;
 +
Vytvoření tabulky
 +
  CREATE TABLE nazev_tabulky (
 +
      sloupec_1 datovy_typ,
 +
      ...
 +
      sloupec_n datovy_typ);
 +
Název databáze i tabulky se musí řídit základními pravidly pro názvy všech objektů jazyka SQL - viz [[SQL]].<br/>
 +
Každý sloupec tabulky je jeden atribut (vlastnost) popisovaných [[Data|dat]]. A každý sloupec musí mít určený tzv. datový typ, který určuje hodnoty, které jsou pro daný sloupec přípustné.
 +
Nejčastějšími datovými typy jsou:
 +
* CHAR(d) - řetězec znaků určité délky, kterou označuje číslo d. Např. tedy CHAR(20) bude řetězec o délce 20 znaků.
 +
* DATE - datum ve formátu RRRR-MM-DD
 +
* INTEGER - číslo od -2 147 483 648 do 2 147 483 647, maximální počet znaků může být specifikován v závorkách. Existují i další datové typy pro čísla, ale INTEGER je pro většinu dat dostačující.<ref name="w3">W3schools.com [online]. [cit. 2017-01-03]. Dostupné z: http://www.w3schools.com/sql/default.asp</ref>
  
[[File:ERD-artist-performs-song.svg|thumb|upright 2|right|Dvě vztažené entity za použití notace Crow's Foot]]
+
====ALTER====
 +
Přidání sloupce
 +
  ALTER TABLE nazev_tabulky
 +
      ADD nazev_sloupce datovy_typ;
 +
Odstranění sloupce
 +
  ALTER TABLE nazev_tabulky
 +
      DROP COLUMN nazev_sloupce;
 +
Úprava sloupce
 +
  ALTER TABLE nazev_tabulky
 +
      MODIFY nazev_sloupce datovy_typ;<ref name="w3"></ref>
 +
====DROP====
 +
Pozor, odstraňování objektů používáme pouze v případě, že jsme si jisti, že daná [[data]] už nebudeme potřebovat.<br/>
 +
Odstranění databáze
 +
  DROP DATABASE nazev_databaze;
 +
Odstranění tabulky
 +
  DROP TABLE nazev_tabulky;<ref name="w3"></ref>
  
Entity-relationship model (ERM), entitně vztahový model se v softwarovém inženýrství používá pro abstraktní a konceptuální znázornění dat. Entity-relationship modelování je metoda datového modelování, která vytváří jeden z typů konceptuálních schémat či sémantických datových modelů systému (obvykle relační databáze) a požadavků na něj stylem shora dolů.
+
==Omezení dat (constraints)==
<ref name="SQL_2">Entity-relationship model. In: Wikipedie: Otevřená encyklopedie [online]. [cit. 2016-12-16]. Dostupné z: https://cs.wikipedia.org/wiki/Entity-relationship_model</ref>
+
SQL omezení se používají ke specifikaci pravidel pro [[data]] v tabulce. To zajišťuje přesnost a spolehlivost [[Data|dat]] v tabulce. Pokud by nastal rozpor mezi omezením a akcí, která je s [[Data|daty]] provedena, akce bude zrušena. Omezení mohou být na úrovni tabulek nebo na úrovni sloupců v tabulce. Mohou být použita po příkazu CREATE nebo ALTER.<br/>
 
+
Syntax
===Alternativní konvence pro psaní diagramů===
+
  CREATE TABLE nazev_tabulky (
 
+
      sloupec_1 datovy_typ omezeni,
Chenova notace entity-relationship modelování používá obdélníky pro znázornění entit a kosočtverce pro znázornění vztahů. Tato notace je odpovídající, protože Chenovy vztahy jsou původně objekty - mohou samy obsahovat atributy i další vztahy.<ref name="SQL_2"/>
+
      ...
 
+
      sloupec_n datovy_typ omezeni);
Alternativní konvence, částečně z historického hlediska:
+
Omezení je několik: PRIMARY KEY (primární klíč), FOREIGN KEY (cizí klíč), NOT NULL, UNIQUE, CHECK, DEFAULT, INDEX, nejpoužívanější jsou ale primární a cizí klíče.<ref name="w3"></ref>
* IDEF1X[4]
+
===Primární klíč===
* Bachmanova notace
+
Omezení primárního klíče identifikuje každý záznam (řádek) v tabulce. Primární klíče musí obsahovat unikátní hodnoty (omezení UNIQUE) a nesmí obsahovat nulové hodnoty (omezení NOT NULL). Každá tabulka může mít pouze jeden primární klíč, který se může skládat z jednoho nebo více polí.<br/>
* Martinova notace
+
Příklad definice primárního klíče v rámci příkazu CREATE
* (min, max)-notace Jean-Raymonda Abriala z roku 1974
+
  CREATE TABLE osoby (
* Standard UML
+
      ID_osoby int NOT NULL PRIMARY KEY,
* EXPRESS<ref name="SQL_2"/>
+
      prijmeni char(255) NOT NULL,
 
+
      jmeno char(255),
===Crow's foot===
+
      vek int);
 
+
Příklad definice primárního klíče v rámci příkazu ALTER
Jedna z alternativních notacích známá jako "crow's foot" byla vytvořena nezávisle, v těchto diagramech jsou entity znázorněny v boxech a vztahy oblouky s popisem. Notace "Crow's Foot" znázorňuje vztahy propojováním entit čarami, přičemž symboly na obou koncích čáry symbolizují kardinalitu vztahu. Notace Crow's Foot se používá v Barkerově notaci a v metodologiích jako je SSADM (Structured Systems Analysis and Design Method) nebo informační inženýrství.<ref name="SQL_2"/>
+
  ALTER TABLE osoby (
 
+
      ADD PRIMARY KEY (ID);<ref name="w3"></ref>
Notace Crow's foot má následující výhody:
+
===Cizí klíč===
* Srozumitelnost definování kardinality a dědičnosti ze strany vztahu
+
Cizí klíč se používá ke sloučení dvou tabulek. Je to pole (nebo více polí) jedné tabulky, které odkazuje na primární klíč jiné tabulky. Toto omezení se používá k tomu, abychom zabránili akcím, které by zničily vazby mezi tabulkami. Cizí klíč také zabraňuje tomu, aby do příslušného sloupce byla vložena nesprávná [[data]], musí to být taková [[data]], která odpovídají hodnotám obsaženým v tabulce, na kterou cizí klíč odkazuje.
* Stručně řešená notace povinného vztahu použitím svislé čáry a volitelného vztahu prázdnou kružnicí
+
Příklad definice cizího klíče v rámci příkazu CREATE
* Zobrazuje stručně a jasně notaci, která identifikuje všechny třídy<ref name="SQL_2"/>
+
  CREATE TABLE objednavky (
 +
      ID_objednavky int NOT NULL PRIMARY KEY,
 +
      cislo_objednavky int NOT NULL,
 +
      ID_osoby int FOREIGN KEY REFERENCES osoby(ID_osoby) );
 +
Spojení "FOREIGN KEY REFERENCES" určuje, že bude následovat odkaz na jinou tabulku ve formátu nazev_tabulky(nazev_sloupce).<br/>
 
<br/>
 
<br/>
 +
Příklad definice cizího klíče v rámci příkazu ALTER
 +
  ALTER TABLE objednavky
 +
      ADD FOREIGN KEY (ID_osoby) REFERENCES osoby(ID_osoby);<ref name="w3"></ref>
  
==Popis jazyka SQL==
+
==Příklady na modelu knihovny==
=== Definice pojmů===
 
<br/>
 
'''Entita'''(angl. entity) je objekt reálného světa, který je schopen nezávyslé existence a je jednoznačně odlišitelný od odstatních objektů. Entitou je např. "student Novák Josef, r.č.470822172".
 
<br/>
 
'''Vztah'''(angl. relationship) je vazba mezi dvěma (nebo více) entitami. Např. entita "student Novák Josef, r.č. 470822172" může být ve vztahu "má zapsán" k entitě "učební předmět Konstrukce databázových systémů".
 
<br/>
 
'''Hodnota popisného typu'''(angl. value) - kde popisným typem budeme rozumět jednoduchý datový typ, tedy dvojici {množina hodnot, množina operací}. Hodnotami jsou například celé číslo 123, datum 31.2.1994 apod.
 
<br/>
 
'''Atributem'''(angl. attribute) budeme rozumět funkci přiřazující entitám či vztahům hodnotu (zde popisného typu), určující některou podstatnou ''vlastnost'' entity nebo vztahu. Např. DATUM výpůjčky dané knihy daným abonentem, RODNÉ_ČÍSLO danho zaměstnance, apod.
 
<ref name="SQL_3">POKORNÝ, Jaroslav a Ivan HALAŠKA. Databázové systémy: vybrané kapitoly a cvičení. 2. přepr. vyd. Praha: Karolinum, 1998. ISBN 8071846872.</ref>
 
  
===Příkazy===
+
[[File:SQL_knihovna.png|thumb|upright 5|none|Konceptuální schéma knihovny <br/> [[:File:SQL_knihovna.png]] ]]
<br/>
 
SQL příkazy se dělí na čtyři základní skupiny:
 
*Příkazy pro manipulaci s daty (SELECT, INSERT, UPDATE, DELETE, …)
 
*Příkazy pro definici dat (CREATE, ALTER, DROP, …)
 
*Příkazy pro řízení přístupových práv (GRANT, REVOKE)
 
*Příkazy pro řízení transakcí (START TRANSACTION, COMMIT, ROLLBACK) <ref name="SQL_4">SQL. In: Wikipedie: Otevřená encyklopedie [online]. [cit. 2016-12-17]. Dostupné z: https://cs.wikipedia.org/wiki/SQL</ref>
 
  
==Konceptuální schéma knihovny==
+
Vytvoř tabulku dílo.
 +
  CREATE TABLE Dilo (
 +
      id_dilo int PRIMARY KEY,
 +
      nazev char(200),
 +
      popis char(200) );
  
[[File:SQL_knihovna.png|thumb|upright 5|none|Konceptuální schéma knihovny pomocí notace Crow's Foot <br/> [[:File:SQL_knihovna.png]] ]]
+
Vytvoř tabulku vydání.
 +
  CREATE TABLE vydani (
 +
      id_vyd int PRIMARY KEY,
 +
      id_dilo int FOREIGN KEY REFERENCES Dilo(id_dilo),
 +
      cis_vyd char(20),
 +
      rok_vyd char(20) );
  
FK (foreign key) = cizí klíč<br/>
+
Vytvoř tabulku autorství.
PK (primary key) = primární klíč<br/>
+
  CREATE TABLE Autorstvi (
NN = not null - sloupec nesmí být prázdný.<br/>
+
      id_autorstvi int PRIMARY KEY,
CHAR(20) = text délky maximálně 20 znaků<br/>
+
      id_dilo int FOREIGN KEY REFERENCES Dilo(id_dilo),
DECIMAL(10,0) = první číslo označuje celkový počet míst v číslici, druhé počet míst za desetinní čárkou. V tomto případu se jedná o 10 místní číslo s 0 desetinnými místami. (Např. Decimal(4,3) jsou čísla od -9,999 do 9,999.)<br/>
+
      id_aut int FOREIGN KEY REFERENCES Autor(id_aut) );
  
===Data definition language===
+
Vymaž tabulku druh sekundárního autorství.
 +
  DROP TABLE Drusekaut;
  
<br/>
+
Vymaž databázi knihovna.
'''Vytvoř tabulku dílo.'''<br/>
+
  DROP DATABASE Knihovna;
CREATE TABLE Dilo<br/>
 
(id_dilo PK INT,<br/>
 
nazev CHAR(200),<br/>
 
popis CHAR(200));<br/>
 
<br/>
 
''Vysvětlení interpunkce: středník odděluje jednotlivé SQL dotazy, čárka odděluje vstupní parametry.''<br/>
 
<br/>
 
'''Vytvoř tabulku vydání.'''<br/>
 
CREATE TABLE vydani<br/>
 
(id_vyd PK INT,<br/>
 
id_dilo FK INT REFERENCES Dilo(id_dilo),<br/>
 
cis_vyd CHAR(20),<br/>
 
rok_vyd CHAR(20));<br/>
 
<br/>
 
''Vysvětlení references: references píšeme, protože používáme cizí klíč - musíme zadefinovat, kam cizí klíč odkazuje.''<br/>
 
<br/>
 
'''Vytvoř tabulku autorství.'''<br/>
 
CREATE TABLE Autorstvi<br/>
 
(id_autorstvi PK INT,<br/>
 
id_dilo FK INT REFERENCES Dilo(id_dilo),<br/>
 
id_aut FK INT REFERENCES Autor(id_aut));<br/>
 
<br/>
 
'''Vymaž tabulku druh sekundárního autorství.'''<br/>
 
DROP TABLE Drusekaut;<br/>
 
<br/>
 
'''Vymaž databázi knihovna.'''<br/>
 
DROP DATABASE Knihovna;<br/>
 
<br/>
 
'''Uprav tabulku dílo: přidej sloupec evidenční číslo.'''<br/>
 
ALTER TABLE dilo<br/>
 
ADD ev_cis CHAR(200);<br/>
 
<br/>
 
'''Uprav tabulku pokuta: odstraň datum pokuty.'''<br/>
 
ALTER TABLE pokuta<br/>
 
DROP dat_pok;<br/>
 
<br/>
 
''Vysvětlení: datový typ, napr. "CHAR(200)" nebo "INT" píšeme jenom tehdy, když něco vytváříme. Když mažeme, nemusíme datový typ psát/definovat.''<br/>
 
<br/>
 
<ref name="SQL_5">Basic SQL statements: DDL and DML. In: Database design with UML and SQL, 3rd edition [online]. [cit. 2016-12-24]. Dostupné z: http://www.tomjewett.com/dbdesign/dbdesign.php?page=ddldml.php</ref><ref name="SQL_3"/><ref name="SQL_6">W3schools.com [online]. [cit. 2017-01-03]. Dostupné z: http://www.w3schools.com/sql/default.asp</ref>
 
  
===Data manipulation language===
+
Uprav tabulku dílo: přidej sloupec evidenční číslo.
 +
  ALTER TABLE dilo
 +
      ADD ev_cis char(200);
  
<br/>
+
Uprav tabulku pokuta: odstraň datum pokuty.
'''Vlož dílo "Těžký časy".'''<br/>
+
  ALTER TABLE pokuta
INSERT INTO Dilo(nazev, popis)<br/>
+
      DROP dat_pok;<ref name="SQL_5">Basic SQL statements: DDL and DML. In: Database design with UML and SQL, 3rd edition [online]. [cit. 2016-12-24]. Dostupné z: http://www.tomjewett.com/dbdesign/dbdesign.php?page=ddldml.php</ref><ref name="SQL_3">POKORNÝ, Jaroslav a Ivan HALAŠKA. Databázové systémy: vybrané kapitoly a cvičení. 2. přepr. vyd. Praha: Karolinum, 1998. ISBN 8071846872.</ref><ref name="w3"></ref>
VALUES("Těžký časy", "Soubor 35 krátkých povídek.");<br/>
 
<br/>
 
'''Vlož autor "Charles Bukowski".'''<br/>
 
INSERT INTO Autor(jme_aut,pri_aut)<br/>
 
VALUES("Charles","Bukowski");<br/>
 
<br/>
 
'''Vymaž pokuty, které vznikly na Vánoce.'''<br/>
 
DELETE FROM Pokuta<br/>
 
WHERE dat_pok = "24122016";<br/>
 
<br/>
 
'''Vymaž všechny pokuty.'''<br/>
 
DELETE FROM Pokuta;<br/>
 
<br/>
 
'''Vymaž všetny autory.'''<br/>
 
DELETE FROM Autor;<br/>
 
<br/>
 
''Vysvětlení: bez definice WHERE mažu všechno.''<br/>
 
<br/>
 
'''Zmaž všechny výpujčky od Vánoc do Silvestra.'''<br/>
 
DELETE FROM Vypujcka<br/>
 
WHERE dat_od = "24122016"<br/>
 
AND dat_do = "31122016";<br/>
 
<br/>
 
''Vysvětlení formy data: v konceptuálním schématu knihovny máme definovanou délku data na 8 znaků. Můžeme tedy datum napsat ve formě 24122016 nebo 24.12.16 - podstatné je dodržet délku pole, co je 8 znaků.''<br/>
 
<br/>
 
'''Zmaž autora Charles Bukowski.'''<br/>
 
DELETE FROM Autor<br/>
 
WHERE jme_aut = "Charles"<br/>
 
AND pri_aut = "Bukowski";<br/>
 
<br/>
 
'''Změň cenu stokorunových výtisků na 120 kč.'''<br/>
 
UPDATE Vytisk<br/>
 
SET cena = 120<br/>
 
WHERE cena = 100;<br/>
 
<br/>
 
'''Změň křestní jméno Petra Nováka na Josef.'''<br/>
 
UPDATE ctenar<br/>
 
SET jme_cte = „Josef“<br/>
 
WHERE jme_cte = „Petr“<br/>
 
AND pri_cte = „Novák“;<br/>
 
<br/>
 
'''Vypiš všechny data z tabulky dílo.'''<br/>
 
SELECT *<br/>
 
FROM Dilo;<br/>
 
<br/>
 
'''Vypiš příjmení všech autorů.'''<br/>
 
SELECT pri_aut<br/>
 
FROM Autor;<br/>
 
<br/>
 
'''Z výtisků vypiš všechny signatury a ceny (v pořadí signatura, cena).'''<br/>
 
SELECT signatura, cena<br/>
 
FROM Vytisk;<br/>
 
<br/>
 
'''Vypiš z tabulky výpujčka datumy výpujčky a datumy vrácení tak, aby měli sloupce názvy "datum vypujcky" a "datum vraceni".'''<br/>
 
SELECT dat_od AS datum_vypujcky, dat_do AS datum_vraceni<br/>
 
FROM Vypujcka;<br/>
 
<br/>
 
''Vysvětlení: v datum_vrácení je "_" místo mezery, protože SQL by jinak za mezerou čekal další klíčové slovo/příkaz.''<br/>
 
<br/>
 
'''Vypiš z tabulky pokut id pokuty jako "cislo pokuty" a výšku pokuty ze dne 28.12.2016.'''<br/>
 
SELECT id_pok AS cislo_pokuty, vyse_pok<br/>
 
FROM Pokuta<br/>
 
WHERE dat_pok="28122016";<br/>
 
<br/>
 
''Vysvětlení: datum píšeme v uvozovkách, protože se jedná o řetězec. Jenom datový typ CHAR vypisujeme v uvozovkách, datový typ Integer a Decimal vypisujeme bez uvozovek.''<br/>
 
<br/>
 
'''Vypiš z tabulky čtenář id jako "cislo ctenare", příjmení jako "prijmeni" a adresu všech čtenářů, kteřý se jmenují "Pavel".'''<br/>
 
SELECT id_cte AS cislo_ctenare, pri_cte AS prijmeni, adresa<br/>
 
FROM Ctenar<br/>
 
WHERE jme_cte = "Pavel";<br/>
 
<br/>
 
'''Z tabulky Vydání vypiš všechno o vydáních, které mají id díla "20" a rok vydání "2016".'''<br/>
 
SELECT *<br/>
 
FROM Vydani<br/>
 
WHERE id_dilo = 20<br/>
 
AND rok_vyd = "2016";<br/>
 
<br/>
 
'''Přepoj dílo "Těžký časy" s autorem "Charles Bukowski" v tabulce autorství.'''<br/>
 
SELECT id_dilo<br/>
 
FROM Dilo<br/>
 
WHERE nazev = "Těžký časy";<br/>
 
(Systém ukáže id, např. 12)<br/>
 
<br/>
 
SELECT id_aut<br/>
 
FROM Autor<br/>
 
WHERE jme_aut = "Charles"<br/>
 
AND pri_aut = "Bukowski";<br/>
 
(Systém ukáže id, např. 21)<br/>
 
<br/>
 
INSERT INTO Autorstvi(id_dilo, id_aut)<br/>
 
VALUES(12, 21);<br/>
 
<br/>
 
'''Vypiš všechny čtenáře, kteřý si nikdy nic nevypujčili.'''<br/>
 
SELECT *<br/>
 
FROM Ctenar<br/>
 
WHERE id_cte NOT IN (SELECT id_cte FROM Vypujcka);<br/>
 
<br/>
 
'''Vypiš součet všech pokut.'''<br/>
 
SELECT SUM(vyse_pok)<br/>
 
FROM Pokuta;<br/>
 
<br/>
 
'''Vypiš nejdrahší a nejlevnejší výtisk daného díla.'''<br/>
 
SELECT MAX(cena), MIN(cena)<br/>
 
FROM Vytisk<br/>
 
GROUP BY id_dilo;<br/>
 
<br/>
 
''Vstupní parameter SELECT neobsahuje AND. Jenom za WHERE následuje AND.''<br/>
 
<br/>
 
'''Zjisti, kolik máme autoru v databázi.'''<br/>
 
SELECT COUNT(*) AS pocet_autoru FROM Autor;<br/>
 
<br/>
 
''Vysvetlení: * je tady v závorce, protože je to parameter agregační funkce.''<br/>
 
<br/>
 
'''Zjisti průměrnou cenu výtisků.'''<br/>
 
SELECT AVG(cena) FROM Vytisk;<br/>
 
<br/>
 
'''Uveď průměrnou cenu vytisků. Sloupec nazvi průměrná cena.'''<br/>
 
SELECT AVG(cena) AS prumerna_cena FROM Vytisk;<br/>
 
<br/>
 
<ref name="SQL_5"/><ref name="SQL_3"/><ref name="SQL_6"/>
 
  
 
== Odkazy ==
 
== Odkazy ==
Řádek 237: Řádek 117:
  
 
<references/>
 
<references/>
 
=== Použitá literatura ===
 
 
* Programování v SQL. In: ''Ucimedatabaze.cz: Podpora výuky databázových systémů na SOŠ, založené na technologiích společnosti ORACLE'' [online]. 2011, s. 55 [cit. 2016-12-16]. Dostupné z: http://ucimedatabaze.cz/wp-content/uploads/2012/02/CZ_programovani_SQL.pdf
 
* Entity-relationship model. In: Wikipedie: Otevřená encyklopedie [online]. [cit. 2016-12-16]. Dostupné z: https://cs.wikipedia.org/wiki/Entity-relationship_model
 
*POKORNÝ, Jaroslav a Ivan HALAŠKA. Databázové systémy: vybrané kapitoly a cvičení. 2. přepr. vyd. Praha: Karolinum, 1998. ISBN 8071846872.
 
*SQL. In: Wikipedie: Otevřená encyklopedie [online]. [cit. 2016-12-17]. Dostupné z: https://cs.wikipedia.org/wiki/SQL
 
*Basic SQL statements: DDL and DML. In: Database design with UML and SQL, 3rd edition [online]. [cit. 2016-12-24]. Dostupné z: http://www.tomjewett.com/dbdesign/dbdesign.php?page=ddldml.php
 
*W3schools.com [online]. [cit. 2017-01-03]. Dostupné z: http://www.w3schools.com/sql/default.asp
 
  
 
=== Externí odkazy ===
 
=== Externí odkazy ===
  
* http://www.w3schools.com/sql/default.asp
+
* [https://docs.oracle.com/database/121/SQLRF/toc.htm Oracle dokumentace]
* http://sqlzoo.net/wiki/SQL_Tutorial
+
* [http://www.w3schools.com/sql/default.asp w3schools]
* http://www.mff.cuni.cz/
+
* [http://sqlzoo.net/wiki/SQL_Tutorial SQLZOO]
* http://krokodata.vse.cz/
+
* [http://www.mff.cuni.cz/ Matematicko-fyzikální fakulta]
 +
* [http://krokodata.vse.cz/ Krokodýlovy databáze]
  
 
=== Související články ===
 
=== Související články ===
  
[[Informační systém]], [[Databáze]]
+
* [[Informační systém]]
 +
* [[Databáze]]
 +
* [[SQL]]
 +
* [[Popis prvků konceptuálních modelů, smysl konceptuálního modelu a příklad modelu Knihovny]]
 +
* [[Transformace konceptuálního modelu na datový model, základní prvky datového modelu, specifikace úlohy primárních a cizích klíčů]]
 +
* [[Manipulační část jazyka SQL (DML – insert, update, delete) a příklady na databázi Knihovna]]
 +
* [[Příkaz Select, jeho využití v databázi Knihovna]]
  
 
=== Klíčová slova ===
 
=== Klíčová slova ===
Databázové systémy, Jazyk SQL, E-R konceptuální model, Informační systém, Informace, Data
+
Databázové systémy, Jazyk SQL, primární klíč, cizí klíč
  
 
[[Kategorie: Informační studia a knihovnictví]]
 
[[Kategorie: Informační studia a knihovnictví]]
 +
[[Kategorie:Informační technologie, knihovnické technologie]]
 +
[[Kategorie: Státnicové otázky UISK]]

Aktuální verze z 4. 6. 2018, 11:01

SQL (Structured Query Language) je databázový programovací jazyk, který se skládá z více částí. Jednou z nich je část definiční (Data Definition Language, DDL), která umožňuje vytvářet, upravovat a mazat objekty databáze.

Příkazy

Data Definition Language obsahuje tyto příkazy[1]:

  1. CREATE - vytvoří objekt (databázi, tabulku)
  2. ALTER - změní definici objektu
  3. DROP - smaže objekt
  4. RENAME - přejmenuje objekt
  5. TRUNCATE - vymaže data z tabulky, ale ne tabulku samotnou

Syntax příkazů

Obecná syntax základních tří příkazů vypadá takto:

CREATE

Vytvoření databáze

  CREATE DATABASE nazev_databaze;

Vytvoření tabulky

  CREATE TABLE nazev_tabulky ( 
     sloupec_1 datovy_typ,
     ...
     sloupec_n datovy_typ);

Název databáze i tabulky se musí řídit základními pravidly pro názvy všech objektů jazyka SQL - viz SQL.
Každý sloupec tabulky je jeden atribut (vlastnost) popisovaných dat. A každý sloupec musí mít určený tzv. datový typ, který určuje hodnoty, které jsou pro daný sloupec přípustné. Nejčastějšími datovými typy jsou:

  • CHAR(d) - řetězec znaků určité délky, kterou označuje číslo d. Např. tedy CHAR(20) bude řetězec o délce 20 znaků.
  • DATE - datum ve formátu RRRR-MM-DD
  • INTEGER - číslo od -2 147 483 648 do 2 147 483 647, maximální počet znaků může být specifikován v závorkách. Existují i další datové typy pro čísla, ale INTEGER je pro většinu dat dostačující.[2]

ALTER

Přidání sloupce

  ALTER TABLE nazev_tabulky
     ADD nazev_sloupce datovy_typ;

Odstranění sloupce

  ALTER TABLE nazev_tabulky
     DROP COLUMN nazev_sloupce;

Úprava sloupce

  ALTER TABLE nazev_tabulky
     MODIFY nazev_sloupce datovy_typ;[2]

DROP

Pozor, odstraňování objektů používáme pouze v případě, že jsme si jisti, že daná data už nebudeme potřebovat.
Odstranění databáze

  DROP DATABASE nazev_databaze;

Odstranění tabulky

  DROP TABLE nazev_tabulky;[2]

Omezení dat (constraints)

SQL omezení se používají ke specifikaci pravidel pro data v tabulce. To zajišťuje přesnost a spolehlivost dat v tabulce. Pokud by nastal rozpor mezi omezením a akcí, která je s daty provedena, akce bude zrušena. Omezení mohou být na úrovni tabulek nebo na úrovni sloupců v tabulce. Mohou být použita po příkazu CREATE nebo ALTER.
Syntax

  CREATE TABLE nazev_tabulky ( 
     sloupec_1 datovy_typ omezeni,
     ...
     sloupec_n datovy_typ omezeni);

Omezení je několik: PRIMARY KEY (primární klíč), FOREIGN KEY (cizí klíč), NOT NULL, UNIQUE, CHECK, DEFAULT, INDEX, nejpoužívanější jsou ale primární a cizí klíče.[2]

Primární klíč

Omezení primárního klíče identifikuje každý záznam (řádek) v tabulce. Primární klíče musí obsahovat unikátní hodnoty (omezení UNIQUE) a nesmí obsahovat nulové hodnoty (omezení NOT NULL). Každá tabulka může mít pouze jeden primární klíč, který se může skládat z jednoho nebo více polí.
Příklad definice primárního klíče v rámci příkazu CREATE

  CREATE TABLE osoby (
     ID_osoby int NOT NULL PRIMARY KEY,
     prijmeni char(255) NOT NULL,
     jmeno char(255),
     vek int);

Příklad definice primárního klíče v rámci příkazu ALTER

  ALTER TABLE osoby (
     ADD PRIMARY KEY (ID);[2]

Cizí klíč

Cizí klíč se používá ke sloučení dvou tabulek. Je to pole (nebo více polí) jedné tabulky, které odkazuje na primární klíč jiné tabulky. Toto omezení se používá k tomu, abychom zabránili akcím, které by zničily vazby mezi tabulkami. Cizí klíč také zabraňuje tomu, aby do příslušného sloupce byla vložena nesprávná data, musí to být taková data, která odpovídají hodnotám obsaženým v tabulce, na kterou cizí klíč odkazuje. Příklad definice cizího klíče v rámci příkazu CREATE

  CREATE TABLE objednavky (
     ID_objednavky int NOT NULL PRIMARY KEY,
     cislo_objednavky int NOT NULL,
     ID_osoby int FOREIGN KEY REFERENCES osoby(ID_osoby) );

Spojení "FOREIGN KEY REFERENCES" určuje, že bude následovat odkaz na jinou tabulku ve formátu nazev_tabulky(nazev_sloupce).

Příklad definice cizího klíče v rámci příkazu ALTER

  ALTER TABLE objednavky
     ADD FOREIGN KEY (ID_osoby) REFERENCES osoby(ID_osoby);[2]

Příklady na modelu knihovny

Konceptuální schéma knihovny
File:SQL_knihovna.png

Vytvoř tabulku dílo.

  CREATE TABLE Dilo (
     id_dilo int PRIMARY KEY,
     nazev char(200),
     popis char(200) );

Vytvoř tabulku vydání.

  CREATE TABLE vydani (
     id_vyd int PRIMARY KEY,
     id_dilo int FOREIGN KEY REFERENCES Dilo(id_dilo),
     cis_vyd char(20),
     rok_vyd char(20) );

Vytvoř tabulku autorství.

  CREATE TABLE Autorstvi (
     id_autorstvi int PRIMARY KEY,
     id_dilo int FOREIGN KEY REFERENCES Dilo(id_dilo),
     id_aut int FOREIGN KEY REFERENCES Autor(id_aut) );

Vymaž tabulku druh sekundárního autorství.

  DROP TABLE Drusekaut;

Vymaž databázi knihovna.

  DROP DATABASE Knihovna;

Uprav tabulku dílo: přidej sloupec evidenční číslo.

  ALTER TABLE dilo
     ADD ev_cis char(200);

Uprav tabulku pokuta: odstraň datum pokuty.

  ALTER TABLE pokuta
     DROP dat_pok;[3][4][2]

Odkazy

Reference

  1. Programování v SQL. In: Ucimedatabaze.cz: Podpora výuky databázových systémů na SOŠ, založené na technologiích společnosti ORACLE [online]. 2011, s. 55 [cit. 2016-12-16]. Dostupné z: http://ucimedatabaze.cz/wp-content/uploads/2012/02/CZ_programovani_SQL.pdf
  2. 2,0 2,1 2,2 2,3 2,4 2,5 2,6 W3schools.com [online]. [cit. 2017-01-03]. Dostupné z: http://www.w3schools.com/sql/default.asp
  3. Basic SQL statements: DDL and DML. In: Database design with UML and SQL, 3rd edition [online]. [cit. 2016-12-24]. Dostupné z: http://www.tomjewett.com/dbdesign/dbdesign.php?page=ddldml.php
  4. POKORNÝ, Jaroslav a Ivan HALAŠKA. Databázové systémy: vybrané kapitoly a cvičení. 2. přepr. vyd. Praha: Karolinum, 1998. ISBN 8071846872.

Externí odkazy

Související články

Klíčová slova

Databázové systémy, Jazyk SQL, primární klíč, cizí klíč