一、 外鍵
1.?????什么是外鍵:外鍵是指引用另一個表中的一列或多列,被引用的列應具有主鍵約束或唯一性約束。外鍵用于建立和加強兩個表數據之間的連接。
???????? student表中的gid是學生所在班級id,是引入了grade表中的主鍵id。那么gid就可以作為表student的外鍵。被引用的表,即表grade是主表;引用外鍵的表,即表student是從表,兩個表是主從關系。表student用gid可以連接表grade中的信息,從而建立了兩個表數據之間的連接。
???????? 引人外鍵后,外鍵列只能插入參照列存在的值,參照列被參照的值不能被刪除,這就保證了數據的參照完整性。
2.?????為表添加外鍵約束
想要真正連接兩個表的數據,就需要為表添加外鍵約束。為表添加外鍵約束的語法格式如下:alter table 表名 add constraint FK_ID foreign key(外鍵字段名) references 外鍵表名(主鍵字段名)
在為表添加外鍵約束時,有些需要注意的地方,如下所示:
(1)?????建立外鍵的表必須是InnoDB型,不能是臨時表。因為在mysql中只有InnoDB類型的表才支持外鍵;
(2)?????定義外鍵名時,不能加引號,如constraint ‘FK_ID’或constraint “FK_ID”都是錯誤的。
在主表中數據被刪除時,從表的數據也應被刪除,否則會參數很多無意義的垃圾數據。Mysql可以在建立外鍵時添加on delete或on update子句來告訴數據庫,怎樣避免垃圾數據的產生。具體語法格式如下:
Alter table 表名 addconstraint FK_ID foreign key(外鍵字段名)references外表表名(主鍵字段名);
[on delete{cascade | set null | no action | restrict}]
[on update{cascade | set null | no action | restrict}]
語句中各參數的具體說明如下表所示:
參數名稱 |
功能描述 |
Cascade |
刪除包含與已刪除鍵值有參照關系的所有記錄 |
Set null |
修改包含與已刪除鍵值有參照關系的所有記錄,使用null值替換(不能用于已標記為not null的字段) |
No action |
不進行任何操作 |
Restrict |
拒絕主表刪除或修改外鍵關聯列。(在不定義on delete和on update子句時,這是默認設置,也是最安全的設置) |
?
3.?????刪除外鍵約束: alter table 表名 drop foreign key 外鍵名;
二、 操作關聯表
1.?????關聯關系
(1)?????多對一:在多對一的表關系中,應該將外鍵建在多的一方,否則會造成數據的冗余。
(2)?????多對多:如學生表和課程表。通常情況下,為了實現這種關系需要定義一張中間表(稱為連接表),該表會存在兩個外鍵,分別參照課程表和學生表。在多對多的關系中,需注意的是,連接表的兩個外鍵都是可重復的,但是兩個外鍵之間的關系是不能重復的,所以這兩個外鍵又是表的聯合主鍵。
(3)?????一對一:首先要分清主從關系,從表需要主表的存在才有意義,如人為主表,身份證為從表,外鍵建立在從表。需注意的時,這種關系在數據庫中并不常見,因為以這種方式存儲的信息通常會放在一個表中。在實際開發中,一對一關聯關系可以應用于以下幾個方面。
?? 分割具有很多列的表;
?? 由于安全原因而隔離表的一部分;
?? 保存臨時的數據,并且可以毫不費力地通過刪除該表而刪除這些數據。
2.?????添加數據
上述語句執行成功后,兩個表之間的數據就具有關聯性。假如要查詢軟件一班有哪些學生,首先要查詢軟件一班的id,然后根據這個id在student表中查詢該班級有哪些學生。
3.?????刪除數據:由于grade表和student表之間具有關聯關系,參照列被參照的值是不能被刪除的。因此,在刪除軟件一班時,一定要先刪除該班級的所有學生,然后再刪除班級。
(1)?????將軟件一班的所有學生刪除
(2)?????在grade表中,將軟件一班刪除
???????? ?? 若直接刪除軟件二班會出錯:
需注意的是,實際情況中,想要刪除’軟件一班’并不需要刪除’軟件一班的學生’,可以將表student中gid=1地方改成gid為null只要主表中該列沒有被從表參照就可以刪除。但是在建表時,gid字段有非空約束,所以這個例子中只能刪除學生。
三、 連接查詢:當兩個或多個表中存在相同意義的字段時,便可以通過這些字段對不同的表進行連接查詢。
1.?????交叉連接:返回的結果是被連接的兩個表中所有數據行的笛卡兒積,也就是返回第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。語法格式如下:
Select * from 表1 cross join 表2;
從上面的結果可以看出,交叉連接的結果就是兩個表中所有數據的組合,需要注意的是,在實際研發中,這種需求是很少見的,一般不會使用,而是使用具體的條件對數據進行有目的的查詢。
2.?????內連接:又稱簡單連接或自然連接。使用比較運算符對兩個表的數據進行比較,并列出與連接條件匹配的數據行,組合成新的記錄。語法格式如下:
Select 查詢字段 from 表1 [inner] join 表2 on 表1.關系字段=表2.關系字段
還可以使用where條件語句來實現同樣的功能。
雖然這兩種方式的查詢結果是一樣的,但是inner join是內連接語句,where是條件判斷語句,在where后面可以直接添加其他條件,而inner join語句不可以。
#如果在一個連接查詢中,涉及兩個表是同一個表,這種查詢稱為自連接查詢。自連接是一種特殊的連接,它是指相互連接的表在物理上為同一個表,但邏輯上分為兩個表,例如要查詢王紅所在部門有哪些員工,就可以使用自連接查詢。
3.?????外連接:關鍵字左邊的表被稱為坐標,右邊的字被稱為右表
Select 所查字段 from 表1 left|right [outer] join 表2
On 表1.關系字段=表2.關系字段 where條件
(1)?????left join(左連接):返回包括左表中的所有記錄和右表中符合連接條件的記錄。
如果左表的某條記錄在右表中不存在,則在右表中顯示為空。
(2)?????Right join(右連接):返回包括右表中的所有記錄和左表中符合連接條件的記錄。
4.?????復合條件連接查詢
四、 子查詢:是指一個查詢語句嵌套在另一個查詢語句內部的查詢。它可以嵌套在一個select、select … into語句、insert…into等語句中。在執行查詢語句時,首先會執行子查詢中的語句,然后將返回結果作為外層查詢的過濾條件,在子查詢中通常可以使用in、exists、any、all操作符
(1)?????帶in關鍵字的子查詢:內層查詢語句僅返回一個數據列,這個數據列中的值將供外層查詢語句進行比較操作。
例如:查詢存在年齡為20歲的員工部門。
(2)?????帶exists關鍵字的子查詢:exists關鍵字后面的參數可以是任意一個子查詢,這個子查詢的作用相當于測試,它不會產生任何數據,只返回True或False,當返回值為True時,外層查詢才會執行。
下例中,子查詢的返回結果為True,所以外層查詢語句會執行,即查詢出所有部門信息。需要注意的是,exists關鍵字比in關鍵字的運行效率高,所以在實際開發中,特別是大數據量時,推薦使用exists關鍵字。
(3)?????帶any關鍵字的子查詢:any表示滿足其中任意一個條件,它允許創建一個表達式對子查詢的返回值列表進行比較,只要滿足內層子查詢中的任意一個比較條件,就返回一個結果作為外層查詢條件。
(4)?????帶all關鍵字的子查詢:和any有些類似,只不過帶all關鍵字的子查詢返回的結果需同時滿足所有內層查詢條件。
(5)?????帶比較運算符的子查詢
本文講解了MySQL數據庫多表操作 ,更多相關內容請關注php中文網。
相關推薦: