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 :

SELECT > explication d'une jointure.


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut SELECT > explication d'une jointure et de AS
    bonjour,

    je ne comprends pas pourquoi on met 'Personnes.' après SELECT dans le code suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    CREATE TABLE Personnes 
    (
    nom VARCHAR(40),
    prenom VARCHAR(40)
    )
     
    REPLACE INTO Personnes(`nom`,`prenom`) VALUES
    ('Martin','Jean'),
    ('Tartan','Pion'),
    ('Dupond','Jacques')
     
    CREATE TABLE Biblio
    (
    nom VARCHAR(40),
    nblivres DECIMAL(10,0)
    )
     
    REPLACE INTO Biblio(`nom`,`nblivres`) VALUES
    ('Martine','5'),
    ('Tartan','10'),
    ('Dupond','3')
     
    /* 
    J'ai ici quelques difficultés à expliquer le code ci-dessous;
    pour l'instant, j'explique ce code comme ceci : sélectionner les entrées de l'attribut 'nom' 
    et de l'attribut 'nblivres' provenant des tables ' personnes'
    et 'Biblio' à condition que l'attribut 'nom' de la table 'Personnes' soit égal à l'attribut 'nom' de la table 'Biblio'.
    */
     
    SELECT Personnes.nom, nblivres
    FROM Personnes, Biblio
    WHERE Personnes.nom = Biblio.nom
    quelqu'un peut-il me donner une explication plus valable, plus claire du fonctionnement de ce code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Personnes.nom, nblivres
    FROM Personnes, Biblio
    WHERE Personnes.nom = Biblio.nom
    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    En fait, tu dois mettre le nom de la table (ou un alias) devant le champ 'nom', car les deux tables 'Personnes' et 'Biblio' contiennent un champ 'nom' dans leur table.

    En faisant l'inverse, si on ne met pas le nom de la table devant le nom du champs, ton interpréteur ne sait pas dans quelle table il doit aller chercher la valeur.

    La condition de jointure permet de joindre le nom de la personne dans la table 'Personne' avec le nom de la personne dans la table 'Biblio'. Ainsi, lors de l'affichage des données, les données de la table 'Personne' et de la table 'Biblio' seront affichées à côté selon la condition de jointure.

    Je ne sais pas si j'ai été clair ?

  3. #3
    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 : 63
    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
    J'ajoute à ce qui a été dit précédemment que la requête aurait gagné en clarté et en simplicité en utilisant la syntaxe normalisée depuis 1992 pour les jointures (ça fait 17 ans quand même, il serait temps de s'y mettre ! ) et en utilisant des alias :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT p.nom, b.nblivres
    FROM Personnes AS p
    INNER JOIN Biblio AS b ON p.nom = b.nom
    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 !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    merci pour ta réponse.
    Je comprends en tout cas une chose : c'est que pour lever toute ambiguïté au sujet d'un attribut il faut préciser la table suivi d'un '.' lui-même suivi de l'attribut.

    Ainsi, mon code pourrait également s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Personnes.nom, Biblio.nblivres
    FROM Personnes, Biblio
    WHERE Personnes.nom = Biblio.nom
    effectivement, le code suivant n'est pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom, nblivres
    FROM Personnes, Biblio
    WHERE Personnes.nom = Biblio.nom
    c'est ce 'FROM' que je ne comprends pas bien maintenant.
    Comment fonctionne-t-il? dans le code faux ci-dessus, je ne m'imaginais une correspondance exacte et ordonnée entre des éléments qui suivent 'SELECT' et ceux qui suivent 'FROM'.
    j'ai donc essayé le code suivant qui semble bien fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Personnes.nom, Biblio.nblivres
    FROM Biblio, Personnes
    WHERE Personnes.nom = Biblio.nom
    je retiens donc que

    1/ en cas d'ambiguïté, je dois bien préciser le premier élément qui suit 'SELECT' car il est utilisé comme 'référence'.

    2/ les éléments qui suivent 'FROM' sont les tables mais que l'ordre n'est pas une obligation (même s'il est préférable de garder un ordre cohérent pour des raisons de clarté).

  5. #5
    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 : 63
    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
    Ve la proximité temporelle de nos deux messages et la longueur du tien, je suppose que tu n'as pas lu le mien. Je t'invite donc à le faire, ça t'éclairera peut-être un peu plus.
    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 !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Merci CinePhil,

    Oui, je n'avais pas vu ta réponse.

    Effectivement, dans mon tuto., j'ai étudié le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # ici, on utilise la fonction spéciale INNER JOIN ... USING
    # Pour réaliser la jointure. La méthode INNER JOIN n’inclus 
    # les enregistrements de la première table que s’ils ont 
    # une correspondance dans la seconde table.
    SELECT Personnes.nom, nblivres
    FROM Personnes INNER JOIN Biblio
    USING (nom)
     
    # Si les attributs pivots ne portent pas le même nom,
    # il faut utiliser la syntaxe ON.
    SELECT Personnes.nom, nblivres
    FROM Personnes INNER JOIN Biblio
    ON Personnes.nom = Biblio.nom
     
    # Pour remédier aux limites de INNER JOIN, il existe 
    # la syntaxe LEFT JOIN qui inclus tous les enregistrements 
    # de la première table même s’ils n’ont pas de correspondance 
    # dans la seconde table. Dans ce cas précis, l’attribut non
    # renseigné prendra la valeur NULL.
     
    SELECT Personnes.nom, nblivres
    FROM Personnes LEFT JOIN Biblio
    ON Personnes.nom = Biblio.nom
    Est-ce proprement écrit?
    Ou est-il préférable d'écrire comme tu le fais?

    Par contre, je n'ai aucune info. sur les alias.
    Tu peux m'expliquer un peu.
    Bon ... Je crois comprendre qu'il faut utiliser 'AS'
    après le nom de la table. Quand est-il utile de l'utiliser ?
    Dans les derniers codes ci-dessus, je trouve que c'est
    tout aussi clair de mentionner le nom réel de la table.
    Mais il y a sans doute des cas où cela serait plus clair.
    C'est peut-être un habitude recommandable d'utiliser
    des alias dans cette sorte de requête?

  7. #7
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Citation Envoyé par éric1 Voir le message
    Par contre, je n'ai aucune info. sur les alias.
    Tu peux m'expliquer un peu.
    Bon ... Je crois comprendre qu'il faut utiliser 'AS'
    après le nom de la table. Quand est-il utile de l'utiliser ?
    Dans les derniers codes ci-dessus, je trouve que c'est
    tout aussi clair de mentionner le nom réel de la table.
    Mais il y a sans doute des cas où cela serait plus clair.
    C'est peut-être un habitude recommandable d'utiliser
    des alias dans cette sorte de requête?
    On peut se passer du AS quand celui-ci est utilisé pour aliaser (surnommer) le nom d'une table. Ces séquences sont équivalentes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FROM Personnes AS p
    FROM Personnes p
     
    INNER JOIN Biblio AS b
    INNER JOIN Biblio b
    On va aliaser le nom d'une table généralement pour lever les ambiguïtés (comme tu l'as compris) tout en utilisant un nom plus court. C'est juste histoire de raccourcir la commande.
    Il existe des cas où il est obligatoire (à moins que je ne dise une connerie) d'aliaser les noms des tables quand on effectue des auto jointures (jointure sur une même table).

    Aussi, le mot clé AS est nécessaire quand on veut renommer ou simplement nommer une colonne (un résulat) dans la close SELECT. Ca n'est donc pas le même AS que pour les tables. C'est fréquent quand on utilise des fonctions pour construire un nouveau résultat. Le AS va servir à nommer ce résultat qu'on pourra exploiter ensuite comme s'il s'agissait d'une simple colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONCAT(nom, prenom) AS nom_complet FROM ...

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

Discussions similaires

  1. Une jointure crée une boucle de SELECT
    Par hubux dans le forum Doctrine2
    Réponses: 1
    Dernier message: 22/02/2013, 11h58
  2. Remplacer des select imbriqués par une jointure
    Par comode dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/11/2011, 14h01
  3. Réponses: 4
    Dernier message: 14/09/2011, 12h31
  4. Select into avec une jointure & plsql
    Par bobic dans le forum PL/SQL
    Réponses: 13
    Dernier message: 03/06/2009, 16h49
  5. select d'après le résultat d'une jointure
    Par echabenat dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/03/2008, 11h42

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