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

Langage SQL Discussion :

Clause GROUP BY facultative


Sujet :

Langage SQL

  1. #1
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut Clause GROUP BY facultative
    Bonjour,

    J'ai entendu dire que dans la dernière norme SQL, le group by devenait facultatif si derrière il y avait une clause having.
    J'ai testé sur
    Oracle : marche pas
    sqlserver : marche pas
    mysql : marche mais ne donne pas le même résultat qu'avec group by.....

    Paraîtrait que sur postgres ça marche...

    Quelqu'un pourrait-il me confirmer éventuellement cette info, et me confirmer que les résultats sont différents avec ou sans group by avec having.
    Merci

  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 801
    Points
    30 801
    Par défaut
    La clause GROUP BY a toujours été facultative à partir du moment où le regroupement porte sur toutes les lignes regroupées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  COUNT(*)
    FROM    matable
    WHERE   condition
    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
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Non, le GROUP BY est toujours obligatoire. En revanche, il n'est pas obligatoire de faire figurer toutes les colonnes non agrégées présente dans la clause SELECT à condition que l'on y fasse figurer au moins chacune des clefs primaires ou subrogées des colonnes qui en dépendent.
    Cela dit, les requêtes deviennent incompréhensibles. C'est pourquoi je conseille toujours de faire figurer toutes les colonnes nécessaires.
    Mais prendre MySQL comme référence est un non sens... Ce n'est pas un SGBD Relationnel et il est farci de bugs en plus d'être un veau.
    À lire sur MySQL : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/
    http://blog.developpez.com/sqlpro/p9...lles-en-sql-1/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut
    Bonjour,

    Je ne prends pas mysql comme sgbd de référence, j'ai seulement testé AUSSI sous mysql....
    Mon SGBD de référence reste le N°1 : Oracle !
    Reconnais toutefois que bien peu de SGBD respectent au sens strict la norme SQL.
    Voici un extrait de la doc postgres que j'ai lue :
    Même en l'absence de clause GROUP BY, la présence de HAVING transforme une requête en requête groupée. Cela correspond au comportement d'une requête contenant des fonctions d'agrégats mais pas de clause GROUP BY. Les lignes sélectionnées ne forment qu'un groupe, la liste du SELECT et la clause HAVING ne peuvent donc faire référence qu'à des colonnes à l'intérieur de fonctions d'agrégats. Une telle requête ne produira qu'une seule ligne si la condition HAVING est réalisée, aucune dans le cas contraire

    En gros il fait comme mysql !
    Je voulais seulement savoir si la norme prévoyait l'utilisation du having SANS le Group by et il semble que OUI (comme le dit al1_24).

    Sqlpro, on pourra en discuter à l'Isen à l'occasion puisqu'on est collègues!
    Bonne journée

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par r83 Voir le message
    Voici un extrait de la doc postgres que j'ai lue :
    Même en l'absence de clause GROUP BY, la présence de HAVING transforme une requête en requête groupée. Cela correspond au comportement d'une requête contenant des fonctions d'agrégats mais pas de clause GROUP BY. Les lignes sélectionnées ne forment qu'un groupe, la liste du SELECT et la clause HAVING ne peuvent donc faire référence qu'à des colonnes à l'intérieur de fonctions d'agrégats. Une telle requête ne produira qu'une seule ligne si la condition HAVING est réalisée, aucune dans le cas contraire
    Bonjour,

    Ceci ne veut pas dire que la clause group by est falcultative.

    Ceci veut dire que vous pouvez faire une requête de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select max(ma_col)
    from ma_table
    having min(ma_col) = X
    car si, sous pgsql, vous essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select ma_col
    from ma_table
    having min(ma_col) = 1
    Vous aurez une erreur


    En gros il fait comme mysql !
    Non, pas du tout

  6. #6
    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 801
    Points
    30 801
    Par défaut
    la liste du SELECT et la clause HAVING ne peuvent donc faire référence qu'à des colonnes à l'intérieur de fonctions d'agrégats
    C'est écrit !

    Pas de colonnes non agrégées dans les clauses SELECT ou HAVING s'il n'y a pas de clause GROUP BY
    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.

  7. #7
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut
    Merci pour les réponses.
    Par contre je ne comprends pas trop cette requête qui marche aussi sous Oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ma_col
    FROM ma_table
    HAVING min(ma_col) = 1
    Quel est son intérêt ? Un exemple concret ?
    Bonne soirée

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Ça doit pas servir souvent en effet.

    Mais je pense que là où on va trouver un intérêt, c'est dans une requête de contrôle par exemple :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select min(numero), max(numero), count(numero)
    from commande
    having count(numero) = max(numero) - min(numero)
    => Tu vérifies ici que tu n'as pas de trous dans la numérotation de tes commandes. S'il y a une ligne, c'est bon, sinon il y a un trou.

    Je regrette, j'ai rien trouvé de plus utile
    On ne jouit bien que de ce qu’on partage.

  9. #9
    r83
    r83 est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 271
    Points : 86
    Points
    86
    Par défaut
    Merci pour ton exemple.....
    en fait, vu qu'il n'y a qu'un seul groupe, c'est la bonne occasion de mettre dans une condition une fonction colonne non autorisée dans un where.
    Mais effectivement je ne suis aps convaincu de l'utilité de cette syntaxe

    Cordialement

Discussions similaires

  1. Clause group by sur oracle
    Par clement_911 dans le forum SQL
    Réponses: 3
    Dernier message: 06/04/2007, 13h24
  2. [MySQL 5.0] Pb de SGBD et de Requete SQL clause GROUP BY
    Par skyrider dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/08/2006, 12h24
  3. Requête SQL - Pb avec la clause GROUP BY
    Par jeromesco dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/07/2006, 09h04
  4. [Access] Clause GROUP BY avec une date
    Par Kanie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/04/2006, 19h58
  5. clause GROUP BY & récupérer derniere valeur
    Par Stef784ever dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/11/2005, 17h40

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