>  기사  >  데이터 베이스  >  mysql 다중 테이블 작업을 완전히 마스터하세요.

mysql 다중 테이블 작업을 완전히 마스터하세요.

WBOY
WBOY앞으로
2022-03-28 13:48:222218검색

이 기사에서는 다중 테이블 관계, 외래 키 제약 조건, 다중 테이블 조인트 쿼리, 내부 조인 쿼리 및 외부 조인 쿼리를 포함하여 다중 테이블 작업과 관련된 문제를 주로 소개하는 mysql에 대한 관련 지식을 제공합니다. 그것은 모두에게 도움이 됩니다.

mysql 다중 테이블 작업을 완전히 마스터하세요.

추천 학습: mysql 튜토리얼

다중 테이블 관계

일대일(일반적으로 병합된 테이블),
일대다/다대일(부서 및 직원),
다수 -to-many(학생 및 강좌) - 중간 테이블 사용

외래 키 제약 조건 개념

다중 테이블 관계의 제약 조건에 특별히 사용됨
마스터 테이블의 기본 키를 사용하여 슬레이브 테이블의 외래 키를 제어합니다

외래 키 제약 조건:

1. 마스터 테이블은 이미 존재하거나 생성 중이어야 합니다
2. 기본 키 열은 기본 테이블에 대해 설정되어야 합니다
3. 기본 키에는 null 값이 포함될 수 없지만 외래 키에는 다음이 포함될 수 있습니다. null 값
4. 기본 테이블 조합의 테이블 이름 뒤에 지정된 목록 또는 열 이름입니다. 이 열 또는 열의 조합은 기본 테이블의 기본 키 또는 후보 키여야 합니다
5. 외래 키의 열 수는 기본 키의 열 수와 동일해야 합니다
6. 데이터 유형 외래 키의 열은 기본 키의 해당 열의 데이터와 동일해야 합니다. 동일한 유형

• 외래 키 제약 조건 외래 키 생성foreign key
在创建表之前添加外键约束
mysql 다중 테이블 작업을 완전히 마스터하세요.

在创建表之后添加外键约束

mysql 다중 테이블 작업을 완전히 마스터하세요.

验证外键约束的作用

1、数据插入:
要先给主表添加约束
从表添加约束要依赖于主表,主表没有的数据不能添加
mysql 다중 테이블 작업을 완전히 마스터하세요.

2、数据删除
主表的数据被从表依赖时,不能删除,否则可以删除
从表的数据可以任意删除

eg:

delete from dept where deptno = '1001';-----不可以删除(被依赖了)delete from dept where deptno = '1004';
------可以删除delete from emp where eid = '7';  -----可以删除

删除外键约束

删除之后,表与表之间就没有关系了
语法:

alter table 表名字 drop foreign key 外键约束名alter table emp2 drop foreign key emp2_fk;

mysql 다중 테이블 작업을 완전히 마스터하세요.

• 多对多关系-构建外键约束
A表的一行对应B表的多行,B表的一行对应A表的多行,这时候需要再重新建立一个中间表,记录表关系
mysql 다중 테이블 작업을 완전히 마스터하세요.

注意:
修改和删除时,中间从表可以随便删除和修改,但是两边从表手主表依赖的数据不能删除或者修改。

多表联合查询(非常重要)

• 概念
就是同时 查询两个或者两个以上的表,因为有时候用户在查看数据的时候,需要显示的数据来自多张表

• 数据准备
注意:
外键约束只对数据的增删改起作用,对于数据查询没有影响

• 交叉连接查询 select * from A ,B;---会产生冗余数据

1、交叉连接查询返回返回被连接的两个表所有数据行的笛卡尔积
2、笛卡尔集可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
3、假如A表有 m 行数据,B表有 n 行数据,则返回 m * n 行数据
4、笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选

内连接查询

求的是两个表之间的交集
mysql 다중 테이블 작업을 완전히 마스터하세요.

inner 可以省略

隐式内连接(SQL92标准):

select * from A,B where 条件;

显式内连接(SQL99标准);

select * from A inner join B on 条件
---查询每个部门的所属员工  //隐式内连接
select* from dept3,emp3 where dept3.deptno = emp3.dept_id;  //这样写标准

