MySQL 基础 ————高频函数总结

一、MySQL函数调用方式

函数调用的基本语法:

SELECT 函数(实参列表)  [FROM 表]

其中,对于函数,需要重点关注三点:

1、函数的名称

2、参数列表

3、函数功能

二、函数的分类

在 MySQL中,函数分为两类:1、单行函数;2、分组函数

2.1 单行函数

单行函数有 concat、length、ifnull 等。单行函数下还有多种分类。

2.1.1 字符函数

字符函数的参数类型就是 varchar 。常用的字符函数有:

1、大小写控制函数:LOWER()、UPPER()。

SELECT LOWER('MORTY'),UPPER('morty') ;

2、字符控制函数:

CHAR_LENGTH(str) : 返回字符串的字符个数。

select char_length('中国') 字符数,CHAR_LENGTH('Morty') 字符数,CHARACTER_LENGTH('中国') 字符数,length('中国') 字节数;

tip:查看字符集的语句:SHOW VARIABLES LIKE '%char%';

CONCAT(str1, str2, ...) : 拼接多个字符串

SELECT CONCAT('中国', '-', '香港') 地市,CONCAT('Jack', '_', 'Morty') 姓名,CONCAT(UPPER('Hello'), ' ', LOWER('WORLD')) 问候 ;

SUBSTR(str, pos [, len]) : 截取字符串,下标从 1 开始,len代表需要截取字符数,不指定则截取到最后。

SELECT 
'中国人民共和国建国70周年' 原始,
SUBSTR('中国人民共和国建国70周年', 2) 截取后,
SUBSTR('中国人民共和国建国70周年',3, 5) 截取后;

# 姓名中首字符大写
SELECT emp_name 原始,CONCAT(UPPER(SUBSTR(emp_name, 1, 1)),LOWER(SUBSTR(emp_name, 2))) last_name 
FROMemp 

INSTR(str, substr) : 返回子串第一次出现的索引,如果找不到返回 0

SELECT INSTR('我和我的祖国', '祖国') 第一次出现, INSTR('我和我的祖国', '中国') 没有子串;

TRIM(str) : 去掉前后空格

SELECT TRIM('   我们  不一 样   ') 去前后空格;

LPAD(str, len, padstr) : 左补指定字符串,且总长度是 len 个字符。注意,padstr 可以是多个字符,但最终字符数必须是 len。RPAD(...) 右补同理。

SELECT 
LPAD('美景东方小区', 10, 'abc') 左补多个字符,
LPAD('美景东方小区', 10, '*') '左补*';

REPLACE(str, fromstr, tostr) : 替换子串

SELECT REPLACE('王建国,你好', '王', '李') 替换;

 

也可以修改字段内的个别文字,如:

UPDATE 表名 SET 列名 = REPLACE(列名, '原内容', '新内容') WHERE 条件;

 

2.1.2 数学函数

1、ROUND(x  [, d])   四舍五入(计算规则:先算绝对值,在加正负号),如果是两个参数,则第二个参数代表保留小数点后位数。

SELECT ROUND(1.65), ROUND(-1.45), ROUND(-1.5);

SELECT ROUND(1.65, 1), ROUND(-1.453, 2);

2、CEIL(x) 向上取整,返回 >= 该参数的最近整数,FLOOR(x) 向下取整,返回 <= 该参数的最近整数。

SELECT FLOOR(1.52), CEIL(1.00), CEIL(-1.02);

3、TRUNCATE(x, d) : 小数截取,保留小数后指定位数。

SELECT TRUNCATE(1.65, 1);

4、MOD(a, b) : 取余运算。不论正负,都可以套用公式:a - a/b * b,除法运算要取整。规律:结果值符号与被除数相同。mod()运算与 % 的效果是相同的。

SELECT MOD(10, 3), MOD(-10, 3), MOD(-10, -3), -10 % -3;

5、RAND() :取得 [0, 1) 之间的随机数,可以配合其他函数一起使用,另外,该函数可以接收一个种子值,这个种子值会对应一个不变的随机数,只要种值不变,生成的随机数就不会改变。另外,获取 [ a, b ] 之间的整数公式是:

FLOOR(a + RAND() * (b - a + 1))

SELECT RAND(1),RAND(1),RAND(),RAND(),FLOOR(RAND() * 100) 组合;

2.1.3 日期函数

1、获取当前系统时间,获取当前日期,获取当前时间,获取年份:

