第一章 外鍵
在實際開發專案中,一個健壯的資料表一定有很好的參照完整性,為保證資料的完整性,需將兩表建立關系,這時可通過外鍵約束來實作
1.1、介紹
什么是外鍵約束?
在另一張表中參考另一張表的主鍵約束或唯一約束,
例如:如下操作創建表
create table grade(
id int primary key,
name varchar(36)
);
create table student(
sid int primary key,
sname varchar(36),
gid int not null,
foreign key(gid) references grade(id)
);
從上述創建表可知,學生表中參考班級表中的主鍵,從而兩表有了聯系,兩表有了主從關系,
主表:被參考的表,如 grade 表
從表:參考表,如 student 表
注意:參考外鍵后,外鍵列只能插入參照列存在的值,且洗掉資料時,只能先洗掉 student 表中的資料,再洗掉 grade 表的資料
1.2、外鍵約束
還可以在表創建后來創建外鍵約束,
語法:
alter table 表名 add constraint 外鍵約束名 foreign key(外鍵欄位) references 外表(主鍵欄位)
[on delete [cascade|set null | no action | restrict]]
[on update [cascade|set null | no action | restrict]]
需要注意的是建立外鍵的表必須是 innoDB 型,不能為臨時表,
定義外鍵約束名時,不能加引號,
[]:可選項,當洗掉主表時,從表中的資料也應該洗掉,各引數如下:
| 引數 | 說明 |
|---|---|
| cascade | 洗掉包含有參照關系的記錄 |
| set null | 使用null替換洗掉含有參照關系的欄位資料,前提 欄位約束不為 not null |
| no action | 不進行任何操作 |
| restrict | 默認配置,拒絕洗掉主表或修改外鍵關聯列 |
1.3、洗掉外鍵
當有業務需求需要洗掉表間的關聯關系時,需要洗掉外鍵約束
語法:
alter table 表名 drop foreign key 外鍵約束名;
第二章 關聯表
2.1、關聯關系
- 多對一
- 是常見的一種關系,在多對一的表關系中,
外鍵會建在多的一方,否則會造成資料的冗余,
- 是常見的一種關系,在多對一的表關系中,
- 多對多
- 會常見中間表,該表會存有 兩個外鍵,
- 一對一
- 常見于保存臨時的資料表中
注意:在兩個具有關聯表中洗掉資料時,一定要先洗掉從表資料,再洗掉主表資料,
第三章 連接查詢
3.1、交叉連接
也是進行笛卡爾積運算,
語法:
select * from 表1 cross join 表2;
結果是兩表列的乘積,
不常見,
3.2、內連接
又稱簡單連接或自然連接,是常見的一種連接查詢
通過表中共有欄位進行連接運算
語法:
select 查詢欄位 from 表1 [inner] join 表2
on 表1.欄位 = 表2.欄位
還有一種連接為自連接,是內連接特殊的存在,是在同一張表上進行的連接運算,
語法:
select 查詢欄位 from 表1 join 表2
on 表1.欄位 = 表2.欄位
例如:
select * from emp e1 join emp e2
on e1.欄位 = e2.欄位
3.3、外連接
查詢兩張表中另一張表的資料加上本身的資料,也就是說查詢結果中以一張表為主表,在另一張表為從表中進行匹配,
語法:
select 查詢欄位 from 表1 left|right [outer] join 表2
on 表1.欄位 = 表2.欄位
where
.....
1、左外連接
語法:
select 查詢欄位 from 表1 left join 表2
on 表1.欄位 = 表2.欄位
where
.....
左邊的表為主表,右邊為從表,以主表為主,從表為輔
如果主表在從表中沒有匹配,則以null代替
2、右外連接
語法:
select 查詢欄位 from 表1 right join 表2
on 表1.欄位 = 表2.欄位
where
.....
右邊的表為主表,左邊為從表,以主表為主,從表為輔
如果主表在從表中沒有匹配,則以null代替
3.4、復合連接
在連接查詢中,添加過濾條件來限制查詢結果,使查詢結果更加精確,例如 在鏈家查詢中添加 where、group by、order by等操作,
第四章 子查詢
4.1、帶 in 查詢
內層查詢陳述句回傳集合,集合中的元素供外層查詢進行比較
例如:查詢存在年齡為20 歲的員工部門
select *
from dept
where did in (
select did
from emp where age=20
);
其中 in 前還可以添加 not ,表示不再其中,與 in 相反
4.2、帶 exists 查詢
true 、false
當為true 時,外層查詢才會執行
例如:查詢 emp 表中是否存在年齡大于 21 歲的員工
select *
from dept
where exists(
select did
from emp where age > 21
);
exists 比 in 關鍵字的運行效率高,在實際開發中,尤其是資料量大時,推薦使用
4.3、帶 any 查詢
表示滿足其一即可
例如:
select *
from dept
where did > any(
select did from emp
);
4.4、帶 all 查詢
全都滿足
例如:
select *
from dept
where did > all(
select did from emp
);
4.5、比較運算子查詢
'<','>','=','<=','>=','!='
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552749.html
標籤:MySQL
下一篇:返回列表
