1,流程处理函数
二选一
IF(value,value1,value2)
value正确输出为value1,错误输出为value2
SELECT IF(1>0,'YES','NO')
FROM DUAL;
判断是否为NULL
IFNULL(value1,value2)
是NULL输出为value1,不是输出为value2
多选一
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2...[ELSE resultn] END
用法:按照工资多少分别命名为NO123
SELECT last_name,salary,CASE WHEN salary > 80000 THEN 'NO1'
WHEN salary > 50000 THEN 'NO2'
WHEN salary > 100000 THEN 'NO3'
ELSE 'LAST' END 'level'
FROM employees;
CASE expr WHEN 常量1 THEN 值1 WHEN 常量1 THEN 值1...[ELSE 值n] END
2,加密解密函数
PASSWORD在mysql8.0中被放弃
MD5(),SHA()
加密不可逆
SELECT MD5(MYSQL),SHA(MYSQL)
FROM DUAL;
在mysql8.0中被放弃
ENCODE(value,password_seed)
DECODE(value,password_seed)
两者互为反函数
SELECT ENCODE('MYSQL','HELLO'),DECODE(ENCODE('MYSQL','HELLO'),'HELLO')
FROM DUAL;
3,MYSQL信息函数
-
版本号 VERSION()
-
服务器连接数 CONNECTION_ID()
-
当前命令所在数据库 DATABASE() / SCHEMA()
-
当前用户名 USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER()
-
value自变量的字符集 CHARSET(value)
-
value的比较规则 COLLATION(value)
4,其他函数
A,四舍五入
FORMAT(value,n)四舍五入保留到小数点后n位
SELECT FORMAT(123.126,2)
FROM DUAL;
B,进制转换
CONV(value,from,to)from进制转换为to进制
SELECT CONV(16,10,2),CONV(NULL,10,2)
FROM DUAL;
C,IP地址转换
INET_ATON(ipvalue)将以点分隔的IP转化为一个数字
INET_NTOA(ipvalue)将数字IP转化为以点分隔的IP
SELECT INET_ATON('127.0.0.1'),INET_NTOA('2130706433')
FROM DUAL;
D,重复执行,用于测试处理expr需要耗费的时间
BENCHMARK(n,expr)
SELECT BENCHMARK(10000,MD5('MYSQL'))
FROM DUAL;
E,修改字符编码
CONVERT(value USING char_code)修改为char_code
SELECT CHARSET('tydujtfj'),CONVERT('tydujtfj' FROM 'utf8mb3')
FROM DUAL;
练习
1,显示系统时间
SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP(),LOCALTIME(),LOCALTIMESTAMP()
FROM DUAL;
2,查询工号,姓名,工资,加薪20%后的结果(new salary)
SELECT employee_id,first_name,salary,salary *1.2 AS 'new salary'
FROM employees;
3,姓名按首字母排序,写出姓名的长度
SELECT first_name,LENGTH(first_name) length
FROM employees
ORDER BY first_name;
4,查询员工id,name,salary,并作为一个列输出,别名OUT_PUT
SELECT CONCAT_WS('-',employee_id,first_name,salary) OUT_PUT
FROM employees;
5,查询顾客生日年,月,日,按年降序排列
USE sql_store;
SELECT LEFT(birth_date,4) AS 'YEAR',SUBSTR(birth_date,6,2) AS 'DAY',RIGHT(birth_date,2)
FROM customers
ORDER BY 'YEAR' DESC
6,生日在1986-01-01年之后的顾客
SELECT first_name,birth_date
FROM customers
WHERE birth_date >'1986-01-01'
WHERE date_format(birth_date,'%Y-%m-%d') > '1986-01-01'
WHERE birth_date > STR_TO_DATE('1986-01-01','%Y-%m-%d')
7,point超过900的顾客
SELECT first_name,'point'
FROM customers
WHERE DATEDIFF(CURDATE(),'point') > 900