SELECT NOW(),CURDATE(),CURTIME(),YEAR('2019-10-20') 年,YEAR(NOW()) 年,YEAR(CURDATE()) 年,YEAR(CURTIME()) 年 ;

2、获取月份:MONTH()、MONTHNAME()、其他的日、时、分、秒 类似。

SELECT MONTH(NOW()),MONTH(CURTIME()),MONTHNAME('2019-10-20') ;

3、STR_TO_DATE(str, format) 将日期字符串按照指定格式解析为日期

SELECT * FROM emp WHERE hiredate = '2019-10-15';
SELECT * FROM emp WHERE hiredate = STR_TO_DATE('10-15 2019', '%m%d %Y');

 

4、DATE_FORMAT(date, format) 日期格式化

SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日') 日期格式化;

SELECT LEFT(DATE_FORMAT(CURRENT_TIMESTAMP(3),'%Y-%m-%d %H:%i:%s.%f'),23) 当前时间 ;

 

5、DATEDIFF(expr1, expr2) 相差天数

SELECT DATEDIFF(NOW(), '2019-10-18') 相差天数;

2.1.4 其他函数

1、VERSION()   版本号

2、DATABASE()  查看当前数据库

3、USER()  查看当前用户

4、PASSWORD(str)  给字符串加密,类似还有MD5(str) 等。

SELECT VERSION(),DATABASE(),USER(),PASSWORD('123'),MD5('123') ;

2.1.5 流程控制函数

1、IF(expr1, expr2, expr3)   三目运算符

SELECT IF(1 = 1, 'true', FALSE) 真,IF(1 = 2, 'true', FALSE) 假,IF(FALSE = 0, 'true', FALSE) 真;

2、IFNULL(a, b)  判空,若a 为 null ,则输出 b ,否则直接输出 a.

SELECT *,IFNULL(manager_id, 0) 去NULL 
FROM`emp` ;

3、CASE...WHEN  类似 switch 和 多重 if。

案例,查询高中老师的工资,由于学校偏理科,为积极引进文科老师,所有文科老师根据学科享有一定的工资加成:

SELECT t.`teacher_id`, t.`teacher_name`, l.`lesson_name`,t.salary 原始工资,IFNULL(CASE l.`lesson_name` WHEN '语文' THEN salary * 0.1 WHEN '外语' THEN salary * 0.2 WHEN '政治' THEN salary * 0.3 WHEN '历史' THEN salary * 0.5 WHEN '生物' THEN salary * 0.3 END, 0.0) 工资加成 
FROMteacher t, lesson l 
WHERE t.`lesson` = l.`lesson_id` ;

2.2 分组函数(聚合函数)

分组函数一般用作统计使用,又称组函数、聚合函数 或 统计函数。

2.2.1 高频分组函数

1、SUM()  求和函数

2、AVG()  求平均值

3、MIN()、MAX() 求最大最小值

4、COUNT(column) 求某列非 NULL 值的记录个数

SELECT SUM(salary),ROUND(AVG(salary), 2),MIN(salary),MAX(salary),COUNT(salary) 
FROMteacher ;

这些函数的特点:

1、SUM、AVG 用于处理数值型

2、MAX、MIN、COUNT 可以用于处理任何类型

3、所有的分组函数都忽略 NULL 值。

2.2.2 与 DISTINCT 的搭配用法

所有的分组函数都可以与DISTINCT关键字进行搭配使用。

SELECT SUM(salary) 原求和,SUM(DISTINCT salary) 去重求和,COUNT(salary) 原工资数量,COUNT(DISTINCT salary) 去重工资种类 
FROMteacher ;

2.2.3 COUNT 函数详解

COUNT() 函数除了可以统计指定字段非null 的行数,除了可以统计指定字段非null 的行数:

SELECT COUNT(*) 学生总数 FROM student;

另外,在 COUNT()参数中加一个常量值相当于在表中加了一列,然后统计这个列的记录数。比如:SELECT COUNT(1) FROM 表名;  或者SELECT COUNT(2)、SELECT COUNT('xxx')等,都是同样的意思。

但是,效率上,需要分具体的数据库引擎来看:

MYISAM 存储引擎下,COUNT(*)效率最高,因为其内部有一个计数器,会直接返回行号。

INNODB引擎下,COUNT(*) 和 COUNT(1) 效率差不多,但是比 COUNT(字段) 效率高,因为查询字段的 COUNT(column) 函数需要判断是否为null。 

