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

SQL Oracle Discussion :

priorité des opérateurs


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut priorité des opérateurs
    Bonjour,

    A propos des opérateurs ensemblistes, j'apprends que l'opérateur IN a une priorité plus élevée que l'opérateur UNION.
    Cela signifie t-il que Oracle évalue une clause IN avant une clause avec l'opérateur UNION?

    J'ai simplement besoin d'une confirmation.

    Merci à vous.
    Cordialement.
    Nathalie
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    bien entendu... IN c'est un opérateur permettant de restreindre un ensemble alors que UNION additionne les ensembles... tu peux pas faire le 2° sans avoir fait le 1° c'est logique

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Désolé pour mon intervention, mais toute simplement je n'arrive pas à l'avoir .
    Dans la documentation d'Oracle (SQL Reference – version 9) je trouve seulement les opérateurs UNION [ALL], INTERSECT et MINUS comme opérateurs d'ensemble (set operators). Je ne trouve pas l'opérateur IN dans cette catégorie et bien ni dans la partie sur l'ordre de priorités de ces opérateurs.
    Pourriez-vous SVP me montrer avec un exemple comment cette priorité plus élevé est prise en compte (ou si j'ai raté quelque chose ...)

  4. #4
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 277
    Points
    277
    Par défaut
    Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * 
    FROM employes
    WHERE lieu_de_travail IN (SELECT nom_de_ville
                                        FROM sites
                                        WHERE REGION = 'Normandie' )
    UNION
    SELECT * 
    FROM employes
    WHERE service = 'RH'
    Oracle va résoudre ton premier SELECT (avec la clause IN) ainsi que le SELECT qui est derrière ta clause UNION avant de concaténer les deux résultats (effet de l'UNION).
    Voilà pourquoi tu peux dire que l'opérateur IN est prioritaire à l'opérateur UNION.

    Mais sinon c'est effectivement assez bizarre de comparer les priorité entre un IN et un UNION puisqu'ils ne s'utilisent pas vraiment de la même façon. l'un s'utilise dans une clause WHERE/AND et l'autre non.
    Dyvim

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par dyvim Voir le message
    Un exemple :
    Mais sinon c'est effectivement assez bizarre de comparer les priorité entre un IN et un UNION puisqu'ils ne s'utilisent pas vraiment de la même façon. l'un s'utilise dans une clause WHERE/AND et l'autre non.
    On est d'accord!

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Salem
    je ne suis pas d'accord:

    si on inverse les deux requete qu'est ce qui se passera???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT * 
    FROM employes
    WHERE service = 'RH'
     
    UNION
     
    SELECT * 
    FROM employes
    WHERE lieu_de_travail IN (SELECT nom_de_ville
                                        FROM sites
                                        WHERE REGION = 'Normandie' )
    Bon courage

    Zoheir BOUSSAFI
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  7. #7
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 277
    Points
    277
    Par défaut
    Le plan d'éxécution sera le même exactement normalement.

    Il jouera en même temps les deux SELECT puis concatenera leurs résultats...
    (par contre il est vrai que le SELECT situé derrière le IN sera toujours joué en premier)
    Dyvim

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    C'est peut être intéressant de se rappeler que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    colonne in (valeur1, valeur2, valeur 3)
    signifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	colonne = valeur1
    or	colonne = valeur2
    or 	colonne = valeur3

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    d'après la doc, UNION est un opérateur de set et IN est une condition

    impossible de mélanger les deux

    select * from T WHERE (x) IN (y)
    UNION
    SELECT * FROM T

    ...

  10. #10
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    salem

    c'est ce que je voulait dire ds mon msge a priori;

    Bon courage
    Zoheir BOUSSAFI
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  11. #11
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    salem

    c'est ce que je voulait dire ds mon msge de 06/11/2007 a 15h38 ,a priori ;

    Bon courage
    Zoheir BOUSSAFI
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  12. #12
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    d'après la doc, UNION est un opérateur de set et IN est une condition

    impossible de mélanger les deux

    select * from T WHERE (x) IN (y)
    UNION
    SELECT * FROM T

    ...
    Dans la théorie, ce que vous appelez ici une condition est en fait l'opérateur relationnel RESTRICT (restriction). Donc je peux lire votre exemple comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Restrict(T) Union T
    Cella ne change rien aux priorités

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    la syntaxe de la IN-condition est

    expr IN expr

    ou

    expr IN (expr,expr)

    ou

    expr IN (subquery)

    mais pas

    expr IN subquery

    donc impossible de mélanger

  14. #14
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    C.J. Date «*Database In depth*» Chapitre 1 pag. 7 et suivantes. Ce chapitre peut être téléchargé
    en format PDF.

    In the following list I’ll briefly describe what
    are usually thought of as the original eight operators (essentially the ones Codd defined
    in his earliest papers)
    ...
    Restrict
    Returns a relation containing all tuples from a specified relation that satisfy a specified
    condition. For example, we might restrict relation EMP to just the tuples where the
    DNO value is D2.

    Project
    Returns a relation containing all (sub)tuples that remain in a specified relation after
    specified attributes have been removed. For example, we might project relation EMP
    on just the ENO and SALARY attributes.

    Product
    Returns a relation containing all possible tuples that are a combination of two tuples,
    one from each of two specified relations. Product is also known variously as cartesian
    product, cross product, cross join, and cartesian join (in fact, it is just a special case of join, as
    we’ll see in Chapter 5).

    Intersect
    Returns a relation containing all tuples that appear in both of two specified relations.
    (Actually, intersect also is a special case of join.)

    Union
    Returns a relation containing all tuples that appear in either or both of two specified
    relations.

    Difference
    Returns a relation containing all tuples that appear in the first and not the second of
    two specified relations.

    Join
    Returns a relation containing all possible tuples that are a combination of two tuples,
    one from each of two specified relations, such that the two tuples contributing to any
    given result tuple have a common value for the common attributes of the two relations
    (and that common value appears just once, not twice, in that result tuple).

    NOTE
    This kind of join was originally called the natural join. Since natural
    join is far and away the most important kind, however, it’s become
    standard practice to take the unqualified term join to mean the natural
    join specifically, and I’ll follow that practice in this book.

    Divide
    Takes two relations, one binary and one unary, and returns a relation consisting of all
    values of one attribute of the binary relation that match (in the other attribute) all values
    in the unary relation.
    Si j'ai bien compris Oracle est un SGBDR(élationel), n'est pas vrai ?

Discussions similaires

  1. priorité des opérateurs
    Par new_wave dans le forum Langage
    Réponses: 3
    Dernier message: 02/12/2008, 12h09
  2. Priorité des opérateurs % et ++
    Par G3G3 dans le forum Débuter
    Réponses: 16
    Dernier message: 12/02/2008, 09h40
  3. [OCaml & F#] Priorité des opérateurs
    Par SpiceGuid dans le forum Caml
    Réponses: 7
    Dernier message: 01/01/2008, 15h00
  4. Priorité des opérateurs
    Par neuromencien dans le forum Langage
    Réponses: 3
    Dernier message: 14/05/2007, 17h06
  5. Réponses: 3
    Dernier message: 31/08/2006, 10h39

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