Výraz sjednocení
- Hodnota výrazu sjednocení, označme . Tělo je sjednocením těl a
- Sjednocení dvou relací (tabulek) vrací množinu všech řádků, které jsou obsaženy alespoň v jedné z relací. Výsledná tabulka neobsahuje duplicitní řádky.
- Podmínky: Relace musí mít stejný počet sloupců a odpovídající sloupce musí mít kompatibilní datové typy.
( expr1 UNION expr2 )
- Např. pro tabulky:
TABLE movies1; | TABLE movies2;
title | year | title | year
--------------+------ | --------------+------
The Matrix | 1999 | The Matrix | 1999
The Avengers | 2012 | The Avengers | 1998
(2 rows) | (2 rows)
- Můžeme provést jejich sjednocení:
( TABLE movies1 ) UNION ( TABLE movies2 );
title | year
--------------+------
The Avengers | 1998
The Avengers | 2012
The Matrix | 1999
(3 rows)
Výraz průniku
- Hodnotu výrazu průniku označme . Tělo je průnikem těl a .
- Průnik dvou relací vrací množinu všech řádků, které jsou obsaženy v obou relacích.
- Podmínky: Relace musí mít stejný počet sloupců a odpovídající sloupce musí mít kompatibilní datové typy.
( expr1 INTERSECT expr2 )
- Pro tabulky ze sjednocení můžeme provést:
( TABLE movies1 ) INTERSECT ( TABLE movies2 );
title | year
------------+------
The Matrix | 1999
(1 row)
Výraz rozdíl
- Hodnotu výrazu rozdílu označme . Tělo je množinovým rozdílem těl a .
- Rozdíl dvou relací vrací množinu všech řádků, které jsou obsaženy v první relaci, ale nejsou obsaženy ve druhé relaci.
- Pro tabulku ze sjednocení můžeme provést:
( TABLE movies1 ) EXCEPT ( TABLE movies2 );
title | year
--------------+------
The Avengers | 2012
Skládání relačních výrazů
- Relační výrazy můžeme i skládat.
( ( TABLE movies1 ) EXCEPT ( TABLE movies2 ) )
UNION
( ( TABLE movies2 ) EXCEPT ( TABLE movies1 ) );
title | year
--------------+------
The Avengers | 2012
The Avengers | 1998
(2 rows)
Výrazy ve FROM
klauzuli
- Výrazem
expr AS name
veFROM
klauzuli určíme tabulku, která bude hodnotou tabulkového výrazuexpr
a bude se jmenovatname
. - Například:
TABLE movies1; | TABLE movies2;
title | year | title | year
--------------+------ | --------------+------
The Matrix | 1999 | The Matrix | 1999
The Avengers | 2012 | The Avengers | 1998
(2 rows) | (2 rows)
SELECT DISTINCT year
FROM ( ( TABLE movies1 )
UNION
( TABLE movies2 ) ) AS movies;
year
------
2012
1998
1999
(3 rows)
Restrikce
- Je dán relační výraz
expr
s podmínkoucondition
a jménemname
. Pak
( SELECT *
FROM expr AS name
WHERE condition )
- je relační výraz
restrikce
. - Hodnotou výrazu
expr
si označíme . Hodnotou výrazu restrikce je relace . Řádek bude v těle , právě když je v těle a splňuje podmínkucondition
- Například:
TABLE movies;
title | year | length
-----------------+------+--------
The Matrix
The Avengers
The Avengers
A Space Odyssey | 1968 | 149
(4 rows)
SELECT *
FROM ( TABLE movies ) AS t
WHERE title = 'The Avengers';
title | year | length
--------------+------+--------
The Avengers | 2012 | 143
The Avengers | 1998 | 89
(2 rows)
Výraz můžeme ještě zjednodušit:
SELECT *
FROM movies
WHERE title = 'The Avengers';
title | year | length
--------------+------+--------
The Avengers | 2012 | 143
The Avengers | 1998 | 89
(2 rows)
Projekce
- Projekce je operace, která vybírá určité sloupce (atributy) z tabulky (relace) a vrací novou tabulku obsahující pouze tyto sloupce.
- Tato operace redukuje počet sloupců v relaci a může také odstranit duplikátní tuple.
( SELECT DISTINCT A1, . . ., Am FROM expr AS name )
- Například:
TABLE movies;
title | year | length
--------------------+------+--------
The Matrix | 1999 | 136
The Avengers | 2012 | 143
The Avengers | 1998 | 89
A Space Odyssey | 1968 | 149
(4 rows)
SELECT DISTINCT title
FROM ( TABLE movies ) AS m;
title
-----------------
The Matrix
The Avengers
A Space Odyssey
(3 rows)
- Zjednošuděně:
SELECT DISTINCT title
FROM movies;
title
-----------------
The Matrix
The Avengers
A Space Odyssey
(3 rows)
Přirozené spojení
- Přirozené spojení je operace, která kombinuje dvě tabulky na základě společných atributů (sloupců).
- Přirozené spojení automaticky porovnává všechny sloupce, které mají stejný název v obou tabulkách, a vrací pouze ty řádky, které se shodují ve všech těchto sloupcích.
SELECT table1.*,
table2.column1,
table2.column2
...
FROM expr1 AS table1,
expr2 AS table2
WHERE table1.column1 = table2.column1
AND table1.column2 = table2.column2
...
- Například:
# TABLE movies; | # TABLE casting;
movie_title | movie_year | actor_name | movie_title | movie_year
------------+----------- | ------------------+-------------+-----------
The Matrix | 1999 | Keano Reeves | The Matrix | 1999
Dracula | 1992 | Keano Reeves | Dracula | 1992
(2 rows) | Laurence Fishburne| The Matrix | 1999
| Gary Oldman | Dracula | 1992
| (4 rows)
SELECT m.*, c.actor_name
FROM ( TABLE movies ) AS m,
( TABLE casting ) AS c
WHERE m.movie_title = c.movie_title
AND m.movie_year = c.movie_year;
movie_title | movie_year | actor_name
------------+------------+----------------
Dracula | 1992 | Keano Reeves
Dracula | 1992 | Gary Oldman
The Matrix | 1999 | Keano Reeves
The Matrix | 1999 | Laurence Fishburne
(4 rows)
- Můžeme zkrátit:
SELECT m.*, c.actor_name
FROM movies AS m, casting AS c
WHERE m.movie_title = c.movie_title
AND m.movie_year = c.movie_year;
Přejmenování atributů
- Přejmenování je unární operace, která změní název jednoho nebo více sloupců (atributů) v relaci.
- Tato operace se často používá v kombinaci s jinými operacemi pro zjednodušení nebo zpřehlednění dotazů.
- Například:
TABLE movies;
title | year
------------+------
The Matrix | 1999
Dracula | 1992
(2 rows)
SELECT title AS movie_title,
year AS movie_year
FROM ( TABLE movies ) AS m;
movie_title | movie_year
-------------+------------
The Matrix | 1999
Dracula | 1992
- Zjednodušeně:
SELECT title AS movie_title,
year AS movie_year
FROM movies;
SELECT
jako relační výraz
Uvažujme obecný SELECT
výraz:
( SELECT DISTINCT
table1.column1 AS 'column1',
table2.column2 AS 'column2',
...
FROM
(expr1) AS name1,
(expr2) AS name2,
...
WHERE condition )
- Pokud
expr1
,expr2
, … jsou relační výrazy acolumn1
,column2
, … jsou po dvou různé názvy sloupců, pak hodnotou výrazu je opět relace. - Hodnotu výrazu můžeme spočítat pomocí relačních operací následovně:
- Získáme hodnoty výrazů
expr1
,expr2
, …, které si označíme , , … - Přejmenujeme každý atribut
column
relace naname1.column
. Tím získáme relace , , … - Spočítáme spojení , , … Vzhledem k tomu, že každé dvě relace nemají žádný společný název sloupce, bude se jednat o kartézský součin. Získáme relaci
- Dále se provede restrikce relace vzhledem k podmínce
condition
. Jako výsledek obdržíme relaci . - Následuje projekce relace na
{table1.column1, table2.column2, ...}
. Obdržíme relaci - Nakonec se provede přejmenování sloupce
table1.column1
nacolumn1
,table2.column2
nacolumn2
, … Získáme výstupní relaci .
- Získáme hodnoty výrazů
Navigace
Předchozí: Výraz SELECT v SQL Následující: Integrita dat - primární a cizí klíč Celý okruh: 2. Informační technologie