因此,一般情况下,如果要进行全记录数量统计,直接使用 COUNT(*)  是最好的选择。

2.2.4 和分组函数一同查询的字段

由于分组函数查询结果都是一个值,因此不能和某些可以查询出多行的字段一同查询,比如:

SELECT AVG(salary), id FROM emp;   # 这条语句虽然不会报错,但是其结果不具备太大意义

这种SQL语句虽然不会报错,但是已经不具有什么意义了。因此,与分组函数可以一同查询的字段一般是 GROUP BY 后的字段。

综上,就是关于MySQL中高频函数的总结和测试,后期如果遇到更多的函数,也会在这里追加总结的。欢迎文末留言。

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

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

相关文章

MySQL 高级 —— 复合索引简介(多列索引)

引言 复合索引是指包含多个数据列的索引&#xff0c;与之概念相对的是单列索引&#xff0c;仅包含一个数据列。在大多数情况下&#xff0c;建立多列索引的好处都要多于单列索引。另外&#xff0c;复合索引最多支持16个列&#xff0c;但请一定不要让复合索引包含太多的列&#…

MySQL 优化 —— SQL优化概述(优化专题开篇词)

引言 最近为了研究索引的知识&#xff0c;特地去MySQL 官网研读了一番&#xff0c;发现MySQL官网有比较全面的MySQL优化方案和知识背景&#xff0c;所以希望通过一系列文章&#xff0c;将官网的知识翻译总结一下&#xff0c;避免日后去网上胡乱搜索产生不必要的知识勘误风险。…

MySQL 优化 —— WHERE 子句优化

引言 本文翻译自 MySQL 官网&#xff1a;WHERE Clause Optimization WHERE 子句优化 这一部分我们来讨论对 WHERE 子句的优化处理。本部分的案例都是以 SELECT 语句为例&#xff0c;但这些优化同样适用于 DELETE 和 UPDATE 语句中的 WHERE 子句。 注意 因为对 MySQL 优化器的…

MySQL 优化 —— IS NULL 优化

引言 本博客翻译自 MySQL 官网&#xff1a;IS NULL Optimization&#xff0c; MySQL版本 5.7。 MySQL 对 IS NULL 的优化 MySQL 可以对 IS NULL 执行和常量等值判断&#xff08;列名 常量表达式&#xff0c;如name Tom&#xff09;相同的优化。MySQL 可以利用索引和范围来…

MySQL 优化 —— ORDER BY 优化

引言 本文翻译自MySQL 官网&#xff1a;ORDER BY Optimization&#xff0c;MySQL 版本&#xff1a;5.7。 这一部分描述了MySQL何时会使用索引来满足order by子句&#xff0c;filesort 操作会在索引不能生效的时候被用到&#xff0c;以及优化器对order by的执行计划信息。 or…

MySQL 高级 —— 索引实现的思考

引言 最近看了一个公开课&#xff0c;是有关MySQL对索引设计的思考。详细讲解了几种索引实现的设计思考与利弊辨析&#xff0c;讨论了为什么MySQL默认情况下会使用B树索引&#xff0c;B树索引又对B树做了哪些结构改进。 本片博客通过个人的学习理解和总结&#xff0c;由几种简…

MySQL 优化 —— MySQL 如何使用索引

引言 本文翻译自MySQL 官网 &#xff1a;How MySQL Uses Indexes &#xff0c;MySQL 版本 5.7 。 提升 SELECT 操作性能最好的方式就是在查询的一列或多列上建立索引。索引的行为类似指向表数据的指针&#xff0c;可以让查询能够快速判断哪个记录满足 WHERE 子句中的条件&…

MySQL 优化 —— EXPLAIN 执行计划详解

引言 本博客大部分内容翻译自MySQL 官网 Understanding the Query Execution Plan 专题。另外有一些补充&#xff0c;则来自于网课以及《高性能MySQL&#xff08;第三版&#xff09;》。 根据我们的表、字段、索引、以及 where 子句中的条件等信息&#xff0c;MySQL 优化器会…

Git 初学札记(十)—— Reset 回退的三种状态解析

引言 工作中经常会涉及到需要本地代码覆盖更新的操作。有时候可能是从远端git 上直接覆盖更新&#xff0c;或者是其他本地分支覆盖更新当前分支等等。这个时候就需要用到 reset 操作。 reset 操作分为三种类型&#xff1a;Soft、Mixed、Hard。今天我们就来说说这三种类型究竟…

