zoukankan      html  css  js  c++  java
  • 第五节:常见函数

    一、常见函数

      1、函数

        函数:将一组逻辑语句封装在方法体重,对外暴露方法名;

      2、好处

        (1)隐藏了实现细节;

        (2)提高代码的复用性;

      3、函数调用

        语法:

    select 函数名(实参列表) 【from 表】;
    

      

      4、分类

        (1)单行函数

          如:concat、length、ifNull 等

        (2)分组函数

          功能:做统计使用,由称统计函数,聚合函数,组函数;

      5、常见函数

        (1)字符函数

    Lower()
    Upper()
    concat()
    substr()
    length()
    Instr()
    Lpad()
    Rpad()
    Trim()
    replace()
    

      

        (2)数学函数

    round()
    ceil()
    floor()
    truncate()
    mod()
    

        (3)日期函数

    now()
    curdate()
    curtime()
    year()
    month()
    monthname()
    day()
    hour()
    minute()
    second()
    str_to_date()
    date_format()
    

        (4)其他

    version()
    database()
    user()
    

        (5)控制函数

    if
    case
    

    二、字符函数

      1、大小写控制函数

        这类函数可以改变字符的大小写。

        

         案例:

    SELECT UPPER('John');  #JOHN
    SELECT UPPER('john');  #JOHN
    
    SELECT LOWER('John');  #john
    SELECT LOWER('john');  #john
    

        案例2:将姓变大写,名变小写,然后拼接

    SELECT 
      CONCAT(UPPER(last_name), LOWER(first_name)) 姓名 
    FROM
      employees ;

      

      2、length()

        Length():获取参数值的字节个数

        案例:

    SELECT LENGTH('john');  # 4
    

          案例2:

    SELECT LENGTH('张三丰');   #9
    

          注意:在客户器端使用的 utf8 编码即,所以一个汉字占三个字节。

        查看字符集:

    SHOW VARIABLES LIKE '%char%';
    

          

      3、concat()

        concat():用于拼接字符串

        案例:

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

        还可以使用别名指定列:

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

      

      4、substr() | substring()

        这两个函数功能是一样的,都是截取从指定索引处后面所有的字符。

        注意:MySQL 中的索引是从1开始的。

        这两个函数都有重载的方式:

        方式一:对字符串 str 从pos位置截取到末尾;截取从指定索引处后面所有字符

    substr(str, pos);
    

      

        方式二:对字符串 str 从 pos 位置开始截取,截取从指定索引处指定字符长度的字符

    substr(str, pos, len);
    

        一定要注意,这里截取的字符长度

        案例1:

    SELECT 
      SUBSTR('Hello Java', 1, 5) out_put ;
    

      

        案例2:

    SELECT 
      SUBSTR('我爱中国', 1, 2) out_put ;
    

      

        应用:姓名中首字符大写,其他字符小写,然后用"_"拼接,显示出来

    SELECT 
      CONCAT(
        UPPER(SUBSTR(last_name, 1, 1)),
        "_",
        LOWER(SUBSTR(last_name, 2))
      ) 姓名 
    FROM
      employees ;
    

      

      5、instr(str, substr)

        instr(str, substr):返回 substr 第一次出现的索引,如果找不到返回 0

        案例:

    SELECT 
      INSTR(
        '张无忌大战光明顶光明顶',
        '光明顶'
      ) AS out_put ;  # 6
    

      

      6、trim() 

        trim() 去除字符串首尾空格;

        案例1:

    SELECT 
      LENGTH(TRIM('  张翠山  ')) AS out_put ;     #6
    

        trim() 还可以在字符串首尾中去除指定的字符

        语法:

    trim(要去除的字符 from str);
    

        案例2:

    SELECT 
      TRIM(
        'a' FROM 'aaaaaaaaaaa张aaaa翠山aaaaaaaaaaa'
      ) AS out_put ;
    

      

      7、lpad()

        lpad():用指定的字符实现左填充指定长度,如果多了会截断

        案例1:

    SELECT 
      LPAD('殷素素', 10, '*') AS out_put ;    # *******殷素素
    

        案例2:

    SELECT 
      LPAD('殷素素', 2, '*') AS out_put ;  #殷素
    

      

      8、rpad()

        rpad() 用指定的字符实现左填充指定长度,如果多了会截断

        案例1:

    SELECT 
      RPAD('殷素素', 12, 'a') AS out_put ;  #殷素素aaaaaaaaa
    

      

        案例2:

    SELECT 
      RPAD('殷素素', 2, 'a') AS out_put ;   #殷素
    

      

      9、replace()

        replace(str, A, B):会把字符里的字符 A 全部替换为 B

        案例:

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

      

    三、数学函数

      1、round():四舍五入

        round():四舍五入函数

        案例:

    SELECT ROUND(3.14159);  # 3  默认取整
    
    SELECT ROUND(3.14159, 2); # 3.14 保留到指定精度,保留多少位小数
    

      

      2、ceil():向上取整

        ceil():向上取整,返回大于等于该参数的最小整数

        案例:

    SELECT CEIL(1.52);  # 2
    
    SELECT CEIL(1.01);  # 2
    
    SELECT CEIL(1.00);  # 1
    
    SELECT CEIL(-1.10);  # -1
    

      

      3、floor():向上取整

        floor():向上取整,返回小于等于该参数的最大整数

        案例:

    SELECT FLOOR(9.99); # 9
    
    SELECT FLOOR(-9.99); # -10
    

      

      4、truncate() 截断

        truncate 截断,小数点后保留几位,不需要进位,直接截断

        案例:

    SELECT TRUNCATE(1.6999, 2);  # 1.69
    

      

      5、mod()  取余

        mod()  取余

        案例:

    SELECT MOD(10, 3); # 1
    SELECT 10 % 3;     # 1
    SELECT MOD(-10, 3); # -1
    SELECT -10 % 3;     # 1
    

        扩展:mod 的是怎么计算的呢?

    mod(a, b) =>  a-a/b*b

        例如:

    mod(-10,-3):-10- (-10)/(-3)*(-3)=-1
    

      

    四、日期函数

      1、now():获取当前系统日期+时间

    SELECT NOW();   #2021-06-15 16:13:36
    

      

      2、curdate():返回当前系统日期,不包含时间

    SELECT CURDATE();  #2021-06-15
    

      

      3、curtime() 返回当前时间,不包含日期

    SELECT CURTIME();  #16:14:42
    

      

      4、获取指定的部分

    SELECT YEAR(NOW());  #2021   年份
    
    SELECT MONTH(NOW());  #6     月份
    
    SELECT MONTHNAME(NOW());  #June   月份(英文)
    
    SELECT DAY(NOW());    #15         日
      
    SELECT DAYNAME(NOW()); #Tuesday   周几
    
    SELECT HOUR(NOW());  #16          小时
    
    SELECT MINUTE(NOW());  #18        分钟
    
    SELECT SECOND(NOW());  #35         秒
    

      

      5、str_to_date:将日期格式的字符转换成指定格式的日期

        

        案例:

    SELECT STR_TO_DATE('1998-3-02', '%Y-%c-%d');
    

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

    SELECT 
      * 
    FROM
      employees 
    WHERE hiredate = STR_TO_DATE('4-3 1992', '%c-%d %Y') ;
    

      

      6、date_format:将日期转换成字符

        案例:

    SELECT 
      DATE_FORMAT('2021-6-8', '%Y年%m月%d日') AS out_put ;
    

      

        应用:

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

      

    五、其他函数

      1、查看MySQL版本号

    SELECT VERSION(); 
    

      

      2、查看当前使用的数据库

    SELECT DATABASE();
    

      

      3、查看当前登录用户

    SELECT USER();
    

      

    六、流程控制函数

      1、if 函数

        语法:

    IF(expr1, expr2, expr3)
    

        当 expre1 为true,执行 expr2,否则执行 expr3

        案例:

    SELECT IF(10 > 5, '大', '小');
    

      

        应用:

    SELECT 
      last_name,
      commission_pct,
      IF (
        commission_pct IS NULL,
        '呵呵',
        '有奖金,哈哈'
      ) AS 备注 
    FROM
      employees ;
    

      

      2、case 函数

        (1)方式一:完全匹配(类似于 switch... case 的效果)

          语法:

    case 要判断的变量、字段或表达式
    when 常量1 then 要显示的值1或语句1;
    when 常量2 then 要显示的值2或语句2;
    when 常量3 then 要显示的值3或语句3;
    
    ...
    else 要显示的值n或语句n;
    end
    

         案例:查询员工的工资,要求

          ① 部门号=30,显示的工资为1.1倍;
          ② 部门号=40,显示的工资为1.2倍;
          ③ 部门号=50,显示的工资为1.3倍;

          ④ 其他部门,显示的工资为原工资

    SELECT salary 原始工资, 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;
    

      

        (2)方式二:范围匹配(类似于多重 if)

        语法:

    case 
    when 条件1 then 要显示的值1或语句1;
    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;
    

      

    七、练习

      1、显示系统时间(注:日期+时间)

    SELECT NOW();
    

      

      2、查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)

    SELECT 
      employee_id,
      last_name,
      salary,
      salary * 1.2 "new salary" 
    FROM
      employees ;
    

      

      3、将员工的姓名按首字母排序,并写出姓名的长度(length)

    SELECT 
      LENGTH(last_name) 长度,
      SUBSTR(last_name, 1, 1) 首字符,
      last_name 
    FROM
      employees 
    ORDER BY 首字符 ;
    

      

      4、做一个查询,产生下面的结果

        <last_name> earns <salary> monthly but wants <salary*3>
        Dream Salary
        King earns 24000 monthly but wants 72000

    SELECT CONCAT(last_name,' earns ',salary,' monthly but wants ',salary*3) AS "Dream Salary"
    FROM employees
    WHERE salary=24000;
    

      

      5、使用case-when,按照下面的条件:

        job       grade
        AD_PRES       A
        ST_MAN      B
        IT_PROG     C
        SA_REP       D
        ST_CLERK     E
        产生下面的结果
        Last_name   Job_id   Grade
        king      AD_PRES   A

    SELECT last_name,job_id AS  job,
    CASE job_id
    WHEN 'AD_PRES' THEN 'A' 
    WHEN 'ST_MAN' THEN 'B' 
    WHEN 'IT_PROG' THEN 'C' 
    WHEN 'SA_PRE' THEN 'D'
    WHEN 'ST_CLERK' THEN 'E'
    END AS Grade
    FROM employees
    WHERE job_id = 'AD_PRES';
    

      

  • 相关阅读:
    浅谈数据分析中的“暗物质”
    浅谈数据分析中的“暗物质”
    房屋价格数据采集与分析
    房屋价格数据采集与分析
    基于Python对象引用、可变性和垃圾回收详解
    基于Python对象引用、可变性和垃圾回收详解
    人脸识别中常用的几种分类器
    人脸识别中常用的几种分类器
    解析新零售,互联网大数据时代的到来
    osg::NodeVisitor中计算一个节点对应的世界变换矩阵、法向量、顶点坐标
  • 原文地址:https://www.cnblogs.com/niujifei/p/14885549.html
Copyright © 2011-2022 走看看