SQL函数笔记

2023-05-16

SQL函数笔记

一、聚合函数——返回汇总值

  1. AVG(表达式) 返回表达式中所有的平均值。仅用于数字列并自动忽略NULL值。
  2. COUNT(表达式) 返回表达式中非NULL值的数量。可用于数字和字符列。
  3. COUNT(*) 返回表中的行数(包括有NULL值的列)。
  4. MAX(表达式) 返回表达式中的最大值,忽略NULL值。可用于数字、字符和日期时间列。
  5. MIN(表达式) 返回表达式中的最小值,忽略NULL值。可用于数字、字符和日期时间列。
  6. SUM(表达式) 返回表达式中所有的总和,忽略NULL值。仅用于数字列。

二、转换函数——转换数据类型

  1. ​ CONVERT(data_type[(length)], expression [, style])
   select convert(varchar(10) ,stuno) as stuno,stuname from student
  1. CAST( expression AS data_type )
   select cast(stuno as varchar(10)) as stuno,stuname from student

Cast和Convert的区别

Cast 和Convert都是用来将一种数据类型的表达式转换为另一种数据类型的表达式。CAST 和 CONVERT 提供相似的功能,只是语法不同。在时间转化中一般用到convert,因为它比cast多加了一个style,可以转化成不同时间的格式。

三、日期函数——处理日期和时间

名称描述
ADDDATE()增加日期
ADDTIME()增加时间
CONVERT_TZ()将当前时区更改为另一时区
CURDATE()返回当前日期
CURRENT_DATE(), CURRENT_DATECURDATE() 的别名
CURRENT_TIME(), CURRENT_TIMECURTIME() 的别名
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMPNOW() 的别名
CURTIME()返回当前时间
DATE_ADD()将两个日期相加
DATE_FORMAT()按照指定格式格式化日期
DATE_SUB()将两个日期相减
DATE()从 date 或者 datetime 表达式中提取出日期部分
DATEDIFF()将两个日期相减
DAY()DAYOFMONTH() 的别名
DAYNAME()返回某天在用星期中的名称
DAYOFMONTH()返回某天是当月的第几天 (1-31)
DAYOFWEEK()返回某天是该星期的第几天
DAYOFYEAR()返回某天是一年中的第几天(1-366)
EXTRACT提取日期中的某一部分
FROM_DAYS()将天数转换为日期
FROM_UNIXTIME()将某个日期格式化为 UNIX 时间戳
HOUR()提取小时
LAST_DAY返回参数日期所在月份的最后一天
LOCALTIME(), LOCALTIMENOW() 的别名
LOCALTIMESTAMP, LOCALTIMESTAMP()NOW() 的别名
MAKEDATE()利用年份和某天在该年所处的天数来创建日期
MAKETIMEMAKETIME()
MICROSECOND()由参数返回微秒
MINUTE()由参数返回分钟
MONTH()返回日期参数的月份
MONTHNAME()返回月份的名字
NOW()返回当前日期和时间
PERIOD_ADD()向年月格式的日期数据之间添加一段时间
PERIOD_DIFF()返回两个年月格式的日期数据之间的月份数
QUARTER()返回日期参数所在的季度
SEC_TO_TIME()将秒数转换为 ‘HH:MM:SS’ 格式
SECOND()返回参数中的秒数 (0-59)
STR_TO_DATE()将字符串转换为日期数据
SUBDATE()以三个参数调用的时候是 DATE_SUB() 的同义词
SUBTIME()减去时间
SYSDATE()返回函数执行的时的时刻
TIME_FORMAT()格式化时间
TIME_TO_SEC()将时间参数转换为秒数
TIME()返回参数表达式中的时间部分
TIMEDIFF()将两个时间相减
TIMESTAMP()只有一个参数时,该函数返回 date 或者 datetime 表达式。当有两个参数时,将两个参数相加。
TIMESTAMPADD()在 datetime 表达式上加上一段时间
TIMESTAMPDIFF()在 datetime 表达式上减去一段时间
TO_DAYS()将日期参数转换为天数
UNIX_TIMESTAMP()返回 UNIX 时间戳
UTC_DATE()返回当前 UTC 日期
UTC_TIME()返回当前 UTC 时间
UTC_TIMESTAMP()返回当前 UTC 日期和时间
WEEK()返回参数的星期数
WEEKDAY()返回日期参数时一个星期中的第几天
WEEKOFYEAR()返回日期参数是日历上的第几周 (1-53)
YEAR()返回日期参数中的年份
YEARWEEK()返回年份和星期
  1. NOW() 当前的系统日期

    select now();--2022-06-27 15:58:39
    select CURTIME();--15:59:16
    select CURDATE();--2022-06-27
    -- 对于时间2021-04-02 09:25:29,分别获取其年、月、日、时、分、秒
    SELECT EXTRACT(YEAR FROM NOW()); -- 2021
    SELECT EXTRACT(MONTH FROM NOW()); -- 4
    SELECT EXTRACT(DAY FROM NOW()); -- 2
    SELECT EXTRACT(HOUR FROM NOW()); -- 9
    SELECT EXTRACT(MINUTE FROM NOW()); -- 25
    SELECT EXTRACT(SECOND FROM NOW()); -- 29
    # 或者从日期格式字符串中获取
    SELECT EXTRACT(YEAR FROM '2021-04-02 10:37:14.123456');  # 2021
    SELECT EXTRACT(MONTH FROM '2021-04-02 10:37:14.123456');  # 4
    SELECT EXTRACT(DAY FROM '2021-04-02 10:37:14.123456');  # 2
    SELECT EXTRACT(HOUR FROM '2021-04-02 10:37:14.123456');  # 10
    SELECT EXTRACT(MINUTE FROM '2021-04-02 10:37:14.123456');  # 37
    SELECT EXTRACT(SECOND FROM '2021-04-02 10:37:14.123456');  # 14
    
  2. year()返回年份

    --返回值范围是 1970〜2069
    select year(now())--2022 
    

