【MySQL】表的CRUD{insert 替换 查询 运算符 语句执行顺序 排序 limit 分页 truncate截断表 去重 mysql日志 聚合函数}

news2024/11/15 13:32:06

文章目录

  • 1.重要点
    • insert -- on duplicate key update
    • 替换
    • 查询
    • 运算符
    • 语句执行顺序
    • 排序
    • limit 分页
    • truncate截断表
    • 去重
  • 2.mysql日志简介
  • 3.聚合函数
    • group by

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)

1.重要点

insert – on duplicate key update

想插入 Jane 这位同学的数据,并不知道这位同学是否存在于这张表中,如果不存在就按照指定数据插入;存在将她的 stunum 更新为 1010:

insert into students(id, stunum, name) values(2, 1010, 'Jane') 
-> on duplicate key update stunum = 1010, name = 'Jane';

在这里插入图片描述
0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
1 row affected: 表中没有冲突数据,数据被插入
2 row affected: 表中有冲突数据,并且数据已经被更新

– 通过 MySQL 函数获取受到影响的数据行数

SELECT ROW_COUNT();
 +-------------+
 | ROW_COUNT() |
 +-------------+
 |           2 |
 +-------------+
 1 row in set (0.00 sec)
 -- ON DUPLICATE KEY 当发生重复key的时候

替换

主键或者唯一键没有冲突,则直接插入;主键 或者 唯一键 如果冲突,则删除后再插入。
在这里插入图片描述

查询

通常情况下不建议使用 * 进行全列查询

查询的列越多,意味着需要传输的数据量越大;
可能会影响到索引的使用。

查询内容为表达式

在这里插入图片描述

不等于null不安全

在这里插入图片描述

-- NULL 和 NULL 的比较,= 和 <=> 的区别 
SELECT NULL = NULL, NULL = 1, NULL = 0; 
+-------------+----------+----------+ 
| NULL = NULL | NULL = 1 | NULL = 0 | 
+-------------+----------+----------+ 
|        NULL |     NULL |     NULL | 
+-------------+----------+----------+ 
1 row in set (0.00 sec) 
SELECT NULL <=> NULL, NULL <=> 1, NULL <=> 0; 
+---------------+------------+------------+ 
| NULL <=> NULL | NULL <=> 1 | NULL <=> 0 | 
+---------------+------------+------------+ 
|             1 |          0 |          0 | 
+---------------+------------+------------+ 
1 row in set (0.00 sec) 

为查询结果指定别名

语法:SELECT column [AS] alias_name [] FROM table_name;
select id, name, chinese + math + english as 总分 from exam_result;  
-- as 可以加也可以不加

结果去重:

select distinct math from exam_result;

运算符

比较运算符

在这里插入图片描述

逻辑运算符

在这里插入图片描述

语句执行顺序

SQL查询中各个关键字的执行先后顺序

from > on> join > where > group by > with > having > select> distinct > order by > limit

distinct > order by > limit

  1. from:从哪个表
  2. where:从该表的哪些数据
  3. group by:对这些数据进行分组
  4. having:对去分组后的数据进一步筛选
  5. select:选择某些列
  6. order by:排序

执行where时 total根本不存在!

在这里插入图片描述

demo

在这里插入图片描述

成功样例

在这里插入图片描述

order by 与别名:只有数据准备好了 才会排序+显示

在这里插入图片描述

排序

-- ASC 为升序(从小到大) -- DESC 为降序(从大到小) -- 默认为 ASC 
SELECT ... FROM table_name [WHERE ...]  
ORDER BY column [ASC|DESC], [...]; 
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序【无序查询 多次查询可能查到不同的结果】

– NULL 视为比任何值都小,升序出现在最上面


SELECT name, qq FROM students ORDER BY qq; 
+-----------+-------+ 
| name      | qq    | 
+-----------+-------+ 
| 唐大师     | NULL  | 
| 孙仲谋     | NULL  | 
| 曹阿瞒     | NULL  | 
| 孙悟空     | 11111 | 
+-----------+-------+ 
4 rows in set (0.00 sec)

查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示

-- 多字段排序,排序优先级随书写顺序 
SELECT name, math, english, chinese FROM exam_result  
ORDER BY math DESC, english, chinese; 
+-----------+--------+--------+-------+ 
| name      | math | english | chinese | 
+-----------+--------+--------+-------+ 
| 唐三藏     |     98 |     56 |    67 | 
| 猪悟能     |     98 |     90 |    88 | 
| 刘玄德     |     85 |     45 |    55 | 
| 曹孟德     |     84 |     67 |    82 | 
| 孙悟空     |     78 |     77 |    87 | 
| 孙权       |     73 |     78 |    70 | 
| 宋公明     |     65 |     30 |    75 | 
+-----------+--------+--------+-------+ 
7 rows in set (0.00 sec)

limit 分页

引用

-- 起始下标为 0 -- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果 
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n; 
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s; 

对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页

-- 第 1 页 
SELECT id, name, math, english, chinese FROM exam_result  
ORDER BY id LIMIT 3 OFFSET 0; 显示123
-- 第 2 页 
SELECT id, name, math, english, chinese FROM exam_result  
ORDER BY id LIMIT 3 OFFSET 3; 显示456
-- 第 3 页,如果结果不足 3 个,不会有影响 
SELECT id, name, math, english, chinese FROM exam_result  
ORDER BY id LIMIT 3 OFFSET 6; 显示7 89没有

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

-- 数据更新,不支持 math += 30 这种语法 
UPDATE exam_result SET math = math + 30 
ORDER BY chinese + math + english LIMIT 3; 

-- 删除整表数据 
DELETE FROM for_delete; 
Query OK, 3 rows affected (0.00 sec)

-- 再插入一条数据,自增 id 在原值上增长 
INSERT INTO for_delete (name) VALUES ('D'); 
Query OK, 1 row affected (0.00 sec) 
-- 查看数据 
SELECT * FROM for_delete; 
+----+------+ 
| id | name | 
+----+------+ 
|  4 | D    | 
+----+------+ 
1 row in set (0.00 sec)

-- 查看表结构,会有 AUTO_INCREMENT=n 项 
SHOW CREATE TABLE for_delete\G 
*************************** 1. row *************************** 
Table: for_delete 
Create Table: CREATE TABLE `for_delete` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(20) DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

truncate截断表

这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上 truncate 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事务,所以无法回滚
  3. 会重置 AUTO_INCREMENT 项
-- 准备测试表 
CREATE TABLE for_truncate ( 
id INT PRIMARY KEY AUTO_INCREMENT, 
name VARCHAR(20) 
); 
Query OK, 0 rows affected (0.16 sec) -- 插入测试数据 
INSERT INTO for_truncate (name) VALUES ('A'), ('B'), ('C'); 
Query OK, 3 rows affected (1.05 sec) 
Records: 3  Duplicates: 0  Warnings: 0 -- 查看测试数据 
SELECT * FROM for_truncate; 
+----+------+ 
| id | name | 
+----+------+ 
|  1 | A    | 
|  2 | B    | 
|  3 | C    | 
+----+------+ 
3 rows in set (0.00 sec)
-- 截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作 
TRUNCATE for_truncate; 
Query OK, 0 rows affected (0.10 sec) -- 查看删除结果 
SELECT * FROM for_truncate; 
Empty set (0.00 sec) 
-- 再插入一条数据,自增 id 重新增长 
INSERT INTO for_truncate (name) VALUES ('D'); 
Query OK, 1 row affected (0.00 sec) 
-- 查看数据 
SELECT * FROM for_truncate; 
+----+------+ 
| id | name | 
+----+------+ 
|  1 | D    | 
+----+------+ 
1 row in set (0.00 sec) 
-- 查看表结构,会有 AUTO_INCREMENT=2 项 【下一个id的值】
SHOW CREATE TABLE for_truncate\G 
*************************** 1. row *************************** 
Table: for_truncate 
Create Table: CREATE TABLE `for_truncate` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(20) DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

去重

删除表中的的重复记录,重复的数据只能有一份

-- 创建原数据表 
CREATE TABLE duplicate_table (id int, name varchar(20)); 
Query OK, 0 rows affected (0.01 sec) -- 插入测试数据 

INSERT INTO duplicate_table VALUES 
(100, 'aaa'), 
(100, 'aaa'), 
(200, 'bbb'), 
(200, 'bbb'), 
(200, 'bbb'), 
(300, 'ccc'); 
Query OK, 6 rows affected (0.00 sec) 
Records: 6  Duplicates: 0  Warnings: 0 

-- 创建一张空表 no_duplicate_table,结构和 duplicate_table 一样 
CREATE TABLE no_duplicate_table LIKE duplicate_table; 
Query OK, 0 rows affected (0.00 sec) 

