Maison >base de données >tutoriel mysql >Analyse de cas de requête multi-tables MySQL

Analyse de cas de requête multi-tables MySQL

WBOY
WBOYavant
2023-05-27 10:52:061677parcourir

Requête multi-tables

Description du cas

Compréhension du produit cartésien

select id,department_name
from employees,departments;#错的

select id,department_id,department_name
from employees CROSS JOIN departments;#错的

Chaque employé et chaque service ont été appariés une fois (nombre d'entrées trouvées = nombre d'identifiants*nombre de services)

Cause de l'erreur : conditions de connexion manquantes

Solution au produit cartésien

Écrivez les conditions de connexion : Tableau 1. Colonne = Tableau 2. Colonne (si plusieurs tables sont connectées, au moins n-1 conditions de connexion doivent être utilisées)

select id,employees.name,department_name 
from employees,departments
WHERE employees.name = departments.name;

Remarque : Si la colonne à afficher est dans Si les noms des tables à interroger sont les mêmes, vous devez indiquer de quelle table il provient, par exemple : employés.nom

Il est recommandé d'indiquer quelles informations de table sont affichées lors de l'interrogation de plusieurs tables (optimisation)

Optimisation : vous pouvez le mettre après FROM Utilisez l'alias de la table, mais une fois que vous utilisez l'alias, vous devrez utiliser l'alias à l'avenir

Classification des requêtes multi-tables

Jointure égale et jointure non équivalente

  • Jointure équivalente : ce qui précède avec =

  • Non-equijoin :

select t1.id,t1.name,t2.grade
from employees t1,departments t2
WHERE ti.salary BETWEEN t2.lowest_salary AND t2.highest_salary ;#非等值

without = Self-join et non-self-join

  • Non-self-link : Table 1 et Table 2 join

  • Auto-lien : la table 1 se joint à elle-même

#显示员工(t1)和其管理者(t2)的基本信息
select t1.id,t1.name,t2.id,t2.name
from employees t1,employees t2#一个表看作两个表
WHERE t1.manage_id = t2.id ;#自连接

Jointure interne et jointure externe

  • Jointure interne : fusionner les tables contenant la même colonne, le résultat n'inclut pas les lignes qui ne correspondent pas à une table avec une autre table

  • Jointure externe : fusionner les tables contenant la même colonne, le résultat En plus des résultats des jointures internes, les lignes sans correspondance sont également interrogées

Catégories de jointures externes : jointure externe gauche (plus de table à gauche, remplir le à droite), jointure externe droite (plus de table à droite, remplissez la gauche), jointure externe complète

SQL92 : Utilisez (+) pour créer une connexion

Connexion interne : Voir ci-dessus

Connexion externe : Si les données à gauche la table ne correspond pas, ajoutez (+) à la table de droite ; à l'inverse, ajoutez (+) à la table de gauche, mais MySQL ne le prend pas en charge

WHERE t1.department_id = t2.department_id(+)#左连接

SQL99 : Comment utiliser JOIN...ON

Inner join

select t1.id,t1.name,t2.department_name,t3.environment
from employees t1 JOIN departments t2
ON t1.department_id = t2.department_id
JOIN locations t3#加入第二个人表
ON t2.department_location = t3.department_location;

Jointure externe

Utilisez OUTER JOIN...ON...

  • Jointure externe gauche : LEFT OUTER JOIN

  • Jointure externe droite : RIGHT OUTER JOIN

  • Full OUTER JOIN : FULL OUTER JOIN (MySQL ne le supporte pas)

select t1.name,t2.department_name#左外连接
from employees t1 LEFT OUTER(可省略) JOIN departments t2
ON t1.department_id = t2.department_id;

Utilisation d'UMION

Fusionner les résultats de la requête

SELECT colum... FROM table1
UNION (ALL)
SELECT colum... FROM table2
  • Opérateur UNION

Deux résultats de requête Union, déduplication (faible efficacité)

  • Opérateur UNION ALL (recommandé)

Union de deux résultats de requête, sans déduplication (haute efficacité)

7 types d'implémentations SQL JOINS

Analyse de cas de requête multi-tables MySQL

Image du milieu (jointure interne) :

select t1.name,t2.department_name
from employees t1 JOIN departments t2
ON t1.department_id = t2.department_id;

Image en haut à gauche (jointure externe gauche) :

select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id;

Image en haut à droite (jointure externe droite) :

select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id;

Image du milieu à gauche :

select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t2.department_id IS NULL;

Image du milieu à droite :

select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t1.department_id IS NULL;

Image en bas à gauche (jointure étrangère complète) :

#方式一:左上图 UNION ALL 右中图
select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id
UNION ALL 
select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t1.department_id IS NULL;

#方式二:左中图 UNION ALL 右上图
select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t2.department_id IS NULL
UNION ALL
select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id;

Image en bas à droite :

#左中图 UNION ALL 右中图
select t1.name,t2.department_name
from employees t1 LEFT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t2.department_id IS NULL
UNION ALL
select t1.name,t2.department_name
from employees t1 RIGHT JOIN departments t2
ON t1.department_id = t2.department_id
WHERE t1.department_id IS NULL;

Nouvelles fonctionnalités de la syntaxe SQL

Jointure naturelle

Utilisez le mot-clé : NATURAL JOIN (inflexible), interrogez automatiquement tous les mêmes champs de la table, puis effectuez une jointure de valeur égale

Connexion USING (ne s'applique pas à l'auto-jointure)

Utilisez le mot-clé : USING (champ du même nom) pour joindre automatiquement les champs du même nom dans la table

select t1.name,t2.department_name
from employees t1 JOIN departments t2
ON t1.department_id = t2.department_id;
等价于
select t1.name,t2.department_name
from employees t1 JOIN departments t2
USING(department_id);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer