Query Sql Esercizi Esame

di il
12 risposte

Query Sql Esercizi Esame

Salve a tutti,
sto studiando per un esame di basi di dati.

Il testo dell'esercizio con lo schema relazionale è il seguente:


PIZZA(nome, prezzo)
INGREDIENTE( nome, marca)
COMPOSIZIONE(NomePizza, NomeIngrediente, Quantità)
_____________________________________________________
ES.a) Scrivere una query equivalente a questa facendo uso del costrutto EXIST:

Select distinct marca
from ingrediente, composizione
where(nomeingrediente=nome)
and (nomepizza="margherita")
and(quantità<10)

Intanto vi chiedo una "traduzione" letterale qualora la mia interpretazione fosse errata:
Mi sta chiedendo " scrivere una query che mi dica la marca degli ingredienti inseriti (più di 10 Grammi) in una margherita?

Ho pensato a una cosa del genere, potrebbe andare?

Select distinct marca
from ingrediente i, composizione c
where c.nomeingrediente=i.nome)
and nomepizza="margherita"
having quantità >10
_______________________________________________

ES.b) Scrivere la query che determina il nome della pizza contenente il maggior numero di ingredienti di marca "Rossi"
Select NomePizza, sum(quantità)
from ingredienti I, composizione C
where I.nome=C.nomeIngrediente
and marca= "rossi"
group by NomePizza
having sum (quantità) *(posso scrivere having sum (quantità)= max? o devo mettere having sum(quantità)> di qualcosa?)
________________________________________________

es c)scrivere la query che restituisce nome e prezzo delle pizze che hanno come ingredienti il pomodoro ma non la mozzarella.
(VINCOLO, NON è POSSIBILE UTILIZZARE IL JOIN NELLA CLAUSOLA FROM)

Io senza il vincolo, cioè usando il join l'ho scritta così.

Select p.nome, p.prezzo
from pizza p, composizione c
where p.nome=c.nomepizza
and nomeingrediente="pomodoro"
and nomeingrediente <> "mozzarella"

Potrebbe andare?
E senza Join come potrei scriverla/impostarla?

Grazie a tutti per la pazienza

