Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [SQL] Clausola Having

  1. #1

    [SQL] Clausola Having

    Salve a tutti, ritorno con un mio solito dilemma:
    Ultimamente sto leggendo una guida su SQL (le mie nozioni su tale campo erano ridotte all'essenziale) e sto trovando grosse ed importanti informazioni. Anche se non ho capio bene come si comporta e a cosa puo' essere utile la clausola HAVING dato che è simile, se non uguale a WHERE.
    L'unica cosa che forse ho capito che HAVING si usa in concomitanza con GROUP BY, o sbaglio?
    Ciao a tutti
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Mi sembra che ti sia già risposto da solo.E' esattamente così.

  3. #3
    La clausola HAVING serve a selezionare ulteriormente dei record gia' scelti a priori con la clausola WHERE oppure ON delle JOIN. Tanto e' che se si immette in HAVING una condizione che invece si presume debba essere di tipo piu' generale, in modo silente MySQL la trasferisce in WHERE ottimizzando la query.

    Ecco perche a volte non si capisce la differenza e apparentemente sembra che WHERE ed HAVING facciano la stessa cosa.

    La grande diversita' e' che HAVING agisce anche su un ALIAS di campo... perche' viene risolto "dopo" che si e' effettuata la selezione dei record, mentre WHERE viene risolto "prima", e quindi l'ALIAS di campo ancora non esiste.

    L'uso di HAVING e solitamente usato con le funzioni di raggruppamento, e quindi anche con GROUP BY, ma nulla vieta di usarlo per conto suo. Sempre che ci sia una logica nell'uso... per es.:
    codice:
    SELECT COUNT(*) AS tot
    from tabella
    where id > 1000
    having tot < 100
    Si avrebbe un result record solo se conteggiando gli id con valore > a 1000 questi siano numericamente inferiori a 100. Quale sarebbe la differenza? Sostanziale direi... COUNT() renderebbe "sempre" una riga con zero o con valore contato, con having la riga verra' resa "solo" se il risultato e' quello richiesto da HAVING.


    Ovviamente salvo errori od omissioni.....

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    @piero.mac Certe volte penso che l'abbia inventato tu l'SQL.

  5. #5
    Originariamente inviato da nicola75ss
    Mi sembra che ti sia già risposto da solo.E' esattamente così.
    Grazie.......Allora qualcosa ho capito
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  6. #6
    Si avrebbe un result record solo se conteggiando gli id con valore > a 1000 questi siano numericamente inferiori a 100. Quale sarebbe la differenza? Sostanziale direi... COUNT() renderebbe "sempre" una riga con zero o con valore contato, con having la riga verra' resa "solo" se il risultato e' quello richiesto da HAVING.
    Ok ora ho le idee piu' confuse
    MiServe di Santino Bivacqua
    PHP/Ruby/Node.js Developer
    www.miserve.com

  7. #7
    Originariamente inviato da piero.mac
    La clausola HAVING serve a selezionare ulteriormente dei record gia' scelti a priori con la clausola WHERE oppure ON delle JOIN. Tanto e' che se si immette in HAVING una condizione che invece si presume debba essere di tipo piu' generale, in modo silente MySQL la trasferisce in WHERE ottimizzando la query.

    Ecco perche a volte non si capisce la differenza e apparentemente sembra che WHERE ed HAVING facciano la stessa cosa.

    La grande diversita' e' che HAVING agisce anche su un ALIAS di campo... perche' viene risolto "dopo" che si e' effettuata la selezione dei record, mentre WHERE viene risolto "prima", e quindi l'ALIAS di campo ancora non esiste.

    L'uso di HAVING e solitamente usato con le funzioni di raggruppamento, e quindi anche con GROUP BY, ma nulla vieta di usarlo per conto suo. Sempre che ci sia una logica nell'uso... per es.:
    codice:
    SELECT COUNT(*) AS tot
    from tabella
    where id > 1000
    having tot < 100
    Si avrebbe un result record solo se conteggiando gli id con valore > a 1000 questi siano numericamente inferiori a 100. Quale sarebbe la differenza? Sostanziale direi... COUNT() renderebbe "sempre" una riga con zero o con valore contato, con having la riga verra' resa "solo" se il risultato e' quello richiesto da HAVING.


    Ovviamente salvo errori od omissioni.....

    Be Piero si vede che ti ho spiegato bene e che hai assimilato ancora meglio
    Bravo ::sei il boss: !!!!

  8. #8
    Originariamente inviato da sanbiv
    Ok ora ho le idee piu' confuse
    Mamma....

    HAVING puo' esistere anche per conto suo. Si usa principalmente con GROUP BY perche' questa e' la clausola che gestisce i raggruppamenti.

    Ma i raggruppamenti sono COUNT, MAX, MIN, SUM, AVG e forse qualche altro ancora. Quindi HAVING e' associabile ai raggruppamenti, i quali "spesso e volentieri" sono gestiti da GROUP BY.....

    ti faccio ancora un altro esempio.... Ammettiamo che tu voglia aggiungere dei record solo se i presenti sono tra 80 e 100... invece di estrarre e poi valutarne la quantita' potresti fare:
    codice:
    SELECT COUNT(id) as tot
    FROM tabella
    HAVING tot BETWEEN 80 AND 100
    Non mi servira' verificare il numero estratto, perche' se estrae la riga significa che il test e' TRUE, se non estrae significa che il test e' FALSE. Con il WHERE non si potrebbe fare. O meglio si fa, ma poi devi controllare quante righe sono state contate. Tutto codice in piu'...




    edit@ thanx Stefano...

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    occhio che per lo standard SQL HAVING può riferirsi solo ai campi (o alias) riferiti nel GROUP BY o in funzioni di aggregazione, quindi conviene usarlo solo in questo modo se si vogliono scrivere query portabili.
    Anche perché per il resto va benissimo il WHERE.

  10. #10
    Originariamente inviato da skidx
    occhio che per lo standard SQL HAVING può riferirsi solo ai campi (o alias) riferiti nel GROUP BY o in funzioni di aggregazione, quindi conviene usarlo solo in questo modo se si vogliono scrivere query portabili.
    Anche perché per il resto va benissimo il WHERE.
    Certamente, anche perche' senza un raggruppamento non avrebbe molto senso.

    Quando dico "Per conto suo" intendo dire che l'associazione GROUP BY <-> HAVING citata nel post di origine non e' un requisito assoluto per HAVING... puo' esistere mi quoto "Sempre che ci sia una logica nell'uso"... anche senza GROUP BY.

    In riferimento alla portabilita' del SQL tra i vari RDBMS ce ne sarebbe da raccontare d'altro .... e pure parecchio.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.