-- 将 duplicate_table 的去重数据插入到 no_duplicate_table 
INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table; 
Query OK, 3 rows affected (0.00 sec) 
Records: 3  Duplicates: 0  Warnings: 0 -- 通过重命名表,实现原子的去重操作 

RENAME TABLE duplicate_table TO old_duplicate_table,  
no_duplicate_table TO duplicate_table; 
Query OK, 0 rows affected (0.00 sec) -- 查看最终结果 

SELECT * FROM duplicate_table; 
+------+------+ 
| id   | name | 
+------+------+ 
|  100 | aaa  | 
|  200 | bbb  | 
|  300 | ccc  | 
+------+------+ 
3 rows in set (0.00 sec)

为什么最后是通过rename方式进行的?

就是单纯的想等一切都就绪了,然后统一放入、更新、生效等

2.mysql日志简介

MySQL中的binlog(二进制日志)、redolog(重做日志)和undolog(回滚日志)是三种重要的日志类型,它们在MySQL数据库的运行和维护中扮演着不同的角色。以下是对这三种日志的简要叙述:

  1. binlog(二进制日志)

定义与作用:

binlog即binary log,是MySQL的二进制日志文件,也称为变更日志(update log)。它记录了所有更新数据库的语句(如DDL和DML语句),并以二进制的形式保存在磁盘中,但不包含没有修改任何数据的语句(如数据查询语句select、show等)
binlog主要用于数据恢复和数据复制(如主从复制)。通过binlog,可以恢复某一时刻的误操作数据,也是实现MySQL数据备份、集群高可用、读写分离等功能的基础。
记录格式与写入时机:

binlog有三种记录格式:statement、row和mixed。

事务执行过程中,会先把日志写到binlog cache中去,事务提交时,才把binlog cache写到binlog文件中去(刷盘)。
binlog cache是为了保证一个事务的所有操作能够一次性写入binlog不被拆开而设置的缓存,其大小受binlog_cache_size参数控制。

写入策略:

sync_binlog参数控制binlog的写入策略。
sync_binlog=0:表示每次提交事务都只write,由操作系统自行判断什么时候执行fsync。
sync_binlog=N:表示每次提交事务都只write,积攒N个事务后才执行fsync。
sync_binlog=1(默认):表示每次提交事务都会执行write和fsync,即将binlog数据持久化到磁盘中。

  1. redolog(重做日志)

定义与作用:

redo log是MySQL中用于保证事务持久性的重要机制。当MySQL服务器意外崩溃或宕机后,它能帮助恢复已经提交的事务,确保数据不会丢失。
redo log是物理日志,记录的是在某个数据页上做了什么修改,属于InnoDB存储引擎层。

写入机制:

InnoDB以页为单位来管理存储空间,修改数据时会先将整个页加载到buffer pool中,然后对需要修改的记录进行修改。但修改后的数据不会立即刷新到磁盘,因为此时刷新是随机IO且效率低下。
因此,InnoDB引入了redo log,在修改数据后,不立即刷新磁盘,而是记录一条redo log,内容是关于哪个页面、多少偏移量、什么数据发生了什么变更。
redo log是循环写入固定的文件,顺序写入磁盘,提高了性能。

刷盘时机:

redo log的刷盘时机由innodb_flush_log_at_trx_commit参数控制。
设置为1时(最安全),每次事务提交都会将redo log写入磁盘。
设置为0时,由后台线程每秒刷新一次到磁盘。
设置为2时,事务提交时只写入操作系统的文件缓存,由操作系统决定何时刷新到磁盘。

  1. undolog(回滚日志)

定义与作用:

undo log是MySQL中用于事务回滚和MVCC(多版本并发控制)的日志。它记录了事务回滚前的数据状态,当事务需要回滚时,可以通过undo log将数据恢复到事务开始前的状态。
同时,undo log也是MVCC实现的关键部分,用于保存数据的旧版本,以便支持非锁定读(如快照读)。

记录内容:

undo log只记录事务中的增删改操作,查询操作不会记录,因为查询不会修改数据。
undo日志段(undo log segment)是undo日志的集合,包含在回滚段(rollback segment)中。InnoDB支持多个回滚段,以提高并发性能。

作用:

事务回滚:保证事务的原子性,通过undo日志在事务需要回滚时,让数据恢复到最初的样子。
MVCC:作为MVCC版本链的一部分,存储老版本数据,支持非锁定读。

综上所述,binlog、redolog和undolog在MySQL中各自承担着不同的职责,共同保证了数据库的数据一致性和可靠性。

