Originariamente inviato da YuYevon
Studio da poco anche io l'SQL ma in questo caso io ragionerei così:
devo visualizzare il cognome; in algebra relazionale userei una proiezione, il cui omologo in SQL è SELECT, quindi ho
SELECT cognome (come dicevi tu)
Da dove lo devo prendere questo cognome? Dalla tabella "persone", quindi sicuramente avrò "almeno"
FROM persone
Queste persone devono aver fatto il macellaio, ma questo tipo di informazione è nell'attributo "tipo" della tabella "lavori", quindi per imporre questa condizione devo avere un'unica tabella su cui lavorare, ma poiché sono due allora le devo congiungere ( = JOINare ) quindi faccio appunto un join. Lo posso fare in due modi: o esplicitamente nella clausola FROM, quindi
SELECT cognome
FROM persone JOIN lavori ON persone.codicefiscale = lavori.codicefiscale
(dove persone.codicefiscale = lavori.codicefiscale è la condizione di JOIN; ho dovuto utilizzare la forma tabella.attributo perché gli attributi di join hanno gli stessi nomi in entrambe le tabelle, e quindi non avrei potuto scrivere semplicemente "codicefiscale = codicefiscale")
oppure nella clausola WHERE riportando semplicemente la suddetta condizione di JOIN
SELECT cognome
FROM persone, lavori --qui indico solo le tabelle su cui devo lavorare senza specificare il JOIN
WHERE persone.codicefiscale = lavori.codicefiscale
Manca solo una cosa importante: la condizione di selezione. Non voglio "cognome" di tutte le tuple del JOIN, ma solo quello di chi ha fatto il macellaio, quindi aggiungiamo la condizione tipo = 'Macellaio' (le stringhe vanno indicate tra apici prestando attenzione ai caratteri minuscoli/maiuscoli di come la si è registrata nel DB) alla clausola WHERE.
Le due possibili query sono quindi:
SELECT cognome
FROM persone JOIN lavori ON persone.codicefiscale = lavori.codicefiscale
WHERE tipo = 'Macellaio'
oppure
SELECT cognome
FROM persone, lavori
WHERE persone.codicefiscale = lavori.codicefiscale AND tipo = 'Macellaio'
quest'ultima si può anche scrivere in maniera forse più leggibile
SELECT cognome
FROM persone p, lavori l
WHERE p.codicefiscale = l.codicefiscale AND tipo = 'Macellaio'
dove nella clausola FROM ho praticamente rinominato le due tabelle (rispettivamente in "p" e "l") per rendere la condizione del JOIN nella clausola WHERE più breve e leggibile, ma in questo caso non è che cambi molto.