1. 字符串函数

MySQL 的常用函数包括字符串函数、数值函数、日期时间函数、流程函数等。

SELECT ascii("abc"),char(97),concat("hello", "world"),lower("HELLO,WORLD"),char_length("hello"),octet_length("hello"),substring("hello", 1, 3),instr("hello", "el"),replace("hello", 'l', 'b'),trim("o" from "hello"),trim("   hello    "),upper("hello");

结果:

各数据库支持常见的字符串函数

函数 描述 Oracle MySQL SQL Server PostgreSQL
ASCII(str) 返回第一个字符的 ASCII 编码 支持 支持 支持 支持
CHR(n) / CHAR(n) 返回 ASCII 编码 n 对应的字符 CHR(n) CHAR(n) CHAR(n) CHR(n)
CONCAT(str1, str2, …) 拼接字符串 支持 支持 支持 支持
LOWER(str) 返回字符串的小写形式 支持 支持 支持 支持
CHAR_LENGTH(str) 返回字符数量 LENGTH(str) 支持 LEN(str) 支持
OCTET_LENGTH(str) 返回字节数量 LENGTHB(str) 支持 DATALENGTH(str) 支持
SUBSTRING(str, n, m) 返回字符串从位置 n 开始的 m 个字符 SUBSTR(str, n, m) 支持 支持 支持
INSTR(str, sub) 返回 str 中首次出现 sub 的位置 支持 支持 PATINDEX( ‘%pattern%’, str) POSITION(sub IN str)
REPLACE(str, old, new) 将字符串中的 old 子串替换为 new 子串 支持 支持 支持 支持
TRIM(sub FROM str) 删除字符串开头和结尾的 sub 字串 支持 支持 支持 支持
UPPER(str) 返回字符串额大写形式 支持 支持 支持 支持

2. 数值函数

SELECT abs(-2),ceil(3.4),floor(3.4),mod(10, 2),rand(),round(3.6, 4),truncate(3.1415926, 4);

输出结果:

以下是 SQL 中常见的数值函数及不同数据库中的实现:
来源: https://gitbook.cn/gitchat/column/5dae96ec669f843a1a4aed95/topic/5db7cdcef6a6211cb96197b6

函数 描述 Oracle MySQL SQL Server PostgreSQL
ABS(x) 计算 x 的绝对值 支持 支持 支持 支持
CEIL(x) / CEILING(x) 计算大于等于 x 的最小整数 支持 CEIL(x) 支持 支持 CEILING(x) 支持
EXP(x) 计算 e 的 x 次幂,e 约等于 2.71828 支持 支持 支持 支持
FLOOR(x) 计算小于等于 x 的最大整数 支持 支持 支持 支持
LN(x) 计算 x 的自然对数,底数为 e 支持 支持 LOG(x) 支持
LOG(y, x) 计算以 y 为底的 x 的对数 支持 支持 LOG(x, y) 支持
MOD(x, y) 计算 x 除以 y 的余数,即求模运算 支持 支持 x % y 支持
POWER(x, y) 计算 x 的 y 次幂 支持 支持 支持 支持
ROUND(x, y) 将 x 四舍五入到 y 位小数 支持 支持 支持 支持
SQRT(x) 计算 x 的平方根 支持 支持 支持 支持
GREAST(x, y, …) 计算参数列表中的最大值 支持 支持 不支持 支持
LEAST(x, y, …) 计算参数列表中的最小值 支持 支持 不支持 支持
RANDOM( ) 返回一个大于等于 0 小于 1 的随机数 DBMS_RANDOM.VALUE RAND() RAND() 支持

3. 日期时间函数

在数据库中,日期时间类型存在 3 种形式:

  • DATE,日期类型,包含年、月、日。可以用于存储出生日期、入职日期等。
  • TIME,时间类型,包含时、分、秒,以及小数秒。一般使用较少。
  • TIMESTAMP,时间戳类型,包含年、月、日、时、分、秒,以及小数秒。用于对时间精度要求比较高的场景,比如存储订单时间。

TIMESTAMPTIME 还可以添加 WITH TIME ZONE 选项,用于指定一个时区偏移量。例如,UTC 标准时间的 0 点等于北京时间的早上 8 点。时区选项通常用于支持全球化的应用系统中。

以下是 4 种数据库对于日期时间类型的支持情况。

