• MySQL常见函数


      概念:函数类似于java的方法(将实现某个功能的逻辑语句封装到方法中,对外暴露一个公开的名字,就是方法名)。

    好处:
      1.隐藏类具体功能的实现细节
      2.提高代码的重用性

    调用:
      SELECT 函数名(实参列表) (实参和形参的 个数、类型 必须一致)
      FROM 表(根据需要:函数的参数用到表中的字段)
    过程:调用该函数,把函数的逻辑语句执行完,将它的返回值显示出来。

    分类:

    1.单行函数:处理数据使用。传入一个参数,处理完后,最终会有一个返回值
    如:CONCAT(str1,str2,...)、LENGTH(str)、IFNULL(expr1,expr2)等

    2.分组函数:简称组函数
    功能:做统计使用。传入一组参数,最终返回一个值。又称为统计函数、聚合函数。

    1.单行函数: 输入一行,输出也还是一行,检索一行处理一次;
    2.多行函数: 输入多行数据,输出是一个结果,检索出来的数据分成组后再进行处理;

    根据参数类型不同,可以分为:
    字符类函数: 是专门用于字符处理的函数,处理的对象可以是字符或字符串常量,也可以是字符类型的列;

    函数 说明
    ascii© 返回一个字符的ASCII码,c表示一个字符
    chr(i) 返回给出ASCII码值所对应的字符,i表示一个ASCII码值
    concat(s1,s2) 将字符串s2连接到字符s1的后面;若s1为null,则返回s2;若s2为null,则返回s1;若s1和s2都为空,则返回null
    initcap(s) 将字符串s的每个单词的第一个字母大写,其他字母小写;单词之间用空格、控制字符、标点符号来区分
    instr(s1,s2[,i][,j])

    返回字符串s2在字符串s1中第j次出现的位置,搜索从字符串s1的第i个字符开始;

    当没有发现要查找的字符时,该函数的返回值为0;

    i为负数,则搜索将从右到左进行,但函数的返回位置还是按从左到右来计算;

    s1和s2均为字符串,i和j均为整数,默认值为1

    length(s) 返回字符串s的长度;若s为null,则返回值为null
    lower(s) 返回字符串s的小写形式
    upper(s) 返回字符串s的大写形式
    ltrim(s1,s2) 删除字符串s1左边的字符串s2
    rtrim(s1,s2) 删除字符串s1右边的字符串s2
    trim(s1,s2) 删除字符串s1左右两端字符串s2
    replace(s1,s2[,s3]) 使用s3字符串替换出现在s1字符串中的所有s2字符串,并返回替换后的新字符串;s3的默认值为空字符串
    substr(s,i[,j]) 从字符串s的第i个位置开始截取长度为j的子字符串;若省略j,则直接截取到尾部

    SHOW VARIABLES LIKE '%char%'/*显示客户端的字符集*/

    #1.length获取参数长度'字节个数'

    SELECT
    LENGTH('john');

    #2.CONCAT(str1,str2,...) 拼接字符串

    SELECT
    CONCAT(last_name,'_',first_name) AS 姓名
    FROM
    employees;

    #3.upper、lower

    SELECT UPPER('john');#小转大
    SELECT LOWER('JOHN');#大转小

    #4.substr、substring截取字符串

    '方法的重载名字一样,参数列表不一样'
    'MySQL中的索引都是从1开始的'
    '使用1个参数的,截取从指定索引处,后面的所有字符' SELECT SUBSTR('李莫愁爱上了陆展元',7) 结果;
    '使用2个参数的,截取从指定索引处,指定长度的字符' SELECT substr('李莫愁爱上了陆展元',1,3) 结果;

    #5.instr:返回字符串中,子串的起始索引(第一次出现的地方),没有返回0

    SELECT INSTR ('杨不悔殷六侠爱上了殷六侠','殷8侠') AS out_put;

    #6trim去除前后的空格

    SELECT LENGTH( TRIM('    张翠山     ') )AS OUt_PUT;
    
    '去除前后的字符'
    SELECT TRIM('a' FROM 'aaaaaa张aaaaaa翠山 aaaaaa') AS OUt_PUT;
    '如果写的是两个字符,就会被系统认为是一个单位,然后系统去匹配相应的字符' SELECT TRIM('aa' FROM 'aaaaaaa张aaaaaa翠山 aaaaaaa') AS OUt_PUT; '以上中间的都被认为是有效的字符,不能用这个去除'

    #7.lpad (‘要左填充的字符串,指定长度,指定字符’)

    '字符串最终的长度就是指定的长度,超过了就会截断。后面的都不会显示'
    SELECT LPAD ('殷素素',10,'*') AS OUT_PUT

    #8.rpad (‘要右填充的字符串,指定长度,指定字符’) 

    '字符串最终的长度就是指定的长度,超过了就会截断。后面的都不会显示'
    SELECT RPAD ('殷素素',12,'ab') AS OUT_PUT

    #9.replace '替换(全部替换)'‘字符串,要替换的内容,替换的内容’

    SELECT REPLACE('张周芷若无周芷若忌周芷若爱上了周芷若','周芷若','赵敏');

    数字类函数: 主要用于执行各种数据计算,所有的数字类函数都有数字参数并返回数字值;

    函数 说明
    abs(n) 返回n的绝对值
    ceil(n) 返回大于或等于数值n的最小整数
    cos(n) 返回n的余弦值,n为弧度
    exp(n) 返回e的n次幂,e=2.71828183
    florr(n) 返回小于或等于n的最大整数
    log(n1,n2) 返回以n1为底n2的对数
    mod(n1,n2) 返回n1除以n2的余数
    power(n1,n2) 返回n1的n2次方
    pound(n1,n2)

    返回舍入小数点右边n2位的n1的值,n2的默认值为0,这会返回小数点最接近的整数;

    如果n2为负数,就舍入到小数点左边相应的位上,n2必须是整数

    sign(n) 若n为负数,则返回-1;若n为正数,则返回1;若n=0,则返回0
    sin(n) 返回n的正弦值,n为弧度
    sqrt(n) 返回n的平方根,n为弧度
    trunc(n1,n2)

    返回结尾到n2位小数的n1的值,n2的默认设置为0,

    当n2为默认设置时,会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上

    #round 四舍五入

    '绝对值四舍五入,然后再去加正负号'
    SELECT ROUND(-1.65);
    
    '小数点后保留几位'
    SELECT ROUND(1.567,2);

    #ceil 屋顶

    '向上取整',返回 >= 该参数的最小整数,大于里面最小的整数
    SELECT CEIL(-1.56);

    #floor 地板

    '向下取整',返回 <= 该参数的最大整数,小于里面最大的整数
    SELECT FLOOR(-9.99);

    #truncate 截断

    '小数点后保留几位'
    SELECT TRUNCATE(1.65,1);

    #mod'取余'

    SELECT MOD(-10,-3);
    SELECT -10%-3;
    '结果一样'
    
    '被除数为正就为正,被除数为负就为负'
    
    a除b求余数
    MOD (a,b) :    a-a/b*b
    MOD (-10,-3) : -10 - (-10 / -3) * -3 =-1
    
    ' (java中除号左右两边都为整数结果取整) 求余数的运算'

    rand:获取随机数(默认返回0-1之间的小数,无限接近于1,到不了1)

    区间有开区间和闭区间,其中又分为全开区间( ),全闭区间[ ],

    左开右闭区间( ] 和左闭右开区间 [ ),

    开区间的意思是区间两处的端点值取不到,而闭区间的端点值就可以取到。

    例如区间[2,6),他是一个左闭右开的区间,

    那么在这2~6之间的数字我都可以取到,而且可以取到2,但不可以取到6.

    日期和时间类函数: 用于处理日期和时间的函数,可以实现计算需要的特定日期和时间;
    日期类型的默认格式是“DD-MON-YY”,DD表示两位数字的“日”,MON表示3位数字的“月份”,YY表示两位数字的“年份”;

    函数 说明
    add_months(d,i) 返回日期d加上i个月之后的结果,i为任意整数
    last_day(d) 返回包含日期d月份后的最后一天
    months_between(d1,d2)

    返回d1和d2之间的数目,若d1和d2的日期都相同,或者都是该月的最后一天,

    则返回一个整数,否则返回的结果将包含一个小数

    new_time(d1,t1,t2) 当时区t1中的日期和时间是d1时,返回时区t2中的日期和时间;d1是一个日期数据类型,t1和t2是字符串
    sysdate() 返回系统当前的日期

    #now

    '返回系统当前日期+时间'
    SELECT NOW();

    #curdate

    '返回系统当前日期,不包括时间'
    SELECT curdate();

    #curtime

    '返回当前时间,不包括日期'
    SELECT curtime();

    #获取指定的部分:年、月、日、时、分、秒

    SELECT YEAR(NOW()) 年;
    SELECT YEAR('1999-2-22');
    SELECT YEAR(hiredate) 年
    FROM employees;
    SELECT MONTH(NOW()) 月;

    #显示英文的月份

    SELECT MONTHNAME(NOW()) 月;
    SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d');#c是没有0的,默认但显示日期的格式是有0的
    AS out_put;

    #查询入职日期为1992-4-3的员工信息

    SELECT 
    *
    FROM
    employees
    WHERE
    hiredate = '1992-4-3';
    
    

    #STR_TO_DATE:将日期格式的字符串 转换成指定格式的日期‘日期格式解析’

    在web页面上输入的东西最终返回一个字符串
    SELECT 
    *
    FROM
    employees
    WHERE
    hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');

    #date_format:将日期转换成字符串 :按照指定格式转换

    SELECT DATE_FORMAT(NOW(),'%y年%m月%d日')

    #查询有奖金员工和入职日期(xx月/xx日 xx年)

    SELECT
    last_name,DATE_FORMAT(hiredate,'%m月/%d日 %Y年') 入职日期
    FROM
    employees
    WHERE
    commission_pct IS NOT NULL;

    返回两个日期之间的时间。

    DATEDIFF(expr1,expr2) 日期函数
    
    参数的类型都是日期类型,用前面的减去后面的。日期的常量值用‘’单引号引起来

    流程控制函数
    #if函数:三元运算符

    SELECT IF(expr1,expr2,expr3)条件1;成立返回2;不成立返回3
    
    SELECT IF(10>5,'','');

    #2.case函数

    使用一:switch-case的效果
    java中

    swich(变量表达式){
      case 常量值:语句1;
      break;
      .....
      default:语句n;
      break;
    }

    判断case的值是否相等

    MySQL中

    case 要判断的字段或表达式
    when 常量1 then 要显示的值1 或要显示的语句1(语句要加;号,值不用)
    when 常量2 then 要显示的值2 或要显示的语句2
    .....
    else(代表默认情况,不满足以上的条件时执行) 要显示的值n或语句n;
    end(case的结尾)

    案例:查询员工的工资,要求
    部门号=30,显示的工资为1.1倍
    部门号=40,显示的工资为1.2倍
    部门号=50,显示的工资为1.3倍
    其他部门,显示的工资为原工资

    SELECT
    salary AS 原始工资,
    department_id,
    CASE department_id 
    WHEN 30 THEN salary * 1.1 
    WHEN 40 THEN salary * 1.2 
    WHEN 50 THEN salary * 1.3
    ELSE salary 
    END AS 新工资
    
    FROM
    employees;

    #3.case 函数的使用二:类似于 多重if 判断区间
    Java中:

    if(条件1){
    语句1;
    }else if(条件2){
    语句2;
    }
    ...
    else{
    语句n;
    }

    mysql中:

    case 
    when 条件1 then 要显示的值1或语句1(如果是true就执行,不是换下一个)
    when 条件2 then 要显示的值2或语句2
    ...
    else 要显示的值n或语句n
    end


    案例:查询员工的工资情况
    如果工资>20000,显示A级别
    如果工资>15000,显示B级别
    如果工资>10000,显示C级别
    否则,显示D级别

    SELECT salary,
    CASE 
    WHEN salary>20000 THEN 'A'
    WHEN salary>15000 THEN 'B'
    WHEN salary>10000 THEN 'C'
    ELSE 'D'
    END AS 工资级别
    FROM employees;

    转换类函数: 用于将数据从一种类型转换为另外一种类型;

    函数 说明

    chartorwida(s)

    该函数将字符串s转换为rwid数据类型
    convert(s,aset[,bset]) 该函数将字符串s由bset字符集转换为aset字符集
    rowidtochar() 该函数将rowid数据类型转换为char类型
    to_char(x[,format]]) 该函数实现将表达式转换为字符串,format表示字符串格式
    to_date(s[,format[lan]]) 该函数将字符串s转换为date类型,format表示字符串格式,lan表示所使用的语言
    to_number(s[,format[lan]]) 该函数将返回字符串s代表的数字,返回值按照format格式进行显示,format表示字符串格式,lan表示所使用的语言

    聚合类函数: 用于对一组数据进行计算,并得到相应的结果;

    函数 说明
    avg(x[distinct/all]) 计算选择列表项的平均值,列表项目可以是一个列或多个列的表达式
    count(x[distinct/all]) 返回查询结果中的记录数
    max(x[distinct/all]) 返回选择列表项目中的最大数,列表项目可以是一个列或多个列的表达式
    min(x[distinct/all]) 返回选择列表项目中的最小数,列表项目可以是一个列或多个列的表达式
    sum(x[distinct/all]) 返回选择列表项目的数值总和,列表项目可以是一个列或多个列的表达式
    variance(x[distinct/all]) 返回选择列表项目的统计方差,列表项目可以是一个列或多个列的表达式
    stddev(x[distinct/all]) 返回选择列表项目的标准偏差,列表项目可以是一个列或多个列的表达式

    功能:功能:做统计使用。传入一组参数,最终返回一个值。又称为统计函数、聚合函数。简称组函数

    分类:
    sum 求和、avg 平均值、max 最大值、min 最小值、count 计算个数

    特点:
      1.sum、avg 用于处理数值类型
        max、min、count 可以处理任何类型
          count只计算非空的值的个数
      2.以上分组函数都忽略null值
      3.可以和distinct搭配实现去重的运算
      4.count函数的单独介绍
        一般使用count(*)统计行数
      5.和分组函数一同查询的字段要求是group by后的字段,其他的都不行


    1.简单的使用:
    参数中直接放要操作的字段

    SELECT
    SUM( salary ) 
    FROM
    employees;
    
    SELECT
    AVG( salary ) 
    FROM
    employees;
    
    SELECT
    MAX( salary ) 
    FROM
    employees;
    
    SELECT
    MIN( salary ) 
    FROM
    employees;
    
    SELECT
    COUNT( salary ) 
    FROM
    employees;
    
    SELECT
    SUM( salary ) 和,
    ROUND( AVG( salary ), 2 ) 平均值,
    MAX( salary ) 最大值,
    MIN( salary ) 最小值,
    COUNT( salary ) 个数 
    FROM
    employees;

    2.参数支持哪些类型

    SELECT SUM(last_name),AVG(last_name) FROM employees;#不支持字符型
    SELECT SUM(hiredate),AVG(hiredate) FROM employees;#不支持日期型
    
    SELECT MAX(last_name),MIN(last_name) FROM employees;#支持字符型
    SELECT MAX(hiredate),MIN(hiredate) FROM employees;#支持日期型,数值大就大
    
    SELECT COUNT(last_name) FROM employees;#计算非空的值
    SELECT COUNT(commission_pct) FROM employees;#计算非空的值

    3.忽略null值

    SELECT SUM(commission_pct),AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 
    FROM employees;

    因为null加任何值都为null,由答案已知null没有参加运算

    由算式得出答案,SUM(commission_pct)/35和AVG(commission_pct)的答案相等,
    所以avg也忽略了null值

    SELECT MAX(commission_pct),MIN(commission_pct)
    FROM employees;
    如果计算null值最小值那么就是null

    4.和distinct搭配

    SELECT SUM(DISTINCT salary),SUM(salary)
    FROM employees;
    
    SELECT COUNT(DISTINCT salary),COUNT(salary)
    FROM employees;

    count函数的详细介绍

    #统计该字段非空值的个数
    SELECT COUNT(salary) FROM employees;
    
    #统计行 数,一行中只要有一个不为null就+1
    SELECT COUNT(*) FROM employees;
    
    #count可以加常量值就相当于在表中加了一列这样的常量值统计个数
    SELECT COUNT(1) FROM employees;

    效率:
    5.5之前:MYISAM存储引擎,在这个引擎中:count(*)的效率最高,
    因为在这个引擎中有个有一个计数器,直接就返回了个数

    5.5开始:INNODB存储引擎,这这个引擎中:count(*)和count(1)的效率差不多,
    但绝对比count(字段)要高,因为加字段需要判断,
    判断该字段的值是否为null如果为null就不加1如果不为null才加1。
    有一个判断的过程。

    5.和分组函数一同查询的字段有限制
    查询的结果要求是一个完整的表格

    SELECT AVG(salary),employee_id
    FROM employees;

    附: dual是Oracle系统内部提供的一个用于实现临时数据计算的特殊表,它只有一个列DUMMY,类型为VARCHAR2(1);

    #查看数据库系统的版本号

    SELECT VERSION();

    #查看当前数据库

    SELECT DATABASE();

    #当前用户

    SELECT USER();

    #返回该字符的密码形式就是自动加密

    password('字符串');

    #返回该字符的md5加密形式

    md5('字符串');
  • 相关阅读:
    iOS设计模式之简单工厂模式
    Spring Boot Admin的使用
    使用Maven创建一个Spring MVC Web 项目
    SpringMVC简单项目配置
    web框架之Spring-MVC环境搭建
    搭建Spring4+Spring MVC web工程的最佳实践
    IntelliJ IDEA和Eclipse最常用的快捷键对应表:
    Cleanup failed to process the following paths错误的解决
    idea的修改文件变颜色
    IDEA下搜狗输入法输入中文时卡着不动的参考解决方法
  • 原文地址:https://www.cnblogs.com/rijiyuelei/p/12324324.html
Copyright © 2020-2023  润新知