推薦學習:
一對一(一般是合併表),
一對多/多對一(部門和員工),
多對多(學生和課程)--用中間表
專門用於多表關係的約束
通過主表的主鍵來控制從表的外來鍵
1、主表必須已經存在,或者正在建立
2、必須要給主表設定主鍵列
3、主鍵不能包括空值,但是外來鍵可以包括空值
4、在主表的表名後面指定的列明或者列名的組合。 這個列或列的組合必須是主表的主鍵或者候選鍵
5、外來鍵中列的數目必須和主鍵中列的數目相同
6、外來鍵中列的資料型別必須和主鍵中對應列的資料型別相同
• 建立外來鍵約束 foreign key
在建立表之前新增外來鍵約束
在建立表之後新增外來鍵約束
1、資料插入:
要先給主表新增約束
從表新增約束要依賴於主表,主表沒有的資料不能新增
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;
• 多對多關係-構建外來鍵約束
A表的一行對應B表的多行,B表的一行對應A表的多行,這時候需要再重新建立一個中間表,記錄表關係
注意:
修改和刪除時,中間從表可以隨便刪除和修改,但是兩邊從表手主表依賴的資料不能刪除或者修改。
• 概念
就是同時 查詢兩個或者兩個以上的表,因為有時候使用者在檢視資料的時候,需要顯示的資料來自多張表
• 資料準備
注意:
外來鍵約束只對資料的增刪改起作用,對於資料查詢沒有影響
• 交叉連線查詢 select * from A ,B
;---會產生冗餘資料
1、交叉連線查詢返回返回被連線的兩個表所有資料行的笛卡爾積
2、笛卡爾集可以理解為一張表的每一行去和另外一張表的任意一行進行匹配
3、假如A表有 m 行資料,B表有 n 行資料,則返回 m * n 行資料
4、笛卡爾積會產生很多冗餘的資料,後期的其他查詢可以在該集合的基礎上進行條件篩選
求的是兩個表之間的交集
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;
分為:(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
來達到目的
----外連線查詢
----查詢哪些部門有員工,哪些部門沒有員工
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;
----外連線查詢
----查詢哪些部門有員工,哪些部門沒有員工
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;
----實現滿外連線: 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
• 基本子查詢
• 子查詢關鍵字-ALL
• 子查詢關鍵字-ANY ,SOME
• 子查詢關鍵字-IN
• 子查詢關鍵字-EXISTS
• 自關聯查詢
推薦學習:
以上就是完全掌握mysql多表操作的詳細內容,更多請關注TW511.COM其它相關文章!