> 데이터 베이스 > MySQL 튜토리얼 > MySQL - 다중 테이블 쿼리에 대한 자세한 소개 및 예

MySQL - 다중 테이블 쿼리에 대한 자세한 소개 및 예

王林
풀어 주다: 2019-08-28 11:59:23
앞으로
2706명이 탐색했습니다.

1. 테이블 간의 관계

일대일: 사용자 테이블과 신원 정보 테이블, 사용자 테이블이 메인 테이블입니다.
예: 남자 테이블, 여자 테이블

  create table man( 
   mid int primary key  auto_increment,
        mname varchar(32),
        wid int unique
    );
로그인 후 복사
 create table woman(
        wid  int primary key  auto_increment,
        wname varchar(32)
    );
로그인 후 복사

일대다: 가장 일반적인 테이블 관계, 사용자 테이블 및 주문 테이블
예: 직원 테이블, 부서 테이블

 create table emp(
            empno int primary key  auto_increment,
            ename varchar(32),
            deptno int
        );
로그인 후 복사
 create table dept(
            deptno int primary key  auto_increment,
            dname varchar(32)
        );
로그인 후 복사

다대다: 학생 테이블 및 수업 일정 등 일반적으로 다대다 관계는 다음과 같이 분할됩니다. 일대다 또는 다대일 관계.

create table student(            sid  int primary key  auto_increment,
            sname varchar(32)
        );
로그인 후 복사
insert into student (sname) values ('大拿');     
insert into student (sname) values ('唐嫣');
insert into student (sname) values ('王健林');
로그인 후 복사
 create table course(
            cid int primary key  auto_increment,
            cname varchar(32)
        );
로그인 후 복사
insert into course (cname) values ('语文');    
insert into course (cname) values ('数学');    
insert into course (cname) values ('英语');    
insert into course (cname) values ('化学');
로그인 후 복사
create table s_c(
       cid int,        sid int
   );
로그인 후 복사
 insert into s_c (sid,cid) values (1,1);    
 insert into s_c (sid,cid) values (1,2);    
 insert into s_c (sid,cid) values (1,3);    
 insert into s_c (sid,cid) values (1,4);    
 insert into s_c (sid,cid) values (2,2);    
 insert into s_c (sid,cid) values (2,4);    
 insert into s_c (sid,cid) values (3,1);    
 insert into s_c (sid,cid) values (3,3);
로그인 후 복사

2. 대용량 데이터의 중복을 피하기 위해 여러 테이블을 사용하는 이유

.
시계를 분해할수록 실제 상황에 맞게 분할하는 것이 좋습니다.

3. 개념

여러 테이블 동시 쿼리

4. Classification

<1>Merge query
Union, Union All

결과 집합 병합은 두 개의 Select 쿼리입니다. 명령문 결과가 함께 병합됩니다. (Union과 동일)
병합된 두 결과, 열 개수, 열 순서, 클래스가 일치해야 함

create table emp(
       empno int primary key  auto_increment,
       ename varchar(32)
   );
로그인 후 복사
create table dept(
        deptno int primary key  auto_increment,
        dname varchar(32)
    );
로그인 후 복사
select * from emp  union select * from dept;    
select * from emp  union all select * from dept;
로그인 후 복사

<2>Join query
Employee table

  create table emp(
            empno int primary key auto_increment, # 员工编号
            ename varchar(32),  #员工姓名
            job varchar(32),        #员工职位
            mgr  int,                       #上级编号
            hiredate date,          #入职时间
            sal double,                 #薪水
            comm double,                #奖金
            deptno int                  #所属部门
        );
로그인 후 복사

Department table

 create table dept(
            deptno int primary key auto_increment,  #部门编号
            dname varchar(32),      #部门名称
            loc varchar(32)             #部门地址
        );
로그인 후 복사

내부 조인: 내부 조인 .... On, Join,,
내부 조인은 비교 연산자이며 해당 라인의 정규화된 라인만

, 예:

select * from emp inner join  dept  on emp.deptno=dept.deptno;        
select * from emp e ,dept d where e.deptno = d.deptno;        
select * from emp e join dept d where e.deptno = d.deptno;
로그인 후 복사

외부 연결:
왼쪽 외부 연결: 왼쪽 외부 조인 | 왼쪽 조인 ... on
은 쿼리를 나타내며 모든 항목은 왼쪽에 있으며 null

select * from emp e LEFT OUTER JOIN  dept d ON e.deptno = d.deptno;
로그인 후 복사

