mysql外來鍵 子查詢

2021-10-24 12:04:20 字數 3151 閱讀 7080

外來鍵:foreign key,外面的鍵(鍵不在自己表中):如果一張表中有乙個字段(非主鍵)指向另外一張表的主鍵,那麼該欄位稱之為外來鍵。

增加外來鍵

外來鍵可以在建立表的時候或者建立表之後增加(但是要考慮資料的問題)。

建立表的時候增加外來鍵:在所有的表字段之後,使用foreign key(外來鍵字段)references 外部表(主鍵字段)

外來鍵要求字段本身是乙個索引(普通索引) 如果字段本身沒有索引,外來鍵會首先建立乙個索引,然後才會建立外來鍵本身

在新增表之後增加外來鍵:修改表結構

alter table 表名 add [constraint 外鍵名字] foreign key(外來鍵字段)referneces 父表(主鍵字段);

修改外來鍵 & 刪除外來鍵

外來鍵不可修改:只能先刪除後新增

刪除外來鍵語法

alter table 表名 drop foreign key 外建名,一張表可以有多個外來鍵,但是外鍵名不能相同 ;

刪除乙個外來鍵無法從表結構看出來,要去看錶建立語句

外來鍵作用

外來鍵預設的作用有兩點:乙個對父表,乙個對字表(外來鍵字段所在的表)

對子表約束: 子表資料進行寫操作(增和改)的時候,如果對應的外來鍵字段在父表找不到對應的匹配:那麼操作會失敗(約束子表資料操作)

對父表約束:父表資料進行寫操作(刪和改:都必須涉及到主鍵本身),如果對應的主鍵在子表中已經被資料所引用,那就不允許操作

外來鍵條件

1、外來鍵要存在:首先必須保證表的儲存引擎是innodb(預設的儲存引擎):如果不是innodb儲存引擎,那麼外來鍵可以建立成功,但是沒有約束效果

2、外來鍵字段的字段型別(列型別)必須與父表的主鍵型別完全一致

3、一張表中的外鍵名字不能重複

4、增加外來鍵的字段(資料已經存在),必須保證資料與父表主鍵要求對應。

外來鍵約束

所謂外來鍵約束:就是指外來鍵的作用

之前所講的外來鍵作用:是預設的作用,其實可以通過對外鍵的需求,進行定製操作

外來鍵約束有三種約束模式:都是針對父表的約束

​ distric:嚴格模式(預設):父表不能刪除或者更新乙個已經被子表資料引用的記錄

​ cascasde:級聯模式,父表的操作,對應子表關聯的資料也跟著被刪除

​ set null:置空模式,父表的操作之後,子表對應的資料(外來鍵字段)被置空

通常的乙個合理的做法(約束模式):刪除的時候子表置空,更新的時候子表級聯操作

指定模式的語法

foreign key(外來鍵字段)references 父表(主鍵字段)on delete 模式 on update 模式;

刪除置空的前提條件:外來鍵字段允許為空(如果不滿足條件,外來鍵無法建立)

外來鍵雖然很強大,能夠進行各種約束:但是對於後端語言來講,外來鍵的約束降低了後端語言對資料的可控性:通常在實際開發中,很少使用外來鍵來處理

聯合查詢:將多次查詢(多條select語句),在記錄上進行拼接(字段不會增加)

基本語法

多條select語句構成:每一條select語句獲取的字段數必須嚴格一致(但是字段型別無關)

select 語句 1

union [union 選項]

select 語句 2

union選項:與select選項一樣有兩個

​ all:保留所有(不管重複)

​ distinct:去重(整個重複):預設的

聯合查詢只要求字段一樣,跟資料型別無關,保留的是第一張表的字段

意義1、聯合查詢的意義分為兩種:查詢同一張表但是需求不同。

2、多表查詢:多張表的結構是完全一樣的,儲存的資料(結構)也是一樣的

order by 使用

在聯合查詢中:order by 不能直接使用,需要對查詢語句使用括號才行

若要order by生效:必須搭配limit:limit使用限定的最大數即可。

子查詢:sub query,查詢是在某個查詢結果之上進行的(一條select語句內部包含了另外一條select語句)。

子查詢分類

子查詢有兩種分類方式:按位置分類,按結果分類

按位置分類:子查詢(select語句)在外部查詢(select 語句)**現的位置

​ from子查詢:子查詢跟在from之後

​ where子查詢:子查詢出現在where條件中

​ exists子查詢:子查詢出現在exists裡面

按結果分類:根據子查詢得到的資料進行分類(理論上講任何乙個查詢得到的結果都可以理解為二維表)

​ 標量子查詢:子查詢得到的結果是一行一列

​ 列子查詢:子查詢得到的結果是一行多列

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

​ 上面幾個出現的位置都是在where之後

​ 錶子查詢:子查詢得到的結果是多行多列(出現的位置是在from之後)

標量子查詢

select

*from *** where id =

(select id from ***)

查詢出的結果一行一列,作為另乙個查詢語句的條件

列子查詢

列子查詢返回的結果會比較:一行多列,需要使用in 作為條件匹配,其實在mysql中海油乙個類似的條件:all,some,any(基本不用tnt)

=any *****= in

any *****= some; any和some是一樣的

=all *****= 為全部

這幾種寫法都可以被in替換,所以基本沒啥用

行子查詢

行子查詢:返回的結果是多行多列(一行多列)

行子查詢:需要構造行元素,行元素由多個字段構成

錶子查詢

錶子查詢:子查詢返回的結果是多行多列的二維表:子查詢返回的結果是當做二維表來使用

表查詢:from子查詢:得到的結果作為from的資料來源

exists子查詢

exists:是否存在的意思,exists子查詢就是用來判斷某些條件是否滿足(跨表),exists是接在wehre 之後,exists返回的結果只有0和1。

子查詢返回的結果是多行多列的二維表:子查詢返回的結果是當做二維表來使用

表查詢:from子查詢:得到的結果作為from的資料來源

exists子查詢

exists:是否存在的意思,exists子查詢就是用來判斷某些條件是否滿足(跨表),exists是接在wehre 之後,exists返回的結果只有0和1。

主鍵,子外來鍵查詢

主鍵 資料庫主鍵是指表中乙個列或列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵,通過它可強制表的實體完整性。當建立或更改表時可通過定義 primary key約束來建立主鍵。乙個表只能有乙個 primary key 約束,而且 primary key 約束中的列不能接受空值。由...

mysql外來鍵查詢

當我們想檢視乙個資料庫表有多少其他表通過外來鍵依賴這個表的時候,可以通過視覺化的工具來看,當沒有工具可以使用的時候,可以通過如下的sql查詢來完成 select concat table name,column name as foreign key concat referenced table ...

mysql查詢所有外來鍵 查詢mysql所有外來鍵約束

select c.table schema 擁有者,c.referenced table name 父表名稱 c.referenced column name 父表字段 c.table name 子表名稱,c.column name 子表字段,c.constraint name 約束名,t.tabl...