MySQL的排序查询和单行函数

Posted 程序员汪汪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的排序查询和单行函数相关的知识,希望对你有一定的参考价值。

排序查询

使用 ORDER BY 子句排序

  • ASC(ascend):升序

  • DESC(descend):降序

语法

 SELECT 查询列表
 FROM 表名
 [WHERE 筛选条件]
 ORDER BY 排序的字段或表达式;

特点

  1. ASC代表的是升序,可以省略。

  2. ORDER BY子句可以支持 单个字段、别名、表达式、函数、多个字段

  3. ORDER BY子句在查询语句的最后面,除了LIMIT子句

案例

单个字段排序

  1. 查询员工表按薪水降序

 SELECT * FROM employees ORDER BY salary DESC;
  1. 查询部门编号>=90的员工信息,并按员工编号降序

 SELECT 
 *
 FROM
 employees
 WHERE
  department_id >= 90
 ORDER BY employee_id DESC;

按表达式排序

  1. 查询员工信息,按年薪降序

 SELECT *, salary * 12 * (1 + IFNULL(commission_pct, 0))
 FROM employees
 ORDER BY salary * 12 * (1 + IFNULL(commission_pct, 0)) DESC;

按别名排序

  1. 查询员工信息,按年薪升序

 SELECT *, salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪
 FROM employees
 ORDER BY 年薪 ASC;

按函数排序

  1. 查询员工名,并且按名字的长度降序

 SELECT LENGTH(last_name), last_name
 FROM employees
 ORDER BY LENGTH(last_name) DESC;

多个字段排序

  1. 查询员工信息,要求先按工资降序,再按employee_id升序

 SELECT * FROM employees ORDER BY salary DESC, employee_id ASC;

单行函数

字符函数

LENGTH(s)

获取参数值的字节个数

 SELECT LENGTH('Tom');
 # utf8字符集下,一个汉字占3个字节,gbk中,一个汉字占2个字节
 SELECT LENGTH('张三丰hahaha');

CONCAT(s1, s2,..., sn)

拼接字符串

 # 这里表示使用 _ 连接字段last_name和字段first_name
 SELECT CONCAT(last_name, '_', first_name) 姓名 FROM employees;

UPPER(s)

将字符串转换为大写

 SELECT UPPER('tomcat');

LOWER(s)

将字符串转换为小写

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

SUBSTR(s, start, length)、SUBSTRING()

SUBSTR(s, start, length):从字符串s的start位置截取长度为length的子字符串

截取字符串(注意:索引从1开始)

 # 从第7个字符开始截取(包括7)
 SELECT SUBSTR('日向雏田爱上了旋涡鸣人', 7) out_put;
 # SUBSTRING() 效果和SUBSTR()一致
 SELECT SUBSTRING('日向雏田爱上了旋涡鸣人', 7) out_put;
 SELECT SUBSTR('日向雏田爱上了旋涡鸣人', 1, 4) out_put;
 # 案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来
 SELECT CONCAT(UPPER(SUBSTR(last_name, 1,1)), '_', LOWER(SUBSTR(last_name, 2))) out_put FROM employees;

INSTR(s, s)

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

 SELECT INSTR('日向雏田爱上了漩涡鸣人,漩涡鸣人爱上了雏田', '漩涡鸣人') AS out_put;

TRIM(s)

LTRIM(s):去掉字符串s开始处的空格

RTRIM(s):去掉字符串s结尾处的空格

去掉字符串开始和结尾处的空格:

 SELECT LENGTH(TRIM('       日向雏田     ')) AS out_put;
 # 去除字符串前后指定的字符
 SELECT TRIM('a' FROM 'aaaaa雏aa田aaaaaa');
 # aa会被当做一个整体
 SELECT TRIM('aa' FROM 'aaaaa雏aa田aaaaaa');

LPAD(s1, len, s2)

在字符串s1的开始处填充字符串s2, 使字符串长度达到len,如果长度小于原字符串长度,则只取前len个字符

 SELECT LPAD('日向雏田', 6, '*') AS out_put; 
 # result: **日向雏田
 SELECT LPAD('日向雏田', 2, "*") AS out_put;
 # result: 日向

RPAD(s1, len, s2)

在字符串s1结尾处添加字符串s2,使字符串的长度达到len,如果长度小于原字符串,则只取前len个字符

 SELECT RPAD('日向雏田', 6, '*') AS out_put;
 # result:日向雏田**
 SELECT RPAD('日向雏田', 2, '*') AS out_put;
 # result:日向

REPLACE(s, s1, s2)

用字符串 s2 替代字符串 s 中的字符串s1

 SELECT REPLACE('漩涡鸣人爱上了春野樱', '春野樱', '日向雏田') AS out_put;
 # result : 漩涡鸣人爱上了日向雏田

