-- Nome e reddito del padre di Franco.

select  nome, reddito
from    persone
where   nome = (select padre
                from   paternita
                where  figlio = 'Franco')
;


-- Nome e reddito dei padri di persone che guadagnano più di 20 milioni.

select nome, reddito
from   persone
where  nome = any (select padre
                   from   paternita, persone
                   where  figlio = nome
                          and reddito > 20)
;


-- Nome e reddito dei padri di persone che guadagnano più di 20 milioni.

select nome, reddito
from   persone
where  nome in (select padre
                from  paternita
                where figlio in (select nome
                                 from  persone
                                 where reddito > 20)
                )
;


-- Persone che hanno un reddito maggiore del reddito di 
   -- tutte le persone con meno di 30 anni.

select nome
from   persone
where  reddito >= all (select reddito
                       from persone
                       where eta < 30)
;

 -- le persone che hanno almeno un figlio.

select *
from   persone p
where  exists (select *
               from  paternita
               where padre = p.nome)
       or
       exists (select *
               from  maternita
               where madre = p.nome)
;


-- Nome ed età delle madri che hanno almeno un figlio minorenne.

select nome, eta
from   persone, maternita
where  nome = madre and
       figlio in (select nome
                  from   persone
                  where  eta < 18)
;

-- Nome ed età delle madri che hanno almeno un figlio minorenne.

select nome, eta
from   persone
where  nome in (select madre
                from   maternita
                where  figlio in (select nome
                                  from   persone 
                                  where  eta < 18))
;

-- Le persone che hanno almeno un figlio.

select *
from   persone
where  exists (select *
               from  paternita
               where padre = nome)
       or
       exists (select *
               from  maternita
               where madre = nome)

;


-- Nome ed età delle madri che hanno almeno un figlio 
   -- la cui età differisce meno di 20 anni dalla loro.


select nome, eta
from   persone p, maternita 
where  nome = madre and
       figlio in (select nome
                  from   persone
                  where  p.eta - eta < 20)
;

/* -- EXECEPT non è supportato da MySQL 5

select nome from impiegato
  EXCEPT
select cognome as nome from impiegato
;
*/

select nome
from   impiegato
where  nome not in (select cognome
                    from   impiegato)
;

/* -- INTERSECT non è supprotato da MySQL 5

select nome from impiegato
  INTERSECT
select cognome from impiegato
;
*/

select nome
from   impiegato
where  nome in (select cognome
                from   impiegato)
;

-- La persona (o le persone) con il reddito massimo.

select *
from   persone
where  reddito = (select max(reddito)
                  from   persone)
;
--Oppure:

select *
from   persone
where  reddito >= all (select reddito
                       from   persone)
;

-- Le persone che hanno la coppia (età, reddito) diversa da 
  -- tutte le altre persone.


select *
from   persone p
where  (eta,reddito) not in
                      (select eta, reddito
                       from   persone
                       where  nome <> p.nome)
;
