Maison >base de données >tutoriel mysql >Analyse de cas de requête multi-tables MySQL
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
É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
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 ;#非等值
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 : 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
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(+)#左连接
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;
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;
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
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;
Utilisez le mot-clé : NATURAL JOIN (inflexible), interrogez automatiquement tous les mêmes champs de la table, puis effectuez une jointure de valeur égale
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!