mysql基础进阶——基本函数

169 阅读4分钟

1.数值函数

  • 说明:查看MySQL全部数值函数搜索mysql numeric function,第一个就是官方文档。
  • 常用的数值函数有:ROUND、TRUNCATE、CEILING、FLOOR、ABS、RAND。
  • 代码演示如下:
SELECT ROUND(5.7365, 2)  -- 四舍五入  5.47
SELECT TRUNCATE(5.7365, 2)  -- 截断   5.73
SELECT CEILING(5.2)  -- 天花板函数,大于等于此数的最小整数  6
SELECT FLOOR(5.6)  -- 地板函数,小于等于此数的最大整数      5
SELECT ABS(-5.2)  -- 绝对值    5.2
SELECT RAND()  -- 随机函数,0到1的随机值   0.8177690634669448

2.字符串函数

  • 常用的字符串函数:
      1. LENGTH, UPPER, LOWER
      1. TRIM, LTRIM, RTRIM
      1. LEFT, RIGHT, SUBSTRING
      1. LOCATE, REPLACE, 【CONCAT】
  • 代码演示如下:
-- 长度、大小写转换
SELECT LENGTH('sky')  -- 字符串字符个数/长度(LENGTH)   3
SELECT UPPER('sky')  -- 转大写   SKY
SELECT LOWER('Sky')  -- 转小写  sky

SELECT LTRIM('  Sky')  -- 去除左边空格  Sky
SELECT RTRIM('Sky  ') -- 去除左边空格   Sky
SELECT TRIM('  Sky  ')  -- 去除左右边两边空格 Sky

-- 取左边,取右边,取中间
SELECT LEFT('Kindergarden', 4)  -- 取左边(LEFT)4个字符  Kind
SELECT RIGHT('Kindergarden', 6)  -- 取右边(RIGHT)6个字符  garden
SELECT SUBSTRING('Kindergarden', 7, 6)     garden
-- 取中间从第7个开始的长度为6的子串(SUBSTRING)
-- 注意是从第1个(而非第0个)开始计数的
-- 省略第3参数(子串长度)则一直截取到最后

SELECT LOCATE('gar', 'Kindergarden')  -- 定位(LOCATE)首次出现的位置  7
-- 没有的话返回0(其他编程语言大多返回-1,可能因为索引是从0开始的)
-- 这个定位/查找函数依然是不区分大小写的

SELECT REPLACE('Kindergarten', 'garten', 'garden') -- 替换 Kindergarden

-- 连接
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM customers

3.MySQL中的日期函数

  1. NOW, CURDATE, CURTIME
  2. YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, DAYNAME, MONTHNAME
  3. EXTRACT(单位 FROM 日期时间对象), 如 EXTRACT(YEAR FROM NOW())
  • 代码演示如下:
  • 当前时间
SELECT 
    NOW(), -- 2023-07-02 19:27:44
    CURDATE(), -- 2023-07-02
    CURTIME()  -- 19:27:44
  • 提取时间日期对象中的元素(2023-07-02)
SELECT YEAR(NOW())  -- 2023
SELECT MONTH(NOW()) -- 7 
SELECT DAY(NOW())   -- 2
SELECT DAYNAME(NOW()) -- Sunday
SELECT MONTHNAME(NOW()) -- July

-- 标准SQL语句有一个类似的函数 EXTRACT(),若需要在不同DBMS中录入代码,最好用EXTRACT():
SELECT EXTRACT(YEAR FROM NOW()) -- 2023

4.格式化日期和时间

说明:

  • DATE_FORMAT(date, format) 将 date 根据 format 字符串进行格式化。

  • TIME_FORMAT(time, format) 类似于 DATE_FORMAT 函数,但这里 format 字符串只能包含用于小时,分钟,秒和微秒的格式说明符。其他说明符产生一个 NULL 值或0。

  • 代码演示如下:

SELECT DATE_FORMAT(NOW(), '%M %d, %Y')  -- July 02, 2023
-- 格式说明符里,大小写是不同的,这是目前SQL里第一次出现大小写不同的情况
SELECT TIME_FORMAT(NOW(), '%H:%i %p')  -- 19:39 PM

5.计算日期和时间

  • 有时需要对日期事件对象进行运算,如增加一天或算两个时间的差值之类,介绍一些最有用的日期时间计算函数:
  1. DATE_ADD, DATE_SUB
  2. DATEDIFF
  3. TIME_TO_SEC
  • 增加或减少一定的天数、月数、年数、小时数等等
SELECT DATE_ADD(NOW(),INTERVAL 1 YEAR)  - 2024-07-02 20:02:55

SELECT DATE_SUB(NOW(),INTERVAL 1 YEAR)  -- 2022-07-02 20:03:14

  • 计算日期差异
-- 只计算日期部分
SELECT DATEDIFF('2019-01-05','2019-01-01')  -- 4

-- 计算00:00到某时间经历的秒数
SELECT TIME_TO_SEC('09:02')  --32520
SELECT TIME_TO_SEC('09:02') -TIME_TO_SEC('09:00')  -120

6.IFNULL和COALESCE函数

  • IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
  • 代码如下:
SELECT
	order_id,
	IFNULL(shipper_id, 'Not assigned') AS shipper
FROM orders
  • COALESCE(value,…)是一个可变参函数,可以使用多个参数。作用:接受多个参数,返回从左至右、第一个不为NULL的参数,如果所有参数都为NULL,那么返回NULL;当它使用2个参数时,和IFNULL函数作用相同。
  • 代码如下:
SELECT
	order_id,
	COALESCE(shipper_id, comments,'Not assigned') AS shipper
FROM orders

7.IF函数

  • IF(条件表达式, 返回值1, 返回值2) 根据是否满足条件返回不同的值。返回值可以是任何东西,数值 文本 日期时间 空值null 均可
  • 代码如下:
-- 将订单表中订单按是否是今年的订单分类为active(活跃)和archived(存档)
SELECT 
	order_id,
	order_date,
	IF(YEAR(order_date) = YEAR(NOW()),'active','archived')
FROM orders

8.CASE运算符

  • CASE语句结构:
CASE 
    WHEN …… THEN ……
    WHEN …… THEN ……
    WHEN …… THEN ……
    ……
    [ELSE ……] (ELSE子句是可选的)
END
  • 代码如下:
-- 将订单分为三类:今年的是 'Active', 去年的是 'Last Year', 比去年更早的是 'Achived'
SELECT 
	order_id,
	CASE
		WHEN YEAR(order_date) = YEAR(NOW()) THEN 'active'
		WHEN YEAR(order_date) = YEAR(NOW())-5  THEN 'last year'
		WHEN YEAR(order_date) < YEAR(NOW())- 5 THEN 'archived'
		ELSE 'future'
	END AS category
FROM orders