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

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

WBOY
WBOY앞으로
2023-05-28 22:07:101150검색
디렉토리
  • 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으로 문의하시기 바랍니다. 삭제