MySQL学习之SQL函数

SQL函数

SQL 函数
任何一个数据库系统都内置了数量相当可观的又非常实用的小函数

这些函数可以根据实现功能的不同划分为不同的类,当然,除了很明显的日期时间和字符串函数两大类外

可以把这些函数归纳为两大类: Aggregate 函数 和 Scalar 函数

Aggregate函数

avg()
count()
max()
min()
sum()
聚合函数中的distinct

SQL Aggregate 函数
    SQL Aggregate 函数用于计算从列中取得的值,并返回一个单一的值

常用的 Aggregate 函数(聚合函数)有:

    函数	       说明
    AVG()	    返回平均值
    COUNT()	    返回行数
    MAX()	    返回最大值
    MIN()	    返回最小值
    SUM()	    返回总和

# 聚合函数:max() / min() / sum() / avg() / count()

    avg() 忽略列值为NULL的行

    count()
        根据参数的不同,COUNT() 大致有三种用法

        1. COUNT ( column_name )
            COUNT(column_name) 函数返回指定列的值的数目,NULL 值除外

            SELECT COUNT(column_name) FROM table_name;

        2. COUNT(*)
            COUNT(*) 函数返回表中的记录数,包括 NULLSELECT COUNT(*) FROM table_name;

        3. COUNT(DISTINCT column_name )
            COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目

            SELECT COUNT(DISTINCT column_name) FROM table_name;

        # 统计一个表有多少行:
        # select count(*) from t11;  # 不写group的话,默认这个表整体为一组
        # count(1) / count(主键) 效率高
        # count(* | 1) 统计行数,不会忽略列值为NULL的行
        # count(column) 会忽略列值为NULL的行

# max() 会忽略列值为NULL的行
# min() 会忽略列值为NULL的行
# sum(column) or sum(column * column) 会忽略列值为NULL的行

# 聚集函数的默认行为是对所有行进行计算,也就是ALL
# 如果想改变这个行为,只想对不同的值进行计算,用DISTINCT
# DISTINCT 不能用于count(*)
# 虽然也可以用于max / min, 但是最后的结果与不用distinct是相同的。
# distinct 只能用于列,不能用于表达式

Scalar函数

SQL Scalar 函数基于输入值,返回一个单一的值

   charset()
   bin()
   oct()
   hex()
   binary()
   cast()
   concat()
   concat_ws()
   group_concat()
   
length()
char_length()

soundex()

conv()
format()

ucase()
lcase()
upper()
lower()

ltrim()
rtrim()
trim()

repeat()
space()
reverse()

instr()
locate()

insert()
replace()

left()
right()
mid()
substring()

数值处理函数
  sin()
  cos()
  tan()
  abs()
  sqrt()
  exp()
  pow()
  log()
  log10()
  round()
  rand()
  pi()

加密函数
  md5()
  password()
  
时间日期函数
  获取
    curdate() / current_date()
    curtime() / current_time()
    current_timestamp()
    now()
  提取
    extract()
    year()
    month()
    day()
    hour()
    minute()
    second()
    microsecond()
    date()
    time()
    week()
    quarter()
    monthname()
    dayname()
    dayofyear()
    dayofweek()
    dayofmonth()
  增
    date_add()
  减
    date_sub()
  获取两个日期间的天数
    datediff()
  时间格式化
    date_format()
# 内置函数
user()
database()

bin()
hex()
oct()


soundex()
binary()  区分大小写

charset()
char_length() 以字符为单位
length() 以字节为单位

concat() 字符串拼接,如果有一个参数为NULL,则返回值为NULL
concat_ws() 可以指定连接符,忽略NULL,但不会忽略任何空字符串; concat_ws('-', 1, 2, 3)
group_concat()

cast()  例如: cast(num as char)
conv(num, c_sys, to_sys) 进制转换
format(n,d) 将数字n以'#,###,###.###'的字符串形式返回,以四舍五入的方式保留小数点后d位,若d为0,则表示结果没有小数部分

upper()  将文本的字母部分转化为大写
lower()  将文本的字母部分转化为小写
ucase()
lcase()

