「外部接続」が使用される理由を説明する前に、レコードを見てみましょう。 (以下の通り:)
表中の Zhang San には部門番号がないため、固定の部門が設置されていない「臨時職員」として一時的に分類されます。
このようなシナリオでは、問題が発生します。各従業員の名前と所属部署を問い合わせたい場合、内部結合を使用する場合、リンク条件が`「従業員テーブル」の「部門番号」=「「部門テーブル」の部門番号」となっているため、 』、『張三』が懐かしくなります。 「Zhang San」には「部門番号」がありませんが、「臨時職員」として会社のメンバーでもあるため、この問題を解決するには外部結合の構文を導入する必要があります。そうしないと、一部の論理データが失われます。 。
外部結合と内部結合の違い:
内部結合の結果には、接続条件を満たすレコードのみが表示され、レコードは接続条件を満たさないものは表示されますが、結果セットには表示されません。
データ接続条件が満たされているかどうかに関係なく、外部接続は特別な方法で結果セットに表示されます。 (たとえば、上記の従業員の部門番号情報をクエリする場合、「Zhang San」には部門番号がないため、内部結合が使用される場合、「Zhang San」は「接続条件」を満たさないため、結果に表示されません)
外部結合の例は次のとおりです。
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" 值与 "左表" 去匹配
「左外部結合」は、接続操作中に、左側のテーブルのすべてのレコードが保持され、右側のテーブルに接続されることを意味します。左のテーブルは右のテーブルに接続され、右のテーブルに条件を満たすレコードがあれば、右のテーブルに条件を満たすレコードがない場合は「NULL」で左のテーブルと接続されます。
「左結合」との違いは「右結合」です。「右結合」は「左結合」の逆です。右のテーブルのすべてのレコードを保持し、左のテーブルの修飾されたレコードを結合します。 ; 同様に、左側のテーブルに条件を満たすレコードがない場合は、「NULL」を使用して右側のテーブルを結合します。
右結合 SQL ステートメントの例:
SELECT e.empno, e.ename, d.dname FROM t_dept d RIGHT JOIN t_emp e ON e.deptno = d.deptno; -- 这里有个需要注意的地方,就是相较于上文中的 "左连接" ,这里的 "右连接" 左右两张的表的位置做了调换
ここでも、「Zhang San」には「部門」がないことがわかります。番号」の記録。したがって、「左結合」と「右結合」の違いはそれほど大きくありません。
各部門の名前とその部門の人数をクエリしますか?
この質問は簡単そうに見えますが、難しい点が 2 つあり、間違いやすい箇所もあります。詳しくは、以下の SQL 文の例と模式図を参照してください。
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、ここからが問題の始まりです。
皆さん、ここの「40」-「OPERATIONS」部門に注目してください。実際にはこの部門には誰もいません、つまり人数は「0」ですが、奇妙なことに、統計が作成されると、カウントされる人数は「1」です これはなぜですか?
これは、グループ化を使用するときに「左結合」を使用し、すべてのデータを左側のテーブルに保持するためです。したがって、グループ化には左側のテーブルの「deptno」に従います。 (左側のテーブルのレコードが保持されるため、グループ化も左側のテーブルに従ってグループ化する必要があります。次のキーは "COUNT(*)" で、有効なすべてのレコードの数をカウントします。左側のテーブル「t_dept」のレコードが右側のテーブル「t_emp」に接続されると、右側のテーブルは「NULL」値を使用して左側のテーブル「t_dept」に接続します。接続が完了すると、 valid Record. 有効なレコードなので「COUNT(*)」 統計結果は「1」です
つまり、40部門の統計結果が「1」であることは理解できますが、これは結果が望むものではありません。どう対処すればよいですか? 解決するにはどうすればよいですか? 以下の SQL ステートメントを参照してください。
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;
この SQL ステートメントはまだ非常に優れています。多くの詳細と考慮されていない状況。本当に一度書いた場合のみ。これらの攻撃が気づかれるときのみ。
部門名と人数を取得します。部門がない場合は、部門名の代わりに「NULL」を使用してください (これは実際には「Zhang San」を指します)
おそらく、今使用したのはすべてを保持するための「左外部結合」だと思うでしょう。部門テーブル内のレコードです。これは単なる「右」外部結合ではありませんか? 実際... 。それほど単純ではありません。
この演習の SQL ステートメントは、「UNION」を使用して実装する必要があります。 " キーワード。複数のクエリ ステートメントの結果セットをマージするには (重複を除外するため)、"UNION" キーワードを使用します。
"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); -- 第一个查询语句,得到的结果集是各个部门的人数。 -- 第二个查询语句,得到的结果集是隶属于各个部门的人数,但是因为 "张三" 是一个没有部门所属的 "临时工" -- 所以两个查询语句的结果集合并之下没救如下图所示。
以上がMySQL でデータテーブルの外部結合を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。