Subquery Within the WHERE Clause
A subquery refers to the inclusion of one or more nested queries within an original query.
select CFPersona
from PersonaLavoro
where stipendio = (select max(stipendio) from PersonaLavoro)Within the where clause, there is a nested query designed to retrieve the maximum value of the stipendio field from the PersonaLavoro table.
Subquery Within the SELECT Clause
Consider the case where you want to display a table of the following format:
| Lavoro | PercentualeLavoratori |
|---|---|
| Sviluppatore Web Senior | 33,333 |
| Sviluppatore Web Junior | 33,333 |
| Chirurgo | 33,333 |
| Segretaria/o | 0 |
| Manager | 0 |
This forms pairs (Job, Percentage of people doing that job relative to the total number of people who have a job in the database).
select l.Nome
( (
--Sottoquery che ritorna il numero di persone che effetutano il lavoro l
select count(*)
from PersonaLavoro pl
where l.ID = pl.IDLavoro
) as PersoneCheEffettuanoIlLavoro
/
(
--Sottoquery che ritorna il numero di persone (distinte) presenti in PersonaLavoro
--Ovvero il numero totale di persone che lavorano
select count(distinct CFPersona)
from PersonaLavoro
) as PersoneCheLavorano
* 100) as PercentualeLavoratori
--Il valore (PersoneCheEffettuanoIlLavoro / PersoneCheLavorano) * 100
--ritornala percentuale di persone che effettuano quel lavoro
--Tale valore viene chiamato PercentualeLavoratori
from Lavoro lSubquery Within the FROM Clause
A subquery within the from clause is usually used when you want to perform an (implicit) join with a table created on-the-fly.
Here is an example where the count of the cheeses sold by the dairy that processed the largest quantity of milk is returned.
- Schema logico dell’Esercizio Caseificio
Caseificio(PK:
id_caseificio,nome,indirizzo,lati,longi,nome_titolare,provincia) GiornoProduzione(q_lat_lavorato,q_forme,forme_vendute, PK:data, PK:cod_caseificio) Forme(PK:id_forma,data_produzione,cod_caseificio) FormeVendute(qualita,nome_acquirente,tipo_acquirente,data_ve,stagionatura, PK:cod_forma) Immagine(FK:cod_caseificio, PK:URL)
--Query finale
select count(*)
from FormaVenduta fv, Forma f, (
select c.CodiceID, c.Nome
from Caseificio c, Lavorazione lav
where c.CodiceID = lav.CodiceIDCaseificio
group by c.CodiceId, c.Nome
order by sum(lav.LatteLavorato)
limit 1
) as clm
--In clm è presente il CodiceID e il Nome del caseificio
--che ha lavorato la maggior quantità di latte
where fv.NumeroProgressivo = f.NumeroProgressivo and
f.CodiceIDCaseificio = clm.CodiceIDHere is an equivalent solution using subqueries within the where clause
select count(*)
from Caseificio c, Forma f,
FormaVenduta fv, Lavorazione lav
where c.CodiceId = lav.CodiceIdCaseificio and
fv.NumeroProgressivo = f.NumeroProgressivo and
f.CodiceIdCaseificio = lav.CodiceIdCaseificio and
lav.LatteLavorato = (select max(LatteLavorato) from Lavorazione)
--Seleziono solo le forme del caseificio che ha lavorato la maggior quantità di latte