Esercitazione 3 SQL.

Documenti analoghi
Esercitazione 3 SQL.

Basi di Dati. Esercitazione 2: Interrogazioni in SQL. K. Donno - Interrogazioni in SQL

Esercitazione 3 SQL.

Basi di Dati. Esercitazione 3: Interrogazioni in SQL. K. Donno - Interrogazioni in SQL

Esercitazione 2 SQL.

Esercitazione 4 SQL.

Basi di Dati. Esercitazione 1: Interrogazioni in SQL. K. Donno - Interrogazioni in SQL

Corso di. Basi di Dati I. 11. Esercitazioni in SQL: Altri esercizi

formulare in SQL una interrogazione per ciascuno dei seguenti punti:

3. Selezionare i nomi dei clienti che iniziano con le lettere P, Q, R, S

Basi di Dati. Esercitazione SQL. 17 novembre 2011

Business Intelligence

SQL - Structured Query Language

Tipi di sottoquery SQL

Basi di dati Corso di Laurea in Informatica Umanistica

SQL - Elementi più avanzati

Basi di Dati. Esercitazione SQL. Paolo Papotti. 19 maggio 2005

QL (Query Language) Alice Pavarani

BASE DI DATI. Esercitazione: Campionato italiano 2015/2016 Raggruppamenti Nidificazione. Informatica Umanistica Università di Pisa

Sia dato il seguente schema di base di dati:

Laboratorio di Basi di Dati

BASE DI DATI. Esercitazione: Campionato italiano 2015/2016 Raggruppamenti Nidificazione. Informatica Umanistica Università di Pisa

SQL: le funzioni di aggregazione

Query SQL - Combinare più tabelle

Esercitazione 2 SQL.

Structured Query Language

SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

4.SQL QUERY. Fare una query significa fare delle ricerche sul nostro database.

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

SQL - Structured Query Language

ed SQL 10 Novembre 2009

BASE DI DATI. Esercizi Progettazione concettuale Progettazione logica Concetti avanzati SQL: Raggruppamento Nidificazione

SQL. Argomenti della lezione. Join esplicito. Interrogazioni complesse in SQL join esplicito outer join operatori aggregati interrogazioni nidificate

Basi di Dati Corso di Laura in Informatica Umanistica

Prova Pratica di Informatica, Modulo Basi di dati Appello 23/07/2018

Basi di Dati: Corso di laboratorio

Select From Where...

formulare in SQL una interrogazione per ciascuno dei seguenti punti:

Query SQL - singola tabella

Interrogazioni complesse. SQL avanzato 1

Select Anagrafiche, Movimenti From Descrizione? Where Anagrafiche.Codice=Codice And Cognome=' Bianchi ';

Linguaggio SQL seconda parte

Operatori aggregati: COUNT

Interrogazioni Interrogazioni in SQL } L'istruzione base dell'sql per costruire interrogazioni di complessita arbitraria e lo statement SELECT } Sinta

Query SQL - singola tabella

BASE DI DATI. Concetti trattati: Funzioni aggregate Raggruppamenti Nidificazione Viste. Informatica Umanistica Università di Pisa

Eprogram ITIS V anno Unità 4 - Il linguaggio SQL

Basi di Dati: Corso di laboratorio

Progettazione di Sistemi Informatici

Basi di Dati Corso di Laura in Informatica Umanistica

Basi di Dati. Esercitazione SQL. 18 maggio 2007

SQL Esercizi DML Blocco 1

Sistemi di Elaborazione delle Informazioni

SQL /10/2016 Basi di dati - SQL 1

Lezioni di Laboratorio sui Data Base

Esempi SQL con Access. Orazio Battaglia

Interrogazioni semplici

Corso di Laurea in Ingegneria Informatica Fondamenti di Informatica II Modulo Basi di dati a.a

Join esplicito. SELECT con join esplicito, sintassi. Ulteriore estensione: join naturale (meno diffuso) Outer join. Join esterno: "outer join"

SQL - Sottointerrogazioni correlate

BASE DI DATI. Concetti trattati: Funzioni aggregate Raggruppamenti Nidificazione Viste. Informatica Umanistica Università di Pisa

