SELECT Statement

Le SELECT statements secondo lo standard ANSI SQL:1999 (American National Standards Institute) hanno la seguente sintassi:

SELECT table1.column, table2.column
FROM table1
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name1, nome_colonna2)] |
[JOIN table2 ON (table1.column_name = table2.column_name and table1.column_name2 = table2.column_name2)] |
[LEFT | RIGHT | FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)] |
[CROSS JOIN table2];

La sintassi tradizionale di Oracle attinente alle join è la seguente:

SELECT table1.column, table2.column
FROM table1, table2
[WHERE (table1.column_name = table2.column_name)] |
[WHERE (table1.column_name(+)= table2.column_name)] |        -- RIGHT OUTER JOIN
[WHERE (table1.column_name) = table2.column_name) (+)] ;    -- LEFT OUTER JOIN

NATURAL JOIN tutte le colonne della tabella source e target che hanno lo stesso nome sono automaticamente associate pertanto non è necessario specificare le colonne in join.
Se le due tabelle non hanno colonne in comune risulta un prodotto cartesiano.
E' come scrivere: select * from tabella1, tabella2;
Un altro problema è che le colonne con stesso nome potrebbero non avere nessuna relazione tra loro o avere tipi di dati non compatibili.
Se si vuole selezionare solo alcune colonne in comune usare la clausola JOIN....ON o USING , che permette la join anche su colonne che hanno nome diverso. Si parla di INNER JOIN.
OUTER JOIN può essere utilizato per estrarre righe che hanno valori della colonna di join della tabella source a NULL o non presente in tabella target.
Ad esempio se table1 e table2 sono in realazione tramite la colonna "column_id", la sintassi OUTER JOIN  restituisce anche le righe della tabella source (table1) che hanno valori nulli in column_id o valori non presenti in tabella target (table2).
Restituisce in più le righe escluse da una INNER JOIN.
LEFT OUTER JOIN restituisce in aggiutna al risultato di una inner join, le righe dalla tabella source escluse dalla inner join.
RIGHT OUTER JOIN restituisce in aggiunta al risultato di una inner join, le righe dalla tabella target escluse dalla inner join.
FULL OUTER JOIN restituisce in aggiunta al risultato di una inner join le righe della tabella source e target escluse dalla inner join.
CROSS JOIN restituisce il prodotto delle righe delle tabelle in join; restituisce una matrice. Se la table1 ha 5 righe e table2 ha 7 righe, la cross join restituisce 35 righe.

Quando si hanno più tabelle in JOIN, queste vengono valutate da sinistra a destra. Di seguito la condizione JOIN..ON in più tabelle.

select *
from tabella1 a
join tabella2 b using (colonna_X)
join tabella3 c using (colonna_Y)
join tabella4 d using (colonna_Z);

select *
from tabella1 a
join tabella2 b on (b.colonna_X = a.colonna_X)
join tabella3 c on (c.colonna_Y = b.colonna_Y)
join tabella4 d on (d.colonna_Z = c.colonna_Z);

NONEQUIJOIN è una condizione di join contenente un operatore non di uguaglianza (=) tra le tabelle impattate. Ad esempio l'operatore BETWEEN per selezionare gli impiegati con salari all'interno di un intervallo.

SELECT e.last_name, e.salary, j.grade_level
FROM employees e JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal;

La SELECT Statement comprende tre concetti alla base della teoria relazionale del database:

  1. PROJECTION  è una restrizione della colonne selezionate rispetto a quelle disponibili. Ad esempio se dalla tabella hr.countries si seleziona solo la colonna country_name invece di country_name, region_id e country_id.
  2. SELECTION   è una restrizione delle tuple o righe selezionate rispetto a quelle disponibili. Ad esempio selezionare dalla tabella hr.countries solo le righe con region_id = 1.
  3. JOINING        fa riferimento alla relazione tra le tabelle.

Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database