数据类型 Oracle MySQL SQL Server PostgreSQL
DATE 包含额外的时、分、秒 支持 支持 支持
TIME 不支持 支持,不支持时区 支持,不支持时区 支持,支持时区
TIMESTAMP 支持,包含时区 支持,使用 UTC 时区 DATETIME2、DATETIMEOFFSET 支持,支持时区

其中,OracleDATE类型包含了日期和时间两部分,但不支持 TIME类型。MySQL 还提供了 DATETIME 日期时间类型。

下表列出了 SQL 中常见的日期时间函数:

函数 描述 Oracle MySQL SQL Server PostgreSQL
CURRENT_DATE 获取系统当前日期 支持 支持 CAST(GETDATE() AS DATE) 支持
CURRENT_TIME 获取系统当前时间 支持 支持 CAST(GETDATE() AS TIME) 支持
CURRENT_TIMESTAMP 获取系统当前日期 支持 支持 支持 支持
EXTRACT(part FROM dt) 返回日期时间中的年、月、日等 支持 支持 DATEPART(part, dt) 支持
dt1 - dt2 计算两个日期之间的天数 支持 DATEDIFF(dt2, dt1) DATEDIFF(DAY, dt1, dt2) 支持
dt + INTERVAL 日期加上一段时间间隔 支持 支持 DATEADD(part, n, dt) 支持

SELECT curdate(),curtime(),now(),unix_timestamp(curdate()),from_unixtime(curdate()),week("2020-02-28"),year("2020-02-28"),hour("20:40:20"),minute("20:40:20"),monthname("2020-02-28"),date_format("2020-02-28", "%Y_%m_%d"),datediff("2020-02-28", "2020-02-01");

输出结果:

除此之外,各种数据库还提供了一些扩展的函数:

  • Oracle 支持 SYSDATESYSTIMESTAMP 获取当前日期和时间戳;
  • MySQL支持 CURDATE()CURRENTDATE() 获取当前日期,CURTIME()CURRENTTIME() 获取当前时间,NOW()CURRENT_TIMESTAMP() 获取当前时间戳;
  • SQL Server 支持 SYSDATETIME()SYSDATETIMEOFFSET() 获取系统当前时间戳;
  • PostgreSQL 支持 NOW() 获取系统当前时间戳。

EXTRACT(part FROM dt) 函数可以返回日期时间中的某个部分,例如年、月、小时等。以下示例查找 2018 年入职的员工:

-- Oracle、MySQL 以及 PostgreSQL 实现
SELECT emp_name, hire_dateFROM employeeWHERE EXTRACT(YEAR FROM hire_date) = 2018;

4. 常用函数

5. 流程函数


SQL 中的 CASE 表达式可以根据不同条件产生不同的结果,实现类似于编程语言中的 IF-THEN-ELSE 逻辑功能。

5.1 简单 CASE 表达式

简单 CASE 表达式的语法如下:

CASE expressionWHEN value1 THEN result1WHEN value2 THEN result2...[ELSE default_result]
END

首先计算 expression 的值;然后依次与 WHEN 列表中的值(value1,value2,…)进行比较,找到第一个相等的值并返回对应的结果(result1,result2,…);如果没有找到相等的值,返回 ELSE 中的默认结果;如果此时没有指定 ELSE,返回 NULL 值。

使用示例:

SELECT name, case idwhen 1 then "第一"when 2 then "第二"when 3 then "第三"else "其它的"end as order_zone
FROM zone

结果显示:

5.2 搜索 CASE 表达式

搜索 CASE 表达式的语法如下:

CASEWHEN condition1 THEN result1WHEN condition2 THEN result2...[ELSE default_result]
END

按照顺序依次计算每个分支中的条件(condition1,condition2,…),找到第一个结果为真的分支并返回相应的结果(result1,result2,…);如果没有任何条件为真,返回 ELSE 中的默认结果;如果此时没有指定 ELSE,返回 NULL 值。

所有的简单 CASE 表达式都可以替换为等价的搜索 CASE 表达式。

SELECT name, case when id=1 then "第一"when id=2 then "第二"when id=3 then "第三"else "其它的"end as order_zone
FROM zone

6. 聚集函数

聚集函数包括 AVG()COUNT()MAX()MIN()SUM()


聚集函数 COUNTSUMAVGMAXMIN 只有 COUNT 可以将 * 号作为参数,其它聚合函数都不行。

MAXMIN 函数适用于几乎所有的数据类型的列;而 SUM / AVG 仅适用于数值类型的列

6.1 COUNT 统计数量

COUNT(*) 函数用于统计行数。

SELECT COUNT(*) FROM product;

COUNT 函数也可以统计某个字段或者表达式的数量。

SELECT COUNT(product_type) FROM product;

使用聚合函数时需要注意两点:

  • 在聚合函数的参数中加上 DISTINCT 关键字,可以在计算之前排除重复值;
  • 聚合函数在计算时,忽略输入值为 NULL 的数据行;COUNT(*) 除外。

使用聚合函数删除重复的值

SELECT COUNT(DISTINCT product_type) FROM product;

6.2 AVG 函数计算平均值

SELECT AVG(price) FROM product;

其它 SUM()/MAX()/MIN()/ 用法和 AVG() 用法类似。

7. 分组数据

分组数据主要是对过滤的数据进行分类。SQL 中的 GROUP BY 子句可以将数据按照某种规则进行分组。

  1. GROUP BY子句中指定的列称为聚合键或者分组列, SELECT 子句中不能出现聚合键之外的列名,
SELECT product_type, COUNT(*) FROM product
GROUP BY product_type;
  1. 对于 GROUP BY,如果分组字段中存在多个 NULL 值,它们将被分为一个组。
SELECT purchase_price, COUNT(*) FROM product
GROUP BY purchase_price;
  1. 带有 WHERE 子句的 GROUP BY 语句
SELECT purchase_price, COUNT(*) FROM product WHERE product_type = "办公用品" GROUP BY purchase_price;

为聚合结果指定条件:

  • WHERE 子句 = 指定行 所对应的条件
  • HAVING 子句 = 指定组 所对应的条件

从性能的角度来说,应该尽量使用 WHERE 条件过滤掉更多的数据,而不是等到分组之后再使用 HAVING 进行过滤;但如果业务需求只能基于汇总之后的结果进行过滤,那就另当别论了。

SQL 语句中可以使用 WHERE 子句对表进行过滤,同时使用 HAVING 对分组结果进行过滤

SELECT purchase_price, COUNT(*)
FROM product
WHERE product_type = "办公用品"
GROUP BY purchase_price
HAVING COUNT(*) = 2;
  1. 对查询结果进行排序,默认按照升序排列 ASC
SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY sale_price;

指定降序排列

SELECT product_id, product_name, sale_price, regist_date
FROM product
ORDER BY sale_price DESC;

如果想要对多个列进行按序排列,则需要对多个列指定关键字

SELECT product_id, product_name, sale_price, regist_date
FROM product
ORDER BY sale_price DESC, regist_date ASC;

指定多个排序键,优先使用左侧的键,如果该列存在相同值的话,再按照右侧的键

SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY sale_price, product_id;

排序键包含 NULL 时,会在开头或者末尾进行汇总

SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY purchase_price;

ORDER BY 子句中可以使用 SELECT 子句中未使用的列和聚合函数

SELECT  product_name, sale_price, purchase_price
FROM product
ORDER BY product_id;SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type
ORDER BY COUNT(*);

9. 类型转换函数

CAST(expr AS type) 函数用于将数据转换为不同的类型。以下是一个类型转换的示例:

-- Oracle 实现
-- 修改日期显示格式
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd';
SELECT CAST('666' AS INTEGER), CAST(hire_date AS CHAR(10))FROM employeeWHERE emp_id = 1;-- SQL Server 和 PostgreSQL 实现
SELECT CAST('666' AS INTEGER), CAST(hire_date AS CHAR(10))FROM employeeWHERE emp_id = 1;-- MySQL 实现
SELECT CAST('666' AS SIGNED INTEGER), CAST(hire_date AS CHAR(10))FROM employeeWHERE emp_id = 1;