Basi di dati (4) Docente: Andrea Bulgarelli. Università di Modena e Reggio Emilia. Argomento: select (1.

Prova Scritta di Basi di Dati

Basi di dati I Prova di autovalutazione 30 ottobre 2014

Lezione 7 SQL (II) Basi di dati bis Docente Mauro Minenna Pag.1

ESERCITAZIONE 4 Giovedì 13 novembre 2014 (3 ore) SQL

Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor

SQL Esempi. 24/10-7/11/2016 Basi di dati - SQL 1

McGraw-Hill. Soluzioni degli esercizi. Tutti i diritti riservati. Capitolo SELECT Neg_Nome FROM Negozi. 2. SELECT Neg_Cod FROM Ordini

IL LINGUAGGIO SQL LE BASI

Laboratorio di Basi di dati/web/mm e Basi di dati per Bioinformatica

Corso di. Basi di Dati I. 8. Esercitazioni in SQL: Interrogazioni nidificate

Basi di dati I Esercizi proposti il 24 ottobre 2016

Il formato di base di un interrogazione in SQL è: SELECT R i1.c 1, R i2.c 2,..., R in.c n FROM R 1, R 2,..., R k WHERE F;

Docente: Alberto Belussi e Carlo Combi. Lezione 4

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

Tabelle esempio: Impiegato/Dipartimento

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

Operazioni. Lezione 8. Operazioni Relazionali. Operazioni insiemistiche Intersezione: Operazioni insiemistiche Unione:

SQL Esempi /10/2017 Basi di dati - SQL 1

Laboratorio di Basi di dati

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, SQL

Basi di dati I Prova di autovalutazione 1 novembre 2016 Soluzioni

E possibile ordinare le righe del risultato di una interrogazione attraverso la clausola order by, a chiusura di una interrogazione.

Interrogazioni nidificate

V. Moriggia Modelli di Base Dati. Modelli di Base Dati. a.a. 2001/

SELECT s.nome, e.data Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

Basi di dati - Laboratorio

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

Il programma di oggi. Gli indici. Ottimizzazione. Metodi per la Gestione dei Dati (lezioni di laboratorio)

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Operatori aggregati. Operatori aggregati. Interrogazioni con raggruppamento. Interrogazioni con raggruppamento

SELECT s.nome, e.data FROM Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

Interrogazioni nidificate

SQL Matteo Magnani, Danilo Montesi Università di Bologna SQL. SQL come Data Manipulation Language - (SELECT FROM WHERE ORDER BY)

Transcript:

Esercitazione 3 SQL foglia@iet.unipi.it

DB Riferimento Consideriamo i seguenti schemi di una base di dati relazionale: MODELLI (cod_modello,nome,versione,cod_fabbrica) VEICOLI (targa,cilindrata,cavalli_fiscali,velocita,posti,data_immatricolazione,cod_ modello,cod_categoria) FABBRICHE (cod_fabbrica,nome,num_modelli_prodotti) CATEGORIE (cod_categoria,nome) PROPRIETARI (codice_fiscale,cognome,nome,indirizzo,citta,provincia,cap) PROPRIETA (targa,codice_fiscale,data_acquisto,data_cessione) Viene data la seguente istanza della base di dati:

DB Riferimento Il database ha il seguente schema relazionale:

Selezionare nome e codice di tutti i Modelli SELECT nome, cod_modello FROM modelli Rinominare le colonne nome, cod_modello in Nome Modello e Codice Modello SELECT nome AS "Nome Modello", cod_modello AS "Codice Modello" FROM modelli E equivalente a: SELECT nome "Nome Modello", cod_modello "Codice Modello" FROM modelli

ES 1 1. Selezionare cognome, nome e indirizzo dei proprietari residenti nella provincia di Pisa 2. Fornire targa, nome e cognome dei proprietari, dei veicoli i cui proprietari risiedono nella provincia di Milano 3. Fornire targa, nome e cognome dei proprietari, dei veicoli i cui proprietari risiedono nella provincia di Torino, trovare solo i veicoli attualmente in possesso

Selezionare cognome, nome e indirizzo dei proprietari residenti nella provincia di Pisa: SELECT cognome, nome, indirizzo FROM proprietari WHERE provincia = 'PI ;

Fornire targa, nome e cognome dei proprietari, dei veicoli i cui proprietari risiedono nella provincia di Milano: SELECT proprieta.targa, proprietari.nome, proprietari.cognome FROM proprieta, proprietari WHERE proprieta.codice_fiscale = proprietari.codice_fiscale AND proprieta.codice_fiscale IN ( SELECT codice_fiscale FROM proprietari WHERE provincia = 'MI'); Oppure: SELECT proprieta.targa, proprietari.nome, proprietari.cognome FROM proprieta, proprietari WHERE proprieta.codice_fiscale = proprietari.codice_fiscale AND provincia = 'MI'; Oppure: SELECT proprieta.targa, proprietari.nome, proprietari.cognome FROM proprieta INNER JOIN proprietari ON proprieta.codice_fiscale = proprietari.codice_fiscale WHERE proprietari.provincia = 'MI'; Oppure: SELECT targa, nome, cognome FROM proprieta NATURAL JOIN proprietari WHERE provincia = 'MI';

Fornire targa, nome e cognome dei proprietari, dei veicoli i cui proprietari risiedono nella provincia di Torino, trovare solo i veicoli attualmente in possesso SELECT proprieta.targa, proprietari.nome, proprietari.cognome FROM proprieta, proprietari WHERE proprieta.codice_fiscale = proprietari.codice_fiscale AND proprieta.data_cessione IS NULL AND proprieta.codice_fiscale IN ( SELECT codice_fiscale FROM proprietari WHERE provincia = TO'); Oppure SELECT targa, nome, cognome FROM proprieta NATURAL JOIN proprietari WHERE data_cessione IS NULL AND provincia = 'TO';

ES 2 1. Calcolare il numero dei modelli prodotti da ciascuna fabbrica, ma solo per le fabbriche con almeno 2 modelli 2. Visualizzare per ciascun veicolo la targa, il codice e il nome della categoria 3. Visualizzare il nome delle fabbriche che producono il modello PUNTO

Calcolare il numero dei modelli prodotti da ciascuna fabbrica, ma solo per le fabbriche con almeno 2 modelli: SELECT cod_fabbrica, COUNT(*) AS Numero modelli FROM modelli GROUP BY cod_fabbrica HAVING COUNT(*) >= 2; Visualizzare per ciascun veicolo la targa, il codice e il nome della categoria: SELECT targa, categorie.cod_categoria, categorie.nome as Nome Categoria FROM veicoli, categorie WHERE veicoli.cod_categoria = categorie.cod_categoria; Oppure SELECT targa, categorie.cod_categoria, categorie.nome as "Nome Categoria" FROM veicoli NATURAL JOIN categorie; Oppure SELECT targa, categorie.cod_categoria, categorie.nome as "Nome Categoria FROM veicoli JOIN categorie ON veicoli.cod_categoria = categorie.cod_categoria;

Visualizzare il nome delle fabbriche che producono il modello PUNTO : SELECT fabbriche.nome FROM modelli, fabbriche WHERE modelli.cod_fabbrica = fabbriche.cod_fabbrica AND modelli.nome = 'PUNTO ; Oppure SELECT fabbriche.nome FROM modelli INNER JOIN fabbriche ON modelli.cod_fabbrica = fabbriche.cod_fabbrica WHERE modelli.nome = 'PUNTO ; Così non va bene (nome ambiguo) -> errore SELECT nome FROM modelli INNER JOIN fabbriche ON modelli.cod_fabbrica = fabbriche.cod_fabbrica WHERE modelli.nome = 'PUNTO'; Perché in questo caso il NATURAL JOIN non può essere usato?? Perché tra le relazioni modelli e fabbriche ci sono attributi con lo stesso nome che non sono chiave.

ES 3 1. Visualizzare per ogni categoria il numero di veicoli 2. Visualizzare le targhe dei veicoli immatricolati dopo il 1 gennaio 1995 3. Visualizzare le targhe dei veicoli immatricolati nel 2001

Visualizzare per ogni categoria il numero di veicoli: SELECT categorie.nome, COUNT(*) AS Numero veicoli FROM veicoli, categorie WHERE veicoli.cod_categoria = categorie.cod_categoria GROUP BY categorie.nome; Oppure SELECT categorie.nome, COUNT(*) AS Numero veicoli FROM veicoli INNER JOIN categorie ON veicoli.cod_categoria = categorie.cod_categoria GROUP BY categorie.nome; Oppure SELECT categorie.nome, COUNT(*) AS "Numero veicoli" FROM veicoli NATURAL JOIN categorie GROUP BY categorie.nome;

Visualizzare le targhe dei veicoli immatricolati dopo il 1 gennaio 1995 SELECT targa FROM veicoli WHERE data_immatricolazione > '1995-01-01 ; Visualizzare le targhe dei veicoli immatricolati nel 2001 SELECT targa FROM veicoli WHERE data_immatricolazione < '2001-12-31' AND data_immatricolazione > '2001-01- 01 ; Oppure SELECT targa FROM veicoli WHERE data_immatricolazione BETWEEN '2001-01-01 AND '2001-12-31 ; Oppure SELECT targa FROM veicoli WHERE YEAR(data_immatricolazione) = 2001;

INTERSECT/EXCEPT Selezionare i cognomi dei proprietari che sono anche nomi (di qualche proprietario) SELECT cognome FROM proprietari INTERSECT SELECT nome FROM proprietari Selezionare i nomi dei proprietari che non sono anche cognomi (di qualche proprietario) SELECT nome FROM proprietari EXCEPT SELECT cognome FROM proprietari

INTERSECT/EXCEPT in MySQL MySQL non implementa le operazioni INTERSECT/EXCEPT Queste operazioni possono essere comunque implementate usando IN o NOT IN

Selezionare i cognomi dei proprietari che sono anche nomi (di qualche proprietario) SELECT distinct cognome FROM proprietari WHERE cognome IN (SELECT nome FROM proprietari); Selezionare i nomi dei proprietari che non sono anche cognomi (di qualche proprietario) SELECT distinct nome FROM proprietari WHERE nome NOT IN (SELECT cognome FROM proprietari);

ES 4 1. Selezionare i veicoli la cui targa ha un 2 come quarto carattere 2. Selezionare i veicoli la cui targa inizia o termina con la lettera A 3. Trovare i modelli con cilindrata inferiore a 1400 che non sono prodotti dalla fabbrica con codice 001 4. Selezionare tutti i veicoli con cilindrata inferiore a tutte le cilindrate dei veicoli con modello 002 (quindi inferiore alla più bassa di queste cilindrate)

Selezionare i veicoli la cui targa ha un 2 come quarto carattere: SELECT * FROM veicoli WHERE targa LIKE 2% ; Selezionare i veicoli la cui targa inizia o termina con la lettera A: SELECT * FROM veicoli WHERE targa LIKE 'A%' OR targa LIKE '%A ; NOTA: _ rappresenta un confronto con un carattere arbitrario % rappresenta un confronto con una stringa di lunghezza arbitraria (eventualmente nulla)

Trovare i modelli con cilindrata inferiore a 1400 che non sono prodotti dalla fabbrica con codice 001 SELECT cod_modello FROM veicoli WHERE cilindrata < 1400 AND cod_modello <> ALL [NOT IN] (SELECT cod_modello FROM modelli WHERE cod_fabbrica='001'); NOTA: <>ALL è equivalente a NOT IN

Selezionare tutti i veicoli con cilindrata inferiore a tutte le cilindrate dei veicoli con modello 002 (quindi inferiore alla più bassa di queste cilindrate) SELECT * FROM veicoli WHERE cilindrata < ALL (SELECT cilindrata FROM veicoli WHERE cod_modello= 002 ); Oppure SELECT * FROM veicoli WHERE cilindrata < (SELECT MIN(cilindrata) FROM veicoli WHERE cod_modello= 002 );

ES 5 1. Fornire l elenco dei veicoli del proprietario con codice fiscale RSSBNA71G02A403J' specificando la targa, il nome della categoria ed il nome del modello 2. Fornire l elenco dei veicoli attualmente in possesso del proprietario con codice fiscale 'RSSBNA71G02A403J' specificando la targa, il nome della categoria ed il nome del modello

Fornire l elenco dei veicoli del proprietario con codice fiscale RSSBNA71G02A403J' specificando la targa, il nome della categoria ed il nome del modello: SELECT v.targa as Targa, m.nome as Nome Modello, c.nome as Nome categoria FROM veicoli v, modelli m, categorie c WHERE v.cod_modello = m.cod_modello AND v.cod_categoria = c.cod_categoria AND v.targa IN (SELECT targa FROM proprieta WHERE codice_fiscale = 'RSSBNA71G02A403J'); Oppure: SELECT v.targa as Targa, m.nome as Nome Modello, c.nome as Nome Categoria FROM veicoli v INNER JOIN modelli m ON v.cod_modello = m.cod_modello INNER JOIN categorie c ON v.cod_categoria = c.cod_categoria WHERE v.targa IN (SELECT targa FROM proprieta WHERE codice_fiscale = 'RSSBNA71G02A403J');

Fornire l elenco dei veicoli attualmente in possesso del proprietario con codice fiscale 'RSSBNA71G02A403J' specificando la targa, il nome della categoria ed il nome del modello SELECT v.targa as Targa, c.nome as Nome Categoria, m.nome as Nome Modello FROM veicoli v, modelli m, categorie c WHERE v.cod_modello = m.cod_modello AND v.cod_categoria = c.cod_categoria AND v.targa IN (SELECT targa FROM proprieta WHERE codice_fiscale = 'RSSBNA71G02A403J' AND data_cessione IS NULL); Oppure: SELECT v.targa as Targa, c.nome as Nome Categoria, m.nome as Nome Modello FROM veicoli v JOIN modelli m ON v.cod_modello = m.cod_modello JOIN categorie c ON v.cod_categoria = c.cod_categoria WHERE v.targa IN (SELECT targa FROM proprieta WHERE codice_fiscale = 'RSSBNA71G02A403J' AND data_cessione IS NULL);

ES 6 1. Selezionare i nomi dei modelli che hanno cilindrata maggiore della media 2. Selezionare il codice fiscale di tutti gli attuali possessori di veicoli che hanno un numero di cavalli fiscali maggiore della media 3. Selezionare il nome dei proprietari e la targa dei dei veicoli che hanno avuto due proprietari 4. Trovare i nomi di tutte le categorie per cui è presente almeno un veicolo

Selezionare i nomi dei modelli che hanno cilindrata maggiore della media SELECT DISTINCT nome FROM modelli NATURAL JOIN veicoli WHERE cilindrata > (SELECT AVG(cilindrata) FROM veicoli); Oppure: SELECT DISTINCT nome FROM modelli JOIN veicoli USING(cod_modello) WHERE cilindrata > (SELECT AVG(cilindrata) FROM veicoli); Oppure: SELECT DISTINCT nome FROM modelli JOIN veicoli ON modelli.cod_modello=veicoli.cod_modello WHERE cilindrata > (SELECT AVG(cilindrata) FROM veicoli);

Selezionare il codice fiscale di tutti gli attuali possessori di veicoli che hanno un numero di cavalli fiscali maggiore della media SELECT codice_fiscale FROM proprieta JOIN veicoli USING(targa) WHERE data_cessione IS NULL AND cavalli_fiscali > (SELECT AVG(cavalli_fiscali) FROM veicoli); Oppure: SELECT codice_fiscale FROM proprieta NATURAL JOIN veicoli WHERE data_cessione IS NULL AND cavalli_fiscali > (SELECT AVG(cavalli_fiscali) FROM veicoli);

Selezionare il nome dei proprietari, la targa dei dei veicoli e l inizio e la fine di ciascun periodo di proprietà per i veicoli che hanno avuto due o piu proprietari, ordinati dal primo all ultimo SELECT nome, targa, data_acquisto AS inizio, data_cessione AS fine FROM proprieta NATURAL JOIN proprietari WHERE targa IN (SELECT targa FROM proprieta GROUP BY targa HAVING COUNT(*) >= 2) ORDER BY data_acquisto; Oppure (con exists e passaggio di binding NON VISTO): SELECT nome, targa, data_acquisto AS inizio, data_cessione AS fine FROM proprieta AS pro NATURAL JOIN proprietari AS prop WHERE EXISTS (SELECT * FROM proprieta WHERE targa = pro.targa HAVING COUNT(*) >= 2) ORDER BY data_acquisto;

Trovare i nomi di tutte le categorie per cui è presente almeno un veicolo SELECT nome FROM categorie WHERE cod_categoria =ANY (SELECT cod_categoria FROM veicoli); Oppure SELECT nome FROM categorie WHERE cod_categoria IN (SELECT cod_categoria FROM veicoli); Oppure (con exists e passaggio di binding NON VISTO): SELECT nome FROM categorie AS c WHERE EXISTS (SELECT * FROM veicoli AS v WHERE c.cod_categoria = v.cod_categoria );

ES 7 1. Recuperare le fabbriche che producono almeno un modello di auto che ha una velocita maggiore di 200 2. Recuperare il valor medio del numero di passaggi di proprieta per ogni veicolo (subquery nel from o con le viste) 3. Elencare (se esistono) i proprietari che hanno almeno un autoveicolo (cat 01) e un ciclomotore (cat 03) 4. Recuperare il tempo medio dopo cui un veicolo viene venduto

Recuperare il nome delle fabbriche che producono almeno un modello di auto che ha una velocita maggiore di 200 SELECT DISTINCT f.nome FROM fabbriche AS f INNER JOIN modelli AS m ON f.cod_fabbrica = m.cod_fabbrica WHERE m.cod_modello IN ( SELECT v.cod_modello FROM veicoli AS v WHERE v.velocita >= 200 ); Oppure (con passaggio di binding ed EXISTS) : SELECT DISTINCT f.nome FROM fabbriche AS f INNER JOIN modelli AS m ON f.cod_fabbrica = m.cod_fabbrica WHERE EXISTS( SELECT * FROM veicoli AS v WHERE m.cod_modello = v.cod_modello AND v.velocita >= 200 );

Recuperare il valor medio del numero di passaggi di proprieta per ogni veicolo Soluzione con SELECT nel FROM SELECT AVG(conto.passaggi) FROM ( SELECT v.targa, COUNT(*) AS passaggi FROM veicoli AS v NATURAL JOIN proprieta AS p GROUP BY v.targa ) AS conto Nota: si Può fare con una vista.

Elencare (se esistono) i proprietari che hanno almeno un autoveicolo (cat 01) e un ciclomotore (cat 03) SELECT cognome, nome FROM proprietari WHERE codice_fiscale IN (SELECT codice_fiscale FROM veicoli v JOIN proprieta p ON v.targa = p.targa WHERE v.cod_categoria = '01') AND codice_fiscale IN (SELECT codice_fiscale FROM veicoli v JOIN proprieta p ON v.targa = p.targa WHERE v.cod_categoria = '03');

Elencare (se esistono) i proprietari che hanno almeno un autoveicolo (cat 01) e un ciclomotore (cat 03) SOLUZIONE CON PASSAGGIO di Binding ed EXISTS NON VISTO a LEZIONE SELECT cognome, nome FROM proprietari AS p WHERE EXISTS( SELECT * FROM veicoli NATURAL JOIN proprieta WHERE p.codice_fiscale = codice_fiscale AND cod_categoria = '01' ) AND EXISTS( SELECT * FROM veicoli NATURAL JOIN proprieta WHERE p.codice_fiscale = codice_fiscale AND cod_categoria = '03' ) ;

Recuperare il tempo medio dopo cui ogni modello viene venduto. Mostrare solamente il cod_modello e il numero di giorni SELECT cod_modello, AVG(datefiff(data_cessione, data_acquisto)) AS numero_giorni_proprieta FROM proprieta NATURAL JOIN veicoli WHERE data_cessione IS NOT NULL GROUP BY cod_modello; Oppure (subquery nel FROM): SELECT cod_modello, AVG(numero_giorni_proprieta) FROM veicoli NATURAL JOIN ( SELECT targa, datediff(data_cessione - data_acquisto) AS numero_giorni_proprieta FROM proprieta WHERE data_cessione IS NOT NULL ) AS giorni_vendita GROUP BY cod_modello;