目錄
1、數據庫的約束
2、查詢操作的進階
2.1 查詢插入
2.2 聚合查詢
2.3 運算查詢
2.3 分組查詢
2.4 聯合查詢
2.5 內外連接
2.6 子查詢
2.7 合并查詢
1、數據庫的約束
? 數據庫的約束是指:數據庫會自動的對數據的合法性進行校驗和檢查的一系列操作的機制,目的就是為了保證數據庫避免被插入或修改了一些非法的數據。
MySQL中提供了以下約束:
not null | 指某列不能存儲null值 |
unique | 保證某列的每行必須有唯一的值 |
default | 規定沒有給列賦值的默認值 |
primary key | not null和unique的結合,確保某列或多列的結合有唯一標識 |
foreign key | 保證一個表中的數據匹配另一個表中值的參照完整性 |
check | 保證列中的值符合指定的條件 |
例如:
primary key 一行記錄的身份標識
一張表中只能有一個primary key,一個表中的記錄,只能有一個作為身份標識的數據。
使用自增主鍵,數據庫會自動分配一個主鍵,會從1開始,依次遞增的分配主鍵的值。如果指定插入,默認值會從最大的值開始繼續分配。
create table student (id int primary key auto_increment,name varchar(20));
foreign key 外鍵 描述兩個表之間的關聯關系
現在有兩個表,其中class表對student表進行了約束
創建約束的過程:
create table 表名( 列,列 foreign key(要約束的列)references 來自的表(來自的列));
注意事項:
1、約束別人的表稱為“父表”,被約束的表稱為“子表”。2、使用外鍵約束的時候,要求父表中被關聯的這一列,要是主鍵或者被unique修飾。
2、查詢操作的進階
2.1 查詢插入
查詢可以搭配插入使用,把查詢得到的結果,作為插入的數據。
insert into 表1 select * from 表2;
注意:查詢出來的結果集,列的數量和類型要和插入的表相匹配。
2.2 聚合查詢
表達式查詢:針對列和列之間進行運算的
聚合查詢:相當于針對行和行之間運算的
1、查詢當前行數
select count(要查詢的列)from 表名;
注意:
1、要是查詢整個表的行數,null會被算進去,如果是查詢具體的一列的行數,null不會被算進去。
2、在查詢單獨列的行數時,還可以對此列的行進行去重操作,在要查詢的列前加上distinct。
2.3 運算查詢
可以對這一列的若干行進行算術計算,只能對數字類型進行使用,null不會參與運算。
主要運算方式:
SUM() | 求和 |
AVG() | 求平均值 |
MAX() | 求最大值 |
MIN() | 求最小值 |
例如:
2.3 分組查詢
可以使用group by進行分組,再針對分組進行聚合查詢。
分組規則:針對指定的列進行分組,把這一列中值相同的行,分成一個組。
分組語句:select 列名 from 表名 group by 要分組的列名;
若分組后一個組中有多個數據,會隨機輸出一個數據作為代表。
分組加聚合語句:select 列名,聚合運算 from 表名 group by 要分組的列名;
例如:
在使用group by進行分組的時候,還可以使用where來搭配條件。
1、分組前條件:where在group前
select 列名,聚合運算 from 表名 where條件 group by 要分組的列名;
2、分組后條件:使用having來描述條件,having在group by后
select 列名,聚合運算 from 表名 group by 要分組的列名 having 條件;
3、使用where和having還可以同時滿足前后都有條件的情況
2.4 聯合查詢
聯合查詢又稱為多表查詢,當我們要查詢的結果是多個表配合使用才能得到,就可以使用聚合查詢,使用SQL語句將多個表進行笛卡爾積,把有效的結果進行篩選出來。
笛卡爾積本質是通過排列組合的方式,得到一個更大的表,這個表的列數是多個表的列數相加,行數是多個表的行數相乘。
例如:有兩個表,一個是學生表,一個是成績表,要計算某個學生的成績的時候,就可以通過笛卡爾積,把這兩個表組合起來,篩選出要得到的結果。
1、先進行笛卡爾積
2、加上連接條件,篩選有效數據。
3、進一步篩選,得到某個同學的成績,以zhangsan為例。
4、針對要查詢的列進行精簡
如果是三個表配合才能得到結果,就需要對這三個表進行笛卡爾積,然后需要兩個連接條件,來連接這三個表。
2.5 內外連接
內連接:當我們將多個表進行聯合查詢的時候,通過條件進行連接篩選,只有匹配成功的數據才能作為結果輸出。
內連接語句:select * from student inner join score on student.id=score.id;
外連接:外連接分為左外連接和右外連接,左外連接以左側表為基準,左側表中的數據沒有找到匹配的數據時,以NULL作為代替,右外連接以右側表為基準,右側表中的數據沒有找到匹配的數據時,以NULL作為代替。
左外連接:
左外連接語句:select * from student left join score on student.id=score.id;
右外連接:
右外連接語句:select * from student right?join score on student.id=score.id;
2.6 子查詢
子查詢:把多個簡單的SQL語句拼成一個復雜的SQL語句
單行子查詢:查詢出的一行記錄的結果,作為另一個查詢語句的條件進行再次查詢。
語句:select 列名 from 表名 where 列名=(select的查詢結果);
多行子查詢:查詢出的多行記錄的結果,作為一個范圍類型,讓另一個查詢語句進行判斷。
語句:select 列名 from 表名 where 列名 in(select查詢的范圍結果);
in 表示在這個范圍內
2.7 合并查詢
使用union關鍵字可以將多個SQL查詢的結果合并到一起
注意:
1、查詢出結果的列名以查詢第一個表的列名為準
2、兩條語句合并查詢時,會進行去重操作,若不進行去重,使用union all關鍵字。