insert(str, pos, len, newstr)
# 第一个字符的索引为1
# 如果pos超过str的长度,则直接返回原str;
# 如果len超过str的长度,则从pos开始由newstr完全替换
# 如果newstr长度小于len,则多余的被删除
replace(str, oldstr, newstr)  返回str中的oldstr被newstr替换后的最终字符串。如果oldstr不在里面,返回原str

left(str, len)  返回从str开头开始的len长度字符串  left('abc', 2) --> ab
right(str, len)  返回从str末尾开始的len长度字符串 right('abc', 2) --> bc

mid()
substring(str, pos, len)  取str的pos位置开始返回len长度的字符串
    substring(str from pos for len)
    substring(str from -pos for len)
    substring(str, pos)
    substring(str from pos)
    substring(str from -pos)

# 第一个字符的索引为1
instr(str, substr) 返回substr在str中出现的第一个位置。若没有,返回0
locate(substr, str, pos)  返回substr在str中从pos开始的第一个索引位置,pos可以没有;如果没有,返回0

repeat(str, count) 返回count*str组成的字符串。如果count或者str为NULL,结果为NULL;如果count为0,结果为空字符串
space(n)  返回一个由n个空格组成的字符串
reverse(str)  返回倒序的str

ltrim()  剔除字符串左边的空白字符
rtrim()  剔除字符串右边的空白字符
trim()   剔除字符串两边的空白字符 =
trim(both ' ' from str)
trim(leading 'x' from str)
trim(trailing 'x' from str)

#############################################################################

# 数值处理函数
# sin() / cos() / tan() / abs() / sqrt() / exp() / pow() / pi() /
# log() / -- 默认以e为底; log(2, 4), 表示以2为底
# log10() /
# round(x, y) 机制跟python中的差不多,忽略5那个特性
# RAND()
  返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。

################################################################################

########################################################################################

加密函数
    MD5()
        计算字符串str的MD5校验和
    PASSWORD(str)
        返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。

############################################################################################

# 获取日期时间
curdate() / current_date()  # 返回当前日期
curtime() / current_time()  # 返回时间
current_timestamp()
now()  # 返回当前日期和时间
    例子: create table employee(d date, t time, dt datetime);
            insert employee values(now(), now(), now());

# 提取
EXTRACT() 函数
    MySQL EXTRACT() 函数返回日期/时间的单独部分,比如年、月、日、小时、分钟
        EXTRACT(unit FROM date):
        参数	说明
        date	一个合法的日期表达式
        unit	返回值的类型

        unit 参数可以是以下值
        值	                    说明
        MICROSECOND	            毫秒
        SECONDMINUTEHOURDAY	                    天
        WEEK	                周
        MONTH	                月
        QUARTER	                季度
        YEAR	                年
        SECOND_MICROSECOND	    秒.毫秒
        MINUTE_MICROSECOND	    分..毫秒
        MINUTE_SECOND	        分.秒
        HOUR_MICROSECOND	    小时...毫秒
        HOUR_SECOND	            小时..秒
        HOUR_MINUTE	            小时.分
        DAY_MICROSECOND	        小时...毫秒
        DAY_SECOND	            小时..秒
        DAY_MINUTE	            小时.分钟
        DAY_HOUR	            小时
        YEAR_MONTH	            年.月
        忽略说明中的点号 (.)

        当 unit 为复合类型时,它就是把这些元数据简单的拼接在一起

DATE_ADD() 函数
    MySQL DATE_ADD() 函数用于向日期添加指定的时间间隔
    DATE_ADD(date,INTERVAL expr type)
    参数	说明
    date	合法的日期表达式
    expr	希望添加的时间间隔
    type	时间间隔的类型
    type 参数可选值如下
    值	                    说明
    MICROSECOND	            毫秒数
    SECOND	                秒数
    MINUTE	                分钟数
    HOUR	                小时数
    DAY	                    天数
    WEEK	                周数
    MONTH	                月数
    QUARTER	                季度数
    YEAR	                年数
    SECOND_MICROSECOND	    秒.豪秒
    MINUTE_MICROSECOND	    分.豪秒
    MINUTE_SECOND	        分.秒
    HOUR_MICROSECOND	    小时.豪秒
    HOUR_SECOND	            小时.秒
    HOUR_MINUTE	            小时.分
    DAY_MICROSECOND	        天.豪秒
    DAY_SECOND	            天.秒
    DAY_MINUTE	            天.分钟
    DAY_HOUR	            天.小时
    YEAR_MONTH	            年.月

    例如:
        1. SELECT DATE_ADD(NOW(),INTERVAL 30 DAY );

        2. 给当前时间加上 1天又1小时
           SELECT NOW(), DATE_ADD(NOW(),INTERVAL 1.1 DAY_HOUR );

DATE_SUB() 函数
    MySQL DATE_SUB() 函数从日期减去指定的时间间隔
    DATE_SUB(date,INTERVAL expr type)

DATEDIFF() 函数
    MySQL DATEDIFF() 函数返回两个日期之间的天数,准确的说,是返回两个日期时间午夜 ( 00:00:00 ) 的数目
    DATEDIFF(enddate,startdate)
        如果 enddate 大于 startdate ,那么返回的是正数,反之,返回的是负数
    参数说明
    参数	            说明
    enddate	            开始时间,必须是合法的日期或日期/时间表达式
    startdate	        结束时间,必须是合法的日期或日期/时间表达式

    例如:
        1. 假设我们要返回日期 2017-06-192017-05-18 之间的天数,
           SELECT DATEDIFF('2017-06-19','2017-05-18') AS days;

           如果我们把两个时间对调一下,那么返回的结果就是负数
           SELECT DATEDIFF('2017-05-18','2017-06-19') AS days;

year()
month()
day()
hour()
minute()
second()
microsecond()
date()
time()
week()  # 一年第几周
quarter()  # 季度
monthname()  # 返回当前月的英文名
dayname()
dayofyear()
dayofweek()  返回日期星期几的索引 (1 = Sunday, 2 = Monday, ., 7 = Saturday);这些索引值对应于ODBC标准。
dayofmonth()


# 日期时间格式化:(重点)
date_format(timestr, 日期时间占位符)
    参数	说明
    date	合法的日期
    format	日期/时间的输出格式

    format 参数可使用的元字符有
    元字符	                说明
    %Y	                    年,4%y	                    年,2%m	                    月,数值 ( 00-12 )
    %c	                    月,数值 ( 0 - 12)
    %d	                    月的天,数值 ( 00-31 )
    %e	                    月的天,数值 ( 0-31 )
    %D	                    带有英文后缀的月中的天

    %H	                    小时 ( 00-23 )
    %h	                    小时 ( 01-12 )
    %I	                    小时 ( 01-12 )
    %k	                    小时 ( 0-23 )
    %l	                    小时 ( 1-12 )
    %i	                    分钟,数值 ( 00-59 )
    %S	                    秒 ( 00-59 )
    %s	                    秒 ( 00-59 )
    %f	                    微秒
    %p	                    AM 或 PM
    %r	                    时间,12-小时 ( hh:mm:ss AM 或 PM )
    %T	                    时间, 24-小时 ( hh:mm:ss )

    %j	                    年的天 ( 001-366 )
    %w	                    周的天 ( 0=星期日, 6=星期六 )

    %a	                    缩写星期名
    %W	                    全称星期名
    %b	                    缩写月名
    %M	                    全称月名

    %U	                    周 ( 00-53 )星期日是一周的第一天
    %u	                    周 ( 00-53 )星期一是一周的第一天
    %V	                    周 ( 01-53 )星期日是一周的第一天,与 %X 使用
    %v	                    周 ( 01-53 )星期一是一周的第一天,与 %x 使用

    %X	                    年,其中的星期日是周的第一天,4 位,与 %V 使用
    %x	                    年,其中的星期一是周的第一天,4 位,与 %v 使用

    例子:博客园中的博客多少年多少月发布了几篇博客
            select data_format(sub_time, '%Y-%m'), count(1) from blog group by data_format(sub, '%Y-%m');
            占位符一部分跟Python里面的一样
            https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format


更多信息:
https://dev.mysql.com/doc/refman/5.7/en/functions.html

执行函数

select upper('egon');

获取函数返回值

select UPPER('egon') into @res;
SELECT @res;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值