进阶4:常见函数

#进阶4:常见函数

        /*

        概念:将一组逻辑语句封装在一组方法体中,对外暴露方法名
        好处:1、隐藏了实现细节  2、提高代码的重用性
        调用:select 函数名(实参列表) 【from 表】;
        特点:
            1、叫什么(函数名)
            2、干什么(函数功能)

        分类:
            1、单行函数
            如:concat、length、ifnull等
            2、分组函数
            功能:做统计使用,又称为统计函数、聚合函数、组函数
            
        常见函数:
            字符函数:
            length
            concat
            substr
            instr
            trim
            upper
            lower
            lpad
            rpad
            replace
            
            数学函数:
            round
            ceil
            floor
            truncate
            mod
            
            日期函数
            now
            curdate
            curtime
            year
            month
            monthname
            day
            hour
            minute
            second
            str_to_date
            date_formate
            
            其他函数
            version
            database
            user
            
            控制函数
            if
            case
            
        */

        #一、字符函数

        #1、length 获取参数值的字符个数
        SELECT LENGTH('john') AS 长度;
        SELECT LENGTH('张三丰hahaha'); # utf-8 一个字母一个字节,一个汉字三个字节;

        SHOW VARIABLES LIKE '%char%';

        #2、concat 拼接字符串

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

        #3upperlower
        SELECT UPPER('john');
        SELECT LOWER('John');
        #示例:将姓变大写,名变小写,然后拼接
        SELECT CONCAT(UPPER(`last_name`),LOWER(`first_name`)) AS 姓名 FROM `employees`;

        #4、substr、 substring
        注意:索引从1开始
        #截取从指定索引处后面所有字符
        SELECT SUBSTR('李莫愁爱上了陆展元', 7) AS out_put;

        #截取从指定索引处指定字符长度的字符
        SELECT SUBSTR('李莫愁爱上了陆展元', 1, 3) AS out_put;

        #案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来;

        SELECT CONCAT(UPPER(SUBSTR(`last_name`, 1, 1)), '_', SUBSTR(`last_name`, 2), `first_name`) AS 姓名 
        FROM `employees`;

        #5、instr 返回子串第一次出现的索引,如果找不到返回0

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

        #6、trim 去掉前后指定的字符,默认为‘空’

        SELECT TRIM('      张翠山      ') AS out_put;
        SELECT LENGTH(TRIM('      张翠山      ')) AS out_put;
        SELECT TRIM('a' FROM 'aaaaaaaaaaa张翠山aaaaaaaaaaaaa') AS out_put;
        SELECT TRIM('aa' FROM 'aaaaaaaaaaa张aaaaaaaaaa翠山aaaaaaaaaaaaa') AS out_put;

        #7、lpad 用指定的字符实现左填充指定的长度

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

        #8、rpad 用指定的字符实现右填充指定的长度

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

        #9replace 替换

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



        #二、数学函数

        #round 四舍五入

        SELECT ROUND(1.45);
        SELECT ROUND(1.55);
        SELECT ROUND(-1.45);
        SELECT ROUND(1.567878, 2); 

        #ceil 向上取整,返回>=该参数的最小整数

        SELECT CEIL(1.002);

        SELECT CEIL(-1.002);

        #floor 向下取证,返回<=该参数的最大整数

        SELECT FLOOR(-9.99);

        #truncate 截断 小数点后截取只剩 n 位

        SELECT TRUNCATE(1.6999999, 1);

        #mod 取余

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


        #三、日期函数

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

        #curdate 返回当前系统日期,不包含时间
        SELECT CURDATE();

        #curtime 返回当前时间,不包含日期
        SELECT CURTIME();

        #可以获取指定的部分,年、月、日、小时、分钟、秒
        SELECT YEAR(NOW()) 年;
        SELECT YEAR('1998-10-1') 年;

        SELECT YEAR(hiredate) 年 FROM employees;
        SELECT MONTH(NOW()) 月;
        SELECT MONTHNAME(NOW()) 月;

        # str_to_date 将字符通过指定的格式转换成日期
        SELECT STR_TO_DATE('1998-3-2','%Y-%m-%d');
        SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d');

        #案例:查询入职日期为1992-4-3的员工信息
        SELECT * FROM employees WHERE hiredate = '1992-4-3';

        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年') AS '入职日期' FROM `employees`;

        #四、其他函数

        SELECT VERSION();
        SELECT DATABASE();
        SELECT USER(); #当前用户

        #五、流程控制函数
        #1.if函数: if else 的效果

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

        SELECT `last_name`, `commission_pct`, IF(`commission_pct`, '有奖金,嘻嘻', '没奖金,呵呵') FROM `employees`;


        #2.case函数的使用一:switch case的效果
        /*
        java 中
        switch(){
            case 常亮1:语句1;break;
            ......
            default:语句n;break;
        }

        mysql 中

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

        */

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

        部门号=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` ;


        #3case 函数的使用二:类似于 多重if
        /*
        java中
        if(条件1){
            语句1:
        }else if(条件2){
            语句2
        }
        ....
        else{
            语句n
        }

        mysql中

        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`>20000 THEN 'B'
        WHEN `salary`>20000 THEN 'C'
        ELSE 'D'
        END AS '工资级别'
        FROM `employees`;



        #二、分组函数
        /*

        功能:用作统计使用,又称为聚合函数或统计函数或组函数

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

        特点:
        1、sum、avg 一般用于处理数值类型
           max、min、count 可以处理任何类型
        2、以上分组函数都忽略null 值

        3、可以和distinct搭配实现去重的运算

        4、count函数的单独介绍
        一般使用 count(*) 用来统计行数

        5、和分组函数一同查询的字段要求是group by后的字段

        */

        #1、简单地使用
        SELECT SUM(salary) FROM employees;
        SELECT AVG(salary) FROM employees;
        SELECT MIN(salary) FROM employees;
        SELECT MAX(salary) FROM employees;
        SELECT COUNT(salary) FROM employees;

        SELECT SUM(salary),AVG(salary),MIN(salary),MAX(salary),COUNT(salary) FROM employees;

        SELECT SUM(salary),ROUND(AVG(salary),2),MIN(salary),MAX(salary),COUNT(salary) FROM employees;

        #2、参数支持哪些类型

        SELECT COUNT(last_name) FROM employees;  # count 计算非空的值的总数,不为null的个数

        SELECT MAX(last_name), MIN(last_name) FROM employees;

        SELECT MAX(hiredate), MIN(hiredate) FROM employees;


        #3、是否忽略null


        #4、和distinct搭配

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

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

        #5、count函数的详细介绍

        SELECT COUNT(salary) FROM employees;

        SELECT COUNT(*) FROM employees;
        SELECT COUNT(1) FROM employees;
        SELECT COUNT('abc') FROM employees;

        效率:
        MYISAM 存储引擎下, COUNT(*) 的效率高
        INNODB 存储引擎侠, COUNT(*) 和 COUNT(1) 的效率差不多,比 COUNT(字段)高一些

        #6、和分组函数一同查询的字段有限制

 

posted @ 2020-02-26 11:18  gupanpan  阅读(87)  评论(0)    收藏  举报