当前位置: 首页 > news >正文

【MySQL】(5) 数据行的增删改查操作

一、什么是CRUD操作

        就是对数据库中记录(一行)的增删改查。

二、Create 新增

语法:

        不指定列名按照表中列的顺序设置值,必须写全:

        指定列名,按照指定列名的顺序设置值,可以不写全

        一次写入多条记录,可以减少客户端与数据库服务器的连接次数,提高效率

三、Retrieve 检索

1、语法

2、普通的查询

查询所有列

查询列为表达式

3、加限制条件的查询

        若数据量大,使用不加限制条件的查询会耗尽服务器资源。通常使用加限制条件的查询。        

3.1、去重查询

        distinct 修饰多个字段,多个字段都不同才去重

        修饰单个字段:

        修饰多个字段:

3.2、Where 条件查询

        语法:

        >, >=, <, <=:查询总分在200分以下的同学。

        查询内容:名字,总分;查询条件:总分在200分以下。

        不能在条件表达式中使用字段的别名

        原因:该语句的执行顺序是 ① from 找到表。② where 筛选出数据行,此时没有定义 toal 别名。③ select 显示指定字段结果,此时定义了 total。

        AND、OR :查询语文和英语成绩都大于80分的同学。

        BETWEEN a0 AND a1、NOT BETWEEN a0 AND a1:查询语文成绩在 [80, 90] 之间的同学。

        IN(a0, a1, ......):查询数学成绩是78或者79或者98或者99分的同学。

        模糊查询LIKE% 匹配0或多个字符,_ 匹配任意一个字符(包括空字符):

        NULL查询,IS NULL, IS NOT NULL, <=> :

        <=> 是安全的,null<=>null 返回 TRUE(1),=(等于)、!=(不等于)、<>(不等于) 不安全任何值使用不安全的比较操作跟null比较,返回的都是 null任何值与null 的运算结果都是null

 4、聚合函数

        MySQL 内置的函数,常用的有下面这些:

  • 对于 count,expr 可以是 *、列、表达式。推荐 *一是 * 是SQL语言级别的,所有的数据库软件都通用二是 MyISAM 存储引擎里边有一个变量存储了所有记录的条数,使用 count(*) 可以直接访问这个变量返回记录数;网上有些说 count(常量) 比 count(*) 效率高,一是有争议,二是count(常量)在有些数据库软件里边不支持。
  • null 是不会参与计数、计算的

        示例1:统计英语成绩⼩于50分的学⽣个数。

        示例2:查询全班英语成绩的总分、平均分、最高分、最低分:

5、Group by 分组查询

        语法:group by 是分组的依据。 

        为什么 select 的表达式必须是 group by 中的表达式?先准备一张表:

drop table if exists emp;

 create table emp (
 id bigint primary key auto_increment,
 name varchar(20) not null,
 role varchar(20) not null,
 salary decimal(10, 2) not null
 );
 
 insert into emp values (1, '马云', '老板', 1500000.00);
 insert into emp values (2, '马化腾', '老板', 1800000.00);
 insert into emp values (3, '鑫哥', '讲师', 10000.00);
 insert into emp values (4, '博哥', '讲师', 12000.00);
 insert into emp values (5, '平姐', '学管', 9000.00);
 insert into emp values (6, '莹姐', '学管', 8000.00);
 insert into emp values (7, '孙悟空', '游戏角色', 956.8);
 insert into emp values (8, '猪悟能', '游戏角色', 700.5);
 insert into emp values (9, '沙和尚', '游戏角色', 333.3);
 
 select * from emp;

        为什么 select 的聚合函数中的表达式可以不是 group by 中的表达式?

        示例:统计每个⻆⾊的平均⼯资,最⾼⼯资,最低⼯资。

        对分组结果进行条件过滤,不能使用 where,而是使用 having

        示例,显⽰平均⼯资低于1500的⻆⾊和它的平均⼯资:

6、Order by 查询结果排序

        语法:排序是在额外的内存空间中进行(临时表的空间)。

       查询同学各⻔成绩,依次按数学降序,英语升序,语⽂升序的⽅式显⽰:NULL是比最小值还小的值。

        order by 语句中,可以使用字段的别名: 

        order by 使用别名,不要加 '',这样会当作字符串处理导致查询结果不符合预期:

        若未指定升序、降序,默认升序:

7、分页查询

        where 条件查询还不够限制,他没限制结果集大小,服务器也有可能资源耗尽。分页查询可以限制结果集大小,减少服务器压力,更好的用户体验。一页最多显示指定数据行数。

        语法:

-- 起始下标为0 
-- 从 0 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num;

-- 从 start 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT start, num;

-- 从 start 开始,筛选 num 条结果,⽐第⼆种⽤法更明确,建议使⽤ 
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num OFFSET start;

        表中有 8 行数据,每页显示 2 行,则一共有 8/2 = 4 页,若有余数再加 1 页。

        显示当前一页,start = (当前页号-1) * 每页最多显示行,start = (4-1)*2 = 6:

