【简单易懂】MySQL增删改查(进阶)
目錄
1.數據庫約束
1.1 約束類型
1.2 NULL約束
1.3 UNIQE:唯一約束
1.4 DEFAULT:默認值約束
1.5 PRIMARY KEY:主鍵約束
?1.6 FOREIGN KEY:外鍵約束
2. 表的設計
3. 新增
4. 查詢
4.1 聚合查詢
4.1.2 GROUP BY子句
4.1.3 HAVING
4.2 聯合查詢
4.2.1 內連接
4.2.2 外連接
4.2.3 自連接
4.2.4 子查詢
1.數據庫約束
1.1 約束類型
NOT NULL - 指示某列不能存儲 NULL 值。 UNIQUE - 保證某列的每行必須有唯一的值。 DEFAULT - 規定沒有給列賦值時的默認值。 PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標 識,有助于更容易更快速地找到表中的一個特定的記錄。 FOREIGN KEY - 保證一個表中的數據匹配另一個表中的值的參照完整性。 CHECK - 保證列中的值符合指定的條件。對于 MySQL 數據庫,對 CHECK 子句進行分析,但是忽略 CHECK 子句。1.2 NULL約束
創建表時,可以指定某列不為空: create table student (id int not null,name varchar(30) );?如果往 id 列插入空值,就直接報錯
1.3 UNIQE:唯一約束
uniqe就是指定列的每一個數值為唯一值,不能有重復。如果往指定的列中插入重復值也會報錯。
create table student (id int unique,name varchar(30) );?如下列表信息中已經表明
1.4 DEFAULT:默認值約束
default 就是給插入空數據時指定默認值,也可以手動默認
create table student (id int,name varchar(30) default,age int );?往表中增加信息
?將name 默認為 ‘guangming’
create table student (id int,name varchar(20) default 'guangming' );?
1.5 PRIMARY KEY:主鍵約束
對于一個表來說,只能有一個列被指定為主鍵,并且 primary key 是 not null 和 unique 的結合,確保某列有唯一標識,有助于更容易更快速的找到表中的一個特定的記錄。
確認了主鍵,該列既不能為空又不能為重復值。
如下插入數據,將 id 列為空,最終顯示結果為錯誤
?插入重復值,為錯誤
?對于主鍵的關鍵用法就是使用在數字自增中,auto_ncrement 是主要句子
創建表
create table student (id int primary key auto_increment,name varchar(20) );?插入數據
insert into into student (id, name) values (null, 'lisi'), (null, 'zahngsan'), (null,'wnagwu');?在插入數據中,并沒有插入 id ,但是表中可以自動生成
?自增主鍵也可以手動指定 id, 但是后序的自增是從指定的 id 開始的
?1.6 FOREIGN KEY:外鍵約束
外鍵用于關聯其他表的主鍵或唯一建
?foreign key (字段名) references 主表 (列)
?例如創建一張學生表和班級表,學生表就依賴于班級表,學生表就為‘字表’,班級表就為‘父表’
?先創建一個班級表
?
?classId 既是 class 表的主鍵,又是? student 表的外鍵
?然后構造一個學生表,來指定一下 外鍵約束
?往表中插入數據,其中 classId 為1,在class 表中存在,所以插入成功
?如果我們將classId 為10,在class 表中不存在,所以插入不成功
insert into student values (null, 'wangwu', 10);?
?外鍵約束,同樣也約束著父表,當父表中的某個記錄被子表中依賴著的時候,進行修改或者刪除都會失敗
delete from class where class where classId = 1;?
?外鍵約束工作原理
在子表中插入新的記錄的時候,就會根據對應的值,在父表中先查詢,查詢到之后,才能夠執行后序的插入。
查詢操作就是根據父表中被依賴的這一列,必須要有索引,即得到 primary key 或者unique?
2. 表的設計
2.1 一對一
就是唯一性,例如每個人只有一個身份證號
2.2 一對多
以班級為例,一個班級可以有多個學生。
2.3 多對多
以學生和課程為例,一個學生可以選多們課,一門課可以被多個學生選
3. 新增
?將查詢到的結果插入新的表中,但是需要保證查詢到的結果與插入到新的表中類型匹配,列的順序可以不一樣。
創建 A?表? 、 B表
create table A (id int ,name varchar(20), age int); create table B (id int ,name varchar(20), age int);?往表A中插入數據
insert into A values(1, 'lisi', 13), (2, 'wangwu', 15);?將查詢A的結果插入表B中
insert into B select * from A4. 查詢
4.1 聚合查詢
4.1.1 聚合函數
常見的統計總數,計算平均值等,可以使用聚合函數來實現,常見的聚合函數有:
| 函數 | 說明 |
| COUNT([DISTINCT] expr) | 返回查詢到的數據的數量 |
| SUM([DISTINCT] expr | 返回查詢到的數據的總和,不是數字沒有意義 |
| AVG([DISTINCT] expr | 返回查詢到的數據的平均值,不是數字沒有意義 |
| MAX([DISTINCT] expr | 返回查詢到的數據的最大值,不是數字沒有意義 |
| MIN([DISTINCT] expr) | 返回查詢到的數據的最小值,不是數字沒有意義 |
count 函數 的用法
查詢? exam 表的人數, count(*)
select * from count(*) from exam;?在 count 時,也可以指定某個列,如,指定math 列,count(math)
select count(math) from exam;?
?注意,如果表中存在 null ,則是不會被記錄在當中的
?sum 求和函數
將列的若干個數值相加
例如,求 math 列的總成績, sum(math)
select sum(math) from exam;?
?sum 函數只能針對數字進行運算,不能針對字符串來進行
?例如對name進行計算,sum(name)
select sum(name) from exam;?一個聚合函數里面的參數,也可以通過表達式的方式進行運算
select sum(chinese) + sum(math) from exam; select sum(chinese + math + english) from exam;?還可以用 as 起別名來顯示;
select sum(chinese + math + english) as total from exam;?聚合函數還可以搭配 where 字句來使用,可以基于條件進行篩選,把篩選結果再進行聚合
?例如,先篩選出 english 大于 85 的,然后將大于 85 的求和
select sum(english) from eaxm where english > 85;4.1.2 GROUP BY子句
SELECT 中使用 GROUP BY 子句可以對指定列進行分組查詢。需要滿足:使用 GROUP BY 進行分組查詢時,SELECT 指定的字段必須是 “ 分組依據字段 ” ,其他字段若想出現在 SELECT 中則必須包含在聚合函數中?例如對 emp 表進行分組在聚合函數查詢
select role, max(salary), min(salary), avg(salary) from emp group by role;?group by 是可以使用 where, 只不過是在分組之前執行
?如下,先去掉 name 是 liliu 的,在進行對 role 分組
select role, avg(salary) from emp where name != 'liliu' group by role;?
4.1.3 HAVING
GROUP BY 子句進行分組以后,需要對分組結果再進行條件過濾時,不能使用 WHERE 語句,而需要用HAVING?如下,先對role 進行分組,求avg, 然后執行篩選條件 having, 最終將篩選之后的顯示出來。
select role, avg(salary) from emp group by role having avg(salary) < 30;4.2 聯合查詢
聯合查詢就是把多個表的記錄往一起合并,一起進行查詢,稱為多表查詢,使用的方法是“笛卡爾積”
運算過程: 先拿第A表的第一行記錄與第B表的每行記錄分別組合,得到一行新的記錄,
再繼續拿A表的記錄和B的記錄重復執行上述的操作。
得到的列數就是A 的列數 + B的列數
?例如先單獨查詢 表 a 和表 student ,
select * from a; select * from student;?進行聯合查詢
語句就是直接 select * from 表名,表名;
表名與表名之間是有逗號隔開
select * from a, student;?加上條件,可以單獨列出一行的信息,
select * from a, student where a.id = student.studentId;?只保留名字和成績,student.name = exam.name 是兩個表中名字一樣的
select student. name, exam.math from student,exam where student.name = exam.name and student.classId = 1;?
4.2.1 內連接
語法
select 字段 from 表 1 別名 1 [inner] join 表 2 別名 2 on 連接條件 and 其他條件 ; select 字段 from 表 1 別名 1, 表 2 別名 2 where 連接條件 and 其他條件 ; select student. name, exam.math from student join exam on student.name = exam.name and student.classId = 1;?
4.2.2 外連接
外連接分為左外連接和右外連接。如果聯合查詢,左側的表完全顯示我們就說是左外連接;右側的表完全顯示我們就說是右外連接。語法
-- 左外連接,表 1 完全顯示 select 字段名 ? from 表名 1 left join 表名 2 on 連接條件 ; -- 右外連接,表 2 完全顯示 select 字段 from 表名 1 right join 表名 2 on連接條件4.2.3 自連接
自連接是指在同一張表連接自身進行查詢。4.2.4 子查詢
子查詢是指嵌入在其他 sql 語句中的 select 語句,也叫嵌套查詢 單行子查詢:返回一行記錄的子查詢 查詢與 “ 不想畢業 ” 同學的同班同學: select * from student where classes_id=(select classes_id from student where name='不想畢業'); 多行子查詢:返回多行記錄的子查詢 案例:查詢 “ 語文 ” 或 “ 英文 ” 課程的成績信息 -- 使用IN select * from score where course_id in (select id from course where name='語文'or name='英文');4.2.5 合并查詢
在實際應用中,為了合并多個 select 的執行結果,可以使用集合操作符 union , union all 。使用 UNION 和 UNION ALL 時,前后查詢的結果集中,字段需要一致。 union 該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中的重復行。 案例:查詢 id 小于 3 ,或者名字為 “ 英文 ” 的課程: select * from course where id<3 union select * from course where name='英文'; -- 或者使用or來實現 select * from course where id<3or name='英文'; union all 該操作符用于取得兩個結果集的并集。當使用該操作符時,不會去掉結果集中的重復行。 案例:查詢 id 小于 3 ,或者名字為 “Java” 的課程 -- 可以看到結果集中出現重復數據 select * from course where id<3 union all select * from course where name='英文';總結
以上是生活随笔為你收集整理的【简单易懂】MySQL增删改查(进阶)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 朴素贝叶斯—印第安人
- 下一篇: 微软sql服务器可以禁用,禁用索引和约束