OUJOOD.COM
L'instruction JOIN por joindre deux tables ou plus
Vous pouvez combiner les enregistrements de deux ou plusieurs tables, sur la base d'une colonne commune entre elles, en utilisant l'instruction JOIN.Il existe trois types de jointures MySQL:
INNER JOIN (ou plutôt on utilise simplement JOIN )
LEFT OUTER JOIN (ou plutôt on utilise simplement LEFT JOIN)
RIGHT OUTER JOIN (ou plutôt on utilise simplement RIGHT JOIN)
Les jointures MySQL sont utilisées avec l'instruction SELECT. Ils sont utilisés pour récupérer des données de plusieurs tables. On l'exécute chaque fois que l'on a besoin d'extraire des enregistrements de deux tables ou plus.
Le INNER JOIN de MySQL
Le INNER JOIN est utilisée pour renvoyer toutes les lignes de plusieurs tables pour lesquelles la condition de jointure est satisfaite. Il s'agit du type de jointure le plus courant. La syntaxe de la "jointure interne" est la suivante :SELECT colonnes FROM table1 INNER JOIN table2 ON table1.colonne_commune = table2.colonne_commune
Exemple : Supposons que nous avons créé une table sous le nom CLIENTS et que nous y avons introduit des données comme indiqué ci-dessous. CREATE TABLE IF NOT EXISTS CLIENTS(
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
PRENOM CHAR(20) NOT NULL,
NOM CHAR(20),
ADRESSE CHAR(200)),
PHONE LONG,
EMAIL CHAR(100),
FAVORI INT
)
requete_sql = "INSERT INTO CLIENTS(ID,PRENOM, NOM, ADRESSE, PHONE, EMAIL, FAVORI)
VALUES (%s, %s, %s, %s, %s, %s, %s)"
valeur = [ (101,'Marcus','Mohanus', '40 lot 1 paris','0676160137','marcus@mon_mail.com', 201),
(102,'Peter', 'Neel', '43 rue 1 quartier B ville G', '0522722976','Peter@mon_mail.com', 202),
(103,'Amy', 'Barik', '35 Av B bloc 7 ville C', '0742553500','amy@mon_mail.com',''),
(104,'Raja', 'Moufid', '32 BV L ville D', '0645782206','raja@mon_mail.com','')
]
Puis une table sous le nom PRODUITS et que nous y avons introduit des données comme indiqué ci-dessous.CREATE TABLE IF NOT EXISTS PRODUITS(
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
PRODUIT(20) NOT NULL,
PRIX FLOAT
)
requete_sql = "INSERT INTO PRODUITS(ID,PRODUIT, PRIX)
VALUES (%s, %s, %s)"
valeur = [ (201,'Chocolat',15.00),
(202,'Bombon',5.25 ),
(203,'Huile', 10.75 ),
(204,'Lait écrémé', 1.25 )]
Dans la colonne FAVORI bous avons introduit le ID du Produit favori du CLIENTS.Doncles deus tables sont jointes par une colonne commune soit:
la colonne FAVORI de la table CLIENTS et la colonne ID de la table PRODUITS.
Même si les deux colonnes portent chacune un nom différent dans chaque table mais il s'agit d'une colonne commune vu la nature de leur contenu.
# Importation des module nécessaires
import mysql.connector
try:
#Créer une connexion à la base de données
conn = mysql.connector.connect(
host = "localhost",
user = "votre nom utilisateur",
passwd = "votre mot de passe",
database="oujood_py"
)
# préparation d'un objet curseur
curseurObjet = conn.cursor()
#Suppression de la table EMPLOYEE si elle existe déjà.
curseurObjet.execute("DROP TABLE IF EXISTS CLIENTS")
#Creation de la table CLIENTS
requete ='''CREATE TABLE CLIENTS(
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
PRENOM CHAR(20) NOT NULL,
NOM CHAR(20),
ADRESSE CHAR(200),
PHONE LONG,
EMAIL CHAR(50) NOT NULL,
FAVORI INT
)'''
curseurObjet.execute(requete)
requete_sql = "INSERT INTO CLIENTS(ID,PRENOM, NOM, ADRESSE, PHONE, EMAIL, FAVORI) VALUES (%s, %s, %s, %s, %s, %s, %s)"
valeur = [ (101,'Marcus','Mohanus', '40 lot 1 paris','0676160137','marcus@mon_mail.com',201),
(102,'Peter', 'Neel', '43 rue 1 quartier B ville G', '0522722976','Peter@mon_mail.com',202),
]
# Exécution de la commande SQL
curseurObjet.executemany(requete_sql, valeur)
conn.commit()
requete_sql1 = "INSERT INTO CLIENTS(PRENOM, NOM, ADRESSE, PHONE, EMAIL) VALUES ( %s, %s, %s, %s, %s)"
valeur = [ ('Amy', 'Barik', '35 Av B bloc 7 ville C', '0742553500','amy@mon_mail.com'),
('Raja', 'Moufid', '32 BV L ville D', '0645782206','raja@mon_mail.com'),
]
# Exécution de la commande SQL
curseurObjet.executemany(requete_sql1, valeur)
conn.commit()
#Suppression de la table EMPLOYEE si elle existe déjà.
curseurObjet.execute("DROP TABLE IF EXISTS PRODUITS")
sql = '''CREATE TABLE IF NOT EXISTS PRODUITS(
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
PRODUIT CHAR(20),
PRIX INT
)'''
curseurObjet.execute(sql)
conn.commit()
sql1 = """INSERT INTO PRODUITS(ID,PRODUIT, PRIX) VALUES
(201, 'Chocolat', 15),
(202, 'Bombon', 5),
(203, 'Huile', 10),
(204, 'Lait écrémé', 1)
"""
curseurObjet.execute(sql1)
conn.commit()
# Récupérer du résultat
sql2 = "SELECT * from CLIENTS INNER JOIN PRODUITS ON CLIENTS.FAVORI = PRODUITS.ID"
# Exécution de la commande SQL
curseurObjet.execute(sql2)
# Affichage du résultat
resultat = curseurObjet.fetchall();
for x in resultat:
print(x)
except mysql.connector.Error as error:
print("Échec : {}".format(error),"\n")
finally:
if conn.is_connected():
curseurObjet.close()
conn.close()
print("\n La connexion MySQL est fermée")
Nous reprenons le même exemple mais cette fois au lieu de sélectionner toutes les colonnes, nous pouvons ne sélectionner que les colonnes dont nous avons besoin.Par exemple nous choisissons la colonne PRENOM dans la table CLIENTS et le colonne PRODUIT dans la TABLE PRODUITS comme le montre l'exemple suivant:
# Importation des module nécessaires
import mysql.connector
try:
#Créer une connexion à la base de données
conn = mysql.connector.connect(
host = "localhost",
user = "votre nom utilisateur",
passwd = "votre mot de passe",
database="oujood_py"
)
# préparation d'un objet curseur
curseurObjet = conn.cursor()
# Récupérer du résultat
sql2 = "SELECT CLIENTS.PRENOM , PRODUITS.PRODUIT from CLIENTS INNER JOIN PRODUITS ON CLIENTS.FAVORI = PRODUITS.ID"
# Exécution de la commande SQL
curseurObjet.execute(sql2)
# Affichage du résultat
resultat = curseurObjet.fetchall();
for x in resultat:
print(x)
except mysql.connector.Error as error:
print("Échec : {}".format(error),"\n")
finally:
if conn.is_connected():
curseurObjet.close()
conn.close()
print("\n La connexion MySQL est fermée")
Note : Les clients qui n'ont pas de produit favori, ne sont pas inclus dans le résultat, à savoir : Amy et raja
MySQL Left Outer Join
La jointure LEFT OUTER renvoie toutes les lignes de la table de gauche spécifiée dans la condition ON et seulement les lignes de l'autre table où la condition de jointure est remplie.Exemple : Ici nous reprenons le même exemple ci-dessus en utilisant : LEFT OUTER
# Importation des module nécessaires
import mysql.connector
try:
#Créer une connexion à la base de données
conn = mysql.connector.connect(
host = "localhost",
user = "votre nom utilisateur",
passwd = "votre mot de passe",
database="oujood_py"
)
# préparation d'un objet curseur
curseurObjet = conn.cursor()
# Récupérer du résultat
sql2 = "SELECT CLIENTS.PRENOM , PRODUITS.PRODUIT from CLIENTS LEFT JOIN PRODUITS ON CLIENTS.FAVORI = PRODUITS.ID"
# Exécution de la commande SQL
curseurObjet.execute(sql2)
# Affichage du résultat
resultat = curseurObjet.fetchall();
for x in resultat:
print(x)
except mysql.connector.Error as error:
print("Échec : {}".format(error),"\n")
finally:
if conn.is_connected():
curseurObjet.close()
conn.close()
print("\n La connexion MySQL est fermée")
MySQL RIGHT OUTER JOIN
RIGHT OUTER JOIN retourne toutes les lignes de la table à DROITE spécifiée dans la condition ON et seulement les lignes de l'autre table où la condition de jointure est remplie.
# Importation des module nécessaires
import mysql.connector
try:
#Créer une connexion à la base de données
conn = mysql.connector.connect(
host = "localhost",
user = "votre nom utilisateur",
passwd = "votre mot de passe",
database="oujood_py"
)
# préparation d'un objet curseur
curseurObjet = conn.cursor()
# Récupérer du résultat
sql2 = "SELECT CLIENTS.PRENOM , PRODUITS.PRODUIT from CLIENTS RIGHT JOIN PRODUITS ON CLIENTS.FAVORI = PRODUITS.ID"
# Exécution de la commande SQL
curseurObjet.execute(sql2)
# Affichage du résultat
resultat = curseurObjet.fetchall();
for x in resultat:
print(x)
except mysql.connector.Error as error:
print("Échec : {}".format(error),"\n")
finally:
if conn.is_connected():
curseurObjet.close()
conn.close()
print("\n La connexion MySQL est fermée")