Clauses SQL

Bonjour,

Est ce qu'on peut utiliser la clause "HAVING"
avec la clause "WHERE" ?

dans la même requête SQL

Merci

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Salut

    La clause HAVING est un filtre de regroupement. Elle ne s'utilise qu'en présence de GROUP BY et filtre normalement une fonction récapitulative

    => le WHERE va filtrer les lignes sur lesquelles se basera le regroupement
    => le HAVING va filtrer les lignes du résultat regroupé

    comme les fonctionnalités sont distinctes, on peut les utiliser dans la même requête
    1. { => le WHERE va filtrer les lignes sur lesquelles se basera le regroupement
      => le HAVING va filtrer les lignes du résultat regroupé }}

      J'ai bien compris que le Where était un filtre,
      à partir d'une valeur, il affiche toutes les lignes qui ont le critères du filtre en commun

      Par contre je ne vois pas ce que Having fait de plus, peux tu stp illustrer par un exemple

      Merci
      1. Salut,

        select idClient, to_char(dtEmission, 'mm'), sum(mtPU * nbQte)
        from client c, facture f, ligne_facture l
        where c.idClient = f.idClient
        and f.idFacture = l.idFacture
        and to_char(dtEmission, 'yyyy') = '2009'
        and (mtPU * nbQte) > 10000
        group by idClient, to_char(dtEmission, 'mm')

        ne renverra pas la même chose que
        select idClient, to_char(dtEmission, 'mm'), sum(mtPU * nbQte)
        from client c, facture f, ligne_facture l
        where c.idClient = f.idClient
        and f.idFacture = l.idFacture
        and to_char(dtEmission, 'yyyy') = '2009'
        group by idClient, to_char(dtEmission, 'mm')
        having sum(mtPU * nbQte) > 10000

        car dans la 1ere requete, on ne cherche que les lignes de facture supérieures à $10000 alors que dans la seconde, on veut que le cumul soit supérieur à $10000

        dans le 1er, on ne verra pas Acme qui nous achète de l'eau déshydratée pour $500 tous les jours alors que dans le second, Acme apparaitra car son CA mensuel sera à $15000
        1. En gros si j'ai bien compris la clause Where
          est seulement pour Filtrer les champs,

          et la clause Where c'est seulement pour filtrer les calcules de champs, ou un filtrage sur les fonctions de calcules :

          Where champ1 + 3 > champ2

          Having Sum(champ2 + 3) < Sum(champ1)

          Merci de me confirmer