MySQL 데이터베이스의 중복 제거 및 연결 쿼리 방법

WBOY
풀어 주다: 2023-05-28 22:07:10
앞으로
1155명이 탐색했습니다.
디렉토리
  • 1. 중복 제거

  • 2. 조인 쿼리

    • 다중 테이블 조인 쿼리에 where 사용

    • 내부 조인 - 동등 조인

    • 내부 조인 - 비 동등한 연결

    • 내부 조인 - 자체 조인

    • 외부 조인 - 왼쪽 및 오른쪽 외부 조인

    • 3개의 테이블 조인

1 중복 제거

샘플 테이블 콘텐츠는 이 문서를 참조하세요.

일부 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)
로그인 후 복사

2. 조인 쿼리

하나의 테이블에서 데이터를 읽는 방법을 배웠습니다. 비교적 간단하지만 실제 응용에서는 여러 데이터 테이블에서 데이터를 읽어야 하는 경우가 많습니다.

JOIN은 기능에 따라 대략 다음 세 가지 범주로 나뉩니다.

INNER JOIN(내부 조인 또는 등가 조인): 두 테이블의 필드 일치 관계에 대한 기록을 얻습니다.

LEFT JOIN(왼쪽 조인): 오른쪽 테이블에 일치하는 레코드가 없더라도 왼쪽 테이블의 모든 레코드를 가져옵니다.

RIGHT JOIN: LEFT JOIN과 달리 왼쪽 테이블에 일치하는 레코드가 없더라도 오른쪽 테이블의 모든 레코드를 가져오는 데 사용됩니다.

다중 테이블 조인의 작업은 한 테이블의 각 데이터 조각을 다른 테이블의 데이터 행과 일치시키는 것입니다. 이는 효율성 제어 문제와 관련이 있습니다

다중 테이블 연결 쿼리에 where를 사용하세요

이제 예를 들어 보겠습니다. 각 직원의 이름과 부서 이름을 꺼내세요:

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)
로그인 후 복사

참고: 테이블에 연결이 많을수록 효율성이 낮아집니다. 테이블에 대한 연결 수를 줄여보세요!

Inner Join - Equivalent Join

위의 예에서도 각 직원의 이름과 부서 이름을 가져옵니다: (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)
로그인 후 복사

마찬가지로 왼쪽 외부 조인이라면 왼쪽 테이블의 모든 데이터가 쿼리되므로 왼쪽 조인 키워드를 사용하면 됩니다

에 대한 쿼리 결과 수 외부 조인은 > ;= 내부 조인의 쿼리 결과 수

3 테이블 연결

더 복잡한 상황은 그룹 테이블 연결입니다

사례를 살펴보겠습니다.

부서 이름과 급여 등급을 알아보세요. 직원마다. 직원 이름, 부서명, 급여, 급여 등급을 표시해야 합니다

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