12 Risposte

  • Re: Query Sql Esercizi Esame

    Es. a)
    1) perchè dici >? c'è scritto < (minore)
    2) having non c'entra nulla, è relativo ai GROUP
    3) non mi è chiarissimo cosa significhi "equivalente" (cioè devi usare GROUP BY invece di distinct? Join esplicito invece di implicito ? )
    
    select distinct(marca)
    from ingrediente i
    left join composizione c
    on i.nomeingrediente=c.nome
    where (c.nomepizza="margherita")
    and (c.quantità<10)
    
    Ad ogni modo info di servizio...

    - mai e poi mai usare lettere accentate
    - usa solo lettere tutte minuscole, o tutte maiuscole, perchè non è scontato che siano intercambiabili
    (dipende dalla tipologia di utilizzo di engine a file separati, che possono essere case sensitive su linux e non su windows eccetera)
  • Re: Query Sql Esercizi Esame

    Es. b
    chiede il "numero di ingredienti", non la somma della quantità (almeno così interpreto)
  • Re: Query Sql Esercizi Esame

    Es. c
    con una bella IN (che su MariaDB diventa anche materializzata, su mysqldimmerda (che suppongo vi facciano usare) può determinare un nested loop al contrario
  • Re: Query Sql Esercizi Esame

    +m2+ ha scritto:


    Es. b
    chiede il "numero di ingredienti", non la somma della quantità (almeno così interpreto)
    Mannaggia è vero!!

    Allora una cosa del genere va bene?

    Select TOP 1 c.nomepizza
    from composizione, ingrediente
    where c.nomeingrediente=i.nome
    group by c.nomepizza
    order by c.nomepizza DESC
  • Re: Query Sql Esercizi Esame

    [quote="+m2+"]Es. a)
    1) perchè dici >? c'è scritto < (minore)
    ERRORE MIO DI TRASCRIZIONE, è MAGGIORE ANCHE LI

    3) non mi è chiarissimo cosa significhi "equivalente" (cioè devi usare GROUP BY invece di distinct? Join esplicito invece di implicito ? )

    Per equivalente negli esercizi intende o una query annidata o con group by, con exist, having etc.
    IN questo caso, e anche li ho dimenticato di scriverlo, vuole che si usi exist!
    sorry

    Così può andar bene?

    Select distinct marca
    from ingredienti
    where exist ( select *
    from composizione
    where i.nome=c.nomeingrediente
    and nomepizza="margherita"
    and quantità >10)
  • Re: Query Sql Esercizi Esame

    Select distinct marca
    from ingredienti
    where exist ( select *
    from composizione
    where i.nome=c.nomeingrediente
    and nomepizza="margherita"
    and quantità >10)
    Sì, però non hai usato bene quei "i." e "c."
    Select TOP 1 c.nomepizza
    from composizione, ingrediente
    where c.nomeingrediente=i.nome
    group by c.nomepizza
    order by c.nomepizza DESC
    select top? E non hai specificato da nessuna parte la marca "Rossi" e inoltre perché ordini in base a "nomepizza"?
  • Re: Query Sql Esercizi Esame

    Tonmu ha scritto:


    Select distinct marca
    from ingredienti
    where exist ( select *
    from composizione
    where i.nome=c.nomeingrediente
    and nomepizza="margherita"
    and quantità >10)
    Sì, però non hai usato bene quei "i." e "c."


    Così è corretto?

    Select distinct marca
    from ingredienti i
    where exists
    ( select *
    from composizione c
    where i.nome=c.nomeingrediente
    and c.nomepizza="margherita"
    and quantità >10)

    _____________________________________________

    Select TOP 1 c.nomepizza
    from composizione c, ingrediente i
    where c.nomeingrediente=i.nome
    group by c.nomepizza
    order by c.nomepizza DESC
    select top? E non hai specificato da nessuna parte la marca "Rossi" e inoltre perché ordini in base a "nomepizza"?

    a parte il "rossi" non saprei cosa modificare, potreste essere più diretti please?
  • Re: Query Sql Esercizi Esame

    "top" non esiste in mysql (è roba Microsoft).
    Al massimo LIMIT

    comunque ti suggerisco di non far tanta confusione, parti da una, scrivi come la faresti, e vediamo il perchè e il percome
  • Re: Query Sql Esercizi Esame

    Ok, ripartiamo che è meglio

    ES.a) Scrivere una query equivalente a questa facendo uso del costrutto EXIST:
    Select distinct marca
    from ingrediente, composizione
    where(nomeingrediente=nome)
    and (nomepizza="margherita")
    and(quantità>10)

    HO SCRITTO QUESTA:
    select distinct marca
    from ingrediente
    where exist (select nomeingrediente, count(*)
    from composizione
    where nomepizza='margherita'
    group by nomeingrediente
    having count>10)
    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    Stasera vedo di fare gli altri due e postarli, intanto se questo è sbagliato, suggeritemi pure
  • Re: Query Sql Esercizi Esame

    cicciozza ha scritto:


    Ok, ripartiamo che è meglio

    ES.a) Scrivere una query equivalente a questa facendo uso del costrutto EXIST:
    Select distinct marca
    from ingrediente, composizione
    where(nomeingrediente=nome)
    and (nomepizza="margherita")
    and(quantità>10)

    HO SCRITTO QUESTA:
    select distinct marca
    from ingrediente
    where exist (select nomeingrediente, count(*)
    from composizione
    where nomepizza='margherita'
    group by nomeingrediente
    having count>10)
    °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
    Stasera vedo di fare gli altri due e postarli, intanto se questo è sbagliato, suggeritemi pure
    1) a cosa ti server il primo count(*)?
    2) si usano le " e non le i
    3) having count(*)>10
    4) non c'è collegamento tra la query esterna e quella interna.

    siccome sei alle prime armi, ti consiglio di crearti un database di prova, e testare effettivamente cosa succede
  • Re: Query Sql Esercizi Esame

    Ciamo M2
    Senti ma per creare in modo sbrigativo un mini database (popolando velocemente le tabelle) esiste qualcosa online?

    Perchè usando xampp e mysql per creare la struttura e popolare le tabelle ci metto davvero un sacco di tempo.
  • Re: Query Sql Esercizi Esame

    cicciozza ha scritto:


    Ciamo M2
    Senti ma per creare in modo sbrigativo un mini database (popolando velocemente le tabelle) esiste qualcosa online?

    Perchè usando xampp e mysql per creare la struttura e popolare le tabelle ci metto davvero un sacco di tempo.
    io uso il venerabile mysqlquery browser.
    puoi provare heidisql
Devi accedere o registrarti per scrivere nel forum
12 risposte