Chargement...

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

SQL

La table users

SQL

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 : SQL 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;
Le résultat de cette jointure est évidemment le même que l'exemple plus haut.
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";
Résultat: SQL

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;
Résultat de la jointure SQL: SQL On remarque que la jointure se fait à partir de la table de gauche ( d'où le terme LEFT JOIN ) et on ajoute, sans perdre d'informatio de la table initiales les jointures de la table suivante.

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;
Résultat de la jointure SQL: SQL

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;
xxx serait le nom de la colonne de la première table et yyy de la deuxième table

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?


CSSW Apprendre à créer son site web CSSW