FAV-ZCU/KIV DB1/08. Structured Query Language.md

361 lines
9.9 KiB
Markdown

# Structured Query Language
- dotazovací jazyk pro relační SŘBD
- ISO standard jazyka SQL
- ISO/EIC 9075
- 1986, 1989, **1992**, 1999, 2003, 2006, 2008, 2011, 2016, 2019, 2023
- komponenty:
- DDL - Data Definition Language
- DML - Data Manipulation Language
- DCL - Data Control Language
- TCL - Transaction Control Language
**Vlastnosti a použití SQL**
- neprocedurální deklarativní jazyk
- vychází z jazyka SEQEL
- slouží k vytvoření databáze a struktury relací (tabulek)
- uživatelé jazyka
- administrátor (DBA)
- management
- vývojář aplikace
- koncový uživatel
**Základní příkazy**
- DDL
- `CREATE TABLE`, `ALTER TABLE`, `DROP TABLE`
- `CREATE VIEW`, `DROP VIEW`
- `CREATE INDEX`, `DROP INDEX`
- DML
- `SELECT`
- `INSERT`, `UPDATE`, `DELETE`
- DCL a TCL
- `GRANT`, `REVOKE`
- `COMMIT`, `ROLLBACK`
**Jak psát příkazy**
- každý příkaz musí začínat na nové řádce
- může být zapsán na více řádek
- SQL rozlišuje
- rezervovaná slova - nejsou case-sensitive
- názvy objektů - mohou být case-sensitive
- rezervovaná slova nesmí být dělená do více řádků
- každý příkaz SQL musí být zakončen středníkem
- řetězce v příkazu musí být uzavřeny v apostrofech
## DML
**Příkaz SELECT**
- příkaz `SELECT` nebo jeho části jsou součástí jiných příkazů
- zjednodušená syntaxe
```sql
SELECT [DISTINCT] {* | [sloupec_vyraz [[AS]
alias] [,...]}
FROM tabulka [alias] [,...]
[WHERE podmínka]
[GROUP BY seznam_neagregovaných_sloupců_výrazů]
[HAVING podmínka]
[ORDER BY seznam_řazených_sloupců_výrazů];
```
**Agregované funkce**
- `COUNT(sloupec)`
- počet neprázdných hodnot sloupce
- `SUM(sloupec)`
- součet neprázdných hodnot sloupce
- `AVG(sloupec)`
- aritmetický průměr neprázdných hodnot sloupce
- `MIN(sloupec)`
- minimální hodnota sloupce
- `MAX(sloupec)`
- maximální hodnota sloupce
**Vložení záznamu do tabulky**
- jedním příkazem `INSERT` lze vložit jen jeden záznam do jedné tabulky
- registrace čtenáře Jana Nováka
```sql
INSERT INTO Čtenář (Č_čt, Jméno) VALUES (123, 'Jan Novák');
```
**Změna záznamů tabulky**
- jedním příkazem `UPDATE` lze modifikovat hodnoty několika záznamů jedné tabulky
- uložení adresy čtenáři č. 123
```sql
UPDATE Čtenář SET Adresa = 'Univerzitní 8, Plzeň'
WHERE Č_čt = 123;
```
**Zrušení záznamu tabulky**
- jedním příkazem `DELETE` lze zrušit více záznamů jedné tabulky
- zrušení (smazání) všech rezervací čtenáře č. 123
```sql
DELETE FROM Rezervace WHERE Č_čt = 123;
```
## DDL
**Identifikátory**
- názvy tabulek, pohledů, sloupců a dalších databázových objektů
- názvy objektů jsou u mnoha SŘBD case-sensitive
- max. velikost 128 znaků
- povoleny malá a velká písmena, cifry a podtržítko
- musí začít písmenem
- nesmí obsahovat diakritická znaménka a bílé znaky
**Vybrané datové typy**
+ textové znaky a řetězce
- `CHARACTER`, `CHARACTER VARYING`
- přesné matematické výpočty
- `NUMERIC`, `DECIMAL`, `INTEGER`
- přibližné matematické výpočty
- `FLOAT`, `REAL`, `DOUBLE PRECISION`
+ datum a čas
+ `DATE`, `TIME`, `TIMESTAMP`
+ rozsáhlé objekty
+ `BINARY LARGE OBJECT`, `CHARACTER LARGE OBJECT`
**Definice tabulky**
- příkazem `CREATE TABLE` vytváříme tabulku, ve které
- definujeme její jméno
- zavedeme alespoň jeden sloupec (a jeho datový typ)
- můžeme a nemusíme definovat
- výchozí hodnotu, nepojmenovaná integritní omezení
- můžeme zavést pojmenovaná integritní omezení vázané s tabulkou
- seznam sloupců a integritních omezení je oddělován čárkou a uzavřen v závorce
```sql
CREATE TABLE Kluby (
Id_klubu NUMERIC PRIMARY KEY,
Název CHARACTER VARYING(30) NOT NULL,
Založen DATE
);
```
**Logické vs. fyzické datové typy**
| logický | SŘBD Oracle | SŘBD MariaDB |
| ---- | ---- | ---- |
| CHARACTER | CHAR | CHAR |
| CHARACTER VARYING | VARCHAR2 | VARCHAR |
| NUMERIC | NUMBER | NUMBER |
| DECIMAL | NUMBER | DECIMAL |
| INTEGER | NUMBER | INT |
| FLOAT | NUMBER | FLOAT |
| REAL, DOUBLE PRECISION | NUMBER | DOUBLE |
| DATE, TIME | DATE | DATE, TIME, TIMESTAMP |
| TIMESTAMP | DATE | TIMESTAMP |
| BINARY LARGE OBJECT | BLOB | BLOB |
| CHARACTER LARGE OBJECT | CLOB | TEXT |
**Nepojmenovaná integritní omezení**
- každý sloupec může zahrnout tato integritní omezení
- `NOT NULL` - vyžadovaná hodnota
- `UNIQUE` - unikátní
- `PRIMARY KEY` - primární klíč
- `CHECK` - omezení podmínkou
**Pojmenovaná integritní omezení**
- začínají klíčovým slovem `CONSTRAINT` následovaného názvem omezení
- poté jedna z uvedených možností nahoře (kromě `NOT NULL`)
- zápis pokračuje seznamem sloupců tabulky, pro které je omezení definováno
- některá omezení mají další konstrukce v zápise
**Primární klíč**
- maximálně jeden pro tabulku
- nepojmenovaná varianta
- `id_klubu NUMBER PRIMARY KEY`
- pojmenovaná varianta
- `CONSTRAINT kluby_pk PRIMARY KEY (id_klubu)`
- umožňuje složený PK
**Alternativní klíč**
- nepojmenovaná varianta
- `nazev VARCHAR2(30) NOT NULL UNIQUE`
- pojmenovaná varianta
- `CONSTRAINT nazev_un UNIQUE (nazev)`
**Cizí klíč**
- pouze pojmenovaná varianta
```sql
CONSTRAINT exemplar_fk1
FOREIGN KEY (isbn)
REFERENCES kniha (isbn)
```
- možno doplnit o reakci na rušení/aktualizaci prvku v nadřízené tabulce
```sql
ON DELETE NO ACTION
ON DELETE RESTRICT
ON DELETE SET NULL
ON DELETE CASCADE
ON UPDATE NO ACTION
ON UPDATE RESTRICT
ON UPDATE SET NULL
ON UPDATE CASCADE
```
- příklad
```sql
CONSTRAINT exemplar_fk1
FOREIGN KEY (isbn)
REFERENCES kniha (isbn)
ON DELETE NO ACTION
ON UPDATE NO ACTION
```
**Výběrová podmínka** (`CHECK`)
- stanovení hodnot sloupce výčtem nebo podmínkou
- nepojmenovaná varianta
```sql
...
semestr CHAR(2) NOT NULL
CHECK (semestr IN ('ZS', 'LS'))
...
kladne_cislo NUMBER
CHECK (kladne_cislo > 0)
...
```
- pojmenovaná varianta
```sql
CONSTRAINT ruzne_tymy
CHECK (id_domaci <> id_hoste)
```
**Kompletní vytvoření tabulky**
```sql
CREATE TABLE zapas (
id_zapasu NUMBER PRIMARY KEY,
misto VARCHAR2(100) NOT NULL,
datum_cas DATE,
id_domaci NUMBER,
id_hoste NUMBER,
goly_domaci NUMBER DEFAULT 0,
goly_hoste NUMBER DEFAULT 0,
CONSTRAINT zapas_fk1 FOREIGN KEY (id_domaci)
REFERENCES kluby(id_klubu),
CONSTRAINT zapas_fk2 FOREIGN KEY (id_hoste)
REFERENCES kluby(id_klubu),
CONSTRAINT ruzne_tymy CHECK (id_domaci <> id_hoste)
);
```
**Modifikace tabulky**
- provádí se příkazem `ALTER TABLE`
- lze měnit
- název, sloupec, integritní omezení
- lze přidat/zrušit sloupce
- ideálně u prázdné tabulky
- lze přidat nebo zrušit více sloupců jedním příkazem
- lze přidat/zrušit pojmenovaná integritní omezení
- jen jedno jedním příkazem
**Indexy**
- datová struktura
- logické uspořádání prvků relace podle hodnot vybraných sloupců
- má za úkol zrychlit operaci `SELECT` nad danou tabulkou
- zpomaluje operace `INSERT`, `UPDATE` a `DELETE`
- index je tvořen pro jeden nebo skupinu sloupců
- index může být
- unikátní (automaticky pro integritní omezení)
- dovoluje opakování hodnot (ručně tvořené, např. pro cizí klíče)
```sql
-- Unikátní index
CREATE UNIQUE INDEX kluby_pk_idx
ON kluby (id_klubu);
-- Index dovolující opakovat hodnoty
CREATE INDEX zapas_fk1_idx
ON zapas (id_domaci);
-- Zrušení indexu
DROP INDEX kluby_pk_idx;
DROP INDEX zapas_fk1_idx;
-- zruší je i DROP TABLE
```
**Databázový pohled**
- virtuální relace, která fyzicky neexistuje
- poskytuje výsledek jedné nebo více relačních operací
- definice spojena s příkazem `SELECT`
- přiděluje příkazu `SELECT` jméno, pod kterým je uložen v databázi
- datová struktura výhradně ke čtení
- výjimkou jsou aktualizovatelné pohledy
- čtenáři a jejich výpůjčky
```sql
CREATE VIEW vypujcky_ctenare AS
SELECT c.jmeno, v.inv_c
FROM ctenar c, vypujcka v
WHERE c.id_ctenar = v.id_ctenar;
```
- statistika tabulky exemplář
```sql
CREATE VIEW statistika (zeme, pocet, soucet)
SELECT zeme_vydani,
COUNT(inv_c),
SUM(cena)
FROM exemplar
GROUP BY zeme_vydani;
```
- zrušení: `DROP VIEW vypujcky_ctenare;`
- pohled se může stát nevalidním, pokud bude smazána tabulka či pohled, který je jím používán
## DCL
**Role a oprávnění**
- DB administrátor může uživateli udělit
- systémovou roli, např. `CONNECT`, `RESOURCE`
- systémové oprávnění, např. `UNLIMITED TABLESPACE`
- uživatel databáze může jinému uživateli udělit
- uživatelskou roli
- oprávnění k přístupu k jeho databázovému objektu
- oprávnění předávat přidělený přístup dalším
- role je množinou systémových nebo objektových oprávnění
+ vybraná objektová oprávnění
- `ALL PRIVILEGES`
- `CREATE`, `ALTER`, `DROP`
- `INSERT`, `UPDATE`, `DELETE`, `SELECT`
**Přidělení přístupu k objektům**
- příkazem `GRANT` je možné přidělit jednomu či více uživatelům
- jednu či více rolí
- jedno nebo více systémových oprávnění
- jedno nebo více oprávnění k jednomu DB objektu
- konstrukcí `IDENTIFIED BY` je možné nastavit heslo k přístupu
- konstrukcí `WITH ADMIN OPTION` možnost předávat přidělené systémové oprávnění dalším uživatelům
- konstrukcí `WITH GRANT OPTION` možnost předávat přidělené objektové oprávnění dalším uživatelům
```sql
GRANT UNLIMITED TABLESPACE TO zima;
GRANT SELECT ON osoby TO PUBLIC;
GRANT INSERT, UPDATE, DELETE ON osoby
TO rychlik WITH GRANT OPTION;
```
**Odebrání přístupu**
- příkazem `REVOKE` lze odebrat jednomu nebo více uživatelům
- jednu či více rolí
- jedno nebo více systémových oprávnění
- jedno nebo více oprávnění k jednomu DB objektu
- vždy možné odebrat
- ty role a oprávnění, která byla přidělena
- těm uživatelům, kterým byla přidělena
```sql
REVOKE UNLIMITED TABLESPACE FROM zima;
REVOKE SELECT ON osoby FROM PUBLIC;
REVOKE INSERT, UPDATE, DELETE ON osoby
FROM rychlik;
```