Mysql
 sql >> Base de données >  >> RDS >> Mysql

Joindre à gauche ou sélectionner parmi plusieurs tables à l'aide d'une virgule (,)

Tout d'abord, pour être tout à fait équivalent, la première requête aurait dû être écrite

   SELECT mw.*, 
          nvs.* 
     FROM mst_words mw 
LEFT JOIN (SELECT *
             FROM vocab_stats 
            WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no 
    WHERE (nvs.correct > 0 ) 
      AND mw.level = 1

Ainsi, mw.* et nvs.* produisent ensemble le même ensemble que le singulier * de la deuxième requête. La requête telle que vous l'avez écrite peut utiliser un INNER JOIN, car elle inclut un filtre sur nvs.correct.

La forme générale

TABLEA LEFT JOIN TABLEB ON <CONDITION>

attempts pour rechercher des enregistrements TableB en fonction de la condition. En cas d'échec, les résultats de TABLEA sont conservés, toutes les colonnes de TableB étant définies sur NULL. En revanche

TABLEA INNER JOIN TABLEB ON <CONDITION>

aussi attempts pour rechercher des enregistrements TableB en fonction de la condition. Cependant , en cas d'échec, l'enregistrement particulier de TableA est supprimé du jeu de résultats de sortie.

La norme ANSI pour CROSS JOIN produit un Produit cartésien entre les deux tables.

TABLEA CROSS JOIN TABLEB
  -- # or in older syntax, simply using commas
TABLEA, TABLEB

L'intention de la syntaxe est que CHAQUE ligne dans TABLEA est jointe à CHAQUE ligne dans TABLEB. Ainsi, 4 lignes en A et 3 lignes en B produisent 12 lignes de sortie. Lorsqu'il est associé à des conditions dans la clause WHERE, il produit parfois le même comportement que INNER JOIN, car ils expriment la même chose (condition entre A et B => conserver ou non). Cependant, il est beaucoup plus clair lors de la lecture de l'intention lorsque vous utilisez INNER JOIN au lieu de virgules.

En termes de performances, la plupart des SGBD traiteront une jointure LEFT plus rapidement qu'une INNER JOIN. La notation par virgule peut amener les systèmes de base de données à mal interpréter l'intention et produire un mauvais plan de requête - donc un autre avantage pour la notation SQL92.

Pourquoi avons-nous besoin de LEFT JOIN ? Si l'explication de LEFT JOIN ci-dessus n'est toujours pas suffisante (conserver les enregistrements dans A sans correspondance dans B), alors considérez que pour obtenir le même résultat, vous auriez besoin d'un UNION complexe entre deux ensembles en utilisant l'ancienne notation par virgule pour obtenir le même effet . Mais comme indiqué précédemment , cela ne s'applique pas à votre exemple, qui est en réalité un INNER JOIN caché derrière un LEFT JOIN.

Remarques :

  • RIGHT JOIN est identique à LEFT, sauf qu'il commence par TABLEB (côté droit) au lieu de A.
  • RIGHT et LEFT JOINS sont tous deux des jointures OUTER. Le mot OUTER est facultatif, c'est-à-dire qu'il peut être écrit sous la forme LEFT OUTER JOIN .
  • Le troisième type de jointure OUTER est la jointure FULL OUTER, mais cela n'est pas abordé ici.