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 :

Comment les opérateurs ensemblistes trient-ils ?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut Comment les opérateurs ensemblistes trient-ils ?
    Bonjour,

    Dans mes souvenirs, les opérateurs ensemblistes effectuent un tri lorsqu'ils assemblent(suivant l'opérateur) deux requêtes.
    On peut le vérifier en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT COLUMNA
    FROM T
    WHERE COLUMNB IS NOT NULL
    UNION
    SELECT COLUMNA
    FROM T
    WHERE COLUMNB IS NOT NULL;
    Le résultat de cette Union sera la colonne A trié par ordre ASC.

    J'ai cherché sur le net le fonctionnement des opérateurs ensemblistes, mais je n'ai pas trouvé.
    Auriez-vous une idée ?
    Travaillent-ils avec un ORDER BY ASC par défault sur l'ensemble des colonnes de gauche à droite ?

    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 803
    Points
    30 803
    Par défaut
    Tes souvenirs ne sont pas bons...

    Tant qu'une clause ORDER BY n'est pas explicitement utilisée dans une requête de consultation, le SGBD n'est pas tenu de respecter un quelconque ordre de restitution des lignes.
    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
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Ok.

    Oracle le fait, je l'ai testé.
    Je ne sais pas si d'autres le font.
    Je pensais, que les SGBD effectuaient un tri pour aider à éliminer les doublons sauf dans le cas des UNION ALL par ex.

    Bon bah, vu qu'ils ne font pas obligatoirement un tri ASC, le sujet est résolu..

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    NON !

    Oracle donne l'impression de le faire. mais il existe d'autres algorithmes de groupage non basés sur des tris comme le hachage.
    Comme c'est l'optimiseur qui décide quel algo il utilisera et cela par rapport à des statistiques, il peut parfaitement faire un hash un jour et un tri le lendemain !

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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Merci pour ta réponse

    Je ne savais pas du tout.
    Saurais-tu où je pourrais avoir de plus amples informations par rapport à ce sujet ? Histoire d'étudier tout ça

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut Algèbre relationnelle vs tri...
    Bonjour zizoufoot,


    Citation Envoyé par zizoufoot Voir le message
    Dans mes souvenirs, les opérateurs ensemblistes effectuent un tri lorsqu'ils assemblent(suivant l'opérateur) deux requêtes.
    Mettons les choses au point. Un opérateur ensembliste ne trie pas ! Dans le contexte des bases de données, un tel opérateur relève de l'algèbre relationnelle qui a pour vocation de nous permettre de manipuler des ensembles particuliers, les relations, et par définition un ensemble ne contient pas de doublons, sinon ça serait un sac (bag). Ça n’est pas à l’algèbre de dédoublonner, cela est seulement du ressort d’un des composants de votre SGBD. Un SGBD relationnel authentique doit systématiquement dédoublonner, transformer un sac en ensemble, sur la base d’algorithmes de plus en plus astucieux et performants au fil des ans, peut-être en triant (ou en hachant comme le fait observer SQLpro), mais tout cela est effectué sous le capot, est totalement étranger à l'algèbre et n’a pas non plus à être expliqué à l’utilisateur, qu’il s’appelle zizoufoot ou autre.

    Notons qu’un SGBD adhérant à la norme SQL n’est pas si regardant et n’est pas conforme à la théorie relationnelle. Supposons par exemple que la table PIECE ait pour contenu :


    PIECE
    PieceId   Nom       Couleur    Ville
    ----------------------------------------
          1   Boulon    Bleu       Toulouse
          2   Vis       Rouge      Rennes
          3   Boulon    Rouge      Toulouse
          4   Clou      Bleu       Toulouse
          5   Clou      Rouge      Toulouse
          6   Ecrou     Vert       Bordeaux

    Si l’on veut connaître les paires {Couleur, Ville}, dans le cadre de la théorie relationnelle on utilise l’opération ensembliste PROJECTION (PROJECT) qui s’écrit ainsi :
    PROJECT {Ville, Couleur}
    ou plus simplement (en D) :
    {Ville, Couleur}
    Au résultat :

    Couleur    Ville    
    ---------------------
    Rouge      Toulouse
    Bleu       Toulouse
    Rouge      Rennes
    Vert       Bordeaux 
    Conformément à la théorie, le résultat ne comporte pas de doublons, c’est un ensemble, ce qui fait qu’il peut à son tour servir d’opérande pour une autre opération ensembliste ou un ensemble complexe d’opérations (on est dans le contexte de l’algèbre relationnelle). Comment le SGBD a-t-il éliminé les doublons ? Pourquoi fait-il apparaître <Rouge, Toulouse> en tête du résultat ? Il n’a pas à vous le dire et on n’a pas à s’en soucier, puisqu’on ne s'intéresse qu'à des ensembles. Si cet ordre vous importe, c’est que vous raisonnez non pas en termes d'« ensembles » mais de « fichiers séquentiels », vous vous situez un cran trop bas : n’hésitez pas à grimper au cran supérieur.

    Pour sa part, SQL nous force à raisonner en termes de sacs. Par exemple, le simulacre de projection :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Couleur, Ville
    FROM   PIECE
    fournit un résultat truffé de doublons, ça n’est donc pas un ensemble mais un sac :

    Couleur    Ville    
    ---------------------
    Bleu       Toulouse
    Bleu       Toulouse
    Rouge      Rennes
    Rouge      Toulouse
    Rouge      Toulouse
    Vert       Bordeaux
    L’ordre dans lequel les lignes apparaissent dépend seulement de l'humeur du SGBD et de l’âge du capitaine, c’est totalement étranger à l'algèbre relationnelle.

    Si en SQL vous voulez que le résultat soit un ensemble, il faudra bricoler pour simuler la véritable projection, en utilisant par exemple le mot magique DISTINCT :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Couleur, Ville
    FROM   PIECE

    Là encore, l’ordre d’apparition des lignes dépend de l'humeur du SGBD et de l’âge du capitaine. Comme le dit al1_24 avec un grand bon sens, c’est à vous et à vous seul qu’il revient de décider de cet ordre, grâce à la clause ORDER BY, c'est-à-dire lorsque vous voulez présenter le résultat (les éléments des ensembles) à l’utilisateur au moyen d’une combo où autre objet relevant du jargon des langages informatiques.


    Citation Envoyé par zizoufoot Voir le message
    Saurais-tu où je pourrais avoir de plus amples informations par rapport à ce sujet ? Histoire d'étudier tout ça
    En épluchant les sources des nombreux moteurs de SGBD (comme Lawrence Ellison en son temps, quand il pompa sans vergogne le prototype System R d’IBM), bon courage...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Merci pour votre réponse, claire et précise

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

Discussions similaires

  1. Réponses: 158
    Dernier message: 29/08/2011, 19h18
  2. Réponses: 39
    Dernier message: 01/11/2010, 15h42
  3. Réponses: 24
    Dernier message: 18/12/2007, 17h24
  4. Réponses: 6
    Dernier message: 10/03/2007, 16h13
  5. Réponses: 1
    Dernier message: 21/01/2006, 18h00

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