一、表的增删查改
1.Create 创建
(1)插入 Insert
语法:
insert 【into】 table_name (要插入的字段名称,若省略则默认全插入) values (对应值);
示范:
a. 单行数据 + 全列插入
这是之前建立好的表,表中也存在一些数据,用来示范单次单行全列插入
b.多行数据插入 + 指定部分列插入
例如:在当前表结构中,可以省略id的插入,指定姓名和班级,id会自增,并且可以一次插入多行数据
c. 替换插入
在发生主键冲突或者唯一键冲突时,可以采取替代插入的方式,去更新某一个已存在主键的其他数据。
语法:Insert... on duplicate key update 字段名称=更新值,字段名称=更新值...
例:同样是上面的例子,目前表中已有主键id为1号的人物,若是我想要将主键1号的信息更新,将信息更新成102班的曹操
我们还可以通过反馈的信息去判断实际的插入情况:
(2)替换 replace
replace的效果和替换插入是相似的,但替换是若没有冲突直接插入,若是冲突则将原先数据直接删除后再插入,语法上和insert是一样的
语法:replace into table_name (字段1,字段2...) values(data1,data2...);
例:还是上面的那个表,这次我们用replace语句插入一个11号103班的孙尚香,然后再用replace将其班级修改成101。
同样可以通过几行被影响判断是否发生冲突:
2.Retrieve 查看
select
语法:select [查看内容] from [内容所在表格] where [筛选条件]
1.1 前提准备
接下来会用各种情况和例子去练习和展示select的使用方法和场景,先统一创建一个简单的表结构
当前表格信息:
接下来各种查看的语句和情景就用该表格进行测试
1.2 全列查询
select * from exam_result;
1.3 指定列查询
只想看数学和英语成绩,并且需要知道是谁,可以使用:
select name,math,english from exam_result;
1.4 查询字段为表达式
select语句可以用来显示各种表达式,查询字段也属于表达式,意味着查询字段是可以参与运算的
例:查询数学成绩全部减去60分后的成绩
可以看到,第二列的结果都是数学成绩-60后的结果,并且名称变成了“math-60”,也可以在后面加一个空格然后指定名称显示
例如:算出每个人的总分成绩,并且标注为总分
ps:其中as可以省略
1.5 结果去重
在select后加上distinct,即可对查询结果去重,例如查询数学成绩时,进行去重
1.6 筛选条件 where
当前表中数据:
例子:
英语不及格的同学以及英语成绩
语文成绩在 [80, 90] 分的同学及语文成绩
数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
找到姓孙的同学
找到孙某同学
语文成绩好于英语成绩的同学
总分低于200的同学
语文成绩 > 80 并且不姓孙的同学
孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
孙某怕不是关系户
关于NULL的查询
想查找某列为NULL,where后面跟上字段 is null;
若是筛选不为空的,则where后面跟上 字段 is not null;
注意:NULL和 ''(空串)是不一样的,NULL表示什么都没有,空串是存在,内容为空
NULL在直接参与运算时,结果都是为NULL,若是想用=号去比较两边是否都为NULL,需要:
NULL<=>NULL
1.7 结果排序 order by
对查询结果进行升序或降序的排序,在查询结果后用order by语句
语法:order by 列名称 【asc/desc】
默认升序,但不要依赖升序排序
接下来同样展示大量的例子来练习和熟悉该语句的使用
前提数据:
同学及数学成绩,按数学成绩升序显示
关于NULL的排序,NULL会被视为最小值
插入一个空数据进行测试
查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
这种情况通常是在第一种排序策略出现相同时,采取第二种策略对相同部分进行排序,以此类推
例如,企业在挑选人才时,会优先对核心专业知识技能进行考察,若是该项综合评价得分差不多时,可能会对其他方面进行排序比较,类似于这种应用场景下,需要多个排序条件去控制
查询同学及总分,由高到低
这里我们发现,可以使用别名,是因为select的执行语句的顺序不同,一般执行顺序是先找到表格,然后判断条件,接着执行结果显示,最后再执行排序
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
1.8 结果分页 limit
用于对查询结果分页的语句
语法:
limit 后直接跟数字n,则默认从第一条开始,显示n条查询结果
从 s 开始,筛选 n 条结果 :LIMIT s, n
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 LIMIT n OFFSET s;
例子:
1.9 select语句的执行顺序
3.Update 修改
update
用于修改表中的数据
语法:update table_name set column1=expr1,column2=expr2... where...order by... limit...;
例子:
1.1 前提准备
同样是之前提前准备好的数据测试用例
1.2 例子
将孙悟空同学的数学成绩变更为 80 分
将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
将总成绩倒数前三的 3 位同学的数学成绩加上 60 分
为了出现正常的测试数据,我们先将之前用于测试NULL的空数据进行修改,让其语数英都60
当前总分倒数前三的同学
将他们数学都提升30分,并指定姓名的查询结果
将所有同学的语文成绩更新为原来的 2 倍
更新全表数据的语句要谨慎使用
4.Delete 删除
delete
删除表中的数据
语法:delete from table_name where... order by... limit... (筛选条件)
例子:
1.1 前提数据
1.2 测试例子
删除孙悟空同学和四大皆空的考试成绩
删除整张表格的数据
注意,删除整张表格的数据,而不会删除表格,该操作要谨慎
若是有自增的数据,在删除整个表格数据时,自增的记录还在
truncate
截断表,同样是对这个表数据进行删除,但实际没有对数据进行操作,效率上比delete要快,并且若是有自增量,则会重置自增位置
使用方法:truncate table_name;
例子:
二、实际操作案例
1.对表格数据去重操作
删除一张表中的重复数据,我们可以建立一新的表格,然后将旧表的数据去重后插入到新表中,然后用新表去代替旧表,旧表则可以直接删除或者作为备份,只需要更改名字即可
测试样例:
1.首先先建立一个表格old,并插入一些重复的数据用于测试;
2.然后建立一个结构相同的表格,将原表的数据去重后输入到新表中
3.对两个表格重命名,旧表可作为备份,新表名字变为旧表的名字
三、聚合函数
1.函数
函数 | 说明 |
count | 返回查询到的数据的数量 |
sum | 返回查询到的数据的总和,不是数字没有意义 |
avg | 返回查询到的数据的平均值,不是数字没有意义 |
max | 返回查询到的数据最大值 |
min | 返回查询到的数据最小值 |
2.函数的使用样例
2.1 前提准备
先预先准备一批测试数据,这里用之前的成绩表即可
2.1 统计班级里共有多少位学生
注意,在使用count统计时,不会收到NULL的影响
2.2 统计去重后的数学成绩
注意:去重是针对math列去重,使用要写在count()内
2.3 统计数学成绩总分
2.4 数学成绩高于100分的分数总和
2.5 统计英语高于60的平均分
2.6 返回英语最高分
2.7 返回数学高于70分以上的数学最低分
四、group by 和 having 的使用
1.介绍
group by语句是用于对一个表的数据,根据某个特质或者多个特质进行分组,having则是在分组后的数据中进行条件筛选的语句
2.样例使用
2.1 前提准备
我们先将一个来自Oracle 9i的一个经典测试表导入MySQL中提供测试,该表格是一个雇员信息表,其中包含了三张表格:EMP员工表、DEPT部门表、SALGRADE工资等级表
2.2 显示每个部门的平均工资和最高工资
首先,得到平均工资和最高工资,实际是对数据的聚合,用刚刚学到的聚合函数即可,但这里需要根据不同的部门进行分组聚合,需要用到group by
上面三张表格中,员工表中包含着工资的具体信息,以及所属部门,我们要操作的表也是员工表
先看一下当前员工表内的数据
2.3 显示不同部门的不同岗位的平均工资和最低工资
我们可以认为每次分组,实际就是把一个表通过某个性质划分成多个子表,相当于一个多叉树,和上面的样例一样,只不过这里再多一个划分
2.4 显示平均工资低于2000的部门和它的平均工资
首先我们需要先用group by通过部门分组,得到各个部门的平均工资,然后再针对分组聚合后的结果进行条件筛选,此时的条件筛选不能使用where,而是要用having,两者具有本质区别
3.having 和 where 的区别
having是用于对分组聚合后的数据进行条件筛选,而where是对该表的所有数据直接进行的条件筛选,执行顺序上也是不一样的,两者不能混淆在一起使用,而是有各自的使用场景
总结
本篇博客总结了CRUD语句,总结了关于表的增删查改以及相关的一些基本操作和提供了大量的实际用例去模拟练习,提供参考