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 :

problème de définitions


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut problème de définitions
    Bonjour,

    J'ai plusieurs questions à poser à propos de sql.

    -Que signifie la notion de synonyme( 'tablename = nom d'une table, d'une vue ou d'un synonyme')?

    -A propos de la clause 'WHERE' je lis quelle peut comparer des valeurs dans ldes colonnes, des littéraux, des expressions arithmétiques ou des fonctions.
    Pouvez vous me donner un exemple de comparaison de valeurs dans des fonctions( peut être des fonctions sql telles que avg, sum?).
    -a propos de la valeur 'null', on la définit comme une valeur inconnue ou innaplicable.
    Pouvez vous me donner un exemple?

    Toujours à propos de la valeur null, je lis qu'elle ne peut pas correspondre à une condition d'égalité.
    Si on peut insérer la valeur null dans un champ d'une table, pourquoi ne peut elle pas être l'objet d'une condition d'égalité?

    -a propos des règles de priorité :il est expliqué que l'opérateur 'and' a la priorité sur l'opérateur 'or'.
    Dans la requête suivante :'select ename, job,sal
    from emp where job='salesman'
    or job='president' and sal >1500;
    la priorité dont il est question plus haut consiste elle à évaluer d'abord la condition 'job='president' and sal>1500?

    pb à propos de l'ordre croissant : il est possible de selectionner plusieurs champs concernés par la clause order by

    Dans l'exemple suivant : select ename, job, hiredate,deptno
    from emp order by hiredate desc, deptno asc, voici les résultats obtenus
    king president 17/11/1981 10
    martine salesman 20/09/1981 30
    jones manager 02/04/1981 20
    allen manager 20/02/1981 30

    Je constate que le champ deptno n'est pas en ordre croissant
    pouvez vous m'expliquer pourquoi?
    Peut être ne peut on pas toujours obtenir l'odre demandé dans la clause order by, ou peut être ai je mal compris la requête et le resultat qu'elle doit ramener.

    Merci encore beaucoup à vous.

    Cordialement.
    Nathalie

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 20
    Par défaut
    Je constate que le champ deptno n'est pas en ordre croissant
    pouvez vous m'expliquer pourquoi?
    Parce que les dates sont différentes. Si tu avais eu 2 dates identiques, ces 2 enregistrements auraient ensuite été ordonnées par departement

    -A propos de la clause 'WHERE' je lis quelle peut comparer des valeurs dans ldes colonnes, des littéraux, des expressions arithmétiques ou des fonctions.
    Pouvez vous me donner un exemple de comparaison de valeurs dans des fonctions( peut être des fonctions sql telles que avg, sum?).
    Pour selectionner les personnes qui ont 2 dates identiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select ename, hiredate
    from emp
    group by ename, hiredate
    having count(*) > 1


    Toujours à propos de la valeur null, je lis qu'elle ne peut pas correspondre à une condition d'égalité.
    Si on peut insérer la valeur null dans un champ d'une table, pourquoi ne peut elle pas être l'objet d'une condition d'égalité?
    Si, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...where colonne is null
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where nvl(colonne,0) = 0

  3. #3
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    Citation Envoyé par harbonne Voir le message
    Bonjour,
    -Que signifie la notion de synonyme( 'tablename = nom d'une table, d'une vue ou d'un synonyme')?
    Un synonyme est un nom (ALIAS) que tu définis qui pointeras sur un autre objet (cela peut être une table, une vue)
    Par exemple quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT 'X' from DUAL
    Dual est en fait un synonyme qui pointe sur la table DUAL du schéma SYS, cela te permet d'éviter d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 'x' from SYS.DUAL
    -A propos de la clause 'WHERE' je lis quelle peut comparer des valeurs dans ldes colonnes, des littéraux, des expressions arithmétiques ou des fonctions.
    Pouvez vous me donner un exemple de comparaison de valeurs dans des fonctions( peut être des fonctions sql telles que avg, sum?).
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT ..
    FROM TABLE
    WHERE MaColonne = Nvl(Param1,Param2)
    ou 
    WHERE MaColonne = MaFonction(Param1)
     
    où MaFonction est une fonction stockée retournant une valeur de même type que ma colonne
    -a propos de la valeur 'null', on la définit comme une valeur inconnue ou innaplicable.
    Pouvez vous me donner un exemple?
    Toujours à propos de la valeur null, je lis qu'elle ne peut pas correspondre à une condition d'égalité.
    Si on peut insérer la valeur null dans un champ d'une table, pourquoi ne peut elle pas être l'objet d'une condition d'égalité?
    En fait, c'est parce qu'elle est inconnue et inapplicable qu'on ne peut pas utiliser de condition d'égalité
    La requête suivante retournera 'IS NULL' uniquement, car une condition impliquant une valeur nulle en dehors de l'opérateur IS NULL (ou IS NOT NULL) sera toujours fausse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 'EGAL'
    FROM DUAL
    WHERE NULL = NULL
    UNION ALL
    SELECT 'DIFFERENT'
    FROM dual
    WHERE NULL <> NULL
    UNION ALL
    SELECT 'IS NULL'
    FROM dual
    WHERE NULL IS NULL
    -a propos des règles de priorité :il est expliqué que l'opérateur 'and' a la priorité sur l'opérateur 'or'.
    Dans la requête suivante :'select ename, job,sal
    from emp where job='salesman'
    or job='president' and sal >1500;
    la priorité dont il est question plus haut consiste elle à évaluer d'abord la condition 'job='president' and sal>1500?
    GRANDE REGLE A SE REPETER 1 000 FOIS AVANT DE S ENDORMIR : TOUJOURS UTILISER DES PARENTHESES QUAND ON UTILISE UN OR!!!!
    ET NE JAMAIS FAIRE CONFIANCE AUX REGLES DE PRIORITE

    Cela peut être très dangereux d'utiliser un OR sans bien encadrer sa portée par des parenthèses et ceux qui ne le font pas méritent le bucher
    pb à propos de l'ordre croissant : il est possible de selectionner plusieurs champs concernés par la clause order by

    Dans l'exemple suivant : select ename, job, hiredate,deptno
    from emp order by hiredate desc, deptno asc, voici les résultats obtenus
    king president 17/11/1981 10
    martine salesman 20/09/1981 30
    jones manager 02/04/1981 20
    allen manager 20/02/1981 30

    Je constate que le champ deptno n'est pas en ordre croissant
    pouvez vous m'expliquer pourquoi?
    Peut être ne peut on pas toujours obtenir l'odre demandé dans la clause order by, ou peut être ai je mal compris la requête et le resultat qu'elle doit ramener.
    Un order by sur plusieurs colonnes se lit naturellement par : Ordonne le résultat avec la première colonne que j'ai précisé dans le Order by, pour les lignes ayant une valeur identique sur celle-ci, ordonne les ensuite par la 2nd colonne du order by, pour les colonnes ayant une valeur identique sur les 2 premières colonnes, ordonne les ensuite par la 3ème ... et ainsi de suite
    Merci encore beaucoup à vous.

    Cordialement.
    Nathalie
    De rien

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut pb de définitions
    Bonjour et merci de ton aide,

    J'aimerais juste revenir sur cette explication

    Un order by sur plusieurs colonnes se lit naturellement par : Ordonne le résultat avec la première colonne que j'ai précisé dans le Order by, pour les lignes ayant une valeur identique sur celle-ci, ordonne les ensuite par la 2nd colonne du order by, pour les colonnes ayant une valeur identique sur les 2 premières colonnes, ordonne les ensuite par la 3ème ... et ainsi de suite
    Si j'ai bien compris, un order by fonctionne ainsi:

    1-On ordonne le résultat avec la première colonne que j'ai précisé dans le Order by
    2-pour les lignes ayant le même résultat ( s'il y a des lignes qui ont la même valeur pour le 1er champ sur lequel porte le order by), on ordonne alors par le second champ précisé dans le order by.

    Ceci explique pourquoi il n'y a pas, dans mon exemple, de tri sur le champ deptno, car il n'y a pas deux enregistrments qui ont la même valeur pour hiredate.

    Pouvez vous me confirmer que j'ai bien compris.


    sinon, à propos des règles de priorité, je voualais juste confirmer que la priorité consiste , pour Oracle, à évaluer une condition avant une autre.
    Dans notre exemple, je voulais juste savoir si la condition 'job='president' and sal>1500 est évaluée par Oracle avant la condition job='salesman'.
    Je prendrai en compte votre conseil d'utiliser les parenthèses,et vous remercie de me tenir en garde, mais je voulais juste confirmer que par défaut Oracle procède ainsi(la condition 'job='president' and sal>1500 est évaluée par Oracle avant la condition job='salesman').

    Merci beaucoup à vous de votre aide.
    Cordialement.
    Nathalie


    Merci beaucoup à vous.

    Cordialement.
    Nathalie

  5. #5
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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
    Par défaut
    Citation Envoyé par harbonne Voir le message
    J'aimerais juste revenir sur cette explication
    (...)
    Pouvez vous me confirmer que j'ai bien compris.
    Tu as bien compris
    sinon, à propos des règles de priorité, je voualais juste confirmer que la priorité consiste , pour Oracle, à évaluer une condition avant une autre.
    Dans notre exemple, je voulais juste savoir si la condition 'job='president' and sal>1500 est évaluée par Oracle avant la condition job='salesman'.
    Je prendrai en compte votre conseil d'utiliser les parenthèses,et vous remercie de me tenir en garde, mais je voulais juste confirmer que par défaut Oracle procède ainsi(la condition 'job='president' and sal>1500 est évaluée par Oracle avant la condition job='salesman').
    Tout d'abord, tel que tu l'as écrit tu n'as pas deux conditions mais trois...
    Oracle n'évalue pas vraiment les conditions dans un ordre certain (à moins qu'en utilisant des parenthèses tu lui donnes des explications).

    si tu tapes

    WHERE job='president'
    AND sal>1500
    OR job='salesman'

    ça te rendra le même résultat que

    WHERE sal >1500
    AND job = 'president'
    OR JOB = 'salesman'

    ou que

    WHERE sal >1500
    OR JOB = 'salesman'
    AND job = 'president'

    A savoir Oracle va te rendre toutes les lignes ou le job = 'salesman' additionnées des lignes ou le job est 'président' et le sal > 1500.

    Par contre
    WHERE job = 'president'
    OR ( JOB = 'salesman'
    AND sal >1500)
    ne te rendra sans doute pas la même chose.

    Après quand tu as des clauses AND uniquement, Oracle fera ses tests/restrictions dans le sens qui l'arrange le plus et ce AUTOMATIQUEMENT (quel que soit l'ordre que tu as mis).

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut pb de définitions
    Bonjour et merci de tes explications.

    A propos des règles de priorité, tu expliques que Oracle n'évalue pas vraiment les conditions dans un ordre certain en fonction des opérateurs.
    Alors en quoi consiste la notion de priorité??(si j'avais à expliquer cette notion qu'aurais je à dire?)

    sinon, à propos de ce que tu dis ici
    Après quand tu as des clauses AND uniquement, Oracle fera ses tests/restrictions dans le sens qui l'arrange le plus et ce AUTOMATIQUEMENT (quel que soit l'ordre que tu as mis).
    tu expliques qu'Oracle fera ses tests / restrictions dans le sens qui l'arrange le plus.
    Je ne comprends pas très bien ce que tu veux dire: Oracle va t il tenir compte d'une priorité également?
    Je te remercie beaucoup de ton aide.

    Cordialement.
    Nathalie

  7. #7
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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
    Par défaut
    Citation Envoyé par harbonne Voir le message
    Bonjour et merci de tes explications.

    A propos des règles de priorité, tu expliques que Oracle n'évalue pas vraiment les conditions dans un ordre certain en fonction des opérateurs.
    Alors en quoi consiste la notion de priorité??(si j'avais à expliquer cette notion qu'aurais je à dire?)
    Si tu veux utiliser une clause OR, c'est un peu comme faire deux SELECT et additionner les résultats...
    D'abord il fait le SELECT qui correspond à toutes tes clauses AND et après il fait le (ou les) SELECT qui correspond(ent) à ta(tes) clauses WHERE.
    Ceci bien sûr dans le cas ou tu n'as pas mis de parenthèses...
    tu expliques qu'Oracle fera ses tests / restrictions dans le sens qui l'arrange le plus.
    Je ne comprends pas très bien ce que tu veux dire: Oracle va t il tenir compte d'une priorité également?
    Je te remercie beaucoup de ton aide.
    Concrètement quand tu fais un SELECT, Oracle doit aller chercher dans ses tables ce qui correspond à ta requête.
    Si tu n'as pas de clauses il prend tout... mais si tu as des clause, il doit filtrer ce qu'il va ramener.
    En fait il va appliquer tes clauses dans un ordre de filtrage décroissant. C'est à dire d'abord utiliser la clause qui "selon ses informations" va retirer le plus de lignes. Pour cela il va utiliser les statistiques qu'il connait sur la table pour trouver ce qui est le plus pertinent.

    Ce n'est qu'une schématisation de ce que fait Oracle car en fait il peut utiliser plusieurs clauses en même temps par exemple si tu as un index sur plusieurs colonnes et des clauses sur ces colonnes, alors il va passer par l'index et donc utiliser toutes ces clauses d'un coup. Sans compter que tu peux faire des requêtes sur plusieurs tables aussi. Auquel cas Oracle risque de faire des boucles de calcul pour retrouver les lignes qu'il lui faut.

    Mais si tu as deux clauses qui portent sur deux index différents, alors si les statistiques sont à jour, il va utiliser en premier l'index qui lui permettra de filtrer le plus de lignes (donc tu peux dire qu'il a utilisé une clause avant une autre).

    En espérant avoir été le plus clair possible. (difficile d'expliquer ça en quelques lignes)

    Si quelqu'un se sent plus à l'aise pour expliquer le fonctionnement du moteur Oracle ou veux me corriger qu'il n'hésite surtout pas .

Discussions similaires

  1. [Système] Problème de définition des variables
    Par SLAM JACK dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2006, 19h53
  2. [Configuration] Problème sur définition de constante
    Par Yobs dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 24/03/2006, 11h40
  3. Réponses: 1
    Dernier message: 21/12/2005, 19h08
  4. Réponses: 2
    Dernier message: 17/08/2005, 11h20
  5. Réponses: 22
    Dernier message: 05/07/2005, 00h04

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