jointure

Pur cours SQL - sers ma page de 'liens tuto dev drupal PHP mySQL'

La base des join

jointures internes : elles ne sélectionnent que les données qui ont une correspondance entre les deux tables ; WHERE (ancienne syntaxe) ou JOIN
jointures externes : elles sélectionnent toutes les données, même si certaines n'ont pas de correspondance dans l'autre table. LEFT JOIN et RIGHT-JOIN

ex: User1 existe dans la table "maitre" proprietaires mais il n'apparaît nulle part dans la table jeux_video (il ne possède aucun jeu).
En récupérant les données des deux tables à l'aide :
 d'une jointure interne : User1 n'apparaîtra pas dans les résultats.
 d'une jointure externe :  toutes les données de la table des propriétaires => User1 apparaîtra (et une ligne NULL).

ex de jointure interne avec WHERE

SELECT jeux_video.nom, proprietaires.prenom FROM proprietaires, jeux_video
WHERE jeux_video.ID_proprietaire = proprietaires.ID

alias

avec des alias champs: SELECT jeux_video.nom AS nom_jeu, proprietaires.prenom AS prenom_proprietaire
alias sur les tables :
SELECT j.nom AS nom_jeu, p.prenom AS prenom_proprietaire
FROM proprietaires AS p, jeux_video AS j
WHERE j.ID_proprietaire = p.ID

idem mais AS est facultatif:

SELECT j.nom nom_jeu, p.prenom prenom_proprietaire
FROM proprietaires p, jeux_video j
WHERE j.ID_proprietaire = p.ID

ex2 jointure interne, avec JOIN

Pour éviter de confondre le WHERE « traditionnel » qui filtre les données et le WHERE de jointure que l'on vient de découvrir, on va utiliser la syntaxe JOIN.

donnent le même résultat
SELECT j.nom nom_jeu, p.prenom prenom_proprietaire
FROM proprietaires p, jeux_video j
WHERE j.ID_proprietaire = p.ID
SELECT j.nom nom_jeu, p.prenom prenom_proprietaire
FROM proprietaires p
INNER JOIN jeux_video j
ON j.ID_proprietaire = p.ID

Filtre WHERE, ORDER BY et LIMIT

SELECT j.nom nom_jeu, p.prenom prenom_proprietaire
FROM proprietaires p
INNER JOIN jeux_video j
ON j.ID_proprietaire = p.ID
WHERE j.console = 'PC'
ORDER BY prix DESC
LIMIT 0, 10
Récupère nom du jeu et prénom du propriétaire (dans les tables proprietaires et jeux_video), la liaison entre les tables se fait entre les champs ID_proprietaire et ID, prends uniquement les jeux qui tournent sur PC,
trie-les par prix décroissants et ne prends que les 10 premiers

 

Jointures externes avec LEFT JOIN ou RIGHT-JOIN

LEFT JOIN pour récupérer la table de gauche (ou maitre, ici proprietaire)

SELECT j.nom nom_jeu, p.prenom prenom_proprietaire
FROM proprietaires p
LEFT JOIN jeux_video j
ON j.ID_proprietaire = p.ID

récupére tous les propriétaires, même s'ils n'ont pas d'équivalence dans la table jeux_video.

RIGHT JOIN pour récupérer la table "fille" de droite (meme les orphelins)

SELECT j.nom nom_jeu, p.prenom prenom_proprietaire
FROM proprietaires p
RIGHT JOIN jeux_video j
ON j.ID_proprietaire = p.ID

Orphelin car soit la valeur n'existe pas/plus dans table maitre, soit contient NULL.

Plus sur le web (tuto)

Voir aussi http://fr.openclassrooms.com/informatique/cours/pour-aller-plus-loin-41/traitement-des-null-s et leur pour-aller-plus-loin-41/filtrer-les-donnees-avec-where