数学函数

ROUND(x)

ROUND(x, d):四舍五入,保留d位小数

 SELECT ROUND(-1.55); --> -2
 SELECT ROUND(1.567, 2); --> 1.57

CEIL(x)

向上取整

 SELECT CEIL(-1.02);  --> -1
 SELECT CEIL(1.02); --> 2

FLOOR(x)

向下取整

 SELECT FLOOR(-1.58);  --> -2
 SELECT FLOOR(1.58); --> 1

TRUNCATE(x, y)

返回数值 x 保留到小数点后 y 位的值(与ROUND最大的区别是不会进行四舍五入)

 SELECT TRUNCATE(1.567, 2);   --> 1.56

MOD(x, y)

MOD(x, y)的结果会等于:x - x / b * b

返回 x 除以 y 以后的余数

 SELECT MOD(10, -3);  --> 1
 # 等价于
 SELECT 10%-3; --> 1
 
 # 余数的符号取决于被除数的符号
 SELECT MOD(-10, 3); --> -1
 SELECT MOD(-10, -3); --> -1

日期函数

NOW()

返回当前系统时间(注:日期+时间)

 SELECT NOW();   --> 2019-12-17 00:38:55

CURDATE()

返回当前系统日期,不包含时间

 SELECT CURDATE();  --> 2019-12-17

CURTIME()

返回当前时间,不包含日期

 SELECT CURTIME(); --> 00:41:45

YEAR(d)

返回年份

 SELECT YEAR(NOW());  --> 2019
 SELECT YEAR('1999-1-1'); --> 1999

案例:

 SELECT YEAR(hiredate) 入职时间 FROM employees;

MONTH(d)

返回日期 d 中的月份值,1到12

 SELECT MONTH(NOW());  --> 12

MONTHNAME(d)

返回日期当中的月份的英文名称,如 September

 SELECT MONTHNAME(NOW());  --> December

STR_TO_DATE(s, f)

将字符通过制定的格式转换成日期

 SELECT STR_TO_DATE('1998-9-25', '%Y-%c-%d') AS out_put; --> 1998-09-25

案例:查询入职时间为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(d, f)

将日期通过指定的格式转换成字符

 SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日') AS out_put; --> 2019年12月17日

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

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

其他函数

VERSION()

返回数据库的版本号

 SELECT VERSION();

DATABASE()

返回当前数据库名

 SELECT DATABASE();

USER()

返回当前用户

 SELECT USER();

PASSWORD('字符')

返回该字符的密码形式

 SELECT PASSWORD('雏田');

MD5('字符')

返回该字符的md5加密形式

 SELECT MD5('雏田');

流程控制函数

IF(expr, v1, v2)

如果表达式expr成立,返回结果 v1, 否则返回结果 v2

 SELECT IF(1 > 0, '正确', '错误');  --> 正确

案例:

 SELECT last_name, commission_pct, 
 IF(commission_pct IS NULL, '没奖金,日了狗了', '有奖金,开心') 备注
 FROM employees;

CASE

 CASE expression
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
 ...
  when conditionN THEN resultN
  ELSE result
 END

CASE表示函数开始,END表示函数结束。如果condition1成立,则返回result1,如果condition2成立,则返回result2,当全部不成立则返回result,而当有一个成立之后,后面的就不执行了。

 CASE 要判断的字段或表达式
 WHEN 常量1 THEN 要显示的值1或语句1
 WHEN 常量2 THEN 要显示的值2或语句2
 ...
 else 要显示的值n或者语句n
 END

案例一:

查询员工的工资,要求:

  1. 部门号=30,显示的工资为1.1倍

  2. 部门号=40,显示的工资为1.2倍

  3. 部门号=50,显示的工资为1.3倍

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

 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;

案例二:

查询员工的工资情况,要求:

  1. 如果工资>20000,显示A级别

  2. 如果工资>15000,显示B级别

  3. 如果工资>10000,显示C级别

  4. 否则,显示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;


其他mysql相关文章:



以上是关于MySQL的排序查询和单行函数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL笔记--- 部分 DQL 语句;条件查询;排序;分组函数;单行处理函数;group by ,having ;

MySql 01(安装,删除,简介,常用命令,简单查询,条件查询,排序,单行处理函数多行处理函数分组查询)

Oracle04基本查询+条件查询+排序+单行函数+通用函数介绍

Mysql单行函数

MySql-表的概念DQL查询语句条件查询模糊查询分组函数单行处理函数连接查询笛卡尔积现象内外自连接子查询重要关键字建表增删改查

mysql进阶三四五六