SQL JOINTURES
Les jointures SQL
Les jointures SQL permettent de lier des tables entre elles. Ces tables peuvent être de la même base de données ou non.Table d'exemple pour les jointures
Nous utiliserons les données suivantes pour les exemples:CREATE DATABASE IF NOT EXISTS monsiteweb; | |
USE monsiteweb; | |
DROP TABLE IF EXISTS visiteurs; | |
CREATE TABLE visiteurs | |
( id int, adresse_ip varchar(255), date datetime ); | |
DROP TABLE IF EXISTS users; | |
CREATE TABLE users | |
( id int, nom varchar(255), adresse_ip varchar(255) ); | |
INSERT INTO visiteurs (id, date, adresse_ip) | |
VALUES | |
( "1", "2013-11-20 15:05:13", "5.20.4.96" ), | |
( "2", "2012-05-15 23:55:10", "105.12.3.6" ), | |
( "3", "2013-10-08 12:14:06", "52.24.23.3" ), | |
( "4", "2013-06-07 04:15:00", "36.45.25.204" ), | |
( "5", "2014-11-20 23:03:45", "111.111.111.111" ), | |
( "6", "2010-07-10 03:45:12", "111.111.111.111" ), | |
( "7", "2011-06-15 23:03:45", "111.111.111.111" ), | |
( "8", "2012-05-23 00:00:01", "111.111.111.111" ), | |
( "9", "2010-15-30 23:23:42", "0.0.0.0" ); | |
INSERT INTO users (id, nom, adresse_ip) | |
VALUES | |
( "1", "Olivier ENGEL", "5.20.4.96" ), | |
( "2", "Batman", "105.12.3.6" ), | |
( "3", "Zorro", "52.24.23.3" ), | |
( "4", "Superman", "36.45.25.204" ), | |
( "5", "Spiderman", "222.222.222.222" ), | |
( "6", "Hulk", "222.222.222.222" ); |
La table visiteurs
La table users
Jointure interne
Nous allons regrouper toutes les informations de ces deux tables en une seule table. Le but recherché de cet exemple et de pouvoir dire quel nom est associé à l'adresse IP. Requete SQL qui fait la jointure:SELECT * FROM visiteurs a, users b WHERE a.adresse_ip = b.adresse_ip;
Résultat :
La première chose que l'on remarque c'est qu'il n'y a que 4 lignes alors que la table "visiteurs" en a 9.
SQL n'a pas trouvé une jointure possible avec les lignes 5,6,7,8 et 9 de la table visiteurs,
puisque l'adresse IP n'est pas présente dans la table users.
Cette jointure est donc la plus simple qui existe en SQL, et elle ignore les ligne qui ne peuvent avoir de jointures.
Il existe une autre syntaxe pour ce type de jointure:
SELECT | |
* | |
FROM | |
visiteurs a | |
INNER JOIN | |
users b ON a.adresse_ip = b.adresse_ip; |
A noter aussi que le mot INNER est facultatif.
SELECT | |
* | |
FROM | |
visiteurs a | |
JOIN | |
users b ON a.adresse_ip = b.adresse_ip; |
WHERE, ORDER BY et LIMIT
La recherche, le tri et la limitation d'affichage de données se place après les jointures :SELECT | |
* | |
FROM | |
visiteurs a | |
JOIN | |
users b ON a.adresse_ip = b.adresse_ip | |
WHERE | |
a.date > "2013-01-01 00:00:00"; |
Les jointures externes
Sur MySQL , il existe 2 jointures externes possibles : LEFT JOIN et RIGHT JOIN.Dans l'exemple de jointure interne exmpliqué plus haut, nous avons remarqué qu'il y avait 4 lignes alors que la table "visiteurs" possédait 5 entrées.
La jointure externe permet de récupérer cette ligne, même si elle n'est associée à rien.
LEFT JOIN
Requete SQL de jointure LEFT JOIN:SELECT | |
* | |
FROM | |
visiteurs a | |
LEFT JOIN | |
users b ON a.adresse_ip = b.adresse_ip; |
RIGHT JOIN
A l'opposé RIGHT JOIN établit une jointure en partant de la table de droite.Requete SQL de jointure RIGHT JOIN:
SELECT | |
* | |
FROM | |
visiteurs a | |
RIGHT JOIN | |
users b ON a.adresse_ip = b.adresse_ip; |
Jointure multi critères
Vous pouvez affiner la jointure en ajoutant plusieurs critères :SELECT | |
* | |
FROM | |
visiteurs a | |
LEFT JOIN | |
users b ON a.adresse_ip = b.adresse_ip AND a.xxx = b.yyy; |
Lier plusieurs tables
Il est possbile de lier plus que deux tables :SELECT | |
* | |
FROM | |
<table> a | |
LEFT JOIN | |
<table> b ON a.<colonne> = b.<colonne> | |
LEFT JOIN | |
<table> c ON b.<colonne> = b.<colonne>; |
UNE QUESTION SUR L'ARTICLE?