# SQL Interattivo
Qui sono riportate le istruzioni per eseguire interattivamente SQL sul proprio pc. ==NON è RICHIESTO IN ALCUN MODO SAPERLO FARE PER L'ESAME==, basta esercitarsi sul pdf del Prof. Campi. Questa è stata solo un'aggiunta, fatta vedere a lezione per rendere il tutto più interattivo e mostrare l'output delle Join.
In questo file sono anche riportati gli output per chi non riuscisse a eseguire il Docker, nell' [apposita sezione](#Query-e-risultati).
## Creazione Docker
Creare la seguente struttura di cartelle con i seguenti files:
```
interactive
├── Dockerfile
└── init.sql
```
Contenuto del file `Dockerfile`
```dockerfile=
FROM postgres:16
ENV POSTGRES_DB=demo
ENV POSTGRES_USER=demo
ENV POSTGRES_PASSWORD=demo
COPY init.sql /docker-entrypoint-initdb.d/
```
Contenuto del file `init.sql`
```sql=
-- Drop tables if they already exist (for re-runs)
DROP TABLE IF EXISTS Volo;
DROP TABLE IF EXISTS Aeroporto;
-- Create tables
CREATE TABLE Aeroporto (
Citta VARCHAR(50) PRIMARY KEY,
Nazione VARCHAR(50),
NumPiste INT
);
CREATE TABLE Volo (
IdVolo INT PRIMARY KEY,
GiornoSett VARCHAR(10),
CittaPar VARCHAR(50),
OraPart TIME,
CittaArr VARCHAR(50),
OraArr TIME,
TipoAereo VARCHAR(50)
);
-- Insert airports
INSERT INTO Aeroporto VALUES
('Roma', 'Italia', 3),
('Milano', 'Italia', 2),
('Parigi', 'Francia', 4),
('Londra', 'UK', 5);
-- Insert flights
INSERT INTO Volo VALUES
(1, 'Lunedi', 'Roma', '08:00', 'Milano', '09:00', 'A320'),
(2, 'Martedi','Roma', '10:00', 'Parigi', '12:00', 'A320'),
(3, 'Mercoledi','Milano','14:00', 'Londra', '16:00', 'B737'),
(4, 'Giovedi','Parigi', '09:00', 'Londra', '10:30', 'A320');
```
Creazione del container (da ambiente linux):
```bash=
sudo docker build -t interactive .
sudo docker run -d --name pg-demo interactive
```
## Query e risultati
Connessione al terminale del docker (solo se avete buildato il Docker, altrimenti sotto riporto query e expected output)
```bash=
sudo docker exec -it pg-demo psql -U demo -d demo
```
Query 1:
```sql
SELECT * FROM Aeroporto;
```
Output:
```bash
citta | nazione | numpiste
--------+---------+----------
Roma | Italia | 3
Milano | Italia | 2
Parigi | Francia | 4
Londra | UK | 5
(4 rows)
```
Query 2:
```sql
SELECT * FROM Volo;
```
Output:
```bash
idvolo | giornosett | cittapar | orapart | cittaarr | oraarr | tipoaereo
--------+------------+----------+----------+----------+----------+-----------
1 | Lunedi | Roma | 08:00:00 | Milano | 09:00:00 | A320
2 | Martedi | Roma | 10:00:00 | Parigi | 12:00:00 | A320
3 | Mercoledi | Milano | 14:00:00 | Londra | 16:00:00 | B737
4 | Giovedi | Parigi | 09:00:00 | Londra | 10:30:00 | A320
(4 rows)
```
Query 3:
```sql
SELECT * FROM (Aeroporto A1
JOIN Volo ON CittaPar = A1.Citta)
JOIN Aeroporto A2 ON CittaArr = A2.Citta;
```
Output:
```bash
citta | nazione | numpiste | idvolo | giornosett | cittapar | orapart | cittaarr | oraarr | tipoaereo | citta | nazione | numpiste
--------+---------+----------+--------+------------+----------+----------+----------+----------+-----------+--------+---------+----------
Roma | Italia | 3 | 1 | Lunedi | Roma | 08:00:00 | Milano | 09:00:00 | A320 | Milano | Italia | 2
Roma | Italia | 3 | 2 | Martedi | Roma | 10:00:00 | Parigi | 12:00:00 | A320 | Parigi | Francia | 4
Milano | Italia | 2 | 3 | Mercoledi | Milano | 14:00:00 | Londra | 16:00:00 | B737 | Londra | UK | 5
Parigi | Francia | 4 | 4 | Giovedi | Parigi | 09:00:00 | Londra | 10:30:00 | A320 | Londra | UK | 5
(4 rows)
```
==NOTA==: anche se non è indicata nell'output, il programma disambigua le colonne con lo stesso nome con la notazione puntata! Infatti:
```sql=
SELECT Citta FROM (Aeroporto A1
JOIN Volo ON CittaPar = A1.Citta)
JOIN Aeroporto AS A2 ON A2.Citta = CittaArr;
```
Ritorna
```bash=
ERROR: column reference "citta" is ambiguous
LINE 1: SELECT Citta FROM (Aeroporto A1
^
```
Che posso risolvere con
```sql=
SELECT A1.Citta FROM (Aeroporto A1
JOIN Volo ON CittaPar = A1.Citta)
JOIN Aeroporto AS A2 ON A2.Citta = CittaArr;
```
Che ritorna
```bash=
citta
--------
Roma
Roma
Milano
Parigi
(4 rows)
```