Avant d'expliquer pourquoi les "jointures externes" sont utilisées, regardons un enregistrement. (Comme suit :)
Étant donné que Zhang San dans le tableau n'a pas de numéro de département, nous le classerons temporairement comme « intérimaire » sans établissement de département fixe.
Dans un tel scénario, des problèmes surviennent. Lorsque nous souhaitons interroger le nom de chaque employé et le service auquel il appartient, lors de l'utilisation d'une jointure interne, car notre condition de lien est ` "Numéro de département" de "Table des employés" = "Département du numéro de "Table de département", "Zhang San" nous manquera. Bien que "Zhang San" n'ait pas de "numéro de service", il est également membre de l'entreprise en tant que "travailleur temporaire", donc la syntaxe des jointures externes doit être introduite pour résoudre ce problème, sinon certaines données logiques seront perdues. .
La différence entre les jointures externes et les jointures internes :
Seuls les enregistrements qui remplissent les conditions de connexion apparaîtront dans les résultats de la jointure interne. Les enregistrements qui ne remplissent pas les conditions de connexion n'apparaîtront jamais dans le résultat. ensemble.
Que les conditions de connexion de données soient remplies ou non, les connexions externes seront affichées dans l'ensemble de résultats d'une manière spéciale. (Par exemple, interroger les informations sur le numéro de service de l'employé mentionnées ci-dessus, car « Zhang San » n'a pas de numéro de service, si une jointure interne est utilisée, « Zhang San » ne remplit pas les « conditions de connexion » et n'apparaîtra pas dans le résultat. set. ; Remplacez "jointure externe" et vous ne le manquerez pas.)
L'exemple de phrase de jointure externe est le suivant
SELECT e.empno, e.ename, d.dname FROM t_emp e LEFT JOIN t_dept d ON e.deptno = d.deptno; -- 在连接的时候仍然是链接 "员工表" 与 "部门表" ,只不过连接关键字由 "JOIN" 变成了 "LEFT JOIN" (下文再为大家详细解释) -- 两张表的连接条件还是使用 "ON" 关键字去连接的 , 连接条件依然是 "员工表" 的 "部门编号" = "部门表" 的 "部门编号" -- LEFT JOIN 为 "外连接" 的 "左外连接" ;(在 "外连接" 中,是分为 "左外连接" 与 "右外连接" 的) -- 在该SQL语句中 "LEFT JOIN" 左右各有数据表 "t_emp e" 与 "t_dept d" -- 所以这里的 "左连接" 的意思就是:保留 左表 的所有记录,然后与 右表 去连接,如果 右表 有符合条件的记录,则正常连接即可; -- 如果 右表 没有符合条件的连接记录, 右表 则展示 "NULL" 值与 "左表" 去匹配
"Jointure externe gauche" signifie que pendant l'opération de jointure, tous les éléments du tableau de gauche sont conservés et joignent le tableau de droite. La table de gauche sera connectée à la table de droite. S'il y a des enregistrements qui remplissent les conditions dans la table de droite ; s'il n'y a aucun enregistrement qui remplit les conditions dans la table de droite, "NULL" sera utilisé pour connecter la table de gauche.
La différence avec la « jointure gauche » est la « jointure droite ». La « jointure droite » est l'opposé de la « jointure gauche ». Elle conserve tous les enregistrements dans la table de droite et joint les enregistrements qualifiés dans la table de gauche de la même manière ; la table de gauche Si aucun enregistrement ne remplit les conditions, utilisez "NULL" pour vous connecter à la table de droite.
Exemple d'instruction SQL de jointure à droite :
SELECT e.empno, e.ename, d.dname FROM t_dept d RIGHT JOIN t_emp e ON e.deptno = d.deptno; -- 这里有个需要注意的地方,就是相较于上文中的 "左连接" ,这里的 "右连接" 左右两张的表的位置做了调换
Ici, vous pouvez voir que vous pouvez toujours trouver les enregistrements de "Zhang San" sans "numéro de département". La différence entre « jointure à gauche » et « jointure à droite » n'est donc pas très grande.
Demandez le nom de chaque département et le nombre de personnes dans le département ?
Cette question semble simple, mais elle comporte deux difficultés, et il existe également des domaines dans lesquels des erreurs sont faciles à commettre. Pour plus de détails, consultez les exemples d'instructions SQL et le diagramme schématique ci-dessous.
SELECT d.deptno, d.dname, COUNT(*) FROM t_dept d LEFT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno;
OK, c'est là que les problèmes commencent.
Veuillez faire attention au département "40" - "OPÉRATIONS" ici. Il n'y a en fait personne dans ce département, c'est-à-dire que le nombre de personnes est "0", mais étrangement, lorsque les statistiques sont effectuées ici, le nombre est élevé. des personnes comptées est "1", pourquoi est-ce ? le tableau de gauche. (Étant donné que les enregistrements de la table de gauche sont conservés, le regroupement doit également être regroupé en fonction de la table de gauche. La clé suivante est "COUNT(*)", qui comptera le nombre de tous les enregistrements valides. Ainsi, lorsque tous les enregistrements de la table de gauche "t_dept" Lorsque l'enregistrement est connecté à la table de droite "t_emp", la table de droite utilisera la valeur "NULL" pour se connecter à la table de gauche "t_dept". Une fois la connexion terminée, ce sera un enregistrement valide. Puisqu'il s'agit d'un enregistrement valide, alors "COUNT(*)" Le résultat calculé est "1". Il est donc compréhensible que le résultat statistique de 40 départements soit "1", mais ce résultat n'est pas quoi. nous voulons. Comment le résoudre ? L'instruction SQL ci-dessous
SELECT d.deptno, d.dname, COUNT(e.deptno) FROM t_dept d LEFT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno;
Récupérez le nom du département et le nombre de personnes. Pour les employés sans département, utilisez "NULL" au lieu du nom du département (cela fait en fait référence à "Zhang San")
Vous pensez peut-être que le "gauche externe" join" qui vient d'être utilisé est réservé. Ne pouvons-nous pas simplement remplacer tous les enregistrements de la table département par des jointures externes "à droite" ? En fait... ce n'est pas si simple.
"UNION"关键字 在 SQL 语句中的用法如下:
(SQL查询语句) UNION (SQL查询语句) -- 如果存在多条查询语句的话,可以继续使用 UNION 关键字 连接
PS:这里需要注意一下,“UNION” 合并多少个结果集其实无所谓,关键是这些结果集的字段数量和字段的名称必须要相同 。如果说第一个 SQL 查询语句返回的是 10个 字段,第二个返回的是 2个字段 ,这种情况是完全没办法合并的。
(SELECT d.deptno, d.dname, COUNT(e.deptno) FROM t_dept d LEFT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno) UNION (SELECT d.deptno, d.dname, COUNT(*) FROM t_dept d RIGHT JOIN t_emp e ON d.deptno = e.deptno GROUP BY d.deptno); -- 第一个查询语句,得到的结果集是各个部门的人数。 -- 第二个查询语句,得到的结果集是隶属于各个部门的人数,但是因为 "张三" 是一个没有部门所属的 "临时工" -- 所以两个查询语句的结果集合并之下没救如下图所示。
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!