【增删改查操作】
文章目录
- 一、CRUD简介
- 二、Create 新增
- 1、语法
- 2、⽰例
- (1)单⾏数据全列插⼊
- (2)单⾏数据指定列插⼊
- (3)多⾏数据指定列插⼊
- 三、Retrieve 检索
- 1、语法
- 2、⽰例
- (1)构造数据
- 3、Select
- (1)全列查询
- (2)指定列查询
- (3)查询字段为表达式
- (4)为查询结果指定别名
- (5)结果去重查询
- 4、Where 条件查询
- (1)语法
- (2)⽐较运算符
- (3)逻辑运算符
- (4)⽰例
- 5、Order by 排序
- (1)语法
- (2)⽰例
- 6、分⻚查询
- (1)语法
- (2)⽰例
- 四、Update 修改
- 1、语法
- 2、⽰例
- 3、Update 注意事项
- 五、Delete 删除
- 1、语法
- 2、⽰例
- 3、Delete注意事项
- 六、截断表
- 1、语法
- 2、⽰例
- 3、Truncate注意事项
- 七、插⼊查询结果
- 1、语法
- 2、⽰例
- 八、聚合函数
- 1、常⽤函数
- 2、⽰例
- (1)COUTN
- (2)SUM
- (3)AVG
- (4)MAX
- (5)MIN
- 九、Group by 分组查询
- 1、语法
- 2、⽰例
- 3、having⼦句
- 4、Having 与Where 的区别
- 十、内置函数
- 1、⽇期函数
- (1)⽰例
- 2、字符串处理函数
- (1)⽰例
- 3、数学函数
- (1)⽰例
- 4、其他常⽤函数
- (1)⽰例
一、CRUD简介
CURD是对数据库中的记录进⾏基本的增删改查操作:
- Create (创建)
- Retrieve (读取)
- Update (更新)
- Delete (删除)
二、Create 新增
1、语法
2、⽰例
(1)单⾏数据全列插⼊
value_list 中值的数量必须和定义表的列的数量及顺序⼀致
(2)单⾏数据指定列插⼊
value_list 中值的数量必须和指定列数量及顺序⼀致
没有指定id这一列时,id这一列会用默认值去填充,默认值是NULL(3)多⾏数据指定列插⼊
在⼀条INSERT语句中也可以指定多个value_list,实现⼀次插⼊多⾏数据
一次插入一条数据的效率高还是一次插入多条数据的效率高?
- 执行所有的SQL都要有网络开销
- MySql数据库在保存数据的时候都有磁盘开销
- 每执行一条SQL语句都需要开启一个事务;事务的开启到关闭也需要消耗系统资源
一次提交多条数据(在一个可控的范围之内),比一次提交一次效率 能高那么一点
三、Retrieve 检索
1、语法
2、⽰例
提示:执行本机的SQL脚本:source F:\文档\Navicat\MySQL\Servers\MySQL\java114\exam.sql或\. F:\文档\Navicat\MySQL\Servers\MySQL\java114\exam.sql
(1)构造数据
3、Select
(1)全列查询
select(查询关键字) *(要查询字段的列表,*表示的是所有列) from 表名(从哪个表中查询数据);
查询所有记录
(2)指定列查询
查询所有⼈的编号、姓名和语⽂成绩
在select后⾯的查询列表中指定希望查询的列,可以是⼀个也可以是多个,中间⽤逗号隔开,指定列的顺序与表结构中的列的顺序⽆关(3)查询字段为表达式
- 常量表达式
表达式本⾝就是⼀个常量
表达式在查询列表中,但是表中不存在
返回的结果集是根据查询表列中的字段和表达式生成的一个临时表,专门用来保存查询结果的,当结果集返回给客户端时,临时就销毁了。
也可以是常量的运算
- 把所有学⽣的语⽂成绩加10分
- 计算所有学⽣语⽂、数学和英语成绩的总分
(4)为查询结果指定别名
语法:
AS可以省略,别名如果包含空格必须⽤单引号包裹
示例:
- 为总分这⼀列指定别名:
- 如果别名有空格,必须用单引号包裹:
- as可以省略
(5)结果去重查询
- 查询当前所的数学成绩:
通过观察有两条98的记录
- 在结果集中去除重复记录,可以使⽤DISTINCT
使⽤DISCTINCT去重时,只有查询列表中所有列的值都相同才会判定为重复。
注意:- 查询时不加限制条件会返回表中所有结果,如果表中的数据量过⼤,会把服务器的资源消耗殆尽
- 在⽣产环境不要使不加限制条件的查询
4、Where 条件查询
根据指定的一些条件,过滤掉不符合条件的记录,把符合条件的记录返回给用户。
(1)语法
(2)⽐较运算符
注意:其他语言中的等于是==,赋值是=,MySql中判断等于和赋值都是=,在SQL编程中赋值也可以写成":="
(3)逻辑运算符
(4)⽰例
基本查询:
- 查询英语不及格的同学及英语成绩 ( < 60)
注意:如果英语成绩有NULL的记录,结果集中没有NULL的记录,会自动过滤掉。- 查询语⽂成绩⾼于英语成绩的同学
- 总分在 200 分以下的同学
问题:where·子句为什么不能以别名当做过滤条件?
1、先找到这个表–from
2、定位符合条件的数据行 – where(所以在执行where子句时,select后边指定的别名还没有定义)
3、在过滤后的结果集中抽取要显示的列、表达式AND和OR:
- 查询语⽂成绩⼤于80分且英语成绩⼤于80分的同学
- 查询语⽂成绩⼤于80分或英语成绩⼤于80分的同学
- 观察AND和OR的优先级
优先级比较:NOT>AND>OR
范围查询:
- 语⽂成绩在 [80, 90] 分的同学及语⽂成绩
使⽤BETWEEN AND 实现:
使⽤ AND 实现:
- 数学成绩是 78 或者 79 或者 98 或者 99 分的同学及数学成绩
使⽤IN实现:
使⽤OR实现:
模糊查询:%和_都是通配符
%表示任意多个(包含0个)字符:
- %表示所有,等于没有指定条件
- %xxx,表示以xxx结束,前面可以包含任意多个字符
- xxx%,表示以xxx开头,后面可以包含任意多个字符
- %xxx%,前面和后面可以包含任意多个字符,中间必须有xxx
_表示任意一个字符:(严格匹配,写多少个_就匹配多少字符 -)
- 是一个占位符
- _xxx,表示以xxx结束,前面可以包含一个字符
- xxx_,表示以xxx开头,后面可以包含一个字符
- _ xxx _,前面和后面可以包含一个字符,中间必须是xxx
- 查询所有姓孙的同学
- 查询姓孙且姓名共有两个字同学
NULL的查询:
- 构造数据:写⼊⼀条数据,英语成绩为NULL
- 查询英语成绩为NULL的记录
- 查询英语成绩不为NULL的记录
- NULL与其他值进⾏运算结果为NULL
注意:
- WHERE条件中可以使⽤表达式,但不能使⽤别名
- AND的优先级⾼于OR,在同时使⽤时,建议使⽤⼩括号()包裹优先执⾏的部分
- 过滤NULL时不要使⽤等于号(=)与不等于号(!= , <>)
- NULL与任何值运算结果都为NULL
5、Order by 排序
(1)语法
{col_name (列)| expr(表达式) }结果集或者真实表中
注意:
查看表结构用到了 desc describe 描述
排序中的desc descend 下降(2)⽰例
- 按数学成绩从低到⾼排序(升序)
- 按语⽂成绩从⾼到低排序(降序)
- 按英语成绩从⾼到低排序
在排序时,NULL值被认定为比任何值都小- 查询同学各⻔成绩,依次按数学降序,英语升序,语⽂升序的⽅式显⽰
可以分别为每个列指定排序顺序规则,在结果集中按从左向右的顺序进行排序。
- 查询同学及总分,由⾼到低排序
- 可以使⽤列的别名进⾏排序
- 所有英语成绩不为NULL的同学,按语⽂成绩从⾼到低排序
注意:
- 查询中没有ORDER BY ⼦句,返回的顺序是未定义的,永远不要依赖这个顺序
- ORDER BY ⼦句中可以使⽤列的别名进⾏排序
- NULL 进⾏排序时,视为⽐任何值都⼩,升序出现在最上⾯,降序出现在最下⾯
6、分⻚查询
分页查询可以有效的限制一次查询返回的记录条数。
通过分页查询可以有效控制一次查询出来的结果集中的记录条数,可以有效的减少数据库服务器的压力,同时对于用户也比较友好。(1)语法
(2)⽰例
- 从第0条开始,只取前面2条记录作为返回的结果
- 执行顺序在order by之后
- 查询第⼀⻚数据
start = (当前页号-1)*每页显示的记录数
- 查询第⼆⻚数据
- 查询第三⻚数据,没有达到limit的条数限制,也不会有任何影响,有多少条就显⽰多少条
- 起始位置超过了表中记录的范围,执行没有问题,但是会返回一个空结果集
- 从位置为1的记录开始, 向后读取两条记录
四、Update 修改
1、语法
1、确定要更新的表和列
2、要更新的目标值
3、更新条件
先按条件查找,之后再更新查找到的结果
2、⽰例
- 将孙悟空同学的数学成绩变更为 80 分
(1)查看原始数据
(2)更新操作
(3)查看结果,数学成绩更新成功
- 将曹孟德同学的数学成绩变更为 60 分,语⽂成绩变更为 70 分
(1)查看原始数据
>(2)更新操作
(3)查看结果
- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
(1)查看原始数据
(2)更新操作
(3)查看结果
(4)修改后总成绩倒数前三的 3 位同学和数据成绩
- 将所有同学的语⽂成绩更新为原来的 2 倍
(1)查看原始数据
(2)更新操作
(3)查看结果
3、Update 注意事项
- 以原值的基础上做变更时,不能使⽤math += 30这样的语法
- 不加where条件时,会导致全表数据被列新,谨慎操作
五、Delete 删除
1、语法
2、⽰例
- 删除孙悟空同学的考试成绩
(1)查看原始数据
(2)删除操作
(3)查看结果
- 删除整张表数据
(1)准备测试表
(2)插⼊测试数据
(3)查看测试表
(4)删除整张表中的数据
(5)查看结果
3、Delete注意事项
- 执⾏Delete时不加条件会删除整张表的数据,谨慎操作
六、截断表
1、语法
2、⽰例
(1)准备测试表
(2)插⼊测试数据
(3)查看测试表
(4)查看建表结构,AUTO_INCREMENT=4
(5)截断表,注意受影响的⾏数是0
(6)查看表中的数据
(7)查看表结构,AUTO_INCREMENT已被重置为0
(8)继续写⼊数据
(9)⾃增主键从1开如计数
(10)再次查看表结构,AUTO_INCREMENT=2
3、Truncate注意事项
- 只能对整表操作,不能像 DELETE ⼀样针对部分数据
- 不对数据操作所以⽐DELETE更快,TRUNCATE在删除数据的时候,不经过真正的事务,所以⽆法回滚
- 会重置 AUTO_INCREMENT 项
七、插⼊查询结果
1、语法
2、⽰例
删除表中的重复记录,重复的数据只能有⼀份
(1)创建测试表,并构造数据
(2)插⼊测试数据
(3)查看结果
实现思路:原始表中的数据⼀般不会主动删除,但是真正查询时不需要重复的数据,如果每次查询都使⽤DISTINCT进⾏去重操作,会严重降低效率。可以创建⼀张与
t_recored
表结构相同的表,把去重的记录写⼊到新表中,以后查询都从新表中查,这样真实的数据不丢失,同时⼜能保证查询效率
(1)创建⼀张新表,表结构与t_recored相同
(2)新表中没有记录
(3)原表中的记录去重后写⼊到新表
(4)查询新表中的记录,实现去重
(5)新表与原来重命名
(6)查询重命名后表中的记录,实现需求且原来中的记录不受影响
八、聚合函数
1、常⽤函数
2、⽰例
(1)COUTN
统计exam表中有多少记录
使⽤ * 做统计
使⽤常量做统计
统计有多少学⽣参加数学考试
使⽤指定列做统计:建议主键列
统计有多少学⽣参加英语考试
查看表中的记录,张⻜没有参加英语考试
NULL 的数据不会计⼊结果
统计语⽂成绩⼩于10分的学⽣个数
加⼊where条件
(2)SUM
- 统计所有学⽣数学成绩总分
- 统计所有学⽣英语成绩总分
值为NULL的列不参与统计
- 不能统计⾮数值的列
警告信息,可以使⽤show warnings查看
(3)AVG
- 统计英语成绩的平均分
NULL值不参与统计
- 统计平均总分
(4)MAX
- 查询英语最⾼分
(5)MIN
- 查询 > 70 分以上的数学最低分
- 查询数据成绩的最⾼分与英语成绩的最低分
可以使⽤多个聚合函数
九、Group by 分组查询
GROUP BY ⼦句的作⽤是通过⼀定的规则将⼀个数据集划分成若⼲个⼩的分组,然后针对若⼲个分组进⾏数据处理,⽐如使⽤聚合函数对分组进⾏统计。
1、语法
- col_name | expr:要查询的列或表达式,可以有多个,必须在
GROUP BY
⼦句中作为分组的依据- aggregate_function:聚合函数,⽐如COUNT(), SUM(), AVG(), MAX(), MIN()
- aggregate_expr:聚合函数传⼊的列或表达式,如果列或表达式不在
GOURP BY
⼦句中,必须包含中聚合函数中
2、⽰例
- 准备测试表及数据职员表emp,列分别为:id(编号),name(姓名),role(⻆⾊),salary(薪⽔)
- 统计每个⻆⾊的⼈数
- 统计每个⻆⾊的平均⼯资,最⾼⼯资,最低⼯资
3、having⼦句
使⽤
GROUP BY
对结果进⾏分组处理之后,对分组的结果进⾏过滤时,不能使⽤WHERE
⼦句,⽽要使⽤HAVING
⼦句
- 显⽰平均⼯资低于1500的⻆⾊和它的平均⼯资
4、Having 与Where 的区别
Having
⽤于对分组结果的条件过滤Where
⽤于对表中真实数据的条件过滤
总结:
十、内置函数
1、⽇期函数
参考链接:
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-intervals
14.7 Date and Time Functions
11.5 Expressions
(1)⽰例
- 获取当前⽇期和时间
- 提取指定datatime的⽇期部分
- 在给定⽇期的基础上加31天
- 在给定⽇期的基础上减去1⽉
- 计算两个⽇期之间相差多少天
在计算时只使⽤⽇期部分
表达式1表⽰的⽇期早于表达式2表⽰的⽇期时返回负数
2、字符串处理函数
参考链接:
https://dev.mysql.com/doc/refman/8.0/en/string-functions.html
14.8 String Functions and Operators
(1)⽰例
- 显⽰学⽣的考试成绩,格式为 “XXX的语⽂成绩:XXX分,数学成绩:XXX分,英语成绩:XXX分”
3、数学函数
参考链接:
https://dev.mysql.com/doc/refman/8.0/en/numeric-functions.html
MySQL :: MySQL 8.0 Reference Manual :: 14.6 Numeric Functions and Operators
(1)⽰例
- 返回不⼩于20.36的最⼩整数值
- 返回不⼤于11.32的最⼩整数值
- 字符串的循环冗余校验
4、其他常⽤函数
(1)⽰例
- 对⼀个字符串进⾏md5加密
- ifnull函数
第⼀个参数不为NULL, 返回第⼀个参数的值
第⼀个参数为NULL, 返回第⼆个参数的值
以上是本篇文章的全部内容,如果文章有错误或者有看不懂的地方,多和喵博主交流。互相学习互相进步。如果这篇文章对你有帮助,可以给喵博主一个关注,你们的支持是我最大的动力。