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 :

Group by ou Distinct ?


Sujet :

Langage SQL

  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 36
    Par défaut Group by ou Distinct ?
    Bonjour,

    Je dois effectuer une requête lors de la connexion d'un utilisateur sur une table ayant plusieurs dizaines de milliers de données. (Bientôt des centaines ...)
    Je cherche à savoir ce qui est le plus rapide pour SQL comme traitement.

    Un distinct et un group by peuvent effectuer la même chose. Quelle est la solution la plus optimale ?

    Merci par avance.

    Cordialement,

  2. #2
    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
    Si vous avez un agrégat, c'est GROUP BY, si vous avez besoin d'une liste d'éléments distinct, c'est DISTINCT.

  3. #3
    Membre éclairé Avatar de solo190
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 412
    Par défaut
    Bonsoir à tous,
    Pourquoi pas déjà une clause where pour réduire les données retournées et ensuite un group by pour les regroupements.
    Sincèrement je n'aime pas trop les distincts !
    Merci !

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je dois effectuer une requête lors de la connexion d'un utilisateur sur une table ayant plusieurs dizaines de milliers de données. (Bientôt des centaines ...)
    Seulement ?

    Exprimez plus complètement votre besoin, présentez la structure de la table et la requête que vous comptez faire. Nous pourrons alors juger sur pièces de la meilleure solution.

    D'une manière générale...
    - GROUP BY, c'est quand on a au moins une fonction d'agrégation (SUM, COUNT, AVG, MIN, MAX) dans la requête ;
    - DISTINCT, c'est quand la requête retourne plusieurs lignes identiques et qu'on ne veut que des lignes différentes.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre éclairé
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Par défaut
    Salut,

    Je me rappelle avoir lu récemment un commentaire très pertinent sur le forum ressemblant à "l'utilisation à tout va de DISTINCT est un bon indicateur d'une mauvaise conception ou d'un développeur qui ne comprend pas tout au modèle de données".
    Je trouve cela pertinent, car fréquemment dans les applications je vois des DISTINCT qui n'ont pas lieu d'être (une jointure pourrie, conception ne prenant pas en compte le réel besoin fonctionnel). En plus de ça, ces requêtes sont généralement mal écrites donc difficilement maintenables.
    Je me rappelle aussi un client qui me disait sur des requêtes de reporting "dans le doute, mets toujours DISTINCT"... pour ne pas faire boguer la fonction de génération de report (si doublon).
    Dès lors, j'essaye au minimum de me passer de ce mot-clef qui implique plus de problèmes que de solutions !

    A+

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ce qui est fréquent comme erreur, dans ce qui nous est proposé sur nos forums, c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT (col_A), col_B...
    Il faut rappeler que l'opérateur DISTINCT agit sur toute la ligne de résultat, pas sur une seule colonne. Dans mon exemple, les parenthèses sont parfaitement inutiles !

    Mais attendons de voir ce que Florian54 va nous proposer concrètement comme problème...
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 031
    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 031
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Florian54 Voir le message
    Un distinct et un group by peuvent effectuer la même chose.
    Pas du tout !

    DISTINCT est un opérateur de dédoublonnage de lignes.
    GROUP BY est une opération de regroupement c'est-à-dire de création de sous-ensembles. Même en faisant un GROUP BY, la réponse peut comporter de nombreux doublons !

    Bref, il serait peut être temps de se former au SQL ! Mon site web comme mon bouquin peuvent vous y aider....

    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/ * * * * *

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par SQLPro
    Même en faisant un GROUP BY, la réponse peut comporter de nombreux doublons !
    Je comprends que MySQL autorise à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT colA, COUNT(*) AS Nombre
    FROM table1
    GROUP BY colA, colB
    Mais est-ce le cas dans les autres SGBD ?
    Est-ce autorisé par la norme SQL ?

    En plus, je ne vois pas trop l'intérêt de faire ça mais bon... Plus rien ne m'étonne en informatique !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    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 CinePhil Voir le message
    Mais est-ce le cas dans les autres SGBD ?
    Est-ce autorisé par la norme SQL ?
    Pour la norme, je ne sais pas, mais oui toutes les données du SELECT sont dans le GROUP BY ou sont des aggégats, donc ça fonctionne.
    C'est comme si on ne voulait simplement pas afficher colB.

    Citation Envoyé par CinePhil Voir le message
    En plus, je ne vois pas trop l'intérêt de faire ça mais bon.
    Quand une donnée n'a pas de valeur de représentation ça permet de désencombrer l'affichage.
    Par exemple dans l'algorithme de Tabibitosan on crée une valeur utile au regroupement mais dont l'intérêt d'affichage est nul, une illustration ici :
    http://www.developpez.net/forums/d12...e/#post6581910

Discussions similaires

  1. Problème de group by ou distinct
    Par Stephane_br dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/09/2011, 22h24
  2. Requête avec des groupes de conditions distincts
    Par abdelhamidem dans le forum SQL
    Réponses: 2
    Dernier message: 08/03/2011, 19h00
  3. mélanger group by et distinct
    Par tatayoyo dans le forum SQL
    Réponses: 12
    Dernier message: 25/08/2009, 11h03
  4. Distinct, group by et order by
    Par gloubi dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/11/2006, 17h53
  5. Problème requête avec group by et distinct
    Par tomca dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2005, 17h10

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