REM=================== SINTASSI BASE ===============
REM
REM ------------------------------------------------
REM Tutte le informazioni di ogni Studente.
REM ------------------------------------------------
SELECT Matricola, Nome, Cognome
FROM Studente;

REM ------------------------------------------------
REM Tutte le informazioni di ogni Studente.
REM ------------------------------------------------
SELECT * FROM Studente;

REM ------------------------------------------------
REM Nome di ogni Studente: la risposta contiene duplicati.
REM
REM **SQL tratta le tabelle come MULTIINSIEMI!**
REM
REM ------------------------------------------------
SELECT Nome
FROM Studente;

REM=================== MULTIINSIEMI ===============
REM
REM ------------------------------------------------
REM Nome di REM ogni Studente, senza duplicati.
REM
REM La selezione di tuple che non contengono un
REM attributo identificatore possono produrre duplicati
REM DISTINCT li elimina.
REM ------------------------------------------------
SELECT DISTINCT Nome
FROM Studente;

REM=================== PSEUDONIMI ===============
REM
REM ------------------------------------------------
REM Nome e Cognome di ogni Studente, ridenominando 
REM gli attributi nella tabella prodotta.
REM
REM **SQL ammette la difinzione di ALIAS di attributi:
REM   pseudonimi di nomi di attributi**
REM
REM ------------------------------------------------
SELECT Nome    as Nome_Studente, 
       Cognome as Cognome_Studente
FROM Studente;

REM ------------------------------------------------
REM Nome e Cognome di ogni Studente, ridenominando
REM la tabella Studente.
REM
REM **SQL ammette la difinzione di ALIAS di tabelle:
REM   pseudonimi di tabelle**
REM
REM ------------------------------------------------
SELECT S.Nome, S.Cognome
FROM Studente S;

REM ------------------------------------------------
REM Nome e Cognome di ogni Studente sfruttando
REM alias di attributi e tabelle.
REM ------------------------------------------------
SELECT S.Nome    as Nome_Studente, 
       S.Cognome as Cognome_Studente
FROM Studente S;

REM=================== PREDICATI DI SELEZIONE ======
REM
REM ------------------------------------------------
REM Cognome di coloro i quali si chiamano 'Rosy'.
REM ------------------------------------------------
SELECT Cognome
FROM Studente
WHERE Nome = 'Rosy' ;

REM ------------------------------------------------
REM Cognome di coloro i quali si chiamano 'Rosy' o 'Marco'.
REM ------------------------------------------------
SELECT Cognome
FROM Studente
WHERE Nome = 'Rosy' or Nome = 'Marco';


REM ------------------------------------------------
REM Codice dei corsi per cui e`
REM fissato un appello dopo il 
REM Natale 2001.
REM ------------------------------------------------
SELECT DISTINCT Corso
FROM Appello
WHERE DataEsame > '25-DEC-01';

REM ------------------------------------------------
REM Codice dei corsi per cui e`
REM fissato un appello dopo il
REM primo settembre 2001, ma prima del
REM Natale 2001.
REM ------------------------------------------------
SELECT DISTINCT Corso
FROM Appello
WHERE DataEsame > '01-SEP-01' and
      DataEsame < '25-DEC-01';


REM ------------------------------------------------
REM Cognomi degli studenti la cui matricola
REM appartiene ad un dato insieme.
REM ------------------------------------------------
SELECT Cognome 
FROM Studente
WHERE  Matricola IN (99000,99001);

REM ------------------------------------------------
REM Matricola degli studenti di cui non si
REM conosce la data della prenotazione
REM ad un appello.
REM 
REM **NON** si usa la normale uguaglianza (=) o
REM diseguaglianza (<>) perche` ogni istanza di
REM NULL e` diversa da tutte le altre
REM ------------------------------------------------
SELECT DISTINCT Studente
FROM Prenotazione
WHERE  Data IS NULL;

REM ------------------------------------------------
REM Matricola e data di prenotazione
REM degli studenti prenotati, che hanno
REM specificato la data.
REM ------------------------------------------------
SELECT DISTINCT Studente, Data
FROM Prenotazione
WHERE  Data IS NOT NULL;

REM================= PRODOTTI CARTESIANI, JOIN======
REM
REM ------------------------------------------------
REM Query errata in Oracle 8i:
REM il prodotto cartesiano di una tabella con se 
REM stessa **RICHIEDE** alias.
REM ------------------------------------------------
SELECT *
FROM Corso, Corso;

REM ------------------------------------------------
REM Prodotto cartesiano di Codice in una
REM copia della tabella Corso con Nome
REM nella seconda copia della tabella Corso.
REM ------------------------------------------------
SELECT C1.Codice, C2.Nome
FROM Corso C1, Corso C2;

REM ------------------------------------------------
REM Riproduzione di Corso come 
REM JOIN (stile THETA, come richesto da Oracle 8i)
REM di due copie di se stessa.
REM ------------------------------------------------
SELECT C1.Codice, C2.Nome
FROM Corso C1, Corso C2
WHERE C1.Codice = C2.Codice;

REM ------------------------------------------------
REM Corsi per cui e` indetto un 
REM esame (senza duplicati)
REM ------------------------------------------------
SELECT DISTINCT Nome
FROM   Corso, Appello
WHERE  Corso.Codice = Appello.Corso;

REM ------------------------------------------------
REM Nome e Cognome degli studenti che sono
REM iscritti ad un qualche appello.
REM ------------------------------------------------
SELECT DISTINCT Nome, Cognome
FROM Studente, Prenotazione
WHERE Studente.Matricola = Prenotazione.Studente;

REM ------------------------------------------------
REM Nome e Cognome degli studenti che sono
REM iscritti ad un qualche appello e Codice del
REM corso relativo.
REM ------------------------------------------------
SELECT DISTINCT Nome, Cognome, Corso
FROM   Studente, Prenotazione, Appello
WHERE  Studente.Matricola            = Prenotazione.Studente
AND    Prenotazione.AppelloDataEsame = Appello.DataEsame
AND    Prenotazione.AppelloCorso     = Appello.Corso;

REM ------------------------------------------------
REM Nome e Cognome degli studenti che sono
REM iscritti ad un qualche appello e Nome del
REM corso relativo.
REM ------------------------------------------------
SELECT DISTINCT S.Nome, Cognome, Corso.Nome
FROM Studente S, Prenotazione, Appello, Corso C 
WHERE S.Matricola                   = Prenotazione.Studente
AND   Prenotazione.AppelloDataEsame = Appello.DataEsame
AND   Prenotazione.AppelloCorso     = Appello.Corso
AND   Appello.Corso                 = C.Codice;

REM ------------------------------------------------
REM Nome e Cognome degli studenti che sono
REM iscritti al corso di nome Analisi II.
REM ------------------------------------------------
SELECT DISTINCT S.Nome, Cognome, Corso.Nome
FROM Studente S, Prenotazione, Appello, Corso C 
WHERE S.Matricola 		    = Prenotazione.Studente
AND   Prenotazione.AppelloDataEsame = Appello.DataEsame
AND   Prenotazione.AppelloCorso     = Appello.Corso
AND   Appello.Corso		    = C.Codice
AND   Corso.Nome = 'Analisi II';

REM ------------------------------------------------
REM Verifica che ogni occorrenza del valore NULL
REM e` diversa da ogni altra.
REM 
REM Sono elencate solo le matricole degli studenti
REM che hanno specificato data di iscrizione ad un
REM appello.
REM ------------------------------------------------
SELECT Studente
FROM Prenotazione P1, Prenotazione P2
WHERE P1.Data = P2.Data;
