--Persona(nome, eta)
--Cane(nome, eta)
--Cura(persona,cane)


create table Persona (
	nome varchar(20) primary key,
	eta int
	);
create table Cane (
	nome varchar(20) primary key,
	eta int
	);
create table Cura (
	persona varchar(20) references Persona(nome),
	cane varchar(20) references Cane(nome)
	);
	
insert into Persona values ("Pippo", 10);
insert into Persona values ("Topo", 15);
	
insert into Cane values ("Bracco", 5);
insert into Cane values ("Baldo", 5);	
insert into Cane values ("Pluto", 10);

insert into Cura values("Pippo","Bracco");
insert into Cura values("Pippo","Baldo");	
insert into Cura values("Pippo","Pluto");	
insert into Cura values("Topo","Pluto");				


--1) Restituire i nomi dei cani che sono curati da piu' di una persona.

select c1.cane
from Cura c1, Cura c2
where c1.cane=c2.cane and
      c1.persona<>c2.persona
;

--2) Restituire il nome di ogni persona X tale che tutti i cani di eta'
--   pari a 5 sono curati da X.

--  Restituire il nome di ogni persona X tranne quelle persone Y per
--  cui esiste un cane Z di 5 anni, e Y NON CURA Z.


select nome
from Persona
except
select persona
from AUX
;

create view AUX as
select p.nome as persona, c.nome as cane 
from Persona p, Cane c
where c.eta = 5
except
select persona, cane
from Cura 
;


--3) Per ogni valore che corrisponde all'eta di almeno una persona
--   minorenne, restituire l'eta media dei cani curati dalle persone di
--   quella eta.

select p.eta, avg(c.eta)
from Persona p left join Cura pc on p.nome = pc.persona
               left join Cane c on pc.cane = c.nome 
group by p.eta
having p.eta < 18
;