MySQL 学习笔记(3)— 字符串函数、数值函数、日期时间函数、流程函数、聚集函数以及分组数据相关推荐

  1. MySQL学习笔记-03高级查询、多表联合查询、聚合函数、子查询、视图、存储过程、权限、

    关于作者 金山老师:从事Java.大数据.Python职业化培训6年,项目管理.软件开发14年.欢迎添加我的微信号[jshand],最近建了一些微信交流群,扫描下方二维码添加公众号,回复:进群 文章目 ...

  2. mysql 学习笔记09字符串相关函数

    相关介绍: concat函数使用,拼接字符串 大小写转换函数 length函数,统计字符串长度(字节数) replace 函数,字符串内容替换: substring函数使用,字符串截取 综合使用:

  3. 【Python学习笔记—保姆版】第三章—Python流程控制、函数的定义、常见错误、模块与包、类

    第三章-python函数.分支结构 流程控制 if-else for 循环 while循环 continue/break range()函数 列表与元组遍历 练习 函数的定义 变量作用域 基本形式 函 ...

  4. MYSQL学习笔记三:日期和时间函数

    MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...

  5. MySQL学习笔记—自定义函数

    MySQL学习笔记-自定义函数 注释语法: MySQL服务器支持3种注释风格: 从'#'字符从行尾. 从'– '序列到行尾.请注意'– '(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如 ...

  6. MySQL学习笔记(四)——分组函数,分组查询,连接查询

    MySQL学习笔记(四)--分组函数,分组查询,连接查询 作者:就叫易易好了 日期:2020/11/18 一.分组函数 功能:用作统计使用,又称为聚合函数或统计函数 分类: sum函数 avg函数 m ...

  7. 小白终是踏上了这条不归路----小文的mysql学习笔记(22)--------函数

    ** 小白终是踏上了这条不归路----小文的mysql学习笔记(1) 小白终是踏上了这条不归路----小文的mysql学习笔记(2)----条件查询 小白终是踏上了这条不归路----小文的mysql学 ...

  8. MySQL学习笔记(2)——存储过程与存储函数

    MySQL学习笔记(2)--存储过程与存储函数 文章目录 MySQL学习笔记(2)--存储过程与存储函数 一.存储过程 1.概念:预先编译好的sql语句的集合,理解成批处理语句 2.好处: 3.语法: ...

  9. MySQL学习笔记-基础篇1

    MySQL 学习笔记–基础篇1 目录 MySQL 学习笔记--基础篇1 1. 数据库概述与MySQL安装 1.1 数据库概述 1.1.1 为什么要使用数据库 1.2 数据库与数据库管理系统 1.2.1 ...

  10. MySQL学习笔记_上(select查询)

      上次整理了一些练习发到博客上了,也说要发基础的,整理了一下午才算是把查询那块的勉强整理完,下次再整理其他的,另外还在写设计模式和数据结构的草稿,写的差不多会慢慢发的,这两项算是副线发展,主线还是按 ...

最新文章

  1. 解决猴子选大王问题(用C,原创)
  2. Redirecting to binsystemctl start crond.service
  3. data-index在react里怎样表达_如何自我训练,提高表达能力
  4. 【Manacher】绿绿和串串(luogu 5446)
  5. 重庆大学李婷婷计算机学院,北京大学青年研究中心赴我校考察调研
  6. Conditional Jump Instructions
  7. 用友u8采购发票如何取消审核
  8. 了解SQL Server SELECT INTO语句
  9. 卓有成效的管理者(笔记)——我能贡献什么
  10. 机器学习-UCI数据库
  11. 蓝牙耳机连接笔记本声音卡顿解决办法
  12. win10 虚拟桌面 快捷键
  13. 74LVC245AD技术资料
  14. Android Execution failed for task ‘:app:mergeDebugResources‘.
  15. 五款最出色的数据恢复工具
  16. arcgis怎么关联excel表_ArcGIS如何将表连接到空间数据上
  17. 学习前端比较好的网站
  18. 19 | Linux 常用命令全拼
  19. 信号地与电源地、模拟地与信号地
  20. Verilog 过程结构(initial, always)

热门文章

  1. 伍六七带你学算法 动态规划 ——不同路径
  2. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传
  3. 数据结构(04)— 线性顺序表实战
  4. 当有人看不起你时,要懂得反省自己
  5. Huggingface及BERT代码介绍
  6. 通俗易懂word2vec详解词嵌入-深度学习
  7. javaSE8的流库总结
  8. LeetCode简单题之重新格式化字符串
  9. LeetCode简单题之数组拆分 I
  10. 华为八爪鱼自动驾驶云