zoukankan      html  css  js  c++  java
  • MySQL进阶四

    #进阶4:常见函数

    /*
    概念:类似于Java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
    好处: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
    minute
    second
    str_to_date
    date_format

    其他函数
    version
    database
    user

    控制函数
    if
    case

    */


    #一,字符函数
    #1.length 获取参数值的字节个数
    SELECT LENGTH('john');

    #2.concat 拼接字符串
    SELECT CONCAT(last_name,'_',first_name) AS 姓名
    FROM employees;

    #3.upper,lower
    SELECT UPPER('john');
    SELECT LOWER('john');

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

    #4.substr,substring
    #注意:索引从1开始
    #截取从指定索引处指定的指定字符长度
    SELECT SUBSTR('伏地魔大战汤姆猫',6) AS 'out_put';
    SELECT SUBSTR('伏地魔大战汤姆猫',2,3) AS 'out_put';

    #示例:姓名中首字符大写,其他字符小写,然后用_拼接,显示
    SELECT CONCAT(UPPER(SUBSTR(CONCAT(last_name,first_name),1,1)),'_',LOWER(SUBSTR(CONCAT(last_name,first_name),2)))
    FROM employees;

    #5.instr 返回子串第一次出现的索引,如果找不到返回0
    SELECT INSTR('伏地魔大战汤姆猫','汤姆') AS 'out_put';

    #6.trim 去重
    SELECT TRIM(' 汤姆猫 ') AS 'out_put';
    SELECT TRIM('a' FROM 'aaaaaaaaaaaa汤aaaaaaaa姆aaaaaaa猫aaaa') AS 'out_put';

    #7.lpad 用指定的字符实现左填充长度
    SELECT LPAD('汤姆猫',10,'*') AS 'out_put';

    #8.rpad 用指定的字符实现右填充长度
    SELECT RPAD('汤姆猫',10,'*') AS 'out_put';

    #9.replace 替换
    SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏') AS 'out_put';


    #二,数学函数
    #1.round 四舍五入
    SELECT ROUND(1.65);
    SELECT ROUND(1.6095,2);

    #2.ceil 向上取整,返回>=该参数的最小整数
    SELECT CEIL(1.00);

    #3.floor 向下取整,返回<=该参数的最大整数
    SELECT FLOOR(1.00);

    #4.truncate 截断
    SELECT TRUNCATE(1.66699,1);

    #5.mod取余
    #MOD(a,b) : a-a/b*b;
    SELECT MOD(10,3);
    SELECT 10%3;


    #三,日期函数
    #1.now 返回当前系统日期+时间
    SELECT NOW();

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

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

    #4.可以获取指定的部分,年,月,日,小时,分钟,秒
    SELECT YEAR(NOW()) AS '年';
    SELECT YEAR('1998-1-1') AS '年';
    SELECT YEAR(hiredate) AS '年'
    FROM employees;


    SELECT MONTH(NOW()) AS '月';
    SELECT MONTHNAME(NOW()) AS '月';

    #5.str_to_date 将字符通过指定的格式转换成日期
    SELECT STR_TO_DATE('1999-11-23','%Y-%c-%d');
    #查询入职日期为1999-4-3的员工信息
    SELECT *
    FROM employees
    WHERE hiredate=STR_TO_DATE('4-3 1992','%c-%d %Y');

    #6.date_format 将日期转换成字符
    SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日');


    #四,其他函数
    SELECT VERSION();
    SELECT DATABASE();
    SELECT USER();

    #五,流程控制函数
    #1.if函数: if else 的效果
    SELECT IF(10>5,'大','小');

    SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金','有奖金')
    FROM employees;

    #2.case函数的使用一:swicth case的效果
    /*
    Java中
    swicth(变量或表达式){
    case 常量1:语句1;break;
    ...
    defult:语句n;
    }

    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;

    #case函数 使用二:类似于 多重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>15000 THEN 'B'
    WHEN salary>10000 THEN 'C'
    ELSE 'D'
    END AS '工资级别'
    FROM employees;


    #测试
    /*
    1.显示系统时间(注:日期+时间)
    2.查询员工号,姓名,以及工资提高百分之20的结果(new salary)
    3.将员工的姓名按首字母排序,并写出姓名的长度(length)
    */

    #1.显示系统时间(注:日期+时间)
    SELECT NOW();

    #2.查询员工号,姓名,以及工资提高百分之20的结果(new salary)
    SELECT employee_id,CONCAT(last_name,first_name) AS '姓名',salary*(1+0.2) AS 'new salary'
    FROM employees;

    #3.将员工的姓名按首字母排序,并写出姓名的长度(length)
    SELECT CONCAT(last_name,first_name) AS '姓名',LENGTH(CONCAT(last_name,first_name)) AS '姓名的长度'
    FROM employees
    ORDER BY SUBSTR(CONCAT(last_name,first_name),1,1) ASC;


    #二,分组函数
    /*
    功能:用作统计使用,又称为聚合函数或统计函数或组函数

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

    特点:
    1.sum,avg一般用于处理数值型
    2.max,min,count可以处理任何类型
    3.以上分组函数都忽略null值
    4.可以和distinct搭配实现去重的运算
    5.count函数的单独使用
    一般使用count(*)用作统计行数
    6.和分组函数一同查询的字段要求是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) AS '和',AVG(salary) AS '平均',MAX(salary) AS '最大值',MIN(salary) AS '最小值',COUNT(salary) AS '总个数'
    FROM employees;

    #2.参数支持哪些类型
    SELECT SUM(last_name),AVG(last_name)
    FROM employees;

    SELECT MAX(last_name),MIN(last_name)
    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;

    #效率:MYISAM存储引擎,count(*)效率高 INNOB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)要高一些


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


    #测试
    /*
    1.查询公司员工的最大值,最小值,平均值,总和
    2.查询员工表中的最大入职时间和最小入职时间的相差天数(DIFFRENCE)
    3.查询部门编号为90的员工个数
    */

    #1.查询公司员工工资的最大值,最小值,平均值,总和
    SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary)
    FROM employees;

    #2.查询员工表中的最大入职时间和最小入职时间的相差天数(DIFFRENCE)
    SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) AS 'DIFFRENCE'
    FROM employees;

    #3.查询部门编号为90的员工个数
    SELECT COUNT(*)
    FROM employees
    WHERE department_id=90;

  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/Athena-life/p/13604270.html
Copyright © 2011-2022 走看看