站長資訊網
        最全最豐富的資訊網站

        完全掌握mysql多表操作

        本篇文章給大家帶來了關于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視頻教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久精品国产亚洲AV高清热| 在线精品国产一区二区三区| 合区精品久久久中文字幕一区| 国产午夜精品一区二区| 国产69精品久久久久99| 国产精品永久久久久久久久久| 久久精品国产精品亜洲毛片| 亚洲国产精品专区在线观看| 一区二区三区精品| 久久精品中文字幕有码| 久久精品成人免费看| 国产亚洲精品免费视频播放| 992tv精品视频tv在线观看| 99久久亚洲综合精品成人| 国产精品v片在线观看不卡| 最新亚洲精品国自产在线观看| 国模精品一区二区三区| 亚洲精品无码不卡| 99久久免费国产精品热| 99久久精品九九亚洲精品| 国产精品精品自在线拍| 日韩精品少妇无码受不了| 九九热这里只有在线精品视| 无码人妻精品一区二区三区东京热| HEYZO无码综合国产精品227| 欧美精品中文字幕亚洲专区| 午夜精品一区二区三区在线视 | 精品无码人妻一区二区三区品 | 亚洲精品无码永久中文字幕| 国产精品看高国产精品不卡| 亚洲av午夜福利精品一区| 亚洲综合精品网站| 日韩三级精品| 日韩精品一区二区三区中文字幕 | 亚洲AV成人无码久久精品老人| 欧美日韩专区麻豆精品在线 | 国产亚洲精品影视在线产品| 国产精品美女久久久网AV| 婷婷国产成人精品视频| 亚洲国产精品无码久久九九| 亚洲AV成人精品日韩一区18p|