3.聚合函数

在这里插入图片描述

count(1)为什么也能显示5?因为select 1 的原因!
在这里插入图片描述
在这里插入图片描述

导入sql文件

mysql> source /home/sql_file/testdb data.sql;

在这里插入图片描述

group by

在这里插入图片描述

分组的目的是为了进行分组后,方便进行聚合统计。实际分组是用该列的不同的行数据来进行分组的!分组的条件deptno,组内一定是相同的! – 可以被聚合压缩
分组,不就是把一组按照条件拆成了多个组,进行各自组内的统计分组(“分表”),不就是把一张表按照条件在逻辑上拆成了多个子表然后分别对各自的子表进行聚合统一!

不要单纯的认为,只有磁盘上表结构导入到mysql,真实存在的表,才叫做表
中间筛选出来的,包括最终结果,在我看来,全部都是逻辑上的表!“MySQL一切皆表

having 和 group by 配合使用,对 group by 结果进行过滤,having 经常和 group by 搭配使用,作用是对分组进行筛选,作用有些像 where.

having 是对聚合后的统计数据进行条件筛选。

其中 having 和 where 的区别在于:

执行的顺序不一样,where 是对任意列进行条件筛选,一般是最先执行;having 是对分组聚合后的结果进行条件筛选,一般是最后才执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

塔子哥的环游之旅-腾讯2023笔试(codefun2000)

题目链接 塔子哥的环游之旅-腾讯2023笔试(codefun2000) 题目内容 塔子哥是一位热衷旅游的程序员。他所在的国家共有 n 个城市,编号从 1 到 n。这些城市之间有 m 条双向的交通线路,分别为飞机线路和火车线路。塔子哥起始位于编号为 1 的城市,他计划前往编号为 n 的城市进行旅游…

基于VScode和C++ 实现Protobuf数据格式的通信

目录 1. Protobuf 概述1.1 定义1.2Protobuf的优势 2. Protobuf 语法3、序列号和反序列化3.1 .pb.h 头文件3.2 序列化3.3 反序列化 4、测试用例 Protobuf详细讲解链接 1. Protobuf 概述 1.1 定义 protobuf也叫protocol buffer是google 的一种数据交换的格式&#xff0c;它独立…

大模型算法面试题(十八)

本系列收纳各种大模型面试题及答案。 1、P-tuning v2 思路、优缺点是什么 P-tuning v2是清华大学自然语言处理实验室&#xff08;THUDM&#xff09;等研究机构提出的一种新的预训练模型优化方法&#xff0c;主要关注如何通过动态构建任务相关的提示序列来引导预训练模型进行更…

点可云ERP进销存V8版本—购货入库单的操作使用及各单据状态说明

本章我们讲解购货入库单的操作使用&#xff0c;包括导入导出功能、资金结算、生成其他关联单据、以及各单据状态的说明处理。 购货入库单用于收货、验收、接受采购的商品&#xff0c;并进行验收确保质量和数量。而购货入库单和购货订单的区别在于购货订单的审核后只会记录单据&…

【考研数学】概率论:4 种方法解答一道题,你觉得哪种方法又快又好呢?

今天要给大家分享的笔记是&#xff1a;《用画图的方式求解概率论题目很方便&#xff0c;但难点在于如何画和怎么理解》 在这篇考研笔记中&#xff0c;「荒原之梦考研数学」为同学们提供了 4 种不同的方法解答这一道题目&#xff0c;其中最特别的是第一种通过画图求解的方法。 …

rocketMq的使用和消费模式(异步消息,单项消息(使用mq处理日志),推迟任务(占座买票),批量消息)

rocketMq开始使用 rocketmq是怎么使用的消费模式异步消息单项消息&#xff1a;使用mq处理日志延迟任务&#xff08;占座买票&#xff09;批量 rocketmq是怎么使用的 public class ASimpleTest {Testpublic void simpleProduce() throws Exception{DefaultMQProducer producer …

分享IP 地址混淆知识

由于IPv4 地址资源的枯竭促使 IPv6 技术的广泛应用&#xff0c;从而形成了 IPv4 和 IPv6 并存的局面。这就逐渐出现了 IP 地址混淆导致的网络问题。 IP 地址混淆的表现形式 地址分配错误 在同时支持两种协议的网络中&#xff0c;可能会出现将 IPv4 地址错误地分配给 IPv6 接口…

正则采集器之三——前端搭建