3.日期加减

# 时间减少1小时(前一小时)
select date_sub(now(), INTERVAL 1 hour);

# 日期增加1天
select date_add(now(), INTERVAL 1 day);

# 其他间隔
--INTERVAL 1 YEAR
--INTERVAL 1 MONTH
--INTERVAL 1 DAY
--INTERVAL 1 HOUR
--INTERVAL 1 MINUTE
--INTERVAL 1 SECOND

4.日期格式化、字符串转日期

-- MySQL日期时间处理函数
-- 当前日期:2022-06-27 16:19:07
SELECT NOW() FROM DUAL;-- 当前日期时间:2022-06-27 16:19:07
-- 在MySQL里也存在和Oracle里类似的dual虚拟表:官方声明纯粹是为了满足select ... from...这一习惯问题,mysql会忽略对该表的引用。
-- 那么MySQL中就不用DUAL了吧。
SELECT NOW();-- 当前日期时间:2017-05-12 11:41:55
-- 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:
SELECT CURRENT_TIMESTAMP();-- 2022-06-27 16:19:07
SELECT CURRENT_TIMESTAMP;-- 2022-06-27 16:19:07
SELECT LOCALTIME();-- 2022-06-27 16:19:07
SELECT LOCALTIME;-- 2022-06-27 16:19:07
SELECT LOCALTIMESTAMP();-- 2022-06-27 16:19:07
SELECT LOCALTIMESTAMP;-- 2022-06-27 16:19:07
-- 这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now()来替代上面列出的函数。
 
SELECT SYSDATE();-- 当前日期时间:2022-06-27 16:20:37
-- sysdate() 日期时间函数跟 now() 类似,
-- 不同之处在于:now() 在执行开始时值就得到了;sysdate() 在函数执行时动态得到值。
-- 看下面的例子就明白了:
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();
 
 
SELECT CURDATE();-- 当前日期:2017-05-12
SELECT CURRENT_DATE();-- 当前日期:等同于 CURDATE()
SELECT CURRENT_DATE;-- 当前日期:等同于 CURDATE()
 
SELECT CURTIME();-- 当前时间:11:42:47
SELECT CURRENT_TIME();-- 当前时间:等同于 CURTIME()
SELECT CURRENT_TIME;-- 当前时间:等同于 CURTIME()
 
-- 获得当前 UTC 日期时间函数
SELECT UTC_TIMESTAMP(), UTC_DATE(), UTC_TIME()
-- MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()
SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP();-- 2017-05-15 10:32:21 | 2017-05-15 10:32:21
 
 
-- MySQL 日期时间 Extract(选取) 函数
SET @dt = '2017-05-15 10:37:14.123456';
SELECT DATE(@dt);-- 获取日期:2017-05-15
SELECT TIME('2017-05-15 10:37:14.123456');-- 获取时间:10:37:14.123456
SELECT YEAR('2017-05-15 10:37:14.123456');-- 获取年份
SELECT MONTH('2017-05-15 10:37:14.123456');-- 获取月份
SELECT DAY('2017-05-15 10:37:14.123456');-- 获取日
SELECT HOUR('2017-05-15 10:37:14.123456');-- 获取时
SELECT MINUTE('2017-05-15 10:37:14.123456');-- 获取分
SELECT SECOND('2017-05-15 10:37:14.123456');-- 获取秒
SELECT MICROSECOND('2017-05-15 10:37:14.123456');-- 获取毫秒
SELECT QUARTER('2017-05-15 10:37:14.123456');-- 获取季度
SELECT WEEK('2017-05-15 10:37:14.123456');-- 20 (获取周)
SELECT WEEK('2017-05-15 10:37:14.123456', 7);-- ****** 测试此函数在MySQL5.6下无效
SELECT WEEKOFYEAR('2017-05-15 10:37:14.123456');-- 同week()
SELECT DAYOFYEAR('2017-05-15 10:37:14.123456');-- 135 (日期在年度中第几天)
SELECT DAYOFMONTH('2017-05-15 10:37:14.123456');-- 5 (日期在月度中第几天)
SELECT DAYOFWEEK('2017-05-15 10:37:14.123456');-- 2 (日期在周中第几天;周日为第一天)
SELECT WEEKDAY('2017-05-15 10:37:14.123456');-- 0
SELECT WEEKDAY('2017-05-21 10:37:14.123456');-- 6(与dayofweek()都表示日期在周的第几天,只是参考标准不同,weekday()周一为第0天,周日为第6天)
SELECT YEARWEEK('2017-05-15 10:37:14.123456');-- 201720(年和周)
 
