Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    142

    [sql] aiuto su operazioni su più tabelle

    ciao a tutti, avrei bisogno di alcune delucidazione su sql.

    Sto studiando l'sql e non riesco a capire come operare quando bisogna lavorare su + tabelle.

    Vedendo gli esempi non riesco a capire quando devo usare il join, quando posso chiamare gli attributi con tabella.attributo

    quando usare le subquery.

    Se x esempio ho 2 tabelle

    PERSONE(codicefiscale,nome,cognome)
    LAVORI(idlavoro, descr, tipo,codicefiscale)

    quindi abbiamo una relazione 1:N tra persone e lavori
    se x esempio mi si chiede di elencare i cognomi di tutte le persone che hanno effettuato macellaio come lavoro, come devo ragionare nella mia testa?

    non mi interessa la soluzione ma il ragionamento.
    e in quanti modi è possibile farlo.

    x esempio il ragionamento che al momento faccio è..

    (cosa voglio mostrare? i cognomi quindi...)

    SELECT cognome from PERSONE

    (ora penso.. quali cognomi? a questo punto dovrei mettere in relazione le due tabelle. e mi perdo)
    where lavori.tipo=macellaio
    (ovviamente immagino sia sbagliato)

    Spero che qualcuno avrò del tempo da perdere x me, xchè le cose pens odi saperle ma mi manca il ragionamento su come farli

    grazie in anticipo, sono sicuro che html.it non mi tradirà

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315

    Re: [sql] aiuto su operazioni su più tabelle

    Originariamente inviato da atomico
    Se x esempio ho 2 tabelle

    PERSONE(codicefiscale,nome,cognome)
    LAVORI(idlavoro, descr, tipo,codicefiscale)

    quindi abbiamo una relazione 1:N tra persone e lavori
    se x esempio mi si chiede di elencare i cognomi di tutte le persone che hanno effettuato macellaio come lavoro, come devo ragionare nella mia testa?
    la cosa che ancora non ti e' chiara e' l'utilizzo delle join

    dai un'occhiata qui
    http://www.morpheusweb.it/html/manuali/sql/sql_join.asp

    x esempio il ragionamento che al momento faccio è..

    (cosa voglio mostrare? i cognomi quindi...)

    SELECT cognome from PERSONE

    (ora penso.. quali cognomi? a questo punto dovrei mettere in relazione le due tabelle. e mi perdo)
    where lavori.tipo=macellaio

    (ovviamente immagino sia sbagliato)
    ovviamente invece e' esatto!
    l'unica cosa che manca e' l'unione (che puoi effettuare tramite join) delle due tabelle

    codice:
    SELECT cognome from PERSONE
    where lavori.tipo='macellaio'
    left join lavori on lavori.tipo = 'macellaio' and lavori.codicefiscale=persone.codicefiscale
    NB.: come gia detto nel precedente messaggio, ti consiglio di creare un field ID per ogni tabella

    ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    142
    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.
    ottima spiegazione grazie 10k
    ora proverò a fare un po' di esercizio seguendo il tuo ragionamento e vediamo

    grazie anche a 123delphi che ormai è il mio tutor, è gia il secondo thread che mi segue ty

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.