前端使用有名的饿了么管理后台&#xff0c;vue3版本vue3-element-admin&#xff0c;首先从gitee中克隆一个vue3-element-admin模板代码vue3-element-admin: Vue3 Element Admin开箱即用的中后台管理系统前端解决方案&#xff0c;然后在此基础上进行开发。 1、修改vite.config.…

正点原子imx6ull-mini-Linux驱动之按键输入实验(9)

在前几章我们都是使用的 GPIO 输出功能&#xff0c;还没有用过 GPIO 输入功能&#xff0c;本章我们就来学 习一下如果在 Linux 下编写 GPIO 输入驱动程序。I.MX6U-ALPHA 开发板上有一个按键&#xff0c;我们 就使用此按键来完成 GPIO 输入驱动程序&#xff0c;同时利用第四十七…

LeetCode40题: 组合总和 II(原创)

【题目描述】 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1: 输入: candidates [1…

安装MongoDB UI客户端工具:mongodb-compass-1.40.2-win32-x64.msi

文章目录 1、安装 mongodb-compass-1.40.2-win32-x64.msi2、安装后配置链接地址&#xff1a; 1、安装 mongodb-compass-1.40.2-win32-x64.msi 2、安装后配置链接地址&#xff1a;

读书其实并没有那么大的作用

开场白 Hey&#xff0c;书虫们和生活探索者们&#xff01;今天我们来聊聊一个老生常谈却又常谈常新的话题——读书。有人说&#xff0c;读书能改变命运&#xff0c;但也有人说&#xff0c;读书不过是生活的调味品。那么&#xff0c;读书到底有啥用&#xff1f;让我们一起来扒一…

卫星导航系统的应用领域与发展前景

当人们提到卫星导航系统&#xff0c;往往会联想到车载导航仪或手机上的地图应用。然而&#xff0c;卫星导航系统的应用远不止于此&#xff0c;它在许多领域都发挥着重要作用。下面将介绍几个卫星导航系统的应用领域及其发展前景。首先是海洋航行安全领域。在过去&#xff0c;海…

搜维尔科技:Haption:对于遥控机器人来说,触觉技术是什么

力反馈遥控机器人有哪些好处&#xff1f; 遥控机器人是机器人技术领域的一个领域&#xff0c;主要涉及远距离控制半自主机器人。它被定义为遥操作和远程呈现的结合。第一部分&#xff0c;遥控操作&#xff0c;使操作员能够远程控制机器人。第二部分&#xff0c;远程呈现&#…

全网最适合入门的面向对象编程教程:29 类和对象的Python实现-断言与防御性编程和help函数的使用

全网最适合入门的面向对象编程教程&#xff1a;29 类和对象的 Python 实现-断言与防御性编程和 help 函数的使用 摘要&#xff1a; 在 Python 中&#xff0c;断言是一种常用的调试工具&#xff0c;它允许程序员编写一条检查某个条件。本文主要介绍了断言的应用场景和特点以及 …

jmeter-beanshell学习13-设置等待时间

接口测试时候&#xff0c;如果交易成功&#xff0c;一切正常&#xff0c;如果交易失败&#xff0c;可能会涉及回滚。之前写的都是做完交易&#xff0c;紧接着去查库&#xff0c;就可能遇到还没回滚完成&#xff0c;已经查完库了&#xff0c;查出来的数据不准确。既然写beanshel…

前端低代码必备:FrontendBlocks 4.0版本重磅发布,助力Uniapp-X原生APP开发

项目介绍 本软件是一款强大的所见即所得前端页面设计器&#xff0c;是低代码开发领域的基础设施&#xff0c;生成的代码不依赖于任何框架&#xff0c;实测可以将前端布局工作的耗时减少80%以上&#xff0c;最关键的是&#xff0c;它实现了人人都可以写前端页面的梦想。 不用写…

相似度计算方法

一、相似度计算方法 相似度算法是计算两个或多个对象之间相似程度的方法&#xff0c;这些对象可以是文本、图像、音频等不同类型的数据。在计算机科学、信息检索、推荐系统、数据挖掘等领域中&#xff0c;相似度算法具有广泛的应用。 二、应用场景 搜索引擎&#xff1a;用于文…

实验3-2 计算符号函数的值

//实验3-2 计算符号函数的值#include <stdio.h> #include <math.h>int main() {int n 0;scanf("%d",&n);int sign;if(n > 0)sign1;else if(n < 0)sign-1;else sign0;printf("sign(%d) %d", n, sign); }