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 :

Est-ce que le prérequis de GROUP BY a changé en 20 ans et équivalent de FIRST() ?


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 538
    Par défaut Est-ce que le prérequis de GROUP BY a changé en 20 ans et équivalent de FIRST() ?
    bonjour,

    j'ai deux questions :

    1ere question:

    mes cours de sql datent de plus de 20ans et je viens de découvrir une chose qui m'interpelle au sujet du GROUP BY.
    Depuis 20ans, on me disait (ou j'avais compris que) que ce qui est listé dans le GROUPBY doit obligatoirement être dans le SELECT

    ainsi cela esrt correct :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a,b,c,sum(d)
    from t
    group by a,b,c

    et je pensais cela pas correct:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select c,sum(d)
    from t
    group by a,b,c

    a et B ne sont pas dans le SELECT !!

    En cherchant comment adapter une requête postgresql avec DISTINCT ON pour mysql (car le DISTINCT ON) existe pas avec Mysql, je viens de découvrir qu'on peut mettre des choses dans le group BY qui ne sont pas dans le select !
    est-ce récent ou est-ce que j'avais mal compris depuis 20ans ?




    2eme question (equivalent FIRST() de pg en mysql :
    je cherchais un équivalent mysql du FIRST mais pour mysql. on m'a suggérer ceci :

    que pgsql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select first (b),first(c),sum(d)
    from t
    group by a,b,c

    devient en mysql:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select b,c,sum(d)
    from t
    group by a,b,c

    et à ma grande surprise, ça fonctionne dans mysql !
    du coup, je tombe des nuts !
    j'aurai pensé que je devais faire :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select min(a),min(b),min(c),sum(d)
    from t
    group by a,b,c


    alors qu'est-ce qui est mieux ? plus rapide ou plus correct ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 770
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Les clauses GROUP BY et SELECT doivent être cohérentes, mais MySQL déroge à cette règle et si des colonnes supplémentaires sont présentes dans le SELECT, alors les valeurs restituées sont aléatoires. C'est une bizarrerie propre à MySQL / MariaDB
    À l'inverse, ajouter dans le GROUP BY des colonnes qui ne sont pas dans le SELECT n'a aucun intérêt

    Pour ce qui concerne FIRST(), je ne crois pas que cette fonction existe en PG, c'est plutôt une fonction propre à Access
    Avec MySQL, il faut utiliser la clause LIMIT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select C1, C2,..., Cn
    from ma_table
    where ...
    limit 1

  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
    22 039
    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 : 22 039
    Billets dans le blog
    6
    Par défaut
    FIRST n'existe pas en SQL. Si vous voulez retourner certaines lignes (ce qui n'est pas relationnel d'ailleurs) il faut écrire en SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY ... OFFSET 0 ROW FETCH NEXT 1 ROW ONLY
    Des choses comme LIMIT ou TOP n'existent pas dans le langage SQL. Ce sont des bricolages de certains SGBD comme MySQL !

    Quand au GROUP BY, il faut au moins y mettre toutes les colonnes du SELECT qui ne figurent pas dans des calculs d'agrégation. Mais rien n'empêche d'en mettre plus !

    Ainsi, sont valide les requêtes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A, B, C, COUNT(D)
    FROM  UneTable
    GROUP BY A, B, C;
    Mais aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A, COUNT(D)
    FROM  UneTable
    GROUP BY A, B, C;
    Mais pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A, B, C, COUNT(D)
    FROM  UneTable
    GROUP BY A;
    Qui donnera systématiquement une erreur sauf sous MySQL/MariaDB qui renvoi des données incohérente dans ce cas.
    A lire sur les imbécilités de MySQL :
    https://blog.developpez.com/sqlpro/p...oudre_aux_yeux

    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
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par clavier12AZQSWX Voir le message
    mes cours de sql datent de plus de 20ans et je viens de découvrir une chose qui m'interpelle au sujet du GROUP BY.
    Depuis 20ans, on me disait (ou j'avais compris que) que ce qui est listé dans le GROUPBY doit obligatoirement être dans le SELECT
    Non c'est le contraire, les colonnes non-agrégées du select doivent être présentes dans le group by.
    Ou encore l'ensemble des colonnes non-agrégées est un sous-ensemble des colonnes de la clause group by.

    La dernière requête de SQLpro est en effet une "simplification" de MySQL/MariaDB qui ne donne de bons résultats que dans un seul cas et faux dans beaucoup d'autres.

  5. #5
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 538
    Par défaut
    la partie en gras était ignorée, j'ai l'impression que mes anciens profs l'ont oublié de l'enseigner ou moi qui ne l'ait pas entendue à l'époque.
    au prochain déménagement, je fouillerai dans mes vieux polycopiés

    Quand au GROUP BY, il faut au moins y mettre toutes les colonnes du SELECT qui ne figurent pas dans des calculs d'agrégation. Mais rien n'empêche d'en mettre plus !
    FIRST n'existe pas en SQL.
    en fait j'ai pas besoin réellement du FIRST, j'ai juste besoin qu'il y ait une valeur en colonne qui ne soit pas en groubby.
    gu coup, j'ai improvisé avec un GROUP_CONCAT (avec option DISTINCT ). vu que les données de ma colonne sont identiques , ça va revenir au même qu'un "first"

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

Discussions similaires

  1. qu'est ce que l'instruction "round"?
    Par isa_21 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/03/2003, 10h37
  2. Qu'est ce que c'est : Le GateA20 ?
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 24/02/2003, 15h09
  3. Qu'est ce que le cache ?
    Par irrou dans le forum Assembleur
    Réponses: 4
    Dernier message: 24/11/2002, 23h28
  4. Qu'est-ce que c'est que Nessus, ça fait quoi exactement ?
    Par PeterT dans le forum Développement
    Réponses: 3
    Dernier message: 24/07/2002, 11h23
  5. Réponses: 3
    Dernier message: 19/07/2002, 15h01

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