SELECT EXTRACT(YEAR FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(MONTH FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(DAY FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(HOUR FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(MINUTE FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(SECOND FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(MICROSECOND FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(QUARTER FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(WEEK FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(YEAR_MONTH FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(DAY_HOUR FROM '2017-05-15 10:37:14.123456');
SELECT EXTRACT(DAY_MINUTE FROM '2017-05-15 10:37:14.123456');-- 151037(日时分)
SELECT EXTRACT(DAY_SECOND FROM '2017-05-15 10:37:14.123456');-- 15103714(日时分秒)
SELECT EXTRACT(DAY_MICROSECOND FROM '2017-05-15 10:37:14.123456');-- 15103714123456(日时分秒毫秒)
SELECT EXTRACT(HOUR_MINUTE FROM '2017-05-15 10:37:14.123456');-- 1037(时分)
SELECT EXTRACT(HOUR_SECOND FROM '2017-05-15 10:37:14.123456');-- 103714(时分秒)
SELECT EXTRACT(HOUR_MICROSECOND FROM '2017-05-15 10:37:14.123456');-- 103714123456(日时分秒毫秒)
SELECT EXTRACT(MINUTE_SECOND FROM '2017-05-15 10:37:14.123456');-- 3714(分秒)
SELECT EXTRACT(MINUTE_MICROSECOND FROM '2017-05-15 10:37:14.123456');-- 3714123456(分秒毫秒)
SELECT EXTRACT(SECOND_MICROSECOND FROM '2017-05-15 10:37:14.123456');-- 14123456(秒毫秒)
-- MySQL Extract() 函数除了没有date(),time() 的功能外,其他功能一应具全。
-- 并且还具有选取‘day_microsecond' 等功能。
-- 注意这里不是只选取 day 和 microsecond,而是从日期的 day 部分一直选取到 microsecond 部分。
 
 
SELECT DAYNAME('2017-05-15 10:37:14.123456');-- Monday(返回英文星期)
SELECT MONTHNAME('2017-05-15 10:37:14.123456');-- May(返回英文月份)
SELECT LAST_DAY('2016-02-01');-- 2016-02-29 (返回月份中最后一天)
SELECT LAST_DAY('2016-05-01');-- 2016-05-31
 
-- DATE_ADD(date,INTERVAL expr type) 从日期加上指定的时间间隔
-- type参数可参考:http://www.w3school.com.cn/sql/func_date_sub.asp
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 YEAR);-- 表示:2018-05-15 10:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 QUARTER);-- 表示:2017-08-15 10:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MONTH);-- 表示:2017-06-15 10:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 WEEK);-- 表示:2017-05-22 10:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 DAY);-- 表示:2017-05-16 10:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 HOUR);-- 表示:2017-05-15 11:37:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MINUTE);-- 表示:2017-05-15 10:38:14.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 SECOND);-- 表示:2017-05-15 10:37:15.123456
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MICROSECOND);-- 表示:2017-05-15 10:37:14.123457
 
 
-- DATE_SUB(date,INTERVAL expr type) 从日期减去指定的时间间隔
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 YEAR);-- 表示:2016-05-15 10:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 QUARTER);-- 表示:2017-02-15 10:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 MONTH);-- 表示:2017-04-15 10:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 WEEK);-- 表示:2017-05-08 10:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 DAY);-- 表示:2017-05-14 10:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 HOUR);-- 表示:2017-05-15 09:37:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 MINUTE);-- 表示:2017-05-15 10:36:14.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 SECOND);-- 表示:2017-05-15 10:37:13.123456
SELECT DATE_SUB('2017-05-15 10:37:14.123456',INTERVAL 1 MICROSECOND);-- 表示:2017-05-15 10:37:14.123455
 
-- 经特殊日期测试,DATE_SUB(date,INTERVAL expr type)可放心使用
SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY);-- 前一天:2017-05-11
SELECT DATE_SUB(CURDATE(),INTERVAL -1 DAY);-- 后一天:2017-05-13
SELECT DATE_SUB(CURDATE(),INTERVAL 1 MONTH);-- 一个月前日期:2017-04-12
SELECT DATE_SUB(CURDATE(),INTERVAL -1 MONTH);-- 一个月后日期:2017-06-12
SELECT DATE_SUB(CURDATE(),INTERVAL 1 YEAR);-- 一年前日期:2016-05-12
SELECT DATE_SUB(CURDATE(),INTERVAL -1 YEAR);-- 一年后日期:20178-06-12
-- MySQL date_sub() 日期时间函数 和 date_add() 用法一致,并且可以用INTERNAL -1 xxx的形式互换使用;
-- 另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。
 
-- MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)
-- 函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。
-- MySQL period_add(P,N):日期加/减去N月。
SELECT PERIOD_ADD(201705,2), PERIOD_ADD(201705,-2);-- 201707  20170503
-- period_diff(P1,P2):日期 P1-P2,返回 N 个月。
SELECT PERIOD_DIFF(201706, 201703);-- 
-- datediff(date1,date2):两个日期相减 date1 - date2,返回天数
SELECT DATEDIFF('2017-06-05','2017-05-29');-- 7
-- TIMEDIFF(time1,time2):两个日期相减 time1 - time2,返回 TIME 差值
SELECT TIMEDIFF('2017-06-05 19:28:37', '2017-06-05 17:00:00');-- 02:28:37
 
 
-- MySQL日期转换函数
SELECT TIME_TO_SEC('01:00:05'); -- 3605
SELECT SEC_TO_TIME(3605);-- 01:00:05
 
-- MySQL (日期、天数)转换函数:to_days(date), from_days(days)
SELECT TO_DAYS('0000-00-00'); -- NULL 
SELECT TO_DAYS('2017-06-05'); -- 736850
SELECT FROM_DAYS(0);           -- '0000-00-00' 
SELECT FROM_DAYS(736850);      -- '2017-06-05'
 
-- MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)
 
SELECT STR_TO_DATE('06.05.2017 19:40:30', '%m.%d.%Y %H:%i:%s');-- 2017-06-05 19:40:30
SELECT STR_TO_DATE('06/05/2017', '%m/%d/%Y');                  -- 2017-06-05
SELECT STR_TO_DATE('2017/12/3','%Y/%m/%d')		       -- 2017-12-03
SELECT STR_TO_DATE('20:09:30', '%h:%i:%s')		       -- NULL(超过12时的小时用小写h,得到的结果为NULL)
 
-- 日期时间格式化
SELECT DATE_FORMAT('2017-05-12 17:03:51', '%Y年%m月%d日 %H时%i分%s秒');-- 2017年05月12日 17时03分51秒(具体需要什么格式的数据根据实际情况来;小写h为12小时制;)
SELECT TIME_FORMAT('2017-05-12 17:03:51', '%Y年%m月%d日 %H时%i分%s秒');-- 0000年00月00日 17时03分51秒(time_format()只能用于时间的格式化)
-- STR_TO_DATE()和DATE_FORMATE()为互逆操作
 
-- MySQL 获得国家地区时间格式函数:get_format()
-- MySQL get_format() 语法:get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'
-- MySQL get_format() 用法的全部示例:
SELECT GET_FORMAT(DATE,'usa');   	-- '%m.%d.%Y' 
SELECT GET_FORMAT(DATE,'jis');   	-- '%Y-%m-%d' 
SELECT GET_FORMAT(DATE,'iso');   	-- '%Y-%m-%d' 
SELECT GET_FORMAT(DATE,'eur');   	-- '%d.%m.%Y' 
SELECT GET_FORMAT(DATE,'internal');   	-- '%Y%m%d' 
SELECT GET_FORMAT(DATETIME,'usa');   	-- '%Y-%m-%d %H.%i.%s' 
SELECT GET_FORMAT(DATETIME,'jis');   	-- '%Y-%m-%d %H:%i:%s' 
SELECT GET_FORMAT(DATETIME,'iso');   	-- '%Y-%m-%d %H:%i:%s' 
SELECT GET_FORMAT(DATETIME,'eur');   	-- '%Y-%m-%d %H.%i.%s' 
SELECT GET_FORMAT(DATETIME,'internal'); -- '%Y%m%d%H%i%s' 
SELECT GET_FORMAT(TIME,'usa');   	-- '%h:%i:%s %p' 
SELECT GET_FORMAT(TIME,'jis');   	-- '%H:%i:%s' 
SELECT GET_FORMAT(TIME,'iso');   	-- '%H:%i:%s' 
SELECT GET_FORMAT(TIME,'eur');   	-- '%H.%i.%s' 
SELECT GET_FORMAT(TIME,'internal');     -- '%H%i%s'
 
 
-- MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)
SELECT MAKEDATE(2017,31);   -- '2017-01-31' 
SELECT MAKEDATE(2017,32);   -- '2017-02-01'
SELECT MAKETIME(19,52,35);  -- '19:52:35'
 
-- MySQL 时区(timezone)转换函数:convert_tz(dt,from_tz,to_tz)
SELECT CONVERT_TZ('2017-06-05 19:54:12', '+08:00', '+00:00'); -- 2017-06-05 11:54:12
 
 
-- MySQL (Unix 时间戳、日期)转换函数
-- unix_timestamp(), unix_timestamp(date), from_unixtime(unix_timestamp), from_unixtime(unix_timestamp,format)
-- 将具体时间时间转为timestamp
SELECT UNIX_TIMESTAMP();-- 当前时间的时间戳:1494815779
SELECT UNIX_TIMESTAMP('2017-05-15');-- 指定日期的时间戳:1494777600
SELECT UNIX_TIMESTAMP('2017-05-15 10:37:14');-- 指定日期时间的时间戳:1494815834
 
-- 将时间戳转为具体时间
SELECT FROM_UNIXTIME(1494815834);-- 2017-05-15 10:37:14
SELECT FROM_UNIXTIME(1494815834, '%Y年%m月%d日 %h时%分:%s秒');-- 获取时间戳对应的格式化日期时间
 
-- MySQL 时间戳(timestamp)转换、增、减函数
SELECT TIMESTAMP('2017-05-15');-- 2017-05-15 00:00:00
SELECT TIMESTAMP('2017-05-15 08:12:25', '01:01:01');-- 2017-05-15 09:13:26
SELECT DATE_ADD('2017-05-15 08:12:25', INTERVAL 1 DAY);-- 2017-05-16 08:12:25
SELECT TIMESTAMPADD(DAY, 1, '2017-05-15 08:12:25');-- 2017-05-16 08:12:25; MySQL timestampadd() 函数类似于 date_add()。
 
SELECT TIMESTAMPDIFF(YEAR, '2017-06-01', '2016-05-15');-- -1
SELECT TIMESTAMPDIFF(MONTH, '2017-06-01', '2016-06-15');-- -11
SELECT TIMESTAMPDIFF(DAY, '2017-06-01', '2016-06-15');-- -351
SELECT TIMESTAMPDIFF(HOUR, '2017-06-01 08:12:25', '2016-06-15 00:00:00');-- -8432
SELECT TIMESTAMPDIFF(MINUTE, '2017-06-01 08:12:25', '2016-06-15 00:00:00');-- -505932
SELECT TIMESTAMPDIFF(SECOND, '2017-06-01 08:12:25', '2016-06-15 00:00:00');-- -30355945


四、数字函数——执行算数运算

  1. 函数名称作 用
    ABS求绝对值
    SQRT求二次方根
    MOD求余数
    CEIL 和 CEILING两个函数功能相同,都是返回不小于参数的最小整数,即向上取整
    FLOOR向下取整,返回值转化为一个BIGINT
    RAND生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列
    ROUND对所传参数进行四舍五入
    SIGN返回参数的符号
    POW 和 POWER两个函数的功能相同,都是所传参数的次方的结果值
    SIN求正弦值
    ASIN求反正弦值,与函数 SIN 互为反函数
    COS求余弦值
    ACOS求反余弦值,与函数 COS 互为反函数
    TAN求正切值
    ATAN求反正切值,与函数 TAN 互为反函数
    COT求余切值

六、系统函数——从数据库返回在SQLSERVER中的值、对象或设置的特殊信息

函数说明
VERSION()获取数据库的版本号。
CONNECTION_ID()获取服务器的连接数。
DATABASE()、SCHEMA()获取当前数据库名。
USER()、SYSTEM_USER()、SESSION_USER()获取当前用户名。
CURRENT_USER()、CURRENT_USER获取当前用户名。
CHARSET(str)获取字符串str的字符集。
COLLATION(str)获取字符串str的字符排序方法。
LAST_INSERT_ID()获取最近生成的AUTO_INCREMENT值。

七、文本和图像函数——对文本和图像数据执行操作

函数说明
CHAR_LENGTH(str)计算字符串字符个数。
LENGTH(str)返回值为字符串str的长度,单位为字节。
CONCAT(s1,s2,…)返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL。
CONCAT_WS(x,s1,s2,…)返回多个字符串拼接之后的字符串,每个字符串之间有一个x。
INSERT(s1,x,len,s2)返回字符串s1,其子字符串起始于位置x,被字符串s2取代len个字符。
LOWER(str)、LCASE(str)将str中的字母全部转换成小写。
UPPER(str)、UCASE(str)将字符串中的字母全部转换成大写。
LEFT(s,n)、RIGHT(s,n)前者返回字符串s从最左边开始的n个字符,后者返回字符串s从最右边开始的n个字符。
LPAD(s1,len,s2)、RPAD(s1,len,s2)前者返回s1,其左边由字符串s2填补到len字符长度,假如s1的长度大于len,则返回值被缩短至len字符;前者返回s1,其右边由字符串s2填补到len字符长度,假如s1的长度大于len,则返回值被缩短至len字符。
LTRIM(s)、RTRIM(s)前者返回字符串s,其左边所有空格被删除;后者返回字符串s,其右边所有空格被删除。
TRIM(s)返回字符串s删除了两边空格之后的字符串。
TRIM(s1 FROM s)删除字符串s两端所有子字符串s1,未指定s1的情况下则默认删除空格。
REPEAT(s,n)返回一个由重复字符串s组成的字符串,字符串s的数目等于n。
SPACE(n)返回一个由n个空格组成的字符串。
REPLACE(s,s1,s2)返回一个字符串,用字符串s2替代字符串s中所有的字符串s1。
STRCMP(s1,s2)若s1和s2中所有的字符串都相同,则返回0;根据当前分类次序,第一个参数小于第二个则返回-1,其他情况返回1。
SUBSTRING(s,n,len)、MID(s,n,len)两个函数作用相同,从字符串s中返回一个第n个字符开始、长度为len的字符串。
LOCATE(str1,str)、POSITION(str1 IN str)、INSTR(str,str1)三个函数作用相同,返回子字符串str1在字符串str中的开始位置(从第几个字符开始)。
REVERSE(s)将字符串s反转。
ELT(N,str1,str2,str3,str4,…)返回第N个字符串。
FIELD(s,s1,s2,…)返回第一个与字符串s匹配的字符串的位置。
FIND_IN_SET(s1,s2)返回在字符串s2中与s1匹配的字符串的位置。
MAKE_SET(x,s1,s2,…)按x的二进制数从s1,s2…,sn中选取字符串

附件:

