IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Questions sur GROUP BY


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut Questions sur GROUP BY
    En relisant le cours sur developpez sur la clause group by
    NOTA :
    (1) La présence de la clause GROUP BY est nécessaire dès que la clause de sélection, ou le filtre WHERE, ou encore les jointures comportent simultanément des calculs d'agrégation et la présence de colonnes de table hors de calculs d'agrégation.

    (2) De plus, toutes les colonnes représentées hors des calculs d'agrégation doivent figurer dans la clause GROUP BY.
    pour le (1) si il n'y a pas de colonnes hors de calculs d'agrégation, ne pas mettre group by ne provoquera pas de notification. La requête restera correcte ou pas ?
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*) FROM table WHERE nom="toto"
    de plus est ce que que pour (2) c'est obligatoire toutes les colonnes contenues dans select et même dans le where, les jointures,...(voir dans un orderby ? ) hors agrégation doivent être présentes dans group by ?

    Merci
    (je sais que j'aurais pu essayer et conclure par moi même mais n'étant pas un expert en sql je préfère avoir des avis, des définitions de connaisseurs )

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    S'il n'y a que des agrégats dans la clause SELECT, la clause GROUP BY n'est pas obligatoire.
    Par ailleurs, seules les colonnes non agrégées de la clause SELECT doivent être reprises dans la clause GROUP BY donc celles utilisées pour les jointures ou les restrictions (clause WHERE) n'ont pas besoin d'être incluses dans la clause GROUP BY.
    Toutes les colonnes non agrégées de la clause SELECT devraient être reprises dans la clause GROUP BY. Toutefois, MySQL n'applique pas totalement cette dernière règle et peut retourner des résultats aléatoires.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut
    ok merci
    c'est très clair bon par précaution même étant sous mysql je mettrai toutes les colonnes dans la clause GROUP BY si nécessaire
    je ne marque pas résolu car j'aurais des questions surement par la suite pour la clause HAVING même si je ne l'ai pas mentionnée dans le titre, car ça m'a l'air assez proche de group by et de where en fait si je ne me trompe pas ?

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut
    J'ai créé un formulaire qui génère la liste des colonnes d'une table et ensuite,
    avec select, from, where, orderby,groupby,having, limit ... avec la possibilité d'insert et delete une donnée puis génère une requete sql littérale que le sgbd peut exécuter sur le site

    mais au vu de ce que je lis (et je le sais déjà) des requêtes très compliquées qui peuvent être écrites, je vais me limiter à :

    Utilisation d’autres fonctions de statistiques

    Il existe plusieurs fonctions qui peuvent être utilisées pour manipuler plusieurs enregistrements, il s’agit des fonctions d’agrégations statistiques, les principales sont les suivantes :

    AVG() pour calculer la moyenne d’un set de valeur. Permet de connaître le prix du panier moyen pour de chaque client
    COUNT() pour compter le nombre de lignes concernées. Permet de savoir combien d’achats a été effectué par chaque client
    MAX() pour récupérer la plus haute valeur. Pratique pour savoir l’achat le plus cher
    MIN() pour récupérer la plus petite valeur. Utile par exemple pour connaître la date du premier achat d’un client
    SUM() pour calculer la somme de plusieurs lignes. Permet par exemple de connaître le total de tous les achats d’un client


    Car là, je me sens parti pour recréer un phpadmin ou un SGBD alors que je ne maitrise pas grand chose. Et donc je vais me limiter à des requêtes simples.
    Et je poserai éventuellement des questions sur having mais pas plus !
    (Questions aux modérateurs : j'hésite à marquer résolu car les questions sur having risquent d'arriver sous peu , donc est ce que je recréé un sujet la dessus à ce moment là ou je laisse celui là ouvert étant donné le caractère commun que peut avoir where, groupby et having ? )

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut
    OK having fonctionne avec des fonctions d’agrégat quand on a besoin et que l'on ne peut pas utiliser dans where
    donc puisque je vais me limiter à des requetes simples ma dernière question ici :

    Puisque ce n'est pas obligatoire d'utiliser groupby avec having !

    Est il fortement conseillé d'utiliser group by avec having ?
    Ou y' a t il de nombreuses situations où ce n'est pas le cas ?

    Merci à vous par avance de vos réponses

  6. #6
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Where s'utilise pour filtrer des lignes (row)
    Having s'utilise pour filtrer des groupes (group)

    Donc il vaut mieux utiliser un Group By quand on utilise un Having, puisque c'est le Group By qui va créer les groupes. Il y aura toujours quelques cas exotiques où on peut utiliser Having sans Group by mais clairement ce n'est pas la majorité.

    Donc:

    - Je veux exclure des lignes: Where, même si ce que je veux exclure résulte d'une comparaison complexe entre les colonnes de 2 tables via une jointure.

    - Je veux grouper mes lignes, compter / sommer / faire une agrégation puis ne conserver que les groupes qui ont une agrégation > à une valeur, par exemple pour vérifier que le montant total est > 0: Group By ... Having
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut
    ok finalement dernière petite question :
    deux agrégats dans un select peuvent ou doivent ils être utilisés avec une colonne group by ou considère t on les deux comme un seul si il n'a pas d'autres colonnes et donc le group by pas obligatoire?

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut
    J'imagine que oui en fait la requête serait accepté par le moteur de requête,
    par contre cela n'aurait que peu d'utilité le calcul se faisant sans regroupement et donc j'imagine que le moteur se baserait sur l'ID uniquement renvoyant finalement la table complète !

    sujet résolu (je tenterai l'expérience mais je pense avoir juste sans risque )

  9. #9
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Si il n'y a pas de colonne précisée pour le Group By (donc carrément pas de Group By), le moteur considère qu'il n'y a qu'un seul groupe, et fait donc les agrégations sur ce groupe unique. Et donc on peut mettre 10 agrégats si on veut, pas de souci, mais on aura 1 seule ligne en sortie.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. question sur groupe policy preference
    Par adel87 dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 18/09/2014, 10h12
  2. question sur GROUP CONCAT
    Par Dranak dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/07/2008, 16h04
  3. [MySQL 4.0] Question sur GROUP BY
    Par Fabouney dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/09/2006, 19h45
  4. [MySQL] Question sur les GROUP BY
    Par Coladin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/04/2006, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo