MySQL函数、AVG | MIN | MAX | COUNT | SUM、慢查询

2023-12-29 23:52

本文主要是介绍MySQL函数、AVG | MIN | MAX | COUNT | SUM、慢查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MySQL函数、慢查询

    • 1、函数
      • 1.日期函数
      • 2.两个日期的时间差
      • 3.查询距离时间的间隔时间
      • 4.常用的字符串函数
      • 5.常用的数学函数
      • 6.常用的聚合函数
    • 2、慢查询
      • 1.什么是慢查询?

从需求出发,在数据的操作过程中经常会有以下的问题;求和、最大值、最小值、四舍五入、日期、平均值等,而函数的出现正是为了解决这些问题。

1、函数

函数的分类:

  1. 数学函数:用作常规的数学运算
  2. 字符串函数:对于字符串类型的字段处理
  3. 日期时间函数:对于日期和时间类型的字段进行处理
  4. 聚合函数:常用于GROUP BY从句的SELECT查询中
  5. 自定义函数:根据实际需求自定义函数

1.日期函数

函数名返回值函数名返回值
CURDATE()返回当前的日期HOUR(time)返回time的小时值(0~23)
CURTIME()返回当前的时间MINUTE(time)返回time的分钟值(0~59)
NOW()返回当前的日期和时间SECOND(time)返回time的秒(0~59)
DAYOFWEEK(date)返回date所代表的一星期中的第几天(1~7)DATE_FORMAT(date,fmt)依照指定的fmt格式格式化日期date值
DAYOFMONTH(date)返回date是一个月的第几天(1~31)WEEK(date)返回日期date为一年中第几周(0~53)
DAYOFYEAR(date)返回date是一年的第几天(1~366)DAY(date)返回date的日
MONTH(date)返回date的月份值(1~12)YEAR(date)返回日期date的年份(1000~9999)
eg:
# 函数
-- 日期函数
select curdate()
select curtime()
select now()
select month(now())
select day(now())
select year(now())
select date_format(now(),'%a-%b-%c')

2.两个日期的时间差

DATEDIFF(expr1,expr2)只能算天的差select datediff(now(), '2020-9-1 15:30:30');select datediff('2020-9-1 15:30:30',now());
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)年月日时分秒的差
-- year
--month
-- DAYselect TIMESTAMPDIFF(DAY,now(),'2020-9-1 15:30:30')select TIMESTAMPDIFF(DAY,'2020-9-1 15:30:30',now())
-- HOURselect TIMESTAMPDIFF(HOUR,now(),'2020-9-1 15:30:30')select TIMESTAMPDIFF(HOUR,'2020-9-1 15:30:30',now())
-- MINUTEselect TIMESTAMPDIFF(MINUTE,now(),'2020-9-1 15:30:30')select TIMESTAMPDIFF(MINUTE,'2020-9-1 15:30:30',now())
-- SECONDselect TIMESTAMPDIFF(SECOND,now(),'2020-9-1 15:30:30')select TIMESTAMPDIFF(SECOND,'2020-9-1 15:30:30',now())

3.查询距离时间的间隔时间

-- 根据时间间隔计算时间
A.T_DATE = B.T_DATE+ interval 1 -- hour——即 A表时间 = B表时间 + 1小时,也可以为分钟、秒。
# 或者
DATE_ADD(date,INTERVAL expr unit)
DATE_SUB(date,INTERVAL expr unit)
时间间隔字面量说明
INTERVAL 1 YEAR时间间隔为1年
INTERVAL 2 Month时间间隔为2月
INTERVAL 3 DAY时间间隔为3天
INTERVAL 4 HOUR时间间隔为4小时
INTERVAL 25 MINUTE时间间隔为25分钟
INTERVAL 45 SECOND时间间隔为45秒
select NOW(), NOW() + INTERVAL 1 year 
select DATE_ADD(NOW(),INTERVAL 1 year)

4.常用的字符串函数

函数名返回值函数名返回值
ASCII(char)返回字符的ASCII码值LTRIM(str)从字符串str中切掉开头的空格
BIT_LENGTH(str)返回字符串的比特长度TRIM(str)去除字符串首部和尾部的所有空格
CONCAT(s1,s2…,sn)将s1,s2…,sn连接成字符串QUOTE(str)用反斜杠转义str中的单引号
CONCAT_WS(sep,s1,s2…,sn)将s1,s2…,sn连接成字符串,并用sep字符间隔POSITION(substr in str)返回子串substr在字符串str中第一次出现的位置,从1开始
LOWER(str)返回将字符串str中所有字符改变为小写后的结果UPPER(str)返回将字符串str中所有字符转变为大写后的结果
LEFT(str,x)返回字符串str中最左边的x个字符STRCMP(s1,s2)比较字符串s1和s2
LENGTH(s)返回字符串str中的字符数REVERSE(str)返回颠倒字符串str的结果
-- 字符函数
select concat('hello','你好','!')
select concat_ws(',','hello','你好','!')

5.常用的数学函数

函数名返回值函数名返回值
ABS(x)返回x的绝对值LOG(x,y)返回x的以y为底的对数
BIN(x)返回x的二进制MOD(x,y)返回x/y的模(余数)
CEILING(x)返回大于x的最小整数值PI()返回pi的值(圆周率)
EXP(x)返回值e(自然对数的底)的x次方SIGN(x)返回代表数字x的符号的值
FLOOR(x)返回小于x的最大整数值ROUND(x,y)返回参数x的四舍五入的有y位小数的值
GREATEST(x1,x2,…,xn)返回集合中最大的值RAND()返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成
LEAST(x1,x2,…,xn)返回集合中最小的值SQRT(x)返回一个数的平方根
LN(x)返回x的自然对数TRUNCATE(x,y)返回数字x截短为y位小数的结果
-- 数学函数
-- 向上取整
select ceiling(3.111)
-- 向下取整
select floor(3.111)
-- 四舍五入,保留一位小数
select round(3.988,1)
-- 截断 结果3.99
select truncate(3.998,2)

6.常用的聚合函数

函数名返回值
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col)返回由属于一组的列值连接组合而成的结果

2、慢查询

1.什么是慢查询?

MySQL默认10秒内没有响应SQL结果,则为慢查询;这个时间是可以修改的。

MySQL的慢查询的操作

-- 显示到mysql数据库的连接数
show status like 'connections';
-- 查看慢查询的状态
Show variables like '%slow_query%';
-- 设置慢查询的到表 mysql.slow_log
set global log_output='TABLE';
-- 设置慢查询的时间
set global long_query_time=3;
-- 开启慢查询
set global slow_query_log='ON';
-- 慢查询的次数
show status like 'slow_queries';
-- 慢查询记录
select * From mysql.slow_log ;
-- 慢查询sql语句
select convert(sql_text using utf8) sql_text from mysql.slow_log
-- 关闭慢查询
set global slow_query_log='OFF';

show index FROM student执行该语句;结果中的cardinality是覆盖项;cardinality/count(*) 越接近1 越好 越接近0 越差;或是distinct(ename) / count(*);两者的结果相近。index_type是索引类型:使用的是Btree / B+tree

在这里插入图片描述

当我们在查询前能可以先估计查询究竟要涉及多少行、使用哪些索引、运行时间,mysql提供了相应的功能和语法来实现该功能。在SQL语句前加一个"EXPLAIN"即可。 比如我们要分析如下SQL语句:

explain select * from table where table.id = 1

类似于下面的表:

在这里插入图片描述

EXPLAIN列的解释:

table

显示这一行的数据是关于哪张表的

type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、 indexhe和ALL

说明:不同连接类型的解释(按照效率高低的顺序排序)

system:表只有一行:system表。这是const连接类型的特殊情况。

const :表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待。

eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用。

ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好。

range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况。

index:这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)。

ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。

possible_keys

显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key

实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len

使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref

显示索引的哪一列被使用了,如果可能的话,是一个常数

rows

MYSQL认为必须检查的用来返回请求数据的行数

Extra

关于MYSQL如何解析查询的额外信息。是Using temporary和Using filesort,意思MYSQL根本不能使用索

引,结果是检索会很慢

说明:extra列返回的描述的意义

Distinct :一旦mysql找到了与行相联合匹配的行,就不再搜索了。

Not exists :mysql优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了。

Range checked for each Record(index map:#) :没有找到理想的索引,因此对从前面表中来的每一个行组合,mysql检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一。

Using filesort :看到这个的时候,查询就需要优化了。mysql需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行。

Using index :列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。

Using temporary :看到这个的时候,查询需要优化了。这里,mysql需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上。

Where used :使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题。

这篇关于MySQL函数、AVG | MIN | MAX | COUNT | SUM、慢查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/551083

相关文章

房产证 不动产查询

陕西政务服务网(便民服务)陕西政务服务网(手机版?更直观)不动产权证书|不动产登记证明(电子证照)商品房合同备案查询权利人查询

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

mysql索引三(全文索引)

前面分别介绍了mysql索引一(普通索引)、mysql索引二(唯一索引)。 本文学习mysql全文索引。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。 在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(article),其中有主键ID(

mysql索引二(唯一索引)

前文中介绍了MySQL中普通索引用法,和没有索引的区别。mysql索引一(普通索引) 下面学习一下唯一索引。 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。 添加数据库唯一索引的几种

mysql索引一(普通索引)

mysql的索引分为两大类,聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同。聚簇索引能够提高多行检索的速度、非聚簇索引则对单行检索的速度很快。         在这两大类的索引类型下,还可以降索引分为4个小类型:         1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。         2,唯一索引:与普通索引

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE