MySql(六)常见单行函数


常见函数分类:

  1. 单行函数:(主要作数据的处理):concat、length、ifnull…
  2. 分组函数:(作统计使用;所以又称为统计函数)

单行函数

字符函数

1. LENGTH(‘字符’); java

做用:返回字符的字节长度;一个英文字符为一个字节;一个汉字按照不一样的编码所占据的字节也是不用,例如在utf-8中一个汉字占三个字节,在gbk中一个汉字占两个字节mysql

/**返回4个字节**/
LENGTH('join');
/**返回5个字节(这里的汉字为utf=8编码)**/
LENGTH('哈hi')

2. CONCAT(’’,’’);web

做用:链接字符sql

/**姓和名之间用下划线链接**/
SELECT CONCAT('last_name','_','first_name');

3. UPPER()和LOWER()数据库

做用:字母的大小写转换svg

/**将姓变大写,将名变为小写**/
SELECT CONCAT( UPPER(last_name),LOWER(first_name)) 姓名
FROM employees;

4. SUBSTR()函数

做用:用于截取字符编码

注意:在mysql中索引是从1开始spa

/**返回的结果为“陆展元”**/
SELECT SUBSTR('李莫愁爱上了陆展元',6) AS result;
/**返回的结果为“李莫愁” **/
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) AS result;
/**将姓名中首字符大写,其余字符小写而后用_进行拼接 **/
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1),'_',LOWER(SUBSTR(first_name,2)))) result;

5. INSTRcode

做用:用于返回子串在父串的起始索引,若是找不到返回0

/**返回结果:4**/
SELECT INSTR('老鼠爱大米','大米');
/**返回结果:4**/
SELECT INSTR('老鼠爱大米,很是爱大米','大米');
/**返回结果:0**/
SELECT INSTR('老鼠爱大米','小米');

6. TRIM()

做用:取出字符串中的空格或指定字符

/**此时返回的长度是“张三丰”的字节长度**/
SELECT LENGTH(TRIM('   张三丰    ')) result;
/**删除指定的首字符 'aa';返回结果:'a张aaa三aaa丰aa'**/
SELECT TRIM(LEADING'aa' FROM 'aaa张aaa三aaa丰aa');
/**删除指定的尾字符 'aa;返回结果:‘aaa张aaa三aaa丰'**/
SELECT TRIM(TRAILING'aa' FROM 'aaa张aaa三aaa丰aa');
/**删除指定的首尾字符 'aa';返回结果:'a张aaa三aaa丰'**/
SELECT TRIM(BOTH'aa' FROM 'aaa张aaa三aaa丰aa');
/**默认是删除指定的首尾字符  即去除字符串中的a:返回结果:张aaa三aaaaa丰**/
SELECT TRIM('a' FROM 'aaa张aaa三aaaaa丰') result;
/**去除字符串中的aa:返回结果:a张aaa三aaaaa丰**/
SELECT TRIM('aa' FROM 'aaa张aaa三aaaaa丰') result;

7. LPAD()

做用:用指定字符实现指定长度的左填充
注意:下面的数字 5和2分别指的是字符的长度,好比‘西虹市’长度为3;'red’的长度是3;'red西虹市’长度是6;

/**输出结果:“**西虹市”**/
SELECT LPAD('西虹市',5,'*') result;
/**输出结果:“西虹”**/
SELECT LPAD('西虹市',2,'*') result;

同理:RPAD()为右填充

8.REPLACE()

做用:指定字符之间的替换

/**输出结果:老鼠爱小米**/
SELECT REPLACE('老鼠爱大米','大米','小米') result;

数学函数

1. ROUND()

做用:四舍五入

/**2**/
SELECT ROUNND(1.95);
/**-2**/
SELECT ROUNND(-1.95);
/**1.57**/
SELECT ROUND(1.567,2);

2.CEIL()和FLOOR()

做用:CEIL(参数):向上取整(返回大于等于该参数的最小整数)

FLOOR(参数):向下取整,返回小于等于该参数苏的最大整数

/**2**/
SELECT CEIL(1.47);
/**-1**/
SELECT CEIL(-1.47);
/**1**/
SELECT FLOOR(1.47);
/**-2**/
SELECT FLOOR(-1.47);

3.TRUNCATE()

做用:截断

/**1.6(保留小数点后1位开始截断)**/
SELECT TRUNCATE(1.69999,1);
/**1.699(保留小数点后1位开始截断)**/
SELECT TRUNCATE(1.69999,3);

4.MOD()

做用:取余

/**1**/
SELECT MOD(10,3);
/**1**/
SELECT 10%3;
/**-1**/
SELECT MOD(-10,3);
/**1**/
SELECT MOD(10,-3);
/**-1**/
SELECT MOD(-10,-3);

日期函数

1.NOW()

