首頁  >  文章  >  資料庫  >  完全掌握mysql多表操作

完全掌握mysql多表操作

WBOY
WBOY轉載
2022-03-28 13:48:222171瀏覽

本篇文章為大家帶來了關於mysql的相關知識,其中主要介紹了多表操作的相關問題,包括了多表關係、外鍵約束、多表聯合查詢、內連接查詢和外連接查詢等等,希望對大家有幫助。

完全掌握mysql多表操作

推薦學習:mysql教學

#多表關係

一對一(一般是合併表) ,
一對多/多對一(部門和員工),
多對多(學生和課程)——用中間表

外鍵約束概念

#專門用於多表關係的約束
透過主表的主鍵來控制從表的外鍵

外鍵約束:

1、主表必須已經存在,或者正在建立
2、必須要為主表設定主鍵列
3、主鍵不能包含空值,但是外鍵可以包含空值
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

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刪除