还可以给表起别名,如;

select* from dept3  a ,emp3 b  where a.deptno = b.dept_id;
	---查询每个部门的所属员工  
	//显式内连接select *from dept3 inner join emp3  on dept3.deptno = emp3.dept_id;  
	//这样写标准

还可以给表起别名,如;

select *from dept3 a join emp3 b on a.deptno = b.dept_id;

mysql 다중 테이블 작업을 완전히 마스터하세요.

mysql 다중 테이블 작업을 완전히 마스터하세요.
mysql 다중 테이블 작업을 완전히 마스터하세요.

外连接查询

分为:(outer可以 省略)
左外连接left outer join

select* from A left outer join B on 条件;

右外连接right outer join

select* from A right outer join B on 条件;

满外连接full outer join 테이블을 생성하기 전에 외래 키 제약 조건을 추가하세요

여기에 이미지 설명 삽입🎜🎜생성 후 외래 키 제약 조건 추가 table🎜🎜여기에 그림 설명 삽입🎜🎜역할 확인 외래 키 제약 조건🎜🎜1. 데이터 삽입: 🎜 먼저 메인 테이블에 제약 조건을 추가해야 합니다🎜 테이블에 제약 조건을 추가하는 방법은 메인 테이블에 없는 데이터는 추가할 수 없습니다🎜여기에 사진 설명 삽입🎜🎜2. 테이블은 슬레이브 테이블에 종속되어 있으므로 삭제할 수 없으며 그렇지 않으면 삭제할 수 있습니다.🎜 슬레이브 테이블의 데이터는 임의로 삭제할 수 있습니다🎜🎜예:🎜
select* from A full outer join B on 条件;
🎜외래 키 삭제 제약 조건 🎜🎜이 삭제된 후 테이블 사이에 관계 없음 🎜 구문: 🎜
use mydb3;select* from dept3 left outer join emp3 on dept3.deptno =emp3.dept_id;
🎜여기에 이미지 설명 삽입🎜🎜• 다대다 관계 - 외래 키 제약 조건 만들기🎜 테이블 A의 한 행은 테이블 B의 여러 행에 해당하고, 테이블 B의 한 행은 테이블 A의 여러 행에 해당합니다. 이때 다음을 수행해야 합니다. 🎜중간 테이블🎜을 다시 만들어 테이블 관계를 기록하세요🎜🎜🎜참고: 🎜🎜수정 및 삭제 시 가운데 슬레이브 테이블은 마음대로 삭제 및 수정이 가능하지만 양쪽 슬레이브 테이블이 마스터 테이블에 의존하는 데이터는 삭제 및 수정이 불가능합니다. 🎜🎜🎜다중 테이블 공동 쿼리(매우 중요)🎜🎜• 개념🎜은 두 개 이상의 테이블을 동시에 쿼리하는 것입니다🎜, 사용자가 데이터를 볼 때 표시해야 하는 데이터가 여러 테이블에서 나오는 경우가 있기 때문입니다🎜🎜 • 데이터 준비 🎜 참고: 🎜 외래 키 제약 조건은 데이터 추가, 삭제 및 수정에만 영향을 미치며 데이터 쿼리에는 영향을 미치지 않습니다. 🎜🎜 • 교차 연결 쿼리 select * from A, B - -- 중복 생성됩니다. 남은 데이터 🎜🎜 1. 교차 연결 쿼리는 연결된 🎜 두 테이블 🎜🎜의 모든 데이터 행에 대한 데카르트 곱을 반환합니다. 2. 데카르트 집합은 한 테이블의 각 행과 다른 테이블의 모든 행으로 이해될 수 있습니다. 테이블 일치 🎜 3. 테이블 A에 m 행의 데이터가 있고 테이블 B에 n 행의 데이터가 있는 경우 🎜m * n 행의 데이터가 반환됩니다 🎜🎜 4. 데카르트 곱은 많은 🎜중복🎜 데이터를 생성하며, 다른 후속 쿼리는 집합을 기반으로 조건부 필터링을 수행합니다. 🎜🎜내부 조인 쿼리🎜🎜는 🎜두 테이블 간의 교차점🎜🎜을 찾습니다.여기에 그림 설명 삽입🎜🎜inner는 생략 가능🎜🎜암시적 내부 조인(SQL92 표준): 🎜
select* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;
🎜명시적 내부 연결( SQL99 표준); 🎜
select* from dept3 left outer join emp3 on dept3.deptno=emp3.dept_idunionselect* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;
usemydb3;select* from dept3 a left outer join emp3 b on a.deptno = b.dept.idselect* from dept3 a left join emp3 b on a.deptno = b.dept_id;
select* from Aleft join B on 条件1left join C on 条件2left join D on 条件3;
🎜 🎜
select * from dept3 a right outer join emp3 b on a.deptno = b.dept_id;select* from dept3 a right join emp3 b on a.deptno = b,dept_id;select*from Aright joinB on条件1,right joinC on条件2,right joinD on条件3;
select* from dept3 a left join emp3 b on a.deptno = b.dept_idunionselect* from dept3 a right join emp3 b on a.deptno = b.dept_id
🎜와 같이 테이블에 별칭을 지정할 수도 있습니다. 🎜
select* from dept3 a left join emp3 b on a.deptno = b.dept_idunion allselect* from dept3 a right join emp3 b on a.deptno= b.dept_id
🎜여기에 이미지 설명 삽입🎜🎜그림 설명 삽입 🎜 여기에 이미지 설명 삽입🎜🎜Outer Join 쿼리🎜🎜는 다음과 같이 구분됩니다. (Outer는 생략 가능)🎜 left external Joinleft external Join, 🎜rrreee🎜right external Joinright 외부 조인, 🎜rrreee🎜완전 외부 조인완전 외부 조인🎜
select* from A full outer join B on 条件;