做用:返回当前系统日期和时间

2. CURDATE()

做用:返回当前系统日期不包含时间

3. CURTIME()

做用:返回系统当亲时间不包含日期

/**2019-5-17 12:52:23 **/
SELECT NOW();
/**2019-5-17 **/
SELECT CURDATE();
/**12:52:23 **/
SELECT CURTIME();

也能够根据需求获取指定的部分:年(year)、月(month)、日(day)、时(hour)、分(miniute)、秒(second)

假设当前时间为:2019年5月17号

/**2019**/
SELECT YEAR(NOW()) 年;
/**2019**/
SELECT YEAR('2019-5-17') 年;
/**5**/
SELECT MONTH(NOW()) 月;
/**May**/
SELECT MONTHNAME(NOW()) 月;

4. STR_TO_DATE(‘a’,‘b’)

做用:将日期格式的字符转换成指定的日期类型(a为给定的日期字符;b告诉要解析的日期格式)

大意:首先你得有一个字符,并且这个字符必须是能够能转换成日期的那种(好比:”阿猫阿狗“这个字符串是不能够转换成日期的);经过给定的日期字符(a)在加上对应的日期格式(b)就能够将字符类型的日期装换成日期类型的数据了

5.DATE_FORMATE()

做用:将日期转换成字符

大意:首先你得有一个日期类型的数据,其次指定你要转换的日期格式的字符串

格式符 功能
%Y 四位的年份
%y 两位的年份
%m 月份(0一、0二、0三、…十一、12)
%c 月份(一、二、三、…十一、12)
%d 日(0一、0二、03…)
%H 小时(24小时制)
%h 小时(12小时制)
%i 分钟(00、0一、02…59)
%s 秒(00、0一、02…59)
/**将字符串 '1997-4-13'转换成日期类型**/
SELECT STR_TO_DATE('1997-4-13','%Y-%c-%d');
/**将字符串 '4-13 1997'转换成日期类型**/
SELECT STR_TO_DATE('4-13 1997','%c-%d %Y');
/**将当前日期转化成字符串'2019年/4月/13日'的格式显示**/
SELECT DATE_FORMATE(NOW(),'%Y年/%c月/%d日')

其余函数

  1. VERSION();

    做用:查看版本号

  2. DATEBASE()

    做用:查看当前数据库

流程控制函数

1. if(表达式1,表达式2,表达式3)

做用:当表达式1知足条件时执行表达式2,不然执行表达式3

/**输出结果大于**/
SELECT IF(3>2,'大于','小于');
/

2. case函数

引入:java中switch-case

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

Mysql中的case使用一:

CASE 要判断的字段或表达式
WHEN 常量1 THEN 要显示的值或者语句(若是要显示的是语句则末尾处要加分号)
WHEN 常量2 THEN 要显示的值或者语句(若是要显示的是语句则末尾处要加分号)
...
ELSE 常量N THEN 要显示的值或者语句(若是要显示的是语句则末尾处要加分号)
END

举个栗子:

/**查询员工的工资	要求:
*	部门编号 = 30 ;显示的工资为1.1倍
*	部门编号 = 40 ;显示的工资为1.2倍
*	部门编号 = 50 ;显示的工资为1.3倍
*	部门编号 = 其余 ;显示的工资为原工资
*/
SELECT department_id,salary 原始工资,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 40 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;

适合等值判断

Mysql中的case使用二:

引入java中的多重if

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

mysql中:

CASE
WHEN 条件1 THEN 要显示的值1或语句(若是要显示的是语句则末尾处要加分号)
WHEN 条件2 THEN 要显示的值2或语句(若是要显示的是语句则末尾处要加分号)
....
ELSE 要显示的值n或语句(若是要显示的是语句则末尾处要加分号)
END

举个栗子:

/**
*查询员工的工资状况	要求:
* 工资级别大于 8000 ;显示 A 级别
* 工资级别大于 5000 ;显示 B 级别
* 工资级别大于 4000 ;显示 C 级别
* 不然显示D级别
*/
SELECT salary,
CASE
WHEN salary > 8000 THEN 'A'
WHEN salary > 5000 THEN 'B'
WHEN salary > 4000 THEN 'C'
ELSE  'D' AS 工资级别
FROM employees;

适合区间判断

进阶练习

/**要求按照员工姓名的首字母排序,并写出姓名的长度**/
SELECT first_name,SUBSTR(first_name,1,1) 首字符,LENGTH(first_name) 姓名长度
FROM employees	
ORDER BY 首字符;
/**作一个查询使之产生的效果:<last_name> earns <salary> monthly but wants <salary*3> Dream Salary
eg: TOM earns 1000 monthly but wants 300 
*/
SELECT CONCAT(last_name,'earns',salary,'monthly but wants',salsary*3) AS Drean Salary
FROM employees;