一.外鍵(foreign key)
外鍵用于記錄表之間的聯(lián)系
外面的鍵(鍵不在自己表中):如果有一張表中有一個字段(非主鍵)指向另外一張表的主鍵,那么將該字段稱之為外鍵
(一張表可以有多個外鍵)
1.增加外鍵
- 創(chuàng)建表時候增加外鍵:
foreign key(外鍵字段) reference 外部表 (主鍵字段);- 在新增表之后增加外鍵:
alter table 表名 add [constraint 外鍵名字] foreign key(外鍵字段) reference 父表(主鍵字段);


2.修改外鍵&&刪除外鍵
外鍵不能修改,只能刪除后新增
刪除外鍵
alter table 表名 drop foreign key 外鍵名;一張表中可以有多個外鍵,但名字不能相同

外鍵刪除不能通過查看表結構體現(xiàn),應該通過查看表創(chuàng)建語句查看
3.外鍵作用
- 1.對父表
對父表的約束:父表數(shù)據(jù)進行寫操作(刪和改:都必須涉及到主鍵本身),如果對應的主鍵在子表中已經被數(shù)據(jù)引用,那么不允許操作。
- 2.對子表(外鍵字段所在的表)
約束子表數(shù)據(jù)操作:子表數(shù)據(jù)進行寫操作的時候,如果對應的外鍵字段在父表中找不到對應的匹配——操作失敗
4.外鍵條件
(1)外鍵要存在:首先必須保證表的存儲引擎innodb,如果不是innodb存儲引擎,那么外鍵可以創(chuàng)建成功但是沒有約束效果
(2)外鍵字段的字段類型(列類型)必須與父類的主鍵類型完全一致
(3)一張表中的外鍵名不能重復
(4)增加外鍵的字段(數(shù)據(jù)已經存在),必須保證數(shù)據(jù)與父表主鍵要求對應
5.外鍵約束
針對父表的約束
- district:嚴格模式(默認的),父表不能刪除或者更新一個已經被子表數(shù)據(jù)引用的記錄
- cascade:級聯(lián)模式:對父表操作,子表關聯(lián)的數(shù)據(jù)也跟著操作
- set null:置空模式:父表的操作之后,子表對應的數(shù)據(jù)(外鍵字段)被置空。
約束模式:刪除的時候子表置空,更新的時候子表級聯(lián)操作指定模式的語法
foreign key(外鍵字段) references 父表(主鍵字段) on delete set null on update cascade;
刪除置空的前提條件:外鍵字段允許為空(如果不滿足條件,外鍵無法創(chuàng)建)
二、聯(lián)合查詢
聯(lián)合查詢:將多次查詢(多條select語句),在記錄上次進行拼接(字段不會增加)
基本語法:多條select語句構成:每一條select語句獲取的字段數(shù)必須嚴格一致(但是字段類型無關)
select 語句1 union [union選項] select 語句2……
union選項
- all:保留所有
- distinct:去重(默認的)

聯(lián)合查詢只要求字段數(shù)一樣,跟數(shù)據(jù)類型無關

1.聯(lián)合查詢的意義
(1)查詢同一張表,但是需求不同 eg:查詢學生信息,男生身高升序,女生身高降序
(2)多表查詢:多張表的結構是完全一樣的,保存的數(shù)據(jù)結構也是一樣的。
2.聯(lián)合查詢order by的使用
在聯(lián)合查詢中order by不能直接使用,需要對查詢語句使用括號
若要order by生效必須搭配limit;用limit限制顯示數(shù)量

三、子查詢(sub query)
子查詢:就是一個select查詢是另一個查詢的附屬(一條select語句內部包含了另一條select語句)
1.子查詢分類
- 按位置分類:子查詢(select語句)在外部查詢(select語句)中出現(xiàn)的位置
- from子查詢:子查詢跟在from之后
- where子查詢:子查詢出現(xiàn)where條件中
- exists子查詢:子查詢出現(xiàn)在exists里面
判斷某些條件是否滿足(跨表),exists是接在where之后
exists返回結果只有0和1。


- 按結果查詢:根據(jù)子查詢得到的數(shù)據(jù)進行分類
- 標量子查詢:子查詢得到的結果是一行一列

- 列子查詢:子查詢得到的結果是一列多行
列子查詢返回的結果為一列多行,需要使用in作為條件匹配
還有幾個類似的條件:all,some,anyall:就是全部 ,使用時需要在前面加"="
any:就和in是一樣的,在使用的時候需要在前面加"="或者"!="
any和some是一樣的,即:any==some


- 行子查詢:子查詢得到的結果是多行多列(多列一行)

(以上幾個出現(xiàn)位置是在where之后)
- 表子查詢:子查詢得到的結果是多行多列(出現(xiàn)位置是在from之后)
