SQL语句(二)数据排序和单行函数
目录
一、排序查询
SELECT 查询列表
FROM 表
WHERE 条件
ORDER BY 排序列表 [ASC|DESC]
注意:
- ①
ASC升序|DESC降序
默认升序 - ②
ORDER BY
子句可以支持单个字段,多个字段,表达式,函数,别名 - ③
ORDER BY
子句一般是放在查询语句最后,LIMIT
子句除外
1. 基本排序
查询所有员工信息,工资从高到低:
SELECT * FROM employees
ORDER BY salary DESC;
部门编号>=90
的员工信息,按入职时间先后排序
SELECT *
FROM employees
WHERE department_id >= 90
ORDER BY hiredate ASC;
按年薪高低
显示员工的信息和 年薪【按表达式排序】
SELECT *, salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
按年薪高低
显示员工的信息和 年薪【按别名】
SELECT *, salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
ORDER BY 年薪 DESC;
按姓名的长度显示员工的姓名和工资【按函数排序】
SELECT LENGTH(last_name) AS 名字字节长度, last_name, salary
FROM employees
ORDER BY LENGTH(last_name);
【按字典序】
SELECT last_name, salary
FROM employees
ORDER BY last_name;
2. 多条件排序
查询员工信息,先按工资升序
,再按员工编号降序
【多个字段】
SELECT salary, employee_id
FROM employees
ORDER BY salary ASC,employee_id DESC;
二、单行函数
调用方法
SELECT 函数名()
[FROM 表]
字符函数
①LENGTH函数
作用:获取参数值的字节个数
例:
SELECT LENGTH('john');
SELECT LENGTH('中文hhh');
②CONCAT函数
SELECT CONCAT(last_name,'_',first_name)
FROM employees;
- 在数据库中新建临时列
CONCAT(last_name,'_',first_name)
- 将记录映射到该列中取出
③upper 和 lower
SELECT UPPER('name');
SELECT LOWER('NAME');
姓变大写,名变小写,再拼接:
SELECT CONCAT(UPPER(last_name),'_',LOWER(first_name)) 姓名
FROM employees;
④substr
tips:这里的字符串的索引不同于一般的编程语言,它是从1开始的。
SELECT SUBSTR('李莫愁爱上了陆展元',7) out_put;
SELECT SUBSTR('李莫愁爱上了陆展元',4,3) out_put; #[4,4+3)
⑤instr
INSTR(str,substr)
:当substr
为str
子串时返回开始的索引,若不存在则返回0
SELECT INSTR('123456','456') AS out_put;
⑥trim
TRIM([remstr FROM] str)
- 当填入一个字符串时,返回去掉前后空白字符后的字符串
- 可填入
[remstr FROM]
,可以去掉自定义字符
SELECT TRIM(' ave ') AS out_put;
SELECT TRIM('*' FROM '********ave*****') AS out_put;
⑦lpad 和 rpad
作用:凑字符个数
SELECT LPAD('殷素素',10,'*');
SELECT RPAD('殷素素',10,'*');
⑧replace替换
REPLACE(str,from_str,to_str)
SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏');
数学函数
①round,ceil 和 floor
round
:四舍五入
ROUND(X)
ROUND(X,D)
第二个参数是精确到D位小数
SELECT ROUND(1.65);
SELECT ROUND(2.4);
SELECT ROUND(1.65,2);
ceil
:向上取整
floor
:向下取整
②truncate截断
TRUNCATE(X,D)
:截断x到d位小数
SELECT TRUNCATE(1.69999,1);
③mod取模
MOD(a,b)
: a-a/b*b;
流程控制函数
①IF函数
IF(expr1,expr2,expr3)
expr1
是判断条件,当其为真时取expr2
的值,否则取expr3
的值。
例:
SELECT
last_name,
commission_pct,
IF(commission_pct IS NOT NULL,"有奖金,嘻嘻","没奖金,呵呵")
FROM
employees;
②CASE函数
用法1:
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 department_id, salary 原始工资,
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;
用法二:
# 多重if
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;