# 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) ```