MySQL 高级 —— 深入理解 InnoDB 与 MyISAM

引言 在文件系统中&#xff0c;MySQL将每个数据库&#xff08;也可以称之为schema&#xff09;保存为数据目录下的一个子目录。创建表时&#xff0c;MySQL会在数据库子目录下创建一个与表同名的.frm文件保存表的定义。因为MySQL使用文件系统的目录和文件来保存数据库和表的定义…

Ts声明ElementUI控件

初用Ts&#xff0c;有时候想获取三方控件不太会声明类型&#xff0c;记录一下使用InstanceType导入类型 例如声明一个el-select <el-form-item label"类型:" prop"year" :loading"state.loading"><el-select v-model"props.ruleF…

关于 OutOfMemoryError 的总结与解决方法

引言 本文总结自周志明的《深入理解Java虚拟机》第二章部分内容。 这部分内容&#xff0c;可以为后续性能调优方面的工作起到铺垫作用。 一、什么是 OutOfMemoryError OurOfMemory 简称“OOM”&#xff0c; 直译为“内存耗尽”或“内存溢出”&#xff0c;当然&#xff0c;并…

Windows误关闭资源管理器重启的办法

引言 有时候Windows系统在开机后&#xff0c;在桌面底部的任务栏中无法正常加载必要的网络连接图标或音量图标等&#xff0c;导致无法手动操作音量或连接网络。这时候就会需要打开“任务管理器”重新启动“资源管理器”使其重新加载这些必要的控制图标。 但是由于操作失误&am…

MySQL高级 —— 高性能索引

引言 最近一直在抱着《高性能MySQL&#xff08;第三版&#xff09;》研究MySQL相关热点问题&#xff0c;诸如索引、查询优化等&#xff0c;这阶段的学习是前一段时间MySQL基础与官方的“阅读理解”的进一步延伸。 书中第五章详细阐述了如何设计高性能的索引&#xff0c;以及索…

MySQL高级 —— 查询性能优化

引言 承接《MySQL高级 —— 高性能索引》&#xff0c;本篇博客将围绕《高性能MySQL&#xff08;第三版&#xff09;》第六章内容进行总结和概括。 与索引的部分一样&#xff0c;SQL优化也是广大程序员深入MySQL的又一条必经之路。希望通过本篇博客的总结&#xff0c;能够为我…

哈希表的大小为何最好是素数

引言 为什么散列函数采用取模运算&#xff1f;又为什么取模运算的被取模数最好是素数&#xff1f;素数是如何在取模运算中很好的规避冲突的&#xff1f; 这些问题可能困扰诸多程序员很久了。我们总是说素数可以更好的避免冲突&#xff0c;但总是对各种长篇大论的分析望而却步…

Java常用设计模式————适配器模式

引言 由于无法直接使用某个类中的方法而采取的一种中间类转换的策略。将一个类的接口转换成另一个接口&#xff0c;让原本接口不兼容的类可以兼容。 适配器模式可以分为三种&#xff1a;类适配器、对象适配器、接口适配器。它们之间的区别主要体现在适配器角色与被适配角色之…

Java常用设计模式————桥接模式

引言 在实际的业务中&#xff0c;经常会遇到多维度的概念组合&#xff0c;公园的门票&#xff0c;颐和园有年票、月票、日票&#xff0c;故宫也有年票、月票、日票。那么不同的公园和票种类型就可以视为两种不同的纬度&#xff0c;它们之间会形成相互组合的关系。 在类的设计…

Java常用设计模式————装饰者模式

引言 装饰者模式&#xff0c;又叫装饰器模式。它可以动态的将新功能附加到对象上。在对象功能扩展方面&#xff0c;它比继承更灵活&#xff0c;同时装饰者模式也体现了OCP原则。 在客户端调用使用了装饰者模式的对象时&#xff0c;就好像在使用构造器层层包裹核心对象&#x…

Java常用设计模式————组合模式

引言 组合模式&#xff0c;是一种类似递归算法的结构性设计模式&#xff0c;通过以简单的 List &#xff0c;组合本类对象&#xff0c;实现树状对象结构的“部分、整体”的层次。 它可以让调用程序不需要关心复杂对象与简单对象的区别&#xff0c;而统一地实现处理逻辑。 对…