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='从浩');
select * from emp where deptno=(select deptno from dept where dname='人力部');
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='人力部' or dname='研发部') 分类: MySQL数据库
想了解更多相关问题请访问PHP中文网:MySQL视频教程
위 내용은 MySQL - 다중 테이블 쿼리에 대한 자세한 소개 및 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!