数据操作

复制表结构和数据

复制已有表结构

CREATE  [TEMPORARY] TABLE [IF NOT EXISTS] 表名
{LIKE 旧表名 | (LIKE 旧表名) }

复制已有表数据

INSERT [INTO]  数据表1 [(字段列表)] SELETC [(字段列表)] FROM 数据表名2;

注意:若数据表中含有主键,而主键具有唯一性,所以在数据复制时还要考虑主键冲突的问题

拓展

临时表的创建:

CREATE TEMPORARY TABLE 数据库.表名 (表单)

解决主键冲突

在数据表插入数据的时候,若表中的主键含有实际的业务意义

主键冲突更新

主键冲突更新操作是指,当插入数据的过程若发生主键冲突,则插入数据操作利用更新的方式实现。

INSERT [INTO] 数据表名 [(字段列表)]{VALUES|VALUE}(值列表)
ON DUPLICATE KEY UPDATE 字段名 1 = 新值1[,字段名2 = 新值2]…;
主键冲突替代

主键冲突替代指的是,当插入数据的过程中若发生主键冲突,则删除此条记录,并重新插入。

REPLACE [INTO] 数据表名 [(字段列表)]
{VALUES | VALUE }(值列表)[,(值列表)]…;

REPLACE语句与INSERT语句的使用类似,区别在于前者每执行一次就会发生两个操作(删除记录和插入记录)。

清空数据

除了DELETE语句可以删除数据外,还可以利用TRUNCATE清空数据表中的全部数据。

TRUNCATE [TABLE] 表名

需要注意的是,当删除的数据量很小的时候,DELETE的执行效率要比TRUNCATE高;只有删除的数据量很大的时候,才能看出TRUNCATE的执行效率比DELETE高。

去除重复记录

实际应用中,对于数据的分析需求,有时需要去除查询记录中重复的数据。

SELETE selete 选项 字段列表 FROM 数据表

在上述语法中,“selete选项”默认值为All,表示保存所有查询到的记录;当设置为DISINCT时,表示去除重复记录,只保留一条。需要注意的是,当查询记录的字段有多个时,必须所有字段的值完全相同才被认为是重复记录。

排量与限量

排序

单字段排序

单字段排序指的是查询时仅按照一个指定字段进行升序或降序排序。

SELECT * |{字段列表} FROM 数据表名
ORDER BY 字段名 [ASC|DESC];

ASC表示升序,DESC表示降序。而ORDER BY默认值是ASC

多字段排序

在开发中需要根据多个条件对查询的数据进行排序时,可以采用多字段排序。

SELETE *|{字段列表} FROM 数据表名
ORDER BY 字段名1 [ASC|DESC][,字段名2[ASC|DESC]]…;

多字段排序首先按照字段1进行排序,当字段1相同时,再按照字段名2进行排序,以此类推。

限量

对于一次性查询出的大量数据,不仅不便于阅读查看,还会浪费系统效率。LIMIT可以限定记录的数量,也可以指定查询从那一条记录开始。

SELECT [selete选项] 字段列表 FROM 数据表名
[WHERE 条件表达式][ORDER BY 字段 ASC|DESC]
LIMIT [OFFSET,] 记录数;
排序后限量更新或删除数据
#数据更新的排序与更新
UPDATE 数据表名 SET 字段=新值,…[WHERE 条件表达式]
ORDER BY 字段 ASC|DESC LIMIT 记录数;
#数据删除的排序与限量
DELETE FROM 数据表名 [WHERE 条件表达式]
ORDER BY 字段 ASC|DESC LIMIT 记录数

UPDATE和DELETE操作中添加ORDER BY 表示根据指定的字段,按顺序更新或删除符合条件的记录。如果UPDATE和DELETE操作没有添加WHERE条件,则可以使用LIMIT来限制更新和删除的数量。

分组与聚合函数

分组

在MySQL中,可以使用GROUP BY 根据一个或多个字段进行分组,字段值相同的为一组。另外对于分组的数据可以使用HAVING进行条件筛选。

分组统计

在查询数据时,在WHERE条件后添加GROUP BY即可根据指定的字段进行分组。

SELETE [selete选项]字段列表 FROM 数据表名
[WHERE 条件表达式] GROUP BY 字段名;

分组排序

SELETE [selete选项] 字段列表 FROM 数据表名
[WHERE 条件表达式]
GROUP BY 字段名[ASC|DESC]

GROUP BY 分组排序的实现不需要使用ORDER BY,直接在分组字段后添加ASC(升序,默认可以省略)或DESC(降序)即可。

多分组统计

按照每个字段进行分组后,对已经分组的数据进行再次分组的操作,以实现多分组统计。

SELETE [selete选项]字段列表 FROM 数据表名
[WHERE 条件表达式]
GROUP BY 字段名1 [ASC|DESC],[,字段名2[ASC|DESC]]…;

回溯统计

回溯统计可以简单地理解为再根据指定字段分组后,系统又自动对分组的字段向上进行了一次新的统计并产生一个新的统计数据,且该数据对应的分组字段值为NULL。

SELETE [selete选项] 字段列表 FROM 数据表名
[WHERE 条件表达式]
GROUP BY 字段名1 [ASC|DESC],[,字段名2[ASC|DESC]]…WITH ROLLUP;

统计筛选

当对查询的数据进行分组操作时,可以利用HAVING 根据条件进行数据筛选,他与前面学习过的WHERE功能相同,但是在实际运用时两者有一定的区别。

SELETE [selete选项] 字段列表 FROM 数据表名
[WHERE 条件表达式]
GROUP BY 字段名 [ASC|DESC],…[WITH ROLLUP]
HAVING 条件表达式;

聚合函数

函数名

描述

COUNT()

返回参数字段的数量,不统计为NULL记录

SUM()

返回参数字段值和

AVG()

返回参数字段的平均值

MAX()

返回参数字段的最大值

MIN()

返回参数字段的最小值

GROUP_CONCAT()

返回符合条件的参数字段值的连接字符串

JSON_ARRAYAGG()

将符合条件的参数字段值作为单个JSON数组返回

JSON_OBJECTAGG()

将符合条件的参数字段作为单个JSON对象返回

运算符

常用数学函数

运算符

描述

CEIL(x)

返回大于等于x的最小整数

FLOOR(x)

返回小于等于x的最大整数

FORMAT(x)

返回小数点后保留y位的x(进行四舍五入)

ROUND(x[,y])

计算离x最近的整数;若设置参数y,与FORMAT(x,y)功能相同

TRUNCATE(x,y)

返回小数点后保留y位的x(舍弃多余小数位,不进行四舍五入)

ABS(x)

获取x的绝对值

MOD(x,y)

求模运算,与x%y功能相同

PI()

计算圆周率

SQRT(x)

求x的平方根

POW(x)

幂运算函数,计算x的y次方,与POW(x,y)功能相同

RAND()

默认返回0到1之间的随机数,包括0和1

比较函数

函数

描述

IN()

比较一个值是否在一组给定的集合内

NOT IN()

比较一个值是否不再一组给定的集合内

GREATEST()

返回最大的一个参数值,至少两个参数

LEAST()

返回最小的一个参数值,至少两个参数

ISNULL()

测试参数是否为空

COALESCE()

返回第一个非空参数

INTERVAL()

返回小于第一个参数的参数索引

STRCMP()

比较两个字符串