一、MYSQL中的約束
1、主鍵:primary key 唯一非空的特性並且可以優化查詢速度
2、外鍵:foreign key 外鍵的作用保證2個或2個以上的數據表的數據一致性和完整性
3、唯一:unique
4、非空:not null
5、默認值:deafult
6、自增:auto_increment 設置了自增值每次自動增加1
二、外鍵的添加方式
1、方式一
create table 表名 (
字段名1 數據類型 約束,
字段名2 數據類型 約束,
。。。
constraint 外鍵名 foreign key(字段名) references 主表名(字段名) 級聯操作);
方式2:表創建完成后添加外鍵
alter table 表名 add constraint 外鍵名 foreign key (字段1) references 表名2(字段名2)級聯操作;
三、外鍵的注意事項
1、 兩個表xiaodi和dage,如果xiaodi表中設置了外鍵關聯了dage,那么我們把xiaodi表稱為從表,dage表稱為主表
2、 在建表的時候要現有主表,后有從表
3、 如果要刪除數據表,那么需要先刪從表,在刪主表
4、 如果要向從表中插入數據,那么插入的數據必須是主表中存在的值,如果該值不存在,那么插入操作執行失敗
5、 不可以對主表中的和從表有關聯的數據直接進行刪除,只有把從表的相關的數據先刪除后再刪除主表中的數據(即先刪從表,再刪主表)
6、 一個表中可以有多個外鍵,但是主鍵只能有一個
7、 外鍵通常關聯的是主表的主鍵或者設置了unique的字段
8、 如果要使用外鍵,那么存儲引擎不可以是myisam
9、 外鍵和外鍵關聯的字段的數據類型要一致
一、查看外鍵:show create table 表名;
二、刪除外鍵:alter table 表名 drop foreign key 外鍵名;
三、外鍵的級聯操作
1、 on delete cascade:表示主表中的數據被刪除后,從表中相關數據也會被刪除
2、 on update cascade:表示主表中的數九被修改后,從表中的相關數據也會被修改
3、 on delete cascase on update cascase:表示刪除和修改都有級聯操作
4、 on delete set null:表示主表中的數據被刪除后,從表中相關數據會被設置為null
5、 on update set null
6、 示例:
---------------------------------------------------------------------------------------------------------------------------------------------------------
一、什么是連接查詢:就是將二個或二個以上的表,“連接起來”當做一個數據源,並從中去取得所須要的數據。連接查詢包括交叉連接查詢、內連接查詢、外連接查詢
(一) 交叉連接:交叉連接不帶WHERE子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
1、 格式1:select 要查詢的內容 from 表名1 cross join 表名2;
2、 格式2:select 要查詢的內容 from 表名1,表名2…;
3、 格式3:select 要查詢的內容 from 表名1 join 表名2;
(二) 內連接:內連接也叫連接,是最早的一種連接。還可以被稱為普通連接或者自然連接,內連接是從結果表中刪除與其他被連接表中沒有匹配行的所有行,所以內連接可能會丟失信息。
1、 方法1:select 要查詢的內容 from 表名1 inner join 表名2 on 表1.字段名=表2.字段名;
2、 方法2:select 要查詢的內容 from 表名1 join 表名2 on 表1.字段名=表2.字段名;
3、 注意:在使用內連接時,可以給表起別名,格式為select 要查詢的內容 from 表名1 別名1 join 表名2 別名2 on 別名1.字段名=別名2.字段名;
(三) 外鏈接:只限制一張表中的數據必須滿足連接條件,而另一張表中的數據可以不滿足連接條件的連接方式,外連接分為左外連接、右外連接
1、 左外連接(以左表為主,即左表中的內容會全部顯示出來,右表中不符合條件的部分用null補充):select 要查詢的內容 from 表1 left join 表2 on 表1.字段名=表2.字段名;
2、 右外連接(以右表為主,即右表中的內容會全部顯示出來,左表中不符合條件的部分用null補充)):select 要查詢的內容 from 表1 right join 表2 on 表1.字段名=表2.字段名;
3、 習題:以product表和product_type表為例,查出每個品種各有多少個商品select a.protype_name, count(b.pro_name) from product_type a left join product b on a.protype_id = b.protype_id group by a.protype_name;
二、子查詢:當一個查詢是另一個查詢的條件時,稱之為子查詢。子查詢可以分為如下幾類
(一) 按子查詢結果分:表子查詢、行子查詢、列子查詢、標量子查詢
1、 表子查詢:子查詢的結果為多行多列,即一個表,該子查詢通常放在from關鍵字后面
2、 行子查詢:返回一行數據中多個列的內容
3、 列子查詢:返回的結果為一列多行數據,此時可以當做“多個值”使用,類似:(5,17,8)
4、 標量子查詢:返回的結果為一行一列,即一個值
(二) 按子查詢所在位置分
1、 作為主查詢的結果數據:select c1,(select f1 from tab2) as f11 from tab1;這里子查詢應該是一個標量子查詢
2、 作為主查詢的條件數據:select c1 from tab1 where c1 in (select f1 from tab2);這里子查詢應該是列子查詢,即一列多行
3、 作為主查詢的數據來源:select c1 from (select f1 as c1, f2 from tab2) as t2;這里子查詢應該是表子查詢
(三) 子查詢之any、all關鍵字的使用
1、 any:表示大於集合中的任意一個值即可
1) 表1
2) 表2
3) 查詢1:mysql> select * from tab2 where id>any (select f1 from tab3);
4) 查詢2:mysql> select * from tab2 where id>all (select f1 from tab3);
(四) 子查詢之exists關鍵字