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 ve FROM klauzuli určíme tabulku, která bude hodnotou tabulkového výrazu expr a bude se jmenovat name.
  • 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ínkou condition a jménem name. 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ínku condition
  • 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 a column1, 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ě:
    1. Získáme hodnoty výrazů expr1, expr2, …, které si označíme , , …
    2. Přejmenujeme každý atribut column relace na name1.column. Tím získáme relace , , …
    3. 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
    4. Dále se provede restrikce relace vzhledem k podmínce condition. Jako výsledek obdržíme relaci .
    5. Následuje projekce relace na {table1.column1, table2.column2, ...}. Obdržíme relaci
    6. Nakonec se provede přejmenování sloupce table1.column1 na column1, table2.column2 na column2, … Získáme výstupní relaci .

Předchozí: Výraz SELECT v SQL Následující: Integrita dat - primární a cizí klíč Celý okruh: 2. Informační technologie