聯(lián)合查詢

一.外鍵(foreign key)

外鍵用于記錄表之間的聯(lián)系
外面的鍵(鍵不在自己表中):如果有一張表中有一個字段(非主鍵)指向另外一張表的主鍵,那么將該字段稱之為外鍵
(一張表可以有多個外鍵)

1.增加外鍵

  • 創(chuàng)建表時候增加外鍵:
    foreign key(外鍵字段) reference 外部表 (主鍵字段);
  • 在新增表之后增加外鍵:
    alter table 表名 add [constraint 外鍵名字] foreign key(外鍵字段) reference 父表(主鍵字段);
創(chuàng)建表時候增加外鍵
在新增表之后增加外鍵

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ù)類型無關


聯(lián)合查詢

1.聯(lián)合查詢的意義

(1)查詢同一張表,但是需求不同 eg:查詢學生信息,男生身高升序,女生身高降序

(2)多表查詢:多張表的結構是完全一樣的,保存的數(shù)據(jù)結構也是一樣的。

2.聯(lián)合查詢order by的使用

在聯(lián)合查詢中order by不能直接使用,需要對查詢語句使用括號
若要order by生效必須搭配limit;用limit限制顯示數(shù)量

聯(lián)合查詢的應用

三、子查詢(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。

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

列子查詢返回的結果為一列多行,需要使用in作為條件匹配
還有幾個類似的條件:all,some,any

all:就是全部 ,使用時需要在前面加"="
any:就和in是一樣的,在使用的時候需要在前面加"="或者"!="
any和some是一樣的,即:any==some

列子查詢
all,some,any
  • 行子查詢:子查詢得到的結果是多行多列(多列一行)
行子查詢

(以上幾個出現(xiàn)位置是在where之后)

  • 表子查詢:子查詢得到的結果是多行多列(出現(xiàn)位置是在from之后)
表子查詢
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容