注意:
Oracle 里面有 full join ,可是在mysql 对 full join 支持的不好,我们可以使用 union来达到目的
mysql 다중 테이블 작업을 완전히 마스터하세요.

----外连接查询
----查询哪些部门有员工,哪些部门没有员工

use mydb3;select* from dept3 left outer join emp3 on dept3.deptno =emp3.dept_id;

----查询哪些员工有对应的部门,哪些没有

select* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;

----使用 union 关键字实现左外连接和右外连接的并集

select* from dept3 left outer join emp3 on dept3.deptno=emp3.dept_idunionselect* from dept3 right outer join emp3 on dept3.deptno =emp3.dept_id;

mysql 다중 테이블 작업을 완전히 마스터하세요.

----外连接查询
----查询哪些部门有员工,哪些部门没有员工

usemydb3;select* from dept3 a left outer join emp3 b on a.deptno = b.dept.idselect* from dept3 a left join emp3 b on a.deptno = b.dept_id;

----外连接多个表

select* from Aleft join B on 条件1left join C on 条件2left join D on 条件3;

mysql 다중 테이블 작업을 완전히 마스터하세요.

----查询哪些员工有对应的部门,哪些没有

select * from dept3 a right outer join emp3 b on a.deptno = b.dept_id;select* from dept3 a right join emp3 b on a.deptno = b,dept_id;select*from Aright joinB on条件1,right joinC on条件2,right joinD on条件3;

mysql 다중 테이블 작업을 완전히 마스터하세요.

----实现满外连接: full join
----使用 union 关键字实现左外连接和右外连接的并集
----select * from dept3 a full join emp3 b on a.deptno = b.dept_id; --不能执行

----union是将两个查询结果上下拼接,并去重

select* from dept3 a left join emp3 b on a.deptno = b.dept_idunionselect* from dept3 a right join emp3 b on a.deptno = b.dept_id

----union all 是将两个查询结果上下拼接,不去重

select* from dept3 a left join emp3 b on a.deptno = b.dept_idunion allselect* from dept3 a right join emp3 b on a.deptno= b.dept_id

mysql 다중 테이블 작업을 완전히 마스터하세요.

• 基本子查询
• 子查询关键字-ALL
• 子查询关键字-ANY ,SOME
• 子查询关键字-IN
• 子查询关键字-EXISTS
• 自关联查询

推荐学习:mysql视频教程

위 내용은 mysql 다중 테이블 작업을 완전히 마스터하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제