1. 중복 제거
2. 조인 쿼리
다중 테이블 조인 쿼리에 where 사용
내부 조인 - 동등 조인
내부 조인 - 비 동등한 연결
내부 조인 - 자체 조인
외부 조인 - 왼쪽 및 오른쪽 외부 조인
3개의 테이블 조인
샘플 테이블 콘텐츠는 이 문서를 참조하세요.
일부 MySQL 데이터 테이블 데이터베이스에 중복 레코드가 있을 수 있습니다. 어떤 경우에는 중복 데이터의 존재를 허용하지만 때로는 이러한 중복 데이터를 삭제해야 할 수도 있습니다.
예: 중복 제거 및 직무 정보 표시:
mysql> select distinct job from emp; +-----------+ | job | +-----------+ | CLERK | | SALESMAN | | MANAGER | | ANALYST | | PRESIDENT | +-----------+ 5 rows in set (0.02 sec)
또 다른 예: 중복을 공동으로 제거하고 부서 및 직위에 대한 고유 정보 찾기:
mysql> select distinct job,deptno from emp; +-----------+--------+ | job | deptno | +-----------+--------+ | CLERK | 20 | | SALESMAN | 30 | | MANAGER | 20 | | MANAGER | 30 | | MANAGER | 10 | | ANALYST | 20 | | PRESIDENT | 10 | | CLERK | 30 | | CLERK | 10 | +-----------+--------+ 9 rows in set (0.00 sec)
또 다른 예: 이제 count와 결합하여 작업 수를 계산하려고 합니다. :
mysql> select count(distinct job) from emp; +---------------------+ | count(distinct job) | +---------------------+ | 5 | +---------------------+ 1 row in set (0.00 sec)
하나의 테이블에서 데이터를 읽는 방법을 배웠습니다. 비교적 간단하지만 실제 응용에서는 여러 데이터 테이블에서 데이터를 읽어야 하는 경우가 많습니다.
JOIN은 기능에 따라 대략 다음 세 가지 범주로 나뉩니다.
INNER JOIN(내부 조인 또는 등가 조인): 두 테이블의 필드 일치 관계에 대한 기록을 얻습니다.
LEFT JOIN(왼쪽 조인): 오른쪽 테이블에 일치하는 레코드가 없더라도 왼쪽 테이블의 모든 레코드를 가져옵니다.
RIGHT JOIN: LEFT JOIN과 달리 왼쪽 테이블에 일치하는 레코드가 없더라도 오른쪽 테이블의 모든 레코드를 가져오는 데 사용됩니다.
다중 테이블 조인의 작업은 한 테이블의 각 데이터 조각을 다른 테이블의 데이터 행과 일치시키는 것입니다. 이는 효율성 제어 문제와 관련이 있습니다
이제 예를 들어 보겠습니다. 각 직원의 이름과 부서 이름을 꺼내세요:
mysql> select ename,dname -> from emp,dept -> where emp.deptno = dept.deptno; +--------+------------+ | ename | dname | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | +--------+------------+ 14 rows in set (0.00 sec)
위의 SQL 문은 실제로 매우 비효율적입니다. 최적화(테이블 별칭): (sql92 구문)
mysql> select e.ename,d.dname -> from emp e,dept d -> where e.deptno = d.deptno; +--------+------------+ | ename | dname | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | +--------+------------+ 14 rows in set (0.00 sec)
참고: 테이블에 연결이 많을수록 효율성이 낮아집니다. 테이블에 대한 연결 수를 줄여보세요!
위의 예에서도 각 직원의 이름과 부서 이름을 가져옵니다: (sql99 구문)
Inner Join, inner
mysql> select e.ename,d.dname -> from emp e -> inner join -> dept d -> on -> e.deptno = d.deptno; +--------+------------+ | ename | dname | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | +--------+------------+ 14 rows in set (0.00 sec)
sql99의 장점은 다음과 같습니다. 테이블은 독립적이며 위치를 차지하지 않습니다. 전체 SQL 문을 더 명확하게
사례: 각 사원의 급여 등급을 알아내고 사원 이름, 급여, 급여 등급을 표시하도록 요구
mysql> select -> e.ename,e.sal,s.grade -> from -> emp e -> inner join -> salgrade s -> on -> e.sal between s.losal and s.hisal; +--------+---------+-------+ | ename | sal | grade | +--------+---------+-------+ | SMITH | 800.00 | 1 | | ALLEN | 1600.00 | 3 | | WARD | 1250.00 | 2 | | JONES | 2975.00 | 4 | | MARTIN | 1250.00 | 2 | | BLAKE | 2850.00 | 4 | | CLARK | 2450.00 | 4 | | SCOTT | 3000.00 | 4 | | KING | 5000.00 | 5 | | TURNER | 1500.00 | 3 | | ADAMS | 1100.00 | 1 | | JAMES | 950.00 | 1 | | FORD | 3000.00 | 4 | | MILLER | 1300.00 | 2 | +--------+---------+-------+ 14 rows in set (0.01 sec)
사례: 직원의 상급 리더를 쿼리하려면 직원 이름과 해당 리더 이름이 표시되어야 합니다
직원과 리더의 관계가 하나의 테이블에 있음을 알 수 있습니다. 이때 셀프 조인을 사용해야 합니다(tip. : 하나의 테이블은 두 개의 테이블로 처리됨)
mysql> select -> a.ename as '员工名',b.ename as '领导名' -> from emp a -> join emp b -> on -> a.mgr = b.empno; +-----------+-----------+ | 员工名 | 领导名 | +-----------+-----------+ | SMITH | FORD | | ALLEN | BLAKE | | WARD | BLAKE | | JONES | KING | | MARTIN | BLAKE | | BLAKE | KING | | CLARK | KING | | SCOTT | JONES | | TURNER | BLAKE | | ADAMS | SCOTT | | JAMES | BLAKE | | FORD | JONES | | MILLER | CLARK | +-----------+-----------+ 13 rows in set (0.00 sec)
외부 조인과 내부 조인의 차이점은 외부 조인으로 성공적으로 일치하지 못한 특정 테이블의 레코드도 take out
사례: 직원의 부서정보를 찾아보세요. 직원이 없어도 부서에서 알아내도록 요구
mysql> select -> e.ename,d.dname -> from emp e -> right join dept d -> on -> e.deptno = d.deptno; +--------+------------+ | ename | dname | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | | NULL | OPERATIONS | +--------+------------+ 15 rows in set (0.00 sec)
마찬가지로 왼쪽 외부 조인이라면 왼쪽 테이블의 모든 데이터가 쿼리되므로 왼쪽 조인 키워드를 사용하면 됩니다
에 대한 쿼리 결과 수 외부 조인은 > ;= 내부 조인의 쿼리 결과 수
더 복잡한 상황은 그룹 테이블 연결입니다
사례를 살펴보겠습니다.
부서 이름과 급여 등급을 알아보세요. 직원마다. 직원 이름, 부서명, 급여, 급여 등급을 표시해야 합니다
mysql> select -> e.ename,e.sal,d.dname,s.grade -> from emp e -> join dept d -> on e.deptno = d.deptno -> join salgrade s -> on e.sal between s.losal and s.hisal; +--------+---------+------------+-------+ | ename | sal | dname | grade | +--------+---------+------------+-------+ | SMITH | 800.00 | RESEARCH | 1 | | ALLEN | 1600.00 | SALES | 3 | | WARD | 1250.00 | SALES | 2 | | JONES | 2975.00 | RESEARCH | 4 | | MARTIN | 1250.00 | SALES | 2 | | BLAKE | 2850.00 | SALES | 4 | | CLARK | 2450.00 | ACCOUNTING | 4 | | SCOTT | 3000.00 | RESEARCH | 4 | | KING | 5000.00 | ACCOUNTING | 5 | | TURNER | 1500.00 | SALES | 3 | | ADAMS | 1100.00 | RESEARCH | 1 | | JAMES | 950.00 | SALES | 1 | | FORD | 3000.00 | RESEARCH | 4 | | MILLER | 1300.00 | ACCOUNTING | 2 | +--------+---------+------------+-------+ 14 rows in set (0.00 sec)
더 복잡한 상황을 살펴보겠습니다.
각 직원의 부서 이름, 급여 등급, 리더 이름을 알아보세요. 직원 이름, 부서 이름, 리더 이름, 급여, 급여 등급 표시 요청
mysql> select -> e.ename,e.sal,d.dname,s.grade,l.ename -> from emp e -> join dept d -> on e.deptno = d.deptno -> join salgrade s -> on e.sal between s.losal and s.hisal -> left join -> emp l -> on e.mgr = l.empno; +--------+---------+------------+-------+-------+ | ename | sal | dname | grade | ename | +--------+---------+------------+-------+-------+ | SMITH | 800.00 | RESEARCH | 1 | FORD | | ALLEN | 1600.00 | SALES | 3 | BLAKE | | WARD | 1250.00 | SALES | 2 | BLAKE | | JONES | 2975.00 | RESEARCH | 4 | KING | | MARTIN | 1250.00 | SALES | 2 | BLAKE | | BLAKE | 2850.00 | SALES | 4 | KING | | CLARK | 2450.00 | ACCOUNTING | 4 | KING | | SCOTT | 3000.00 | RESEARCH | 4 | JONES | | KING | 5000.00 | ACCOUNTING | 5 | NULL | | TURNER | 1500.00 | SALES | 3 | BLAKE | | ADAMS | 1100.00 | RESEARCH | 1 | SCOTT | | JAMES | 950.00 | SALES | 1 | BLAKE | | FORD | 3000.00 | RESEARCH | 4 | JONES | | MILLER | 1300.00 | ACCOUNTING | 2 | CLARK | +--------+---------+------------+-------+-------+ 14 rows in set (0.00 sec)
위 내용은 MySQL 데이터베이스의 중복 제거 및 연결 쿼리 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!