四、Update 修改

        语法:

        对于修改语句来说,where 条件非常重要,不加就会修改全部数据行。

        示例,将总成绩倒数前三的3位同学的数学成绩加上30分:

五、Delete 删除

        删除也是一个有风险的操作,必须加 where 条件。在实际开发中,并不真的删除数据,而是加 deleteState 字段,0 表示正常,1表示已删除,当删除一条数据时,就将该数据行的 deleteState 设为 1。

        语法:

        示例,删除张飞的考试成绩:

        select 返回的是查询到的结果集。

六、Truncate 截断表

        语法:

        示例:创建一张测试表:

        插入数据:

INSERT INTO t_truncate (name) VALUES ('A'), ('B'), ('C');

        使用 delete 删除所有数据,并查看创建表时的结构:

        使用 truncate ,会将表恢复到创建时的状态:

  • truncate 不仅会删除数据,还会使表恢复到创建表时的状态;delete 只删除了数据,但没有改变表的状态。
  • truncate 通过释放表的数据页来删除数据,而delete语句是逐行删除数据。因此它的效率比 delete 更快

七、插入查询结果

        语法:

        使用场景:表里有很多重复的数据行,如果每次都 distinct 查询,就很麻烦且效率低下。如果直接把重复的删了,这是不允许的,因为在实际开发中所有数据都最好保留下来。因此可以把不重复的数据存到另一个表,以后查询就查询新表,旧表作为备份。

        示例:

八、内置函数

        在互联网项目中,不使用内置函数,因为会影响数据库的性能,一般对数据的处理放在应用程序中。

1、日期函数

  • 获取当前日期:

  • 获取当前时间:

  • 获取当前日期和时间:

  • 提取指定日期时间的日期部分:

  • 在指定日期的基础上加一周:

  • 在指定日期的基础上减去一个月:

  • 计算2个日期间,相隔多少天,只用日期部分参与计算:

        更多关于日期和时间的内置函数,请参考: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

2、字符串处理函数

  • 计算字符串的字符数和字节长度:

  • 拼接字符串:

  • 拼接后的字符串用指定字符串隔开:

  • 字符串转大写:

  • 字符串转16进制:

  • 子串在字符串中第一次出现的索引:

  • 指定位置 7 处插入字符串,覆盖就填 0。指定位置覆盖字符串,从 7 处开始,往后覆盖 5 个字符:

  • 截取字符,从 7 处开始截取,截取 10 个字符,不足 10 个就到字符串结尾为止:

  • 替换字符:

  • 比较字符串:小于返回 -1,等于返回0,大于返回 1。

  • 返回最左、最右边的字符:

  • 删除前导、末尾、前导和末尾的空格:

  • 删除前导、末尾、前导和末尾的指定字符串:

        更多字符串处理函数,参考:MySQL :: MySQL 8.0 Reference Manual :: 14.8 String Functions and Operators

3、数学函数

  • 取绝对值、向上取整、向下取整:

  • 进制转换,10进制转16进制、格式化,四舍五入小数点后5位:

  • 随机生成一个浮点数、舍弃到小数点后5位:

        更多数学函数,参考:https://dev.mysql.com/doc/refman/8.0/en/numeric-functions.html

4、其它常用函数

  • 显示当前数据库版本、当前使用的数据库、当前用户:

  • 对字符串进行 md5 加密:

  • 第一个字符串不为空,显示第一个;第一个字符串为空,显示第二个:

相关文章:

  • Hexo主题配置and常用指令
  • mysql-8.0.25-winx64安装步骤
  • 中考英语之02高频词汇
  • React 常用 Hooks 详细解析
  • 责任链模式
  • 【leetcode hot 100 230】二叉搜索树中第K小的元素
  • Web前端开发——CSS入门
  • 前端web worker提升性能实战案例
  • zk-SNARKs 最简单的应用示例:密码验证
  • RAG的Rerank:从期待到现实的转变
  • Mysql第二次练习
  • Swift 中 associatedtype 的用法详解
  • IntelliJ IDEA 2023.3.1安装指南从下载到配置的完整教程(附资源下载)
  • 中考英语之09从句
  • 五大基础算法——模拟算法
  • C++特性——智能指针
  • 13. 分治
  • 97.HarmonyOS NEXT跑马灯组件教程:基础概念与架构设计
  • Linux实时内核稳定性案例
  • 【Go语言圣经2.5】
  • 网站 内容建设存在的问题/东营seo
  • 宁波工程造价信息网/宁波seo在线优化
  • 网站推广小助手/域名注册局
  • 佛山网站建设公司88/今日新闻十大头条内容
  • 阿里云上可以做网站吗/免费的个人网站html代码
  • 成都网站建设哪里有/优化外包哪里好