八、字符串函数参考(PGSQL)

  1. 删除字符串
    • PostgreSQL btrim() 函数从一个字符的开头和结尾删除一个包含了由参数指定的所有字符(默认为空格)的最长的字符串
    • ltrim() 从一个字符串的开头删除指定的字符
    • rtrim() 从一个字符串的结尾删除。
    -- btrim() 语法
    SELECT btrim('xxyHELLOzxy', 'xyz') AS "'xxyHELLOzxy'";-- HELLO
    -- ltrim() 开头删除
    SELECT ltrim('xxyHELLOzxy', 'xyz') AS "'xxyHELLOzxy'";-- HELLOzxy
    -- rtrim()	结尾删除
    SELECT rtrim('xxyHELLOzxy', 'xyz') AS "'xxyHELLOzxy'";-- zxyHELLO
    
  2. 字符串长度

    char_length() /character_length()/length():返回一个字符串中的字符数

    select length('hello') -- 5
    
  3. chr() 语法:返回一个 ASCII 值对应的字符
    --	返回一个 ASCII 值对应的字符
    SELECT
        chr(65) AS "chr(65)",-- A
        chr(97) AS "chr(97)";-- a
    
  4. 拼接字符串
    • concat() 语法:concat(param1[, param2] …)
    • concat_ws() 语法:concat_ws(separator, param1[, param2] …)
    • ||
    -- 拼接a,b,c
    select concat('a','b','c') as res;-- abc
    -- 以逗号拼接a,b,c
    select concat_ws(',','a','b','c') as res;-- a,b,c
    -- 结果再拼接
    select '(' || concat('a','b','c') ||')' as res;-- (abc)
    select '(' || concat_ws(',','a','b','c') ||')' as res;-- (a,b,c)
    
  5. format() 语法
    1. 单格式:format(format_str, [param1[, param2] …])

    2.多格式:%[position][flags][width]type

    • position

      可选的。 它用来指明要使用的哪一个参数。它采用 N$ 这样的形式,其中 N 是一个数数字。N 从 1 开始,1 意味着 format_str 之后的第一个参数。如果不指定,默认是使用参数列表中的下一个参数。

    • flags

      可选的。 与宽度选项搭配使用。目前仅支持一个符号:减号(-),它表示输出左对齐。未指定宽度时,不起作用。

    • width

      可选的。它用来设置此格式说明符输出的最少字符数。根据 flag 的设定,对输出进行左侧填充或右侧填充空格。如果指定的宽度小于参数的宽度,则不起任何作用。

      这个参数可以使用下列中的任何一个:

      • 一个正整数值
      • 一个星号 (*) 使用下一个函数参数作为宽度
      • 一个格式为 *n$ 的字符串,用于使用第 n 个函数参数作为宽度。
    • type

      必须的。 指定格式说明符的输出的类型。支持下列的类型:

      • s 将参数值的格式设置为简单字符串。空值被视为空字符串。
      • I 将参数值视为 SQL 标识符,必要时对其进行双引号包围。值为 null 是错误的
      • L 将参数值引起来作为 SQL 文本。空值显示为字符串 NULL,不带引号
    • param1...

      可选的。 格式字符串中的格式说明符引用的参数。如果参数多于格式说明符,则会忽略额外的参数。参数的数量是可变的,可能为零。

    -- 单格式
    select format('hello %s''word') --hello word
    -- 多参数
    SELECT format('This is %s, he is %s years old.', 'Tim', 20);--  This is Tim, he is 20 years old.
    -- 指定位置
    SELECT format('ABC顺序: %3$s, %2$s, %1$s', 'A', 'B', 'C'); -- ABC顺序: C, B, A
    
  6. 指定字符串中提取最左侧的指定数量的字符并返回:left()

    left() 语法:left() 语法

    -- 从左到右显示两个字符
    select left('hello',2) --he
    -- 除去从右到左的两个,显示全部
    select left('hello',-2) --hel
    
  7. 填充指定的字符,使其达到指定的长度
    1. lpad() 语法:lpad(string, length, characters)
      • 左侧填充字符串

    2.format() 函数:format(format_str, [param1[, param2] …])

    3.rpad():

    • 左侧填充字符串
    -- lpad() 语法
    SELECT 
        lpad('123456', 10, '0') AS "lpad('1234', 10, '0')",-- 0000123456
        lpad('9876', 10, '0') AS "lpad('9876', 10, '0')";-- 0000009876
        
    SELECT lpad('hello',10,'xyz');-- xyzxyhello
    -- format() 函数
    SELECT format('%10s','hello');-- hello
    
  8. 计算一个指定的字符串的 md5 哈希值,并返回计算结果的十六进制形式。

    md5() 语法:md5(str)

    select md5('hello');-- 5d41402abc4b2a76b9719d911017c592
    
  9. 在一个字符串中使用指定的文本替换从指定位置开始的指定数量的字符。

    overlay() 语法:overlay(string PLACING replacement FROM start [FOR count])

    • string

      必需的。 文本。要在中搜索和替换的字符串。

    • replacement

      必需的。 文本。替换为的字符串。

    • start

      必需的。 整数。替换开始的索引位置。

    • count

      可选的。 整数。被替换的字符的数量。默认为 replacement 的字符串数,即 length(replacement)

    -- 替换hello 第四个字符(l)为m
    select overlay('hello' placing 'm' from 4 for 1) -- helmo
    
  10. parse_ident() 语法:参数拆分成一个标识符的数组,同时删除单个标识符两端的引号

    语法:parse_ident (qualified_identifier)或者parse_ident (qualified_identifier, strict_mode)

    • qualified_identifier

    必需的。 文本类型。 一个合格的标识符。

    • strict_mode

    可选的。 布尔类型。 是否启用严格模式。默认是 true.

  11. 从一个字符串中返回指定的正则表达式的第一个匹配的结果

    语法:regexp_match(string, regex[, flags]) → text[]

    • string

    必需的。 一个字符串。

    • regex

    必需的。 正则表达式。

    • flags

    可选的。 正则表达式的匹配模式。

    • 注意:

    PostgreSQL regexp_match() 函数返回一个字符串数组,它是一个字符串中使用指定的正则表达式的第一次匹配结果

    regexp_match() 函数不能使用 g 标识,匹配所有结果用regexp_matches()

    -- i 忽略大小写
    SELECT regexp_match('Abcd abCd aBcd', 'ab.', 'i'); --Abc
    SELECT regexp_match('Abcd abCd aBcd', 'ab.'); -- {abC}
    -- 多个分组
    SELECT regexp_match('Abcd abCd aBcd', '(a.)(c.)', 'i'); -- {Ab,cd}
    
    
  12. regexp_matches() 函数:从一个字符串中返回指定的正则表达式的第一次匹配的结果;如果使用了 g 标识,则返回所有的匹配结果。
    -- 比较和regexp_match的不同
    SELECT regexp_matches('Abcd abCd aBcd', '(a.)(c.)', 'ig');-- {Ab,cd}、{ab,Cd}、{aB,cd}
    SELECT regexp_match('Abcd abCd aBcd', '(a.)(c.)', 'i');-- {Ab,cd}
    
  13. regexp_replace() 函数:一个给定字符串中用给定的内容替换给定的正则表达式的第一个匹配的子串;如果使用了 g 标识,则替换所有的匹配结果。

    regexp_replace() 语法:regexp_replace(string, regex, replacement[, flags]) → text

    • string

    必需的。 一个字符串。

    • regex

    必需的。 正则表达式。

    • replacement

    必需的。 替换为的字符串。

    • flags

    可选的。 正则表达式的匹配模式。

    -- ab 替换为xx 返回第一次匹配结果
    SELECT regexp_replace('Abcd abCd aBcd', 'ab.', 'xx');--  Abcd xxd aBcd
    -- ab 替换为xx并且忽略大小写
    SELECT regexp_replace('Abcd abCd aBcd', 'ab.', 'xx','ig');-- xxd xxd xxd
    
  14. regexp_split_to_array() 函数:将一个指定的字符串按照通过 POSIX 正则表达式指定的分隔符拆分成数组并返回。

    语法:regexp_split_to_array(string, regex[, flags]) → text[]

    • string

    必需的。 一个要拆分的字符串。

    • regex

    必需的。 用作分隔符的正则表达式。

    • flags

    可选的。 正则表达式的匹配模式。

    SELECT regexp_split_to_array('ab cd ef  gh', '\s+');-- {ab,cd,ef,gh}
    SELECT regexp_split_to_array('a1,b1,c1', ',');-- {a1,b1,c1}
    SELECT regexp_split_to_array('a1,b1,c1', '');-- {a,1,",",b,1,",",c,1}
    
  15. PostgreSQL regexp_split_to_table() 函数:将一个指定的字符串按照通过 POSIX 正则表达式指定的分隔符拆分成一个结果集并返回。
    • 参数

    string

    必需的。 一个要拆分的字符串。

    regex

    必需的。 用作分隔符的正则表达式。

    flags

    可选的。 正则表达式的匹配模式。

    • 返回值

      PostgreSQL regexp_split_to_table() 函数返回一个结果集,该集合中的元素就是字符串 string 按照正则表达式 regex 拆分的所有部分。

      如果 regexNULL,此函数将返回 NULL

      如果 regex 是一个空字符串,那么整个字符串中的所有字符都将成为结果集的成员。

      如果 null_string 不为 NULL,那么拆分后的数组中的与它匹配的成员将被替换为 NULL

    SELECT regexp_split_to_table('ab cd ef  gh', '\s+'); 
    -- 结果
    /*
    ab
    cd
    ef
    gh
    */
    SELECT regexp_split_to_table('a1,b1,c1', ',');
    -- 结果
    /*
    a1
    b1
    c1
    */
    SELECT regexp_split_to_table('a1,b1,c1', '');
    -- 结果
    /*
    a
    1
    ,
    b
    1
    ,
    c
    1
    */
    
  16. repeat()函数 : repeat()

    语法:repeat(string, number)

    参数:

    • string

      必需的。 要重复的字符串。

    • number

      必需的。 要重复的次数。

    返回值:

    PostgreSQL repeat() 函数返回一个重复了指定次数的字符串。

    -- 重复hello三次
    SELECT repeat('Hello', 3) AS "repeat('Hello', 3)";
    
  17. replace() 函数:将一个指定的字符串中出现的所有指定的子字符串替换为新的子字符串并返回结果。

    语法:replace(string, search_string, replacement)

    参数:

    • string

      必需的。 一个字符串。

    • search_string

      必需的。 被替换的字符串

    • replacement

      必需的。 替换为的字符串。

    返回值:

    PostgreSQL replace() 函数将字符串 string 中的所有的字符串 search_string 使用 replacement 替换,并返回结果

    -- hello -->hmllo
    select replace('hello','e','m');
    
  18. reverse() 函数:反转一个指定的字符串中的字符顺序并返回反转的字符串。
    -- 反转hello
    select reverse('hello');
    
  19. split_part() 函数:将一个指定的字符串按照指定的分隔符拆分,并返回指定的部分。

    语法:split_part(string, delimiter, n)

    ​ 参数

    • string

      必需的。 一个要拆分的字符串。

    • delimiter

      必需的。 分隔符。

    • n

      必需的。 一个整数,它指定了第几个部分需要返回(从 1 开始计数)。

    返回值

    PostgreSQL split_part() 函数将字符串 string 按照分隔符 delimiter 拆分,并返回第 n 个部分。如果 n 为负数,则返回倒数第 -n 个部分。

    -- 返回第三个 ef
    SELECT split_part('ab,cd,ef,gh', ',', 3);
    
  20. substr() 函数:从一个指定的字符串中根据指定的起始位置和长度提取子字符串并返回。

    substr()语法:substr(string, start[, length])

    substr(string, start[, length]) 等同于 substring(string FROM start[ FOR length])

    参数

    • string

      必需的。 一个字符串。

    • start

      必需的。 子字符串的起始位置。

    • length

      可选的。 子字符串的长度。默认是提取到字符串的结尾。

    返回值

    PostgreSQL substr() 函数函数从字符串 string 中提取从位置 start 开始且长度为 length 的子字符串并返回。若没有指定参数 length,则提取从 start 开始到字符串 string 的结尾的子字符串。

    如果 start + length 超过了字符串 string 的长度,则返回 start 到字符串的结尾 string 的子字符串。

    若参数为 NULL,该函数将返回 NULL

    -- 截取第七位以后的字符 即world
    SELECT substr('hello world', 7) AS "substr('hello world', 7)";
    -- 指定截取的长度(长度为2)
    SELECT substr('hello world', 72) AS "substr('hello world', 7)";
    
  21. substring() 函数:从一个指定的字符串中根据指定的起始位置和长度提取子字符串,或者根据正则表达式提取子字符串

    语法:substring(string [FROM start] [FOR length])或者substring(string FROM pattern)或者substring(string SIMILAR pattern ESCAPE escape)

    参数:

    • string

      必需的。 一个字符串。

    • start

      可选的。 子字符串的起始位置。默认是 1,也就是字符串的开头。

    • length

      可选的。 子字符串的长度。默认是提取到字符串的结尾。

    • pattern

      必需的。 正则表达式。 FROM pattern 子句中使用的是 POSIX 正则表达式;SIMILAR pattern 子句中使用的是 SQL 正则表达式。

    • escape

      必需的。 转义字符。

    返回值:

    PostgreSQL substring() 函数函数从字符串 string 中提取从位置 start 开始且长度为 length 的子字符串并返回。若没有指定参数 length,则提取从 start 开始到字符串 string 的结尾的子字符串。

    如果 start + length 超过了字符串 string 的长度,则返回 start 到字符串的结尾 string 的子字符串。

    若参数为 NULL,该函数将返回 NULL

    SELECT
        substring('hello' FROM 2) AS "第二个开始",-- ello
        substring('hello' FROM 2 FOR 2) AS "第二个并且长度为2", -- el
        substring('hello' FOR 2) AS "长度为2)"; -- he
        
    SELECT
        substring('hello' FROM '^.{2}') AS "substring('hello' FROM '^.{2}')", -- he
        substring('hello' FROM '.{3}$') AS "substring('hello' FROM '.{3}$')"; -- llo
        
    SELECT substring('hello' SIMILAR '%#"__l#"%' ESCAPE '#'); --hel
    
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL函数笔记 的相关文章

  • Xlaunch启动后无法显示图形界面,提示connection refused

    解决方案 xff1a 重启远程端
  • 【PR】零基础快速入门教程

    PR 零基础快速入门教程 PR xff08 Premiere xff09 能做什么 xff1f PR欢迎界面及新建项目工作区及窗口说明导入文件建立序列视频剪辑添加字幕导出视频 使用软件 xff1a Premiere2020 新年卷起来 xf
  • 【PR】源窗口

    PR 源窗口 源窗口粗剪源窗口按钮功能标记按钮出入点相关插入与覆盖插入覆盖 导出帧 使用软件 xff1a Premiere2020 源窗口粗剪 我们手上可能有一些很长的视频 xff0c 但是我就想要其中的几段 xff0c 这个时候粗剪就很方
  • 【PR】时间轴窗口

    PR 时间轴窗口 时间轴窗口工具按钮 视频轨道切换轨道输出切换同步锁定目标切换轨道锁定轨道对插入和覆盖进行源修补 工具按钮 音频轨道静音轨道独奏轨道画外音录制 时间轴窗口基础操作添加轨道查看完成视频和音频缩放轨道删除轨道 添加关键帧 使用软
  • 【PR】来,一起做一个简单的剪辑视频吧

    PR 来 xff0c 一起做一个简单的剪辑视频吧 前言新建项目导入素材创建序列裁剪视频视频导入序列 图片背景音频处理多视频素材处理添加字幕导出上传学了上面能做到什么程度 xff1f 可以看一下我用上面的方法做出成品 新手教程哈 xff0c
  • 【PR】视频剪裁

    PR 视频剪裁 把素材文件导入PR问题1 xff1a 删除多余部分 xff08 主要是录制范围 xff09 导出视频 xff08 问题1解决方案看我 xff09 问题2 导出的视频还有黑边导出视频 xff08 问题2解决方案看我 xff09
  • 【PR】图片处理

    PR 图片处理 导入图片将图片文件拖拽进时间轴点击图片选择效果 xff08 时间轴上的那个条 xff09 改变图片位置修改图片大小图片不透明度旋转与锚点 xff08 视频层 xff09 图层 PR不光能导入视频 xff0c 还可以导入图片
  • 【PR】音频处理及过度效果

    PR 音频处理及过度效果 导入音频插入时间轴中的A轨道 xff08 声音轨道 xff09 音频处理调整音量 音频剪贴音频过度效果淡入 xff0c 淡出 xff0c 过度淡入淡出过度 工具按钮 音频轨道 xff08 不充内容 xff0c 可以
  • 实例:用C#.NET手把手教你做微信公众号开发(17)--公众号主动给粉丝发信息之模板消息

    前面讲了那么多 xff0c 都是微信用户主动向公众号发送信息或某个操作触发公众号响应并给予用户回复 如果在微信用户没有主动发起互动的情况下 xff0c 公众号应该如何向微信用户发送消息呢 xff1f 本篇给出一种解决方案 xff1a 模板消
  • 【PR】视频转场与视频粗剪

    PR 视频转场与视频粗剪 视频转场转场使用方法 粗剪与标记 xff08 多个视频合并的小技巧 xff0c 可以不看 xff09 粗剪标注 今天我们来搞一下视频 xff0c 主要是搞一下转场效果 转场 xff1a 让不同场景的画面间过渡更加自
  • 【PR】字幕处理

    PR 字幕处理 添加字幕新建字幕基础设置多字幕添加 其他调整基础效果 效果控件 字幕特效 PR2022版本有字幕插件 xff0c 可以更轻松的处理字幕 我用的是PR2020 xff0c 没有这个功能 xff0c 只能一个一个添加 xff0c
  • 【外设零基础通用教程】GPIO 上

    外设零基础通用教程 GPIO 上 视频 文章结构外设 xff1a GPIO代码编写GPIO输入方法GPIO输出方法 视频地址 xff1a 咸鱼的外设通用教程之GPIO 本教程适合 xff1a 硬件零基础纯小白 上手了硬件不知从何开始 xff
  • 【外设零基础通用教程】GPIO 下

    外设零基础通用教程 GPIO 下 使用方法GPIO 值输入读取值输出设置值 GPIO输入输出应用GPIO输入应用GPIO输出应用文档使用 理论补充输出方式推挽输出开漏输出 上篇连接 xff1a 外设零基础通用教程 GPIO 上 xff0c
  • 硬件外设使用方法——GPIO

    硬件外设使用 GPIO用法 GPIO基本概念GPIO应用pyb与micropython什么是pyb什么是micropythonpyb与micropython关系 GPIO在micropython中的用法什么是pyb库pyb库中的GPIO用法
  • 【硬件外设使用】——ADC

    硬件外设使用 ADC ADC基本概念ADC使用方法pyb adcmachine adc ADC可用的传感器 ADC基本概念 ADC是模拟数字转换器 xff08 Analog to Digital Converter xff09 的缩写 xf
  • 【硬件外设使用】——DAC

    硬件外设使用 DAC DAC基本概念DAC使用方法pyb dacmachine dac DAC可用的传感器 DAC基本概念 DAC是数字模拟转换器 xff08 Digital to Analog Converter xff09 xff08
  • 【硬件外设使用】——PWM

    硬件外设使用 PWM PWM基本概念PWM使用方法pyb pwm方法属性 machine pwm方法属性 PWM可用的传感器 PWM基本概念 PWM是脉冲宽度调制 xff08 Pulse Width Modulation xff09 的缩写
  • 【硬件外设使用】——I2C

    硬件外设使用 I2C I2C基本概念I2C通信协议I2C使用方法pyb i2cmachine i2c I2C可用的传感器 I2C基本概念 I2C是 34 Inter Integrated Circuit 34 的缩写 xff0c 也被称为T
  • 【硬件外设使用】——SPI

    硬件外设使用 SPI SPI基本概念SPI通信协议SPI使用方法pyb spimachine spi SPI可用的传感器 SPI基本概念 SPI是一种串行端口通信接口 xff0c 它是一种同步的全双工协议 xff0c 用于在数字电路之间传输
  • 实例:用C#.NET手把手教你做微信公众号开发(18)--使用微信支付给粉丝发红包

    前面讲的所有都没有涉及到钱 xff0c 一旦关联到钱都是非常敏感的 xff0c 所以开通微信支付的过程和配置过程相对比较繁琐 xff0c 本篇给出主要入口 xff0c 因篇幅原因一篇文章讲不太细 xff0c 但已足以帮你解决问题 xff0c

随机推荐