MindMap Gallery 单表操作
这张思维导图使用EdrawMind绘制,详细描述了单表操作的不同方面。它分为几个主要部分,包括数据操作、排序与聚合、分组和复合查询、连接查询等。每个部分下又细分了具体的操作和示例,例如数据操作中的插入、更新、删除和查询操作,排序与聚合中的ORDER BY、GROUP BY等。整个导图结构清晰,层次分明,便于理解和记忆单表操作的各种命令和使用方法。
Edited at 2022-11-08 14:30:59单表操作
5.1 数据操作
5.1.1 复制表结构和数据
1. 复制已有的表结构
语法:create 【 temporary临时 】 table 【 if not exists 】 表名 { like 旧表名 | (like 旧表名) };
上述语法中,复制表结构仅能从”旧表名“中复制一份相同的表结构,但不会复制数据。其中,“【】”表示可选命令“{ }”表示语法在使用时可以任选其中一种,“|”表示或的意思。
例:create table mydb.new_test like test;
查看已复制的表结构:show create table 复制的新表名;
2. 复制已有的表数据
语法:insert 【into】数据表名1 【(字段列表)】select【(字段列表)】from 数据表名2;
上述语法中,数据表名1和数据表名2通常使用的是同一个表(如test表)从而可在短期内快速增加表的数据量,测试表的压力以及效率等。
例:insert into mydb.new_test select * from test;需注意的是,如果数据表中有主键,而主键又具唯一性,所以在数据复制时还需要考虑主键冲突的问题。
对于主键冲突问题,可以在数据复制时指定除id主键外的任意字段完成。例:insert into mydb.new_test (name,sex,year) select name,sex,year from test;
临时表使用
创建临时表 方式1:create temporary table mydb.tmp_test1 (id int);
创建临时表 方式2:create temporary table mydb.tmp_test2 select id,name from shop.test;
在上述语句中,创建临时表时指定的数据库可以是MySQL服务器中存在的数据库,也可以是不存在的数据库。若数据库不存在,操作临时表时必须使用”数据库.临时表名指定临时表所在的数据库“。临时表和普通表操作相同。show tables不能查看指定数据库有那些临时表,并且临时表名必须使用alter table修改,不能使用rename table ... to修改。
5.1.2 解决主键冲突
1. 主键冲突更新
主键冲突更新操作指的是,当插入数据的过程中若发生主键冲突,则插入数据操作利用更新的方式实现。语法:insert 【into】数据表名【(字段列表)】{ values | value } (值列表) on duplicate key update 字段名1=新值1【字段名2=新值2】....;
从上述语法可知,在insert语句后添加 on duplicate key update可在发生主键冲突时,更新此条记录通过”字段名1=新值1【字段名2=新值2】...“设置的字段名对应的新值
例:insert into mydb.my_goods(id,name,content,keyword) values (20,"橡皮","修正书写错误","文具") on deplicate key update name="橡皮",content="修正书写错误",keyword="文具"; 以上语句执行结果中,当插入的记录与数据表中已存在的数据发生主键冲突时,返回的结果为”2 rows affected“。
2. 主键冲突替换
主键冲突替换操作指的是,当插入数据的过程中若发生主键冲突,则删除此条记录,并重新插入。语法:replace 【into】数据表名【(字段列表)】{ values | value } (值列表)【,(值列表)】...;
上述语法可知,replace语句与insert语句的使用类似,区别在于前者每执行一次就会发生两个操作(删除记录和插入记录)。
例:replace into mydb.my_goods (id,name,content,keyword) values (20,"橡皮","修正书写错误","文具");
从以上可知,replace替换与on deplicate key update更新都能解决插入数据时主键冲突的问题,但replace更适合插入数据直段特别多的情况。
5.1.3 清空数据
除了delete语句可以删除数据外,在MySQL中还可以利用truncate清空指定数据表中的全部数据。语法:truncate 【table】表名;
truncate与delete区别
实现方式不同
truncate本质上先执行删除(drop)数据表的操作,然后再根据有效的表结构文件(.frm)重新创建数据表的方式来实现数据清空操作。而delete语句则是逐条删除数据表中保存的记录。
执行效率不同
在针对大型数据表时,truncate清空数据的实现方式决定了它比delete语句删除数据的方式执行效率更高。
对auto_increment的字段影响不同
truncate清空数据后,再次向表中添加数据,自动增长字段会从默认的初始值重新开始,而使用delete语句删除表中的数据时,则不影响自动增长。
删数据的范围不同
truncate语句只能用于清空表中的所有记录,而delete语句可通过where指定删除满足条件的部分记录。
返回值含义不同
truncate操作的返回值一般是无意义的,而delete语句则会返回符合条件被删除的记录数。
所属SQL语言的不同组成部分
delete语句属于MDL数据操作语句,而truncate通常被认为是DDL数据定义语句。
5.1.4 去除重复记录
语法:select distinct 字段列表 from 数据表名;
5.2 排序与限量
5.2.1 排序
1. 单字段排序
单字段排序指的是查询时仅按照一个指定的字段进行升序或降序排序。语法:select * | { 字段列表 } from 数据表名 order by 字段名 【ASC | DESC】;
2.多字段排序
当在开发中需要根据多个条件对查询的数据进行排序时,可以采用多字段排序。语法:select * | { 字段列表 } from 数据表名 order by 字段名1 【ASC | DESC】【,字段名2【ASC | DESC】】...;
5.2.2 限量
对于一次性查询出的大量记录,不仅不便于阅读查看,还会浪费系统效率。为此。MySQL提供了一个关键字LIMIT,可以限定记录的数量,也可以指定查询从哪一条记录开始
语法:select 【select选项】字段列表 from 数据表名 【where条件表达式】【order by 字段 ASC | DESC】limit 【offset,】 记录数;
上述语法中,”记录数“表示限定获取的最大记录数量;可选项offset表示偏移量,用于设置从哪条记录开始,MySQL中默认第一条记录的偏移量为0,第二条记录的偏移量为1,以此类推。
排序后限量更新或删除数据
在MySQL中除了对查询记录进行排序和限量外,对数据库表中记录的更新与删除操作也可以进行排序和限量。
数据更新的排序与限量语法:update 数据表名 set 字段=新值,...【where条件表达式】order by 字段 ASC | DESC limit 记录数;
数据删除的排序与限量语法:delete from 数据表名【where条件表达式】order by 字段 ASC | DESC limit 记录数;
5.3 分组和聚合函数
5.3.1 分组
1.分组统计
语法:select 【select选项】字段列表 from 数据表名【where条件表达式】group by 字段名;
上述语法在MySQL中分组后,select获取的字段只能是group by分组的字段,或使用了聚合函数的非分组字段,若在获取非分组字段时没有使用聚合函数,MySQL会报错提示。
2.分组排序
语法:select 【select选项】字段列表 from 数据表名 【where条件表达式】group by 字段名 【ASC | DESC】;
需要注意的是,group by分组排序的实现不需要使用order by,直接在分组字段后添加ASC(升序,默认值可省略)或DESC(降序)即可。
3.多分组统计
在对数据进行分组统计时,MySQL中还支持数据按照某个字段进行分组后,对已分组的数据进行再次分组的操作,以实现多分组统计。
语法:select 【select选项】字段列表 from 数据表名【where条件表达式】group by 字段名1 【ASC | DESC】,【字段名2【ASC | DESC】】...;
4.回溯统计
回溯统计可以简单地理解为在根据指定字段分组后,系统又自动对分组的字段向上进行了一次新的统计并产生一个新的统计数据,且该数据对应的分组字段值为null
语法:select 【select选项】字段列表 from 数据表名 【where条件表达式】group by 字段名1【ASC | DESC】,【字段名2,【ASC | DESC】】...with rollup
从上述语法可知,回溯统计的实现只需要在”group by 字段“后添加with rollup即可。
5.统计筛选
当对查询的数据执行分组操作时,可以利用having根据条件进行数据筛选,它与where功能相同,
having与where区别
where操作是从数据表中获取数据,将数据从磁盘存储到内存中,而having是对已存放到内存中的数据进行操作。
having位于group by句后,而where位于group by句前。
having关键字后可以使用聚合函数,而where则不可以。通常情况下,having关键词与group by 一起使用,对分组后的结果进行过滤。
语法:select【select选项】字段列表 from 数据表名 【where条件表达式】group by 字段名 【ASC | DESC】,...【with rollup】having 条件表达式;
在查询中使用别名
字段语法:select 字段 【as】别名1,字段2 【as】别名2【,...】from 表名;
表别名语法:select 表别名.字段【,...】from 表名 【as】表别名;
5.3.2 聚合函数
COUNT()
返回参数字段的数量,不统计为null的记录。
SUM()
返回参数字段之和。
AVG()
返回参数字段平均值。
MAX()
返回参数字段最大值。
MIN()
返回参数字段最小值。
GROUP_CONCAT()
返回符合条件的参数字段值的链接字符串。
JSON_ARRAYAGG()
将符合条件的参数字段值作为单个JSON数组返回。
JSON_OBJECTAGG()
将符合条件的参数字段值作为单个JSON对象返回。
COUNT,SUM,AVG,MAX,MIN,GROUP_CONCAT函数中可以在参数前面添加distinct,表示对不重复的记录进行相关操作。其中,COUNT的参数设置为”*“时,表示统计符合条件的所有记录(包含null)。
5.4 运算符
5.4.1 算术运算符
+
加运算
-
减运算
*
乘运算
/
除运算
%
取模运算
5.4.2 比较运算符
比较运算符
=
等于
<=>
可以进行null值比较的相等运算符
>
大于
<
小于
>=
大于等于
<=
小于等于
<>、!=
不等于
between...and...
指定闭区间范围内
not between...and...
不在指定闭区间范围内
is
比较一个数据是否是true,false或unknown
is not
比较一个数据是否不是true,false或unknown
is null
判断空值
is not null
判断不是空值
like '匹配模式'
获取匹配到的数据
匹配模式符
百分号”%“
表示匹配0到多个字符
下划线”_“
表示匹配任意一个字符
not like '匹配模式'
获取不匹配的数据
比较函数
IN()
比较一个值是否在一组给定的集合内
NOT IN()
比较一个值是否不在一组给的的集合内
GREATEST()
返回最大的一个参数,至少两个参数
LEAST()
返回最小的一个参数,至少两个参数
ISNULL()
测试参数是否为空
COALESCE()
返回第一个非空参数
INTERVAL()
返回小于第一个参数的参数索引
STRCMP()
比较两个字符串
5.4.3 逻辑运算符
AND或&&
逻辑与
OR或||
逻辑或
NOT或!
逻辑非
XOR
逻辑异或
5.4.4 赋值运算符
=
5.4.5 位运算符
位运算符
&
按位与
|
按位或
^
按位异或
<<
按位左移
>>
按位右移
~
按位取反
位运算相关函数
BIT_COUNT(N)
返回在参数N中设置的比特位(二进制位为1)的数量
BIT_AND()
按位返回与的结果
BIT_OR()
按位返回或的结果
BIT_XOR()
按位返回异或的结果
5.4.6 运算符优先级
INTERVAL
BINARY、COLLATE
!
-(一元,负号)、~(一元,按位取反)
^
*、/、DIV、%、MOD
-(相减运算符)、+
<<、>>
&
|
=(比较运算符)、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN
BETWEEN,CASE、WHEN、THEN、ELSE
NOT
AND、&&
XOR
OR、||
=(赋值运算符)、:=