은 없습니다. 오른쪽 외부 연결: 오른쪽 조인 ... on 또는 오른쪽 외부 조인 .... 오른쪽 연결에는 Right Join의 오른쪽 테이블에 있는 모든 라인이 포함되어 있으며, 왼쪽 테이블이 왼쪽 테이블에 있으면 왼쪽 테이블이 왼쪽 테이블에 있으면 오른쪽 오른쪽 테이블에 일치하는 항목이 없으면 부서는 결과에 해당하는 왼쪽 테이블은 null(null)입니다. 각 사람의 리더를 찾는다는 의미입니다. 리더가 없으면 리더가 표시되지 않습니다.
하나의 테이블은 테이블 2개, 직원 테이블 1개, 리더 테이블 1개라고 생각하세요. , 두 emp 테이블

 select * from emp e right OUTER JOIN  dept d ON e.deptno = d.deptno;
로그인 후 복사

자연 조인: 자연 왼쪽 조인(왼쪽 조인과 동일) | 자연 오른쪽 조인(오른쪽 조인과 동일)

자연 조인은 자동으로 판단하며, 두 개의 테이블을 연결 조건으로 지정하고 쿼리 결과를 반환합니다.

select e.ename,el.ename from emp e left join emp el on e.mgr = el.empno;
로그인 후 복사


참고: 내부 연결이 연결 조건을 쓰지 않으면 데카르트 곱의 결과가 발생하므로 이러한 상황은 피해야 하며, 외부 연결이 연결 조건을 쓰지 않으면 오류가 보고됩니다.

<3>Subquery (ANY subquery, IN subquery, SOME subquery, ALL subquery) 하위 쿼리로 해결되는 문제: Cong Hao보다 연봉이 높은 사람은 누구인가요? ? ?

select * from emp natural join dept;       
select * from emp NATURAL left join dept;        
select * from emp NATURAL right join dept;
로그인 후 복사
: 정의: 하위 쿼리를 사용하면 하나의 쿼리를 다른 쿼리에 중첩할 수 있습니다. 이를 내부 쿼리라고도 하며 내부 쿼리와 동일합니다. 내부 쿼리가 포함된 쿼리를 외부 쿼리라고 합니다. 하위 쿼리의 결과는 기본 쿼리에서 사용됩니다.

주의사항
:
1. 괄호
2. 하위 쿼리는 기본 쿼리에서 선택 후 사용할 수 있습니다.

3. 그룹별로 하위 쿼리를 사용할 수 없습니다. 4. 동일한 테이블에 있을 필요는 없으며 하위 쿼리에서 반환된 값만 기본 쿼리에서 사용할 수 있습니다.

요구 사항: 부서명이 사람인 직원 정보 쿼리 첫 번째 방법: 하위 쿼리 사용

 select * from emp where sal >(select sal from emp where ename=&#39;从浩&#39;);
로그인 후 복사

두 번째 방법: 관련 쿼리 사용

select * from emp where deptno=(select deptno from dept where dname=&#39;人力部&#39;);
로그인 후 복사

SQL 최적화: 다중 테이블 쿼리를 사용해 보세요

하위 쿼리가 다음과 같은 경우 최종적으로 실행되면 다중 테이블 쿼리로 변환되어 실행됩니다. 이는 SQL 실행 계획을 통해 확인할 수 있습니다.

                    SQL 실행 계획을 통해 두 메소드의 실행이 동일함을 알 수 있습니다.

5.from后面的子查询
需求:
查询员工号 姓名 月薪

select empno,ename,sal from emp;
로그인 후 복사

6.一般不在子查询中排序

7.一般先执行子查询,再去执行主查询

ANY关键字

假设any内部的查询返回结果个数是三个,如:result1,result2,result3,那么

select .... from .. where a > any(...);
->select ..... from ... where a > result1 or a >result2  or a >result3;
로그인 후 복사

需求:
查询工资比1号部门中任意一个员工高的信息

select * from emp where sal > any(select sal from emp where deptno = 1);
로그인 후 복사

ALL关键字

ALL关键字与any关键字类似,只不过上面的or改成and :

select .... from .. where a > all(...);
->select ..... from ... where a > result1 and a >result2  and a >result3;
로그인 후 복사

需求:
查询工资比1号部门中所有员工号的员工信息

   select * from emp where sal > all(select sal from emp where deptno = 1);
로그인 후 복사

SOME关键字

some 关键字和any关键字是一样的功能。所以:

select .... from .. where a > any(...);

->select ..... from ... where a > result1 or a >result2  or a >result3;
로그인 후 복사

IN关键字

IN运算符用于where表达式中,以列表向的形式支持多个选择。语法如下:

where column in (v1,v2,v3,.....);        
where column not in (v1,v2,v3,.....);
로그인 후 복사

当in前面加上not运算符时候,表示与in相反的意思,既不在这写列表项中选择。

案例:
查询部门名称是人力和研发的员工

 select * from emp where deptno in   (select deptno from dept where dname=&#39;人力部&#39; or dname=&#39;研发部&#39;)
分类: MySQL数据库
로그인 후 복사

想了解更多相关问题请访问PHP中文网:MySQL视频教程

위 내용은 MySQL - 다중 테이블 쿼리에 대한 자세한 소개 및 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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