DQL 语言 --常见函数 06

一、概述

  功能:类似于java中的方法好处:提高重用性和隐藏实现细节
  调用:select 函数名(实参列表);

二、单行函数

  1、字符函数
    concat:连接
    substr:截取子串
    upper:变大写
    lower:变小写
    replace:替换
    length:获取字节长度
    trim:去前后空格
    lpad:左填充
    rpad:右填充
    instr:获取子串第一次出现的索引

 

#1.length 获取参数值的字节个数

SELECT LENGTH('john');

 

SELECT LENGTH('张三丰hahaha');

 

SHOW VARIABLES LIKE '%char%'                                  //查看变量字符类型

 

#2.concat 拼接字符串

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

 

#3.upper、lower  大小写转换

SELECT UPPER('john');  

 

SELECT LOWER('joHn');

 

#示例:将姓变大写,名变小写,然后拼接

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

 

#4.substr、substring

  注意:索引从1开始
截取从指定索引处后面所有字符

SELECT SUBSTR('李莫愁爱上了陆展元',7)  out_put;

 

截取从指定索引处指定字符长度的字符

SELECT SUBSTR('李莫愁爱上了陆展元',1,3) out_put;

 

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

SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2)))  out_put
FROM employees;

 

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

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

 

#6.trim   用于去掉前后空格,也可以用于去掉指定字符(串)。

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

  

SELECT TRIM('a' FROM 'aaaaaaaaa张aaaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')  AS out_put;

 

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

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

 

 

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

 

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

SELECT RPAD('殷素素',12,'ab') AS out_put;

 

#9.replace 替换

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

 

  2、数学函数

    ceil:向上取整
    round:四舍五入
    mod:取模
    floor:向下取整
    truncate:截断
    rand:获取随机数,返回0-1之间的小数

 

#1.round 四舍五入

SELECT ROUND(-1.55);

 

SELECT ROUND(1.567,2);  #保留两位小数

 

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

SELECT CEIL(-1.02);

 

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

SELECT FLOOR(-9.99);

 

#4.truncate 截断(小数点后保留几位)

SELECT TRUNCATE(1.69999,1); #小数点后保留一位

 

#5.mod取余

  实现算法:mod(a,b) :  a-a/b*b
  例子:mod(-10,-3):-10- (-10)/(-3)*(-3)=-1
  记忆:被除数是正数,余数为正数,被除数是负数,余数为负数。
SELECT MOD(10,-3);

 

 简写:

SELECT -10 % -3;

 

  3、日期函数
    now:返回当前日期+时间
    year:返回年
    month:返回月
    day:返回日
    date_format:将日期转换成字符
    curdate:返回当前日期
    str_to_date:将字符转换成日期
    curtime:返回当前时间
    hour:小时
    minute:分钟
    second:秒
    datediff:返回两个日期相差的天数
    monthname:以英文形式返回月
 
#1.now 返回当前系统日期+时间
SELECT NOW();

 

#2.curdate 返回当前系统日期,不包含时间

SELECT CURDATE();

 

#3.curtime 返回当前时间,不包含日期

 

#4.可以获取指定的部分,年、月、日、小时、分钟、秒

SELECT YEAR(NOW()) 年;

SELECT YEAR('1998-1-1') 年;

查询雇员出生日期:

SELECT  YEAR(hiredate) 年 FROM employees;

SELECT MONTH(NOW()) 月;

SELECT MONTHNAME(NOW()) 月;

 查询: 日,时,分,秒

SELECT CONCAT(DATE(NOW()),'_',HOUR(NOW()),'_',MINUTE(NOW()),'_',SECOND(NOW())) ;

 

 #5.str_to_date 将字符串通过指定的格式转换成日期

  相关参数表:

 

SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;

 

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

SELECT * FROM employees WHERE hiredate = '1992-4-3';    #这种传统的方法,如果格式变了 ‘4-3 1992’ ,则无法搜到。

 

SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');  #用这种指定格式查询,保证能查到

 

#6.date_format 将日期转换成字符

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

 

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

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

 

  4、其他函数
    version 当前数据库服务器的版本      //SELECT VERSION();
    database 当前打开的数据库        //SELECT DATABASE();
    user当前用户                      //SELECT USER();
    password('字符'):返回该字符的密码形式    //SELECT PASSWORD(1111);
    md5('字符'):返回该字符的md5加密形式   //SELECT MD5(1234);

 
  5、流程控制函数
    ①if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
    ②case情况1
    case 变量或表达式或字段
    when 常量1 then 值1
    when 常量2 then 值2
    ...
    else 值n
    end

 

    ③case情况2
    case
    when 条件1 then 值1
    when 条件2 then 值2
    ...
    else 值n
    end
 
#1.if函数: if else 的效果
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,呵呵','有奖金,嘻嘻') 备注
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 原始工资,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
      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. 将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT LENGTH(last_name) 长度,SUBSTR(last_name,1,1) 首字符,last_name
FROM employees
ORDER BY 首字符;

 

#2. 做一个查询,产生下面的结果
<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;

 

#3. 使用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';

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2020-07-26 12:42  lfw123  阅读(132)  评论(0编辑  收藏  举报

导航