집 >데이터 베이스 >MySQL 튜토리얼 >MySQL에서 데이터 테이블의 외부 조인을 사용하는 방법
Outer Join을 사용하는 이유를 설명하기 전에 먼저 기록을 살펴보겠습니다. (다음과 같습니다:)
표의 장산은 부서번호가 없으므로, 고정된 부서 설립 없이 임시로 '임시근로자'로 분류하겠습니다.
이러한 시나리오에서는 문제가 발생합니다. 각 사원의 이름과 그가 속한 부서를 조회하고자 할 때, 내부 조인을 사용하는 경우, 연결 조건이 ` "Employee Table"의 "부서 번호" = ""부서 테이블"의 부서 번호이기 때문입니다. ", "장산"이 그리워 질 것입니다. "Zhang San"은 "부서 번호"가 없지만 "임시 직원"으로 회사의 구성원이기도 하므로 이 문제를 해결하려면 외부 조인 구문을 도입해야 합니다. 그렇지 않으면 일부 논리 데이터가 손실됩니다. .
외부 조인과 내부 조인의 차이점:
연결 조건을 충족하는 레코드만 내부 조인 결과에 표시됩니다. 연결 조건을 충족하지 않는 레코드는 결과에 표시되지 않습니다. 세트.
데이터 연결 조건의 충족 여부에 관계없이 외부 연결은 결과 집합에 특별한 방식으로 표시됩니다. (예를 들어 위에서 언급한 직원 부서 번호 정보를 조회할 때 "Zhang San"은 부서 번호가 없기 때문에 Inner Join을 사용하면 "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"의 레코드를 찾을 수 있음을 알 수 있습니다. 따라서 "왼쪽 조인"과 "오른쪽 조인"의 차이는 그리 크지 않습니다.
각 부서의 이름과 부서의 인원수를 조회해 보시겠어요?
이 질문은 간단해 보이지만 두 가지 어려움이 있고, 실수하기 쉬운 부분도 있습니다. 자세한 내용은 아래 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;
좋아, 여기서부터 문제가 시작된다.
다들 주목하세요 여기 "40" - "OPERATIONS" 부서에는 실제로 사람이 없습니다. 즉, 인원수는 "0"인데 이상하게도 여기서 통계를 하면 숫자가 나옵니다. of people counted가 "1"인데 왜 그럴까요?
그룹화를 사용할 때 왼쪽 테이블의 모든 데이터를 유지하는 "Left Join"을 사용하기 때문에 "deptno"에 따라 그룹화하기 때문입니다. 왼쪽 테이블. (왼쪽 테이블의 레코드가 유지되기 때문에 그룹화도 왼쪽 테이블을 기준으로 그룹화해야 합니다. 다음 키는 "COUNT(*)"이며 유효한 모든 레코드의 개수를 계산합니다. 따라서 모든 레코드가 왼쪽 테이블 "t_dept"의 레코드가 오른쪽 테이블 "t_emp"에 연결되면 오른쪽 테이블은 "NULL" 값을 사용하여 왼쪽 테이블 "t_dept"에 연결됩니다. 유효한 기록이므로 "COUNT(*)" 계산 결과는 "1"입니다.
그래서 40개 부서의 통계 결과는 "1"인 것은 이해가 되지만, 이 결과는 그렇지 않습니다. 어떻게 해결해야 할까요?
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 문은 여전히 매우 훌륭합니다. 실제로 다시 작성해 봐야 이러한 공격을 알 수 있습니다. 외부 조인 연습 ②
"왼쪽 외부 조인"이라고 생각하시면 됩니다. " just Used는 예약되어 있습니다. 부서 테이블의 모든 레코드를 "올바른" 외부 조인으로 바꿀 수는 없을까요? 사실... 그렇게 간단하지는 않습니다.
이 연습을 위한 SQL 문은 " 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!