- 數據庫約束
- 表的關系
- 增刪查改
目錄
一.數據庫約束類型
NOT NULL約束類型
UNIQUE 唯一約束
DEFAULT 默認值約束
PRIMARY KEY:主鍵約束
FOREIGN KEY :W外鍵約束
二,查詢
count()兩種用法
sum,avg,max,min用法
?編輯
GROUP BY 子句
HAVING 條件
三,聯合查詢
內連接
外聯結
自連接
子查詢
合并查詢
一.數據庫約束類型
- NOT NULL --只是表的某一列不能儲存NULL值
- UNIQUE --保證某列的每行必須有為一值
- DEFAULT -- 規定沒有給列賦值時的默認值
- PRIMARY KEY -- 是NOT NULL 與 UNIQUE 的結合。確保某列有唯一標識,有助于快速特定尋找表中一個特定記錄
- RFOREIGN KEY --保證一個表中的數據匹配到另一個表中的值的參照完整性
- CHECK --保證列中的值符合特定的條件。
NOT NULL約束類型
創建表時可指定,某列不為空
可以看到報錯顯示,id這一列不能為空,因為被NOT NULL修飾
UNIQUE 唯一約束
指定某一列的值唯一不可重復
創建stu表,指定name這一列被UNIQUE修飾,表中插入兩個‘張三’,所以報錯,插入失敗。
DEFAULT 默認值約束
最初的默認值為NULL。插入數據時,如果某一列值為空,可以為其設定默認值
通過desc 表名 查看設置成功后的默認值
在未設置默認值前查看初始默認值
設置默認之后查看默認值
PRIMARY KEY:主鍵約束
指定某一列為主鍵,主鍵同時具有NOT NOLL 和UNIQUE的性質
主鍵通常搭配自增長auto_increment來使用。對于插入的數據對應的字段不給值時,使用最大值加一。
id這一列就是主鍵
自增長auto_increment什么意思?插入數據時可以不插入主鍵的值,讓數據庫自己分配,按照
1,2,3,4.....等順序的模式,也可以手動指定其他數值,
這幅圖中,在順序插入前四個數據時,在自增主鍵的作用下再次插入數據是從4開始,還是從101開始嘞?答案是101,自增主鍵如果不指定數據,則默認從最大的值加一開始插入。
主鍵通常是某個表里的唯一身份表示,一般不允許存在多個主鍵,但是數據庫里允許把多個列共同作為一個主鍵(聯合主鍵),一般以數字作為主鍵,偶爾用字符串為主鍵。
FOREIGN KEY :W外鍵約束
外鍵用于關聯其他主鍵或唯一鍵
創建父表:
創建子表:
子表中的class引用自父表class中的class列class表中的數據制約啦stu表中的class
在子表中一定要確保插入的數據classid 在父表中存在。
插入:在子表中插入數據會觸發對父表的查詢,若沒有對應的數據會報錯
父表:class
在子表插入數據
在子表插入班級為6的學生會報錯,因為在插入子表數據時會觸發對父表的查詢,父表不存在會報錯。
在刪除附父表中的記錄被子表引用,就不能刪除啦,應該先刪除子表中的數據再回頭刪除附表中的數據
會報錯,此時外鍵正在引用父表中的數據。
正確刪除方法:
一定要確保刪除子表再刪除父表。
二,查詢
- 聚合查詢
常見的聚合查詢函數有? ? ? ? ? ? ? ? ?
COUNT([distinct] exper)? ??? | ?返回查詢到的數量 |
SUM? ??([distinct] exper)? ?? | 返回查詢到的數量總和 |
AVG? ? ?([distinct] exper)? ?? | 返回查詢到數據的平均值,非數字為意義 |
MAX? ? ?([distinct] exper)? ?? | 返回查詢到數據最大值,非數字無意義 |
MIN? ? ? ([distinct] exper)? ?? | 返回查詢到數據最小值,非數組無意義 |
count()兩種用法
先對select 進行查詢,根據結果再執行count
count(*)/? count(0) null也算進去
count(列名) null不算進去
sum,avg,max,min用法
GROUP BY 子句
select使用GROUP BY 子句可以指定列名進行分組查詢。
使用group by 指定某一個列,就會把列值相同的行回到一個組中,分完組后還可以針對每個組進行聚合查詢
select 列名 from 表名 group by 列名;
一個查詢可以包括分組前的條件和分組后的過濾條件
在上述的條件下,排除張三
HAVING 條件
在GROUP BY 子句進行分組的后,要對分組結果進行條件過濾,不能使用where語句,要使用having
顯示平均工資低于10000的角色和他的平均工資
三,聯合查詢
內連接
實際開發中數據往往來自不同的表,要多表聯合查詢,用一張表的每個記錄去和另一個表的記錄一一匹配就是笛卡爾積
以上四個表student包含學生個人信息,classes包含各個班級信息,coures包含課程,score包含個人分數
1.查詢許仙的成績
其中的,可以換成join where可以換成on?
2.查詢所有同學的成績及個人信息
外聯結
select 字段名 from 表名1 left join 表名2 on 篩選條件
外連接于內連接相似,
查詢‘老外學習中文’同學沒有開始成績,但是也要顯現出來
自連接
自連接是指同一張表連接自身進行查詢
SQL中進行條件查詢,是針對列于列之間比較的,不能把比較行,如果把一個表自己與自己鏈接
就可以比較行。
注意:在進行自連接的過程中,兩個表名不能相同,重命名其中一個表
子查詢
子查詢是嵌入再其他sql語句中的select語句,也叫嵌套查詢
select*from 表名 where 列名 = (select 列名 from student where 條件);
查詢與‘不行畢業同班同學’
合并查詢
實際應用中,為了合并多個執行結果,可以使用集合操作符union,union all?
使用union 和union all 要求查詢結果集中,字段一致。
select *from course where id<3 union select *from course where name='英文'
union取得結果集的并集,自動去除重復行
union all 不會去除重復行