函数
统计函数
COUNT
SELECT COUNT( * 或者 (DISTINCT)列字段) FROM 表名 WHERE ...
count(*) :统计总记录数(⭐推荐使用,底层做了优化)
count(常量):统计总记录数
count (列名):统计满足条件的某列有多少个,但是不会统计 null 值
(1)案例一:统计总人数
bash
SELECT COUNT(*) FROM employee;(2)案例二:统计薪水大于一万的人数
bash
SELECT COUNT('Salary') FROM employee WHERE Salary > 10000;(3)案例三:统计有多少种部门管理者
说明:每个部门对应一个管理者编号,但是一个部门可以有多个管理者,需要去重
bash
SELECT * COUNT(DISTINCT('manager_id')) FROM `company`SUM
SELECT SUM(列字段 或者 表达式) FROM 表名 WHERE ...
(1)案例一:统计全班数学总分
bash
SELECT SUM(math) FROM employee;(2)案例二:统计平均薪水
bash
SELECT SUM(Salary) / COUNT(*) FROM employee;AVG
SELECT AVG(列字段 或者 表达式) FROM 表名 WHERE ...
(1)案例一:统计平均薪水
bash
SELECT AVG(Salary) FROM employee;(2)案例二:统计平均总分
bash
SELECT AVG(chinese + math + english) FROM employee;MAX
SELECT MAX(列字段 或者 表达式) FROM 表名 WHERE ...
案例:查询薪水最高的员工
bash
SELECT MAX(Salary) FROM employee;MIN
SELECT MIN(列字段 或者 表达式) FROM 表名 WHERE ...
案例:查询薪水最低的员工
bash
SELECT MIN(Salary) FROM employee;字符串函数


说明
(1)DUAL 亚元表,是系统表,可以作为测试表使用
(2) SUBSTRING:起始位置为 1,如果不写结束位置,默认是从开始位置截取到字符串末尾
(3) STRCMP:返回的结果值和 Java 字符串中的 CMP 函数规则一致
(4) LENGTH:返回的长度按字节计算
bash
SELECT CHARSET(user_name) FROM employee # 返回 id 字段的字符集
SELECT LENGTH('王强') FROM DUAL # 返回字符串的长度(按字节计算)
SELECT CONCAT(user_name,'的工作:',job) FROM employee # 字符串拼接
SELECT INSTR('jacksonling','ling') FROM DUAL # 返回字串的第一个字符在主串中出现的位置
SELECT UCASE(user_name) FROM employee # 查询时,所有用户的姓名转为大写
SELECT LCASE(user_name) FROM employee # 查询时,所有用户的姓名转为小写
SELECT REPLACE(user_name, '刘洋', 'lucy') AS user_name FROM employee # 查询时,替换名字
SELECT STRCMP('app','bpp') FROM DUAL # 适用strcmp函数
SELECT SUBSTRING(user_name, 1,1) FROM employee # 查询时,显示所有名字的第一个字
SELECT LEFT(user_name, 1) FROM employee # 查询时,显示所有名字的第一个字
SELECT LTRIM(' hi ') FROM DUAL # 去除左边空格
SELECT RTRIM(' hi ') FROM DUAL # 去除右边空格
SELECT TRIM(' hi ') FROM DUAL # 去除两边空格练习:以首字母小写的方式显示所有员工的姓名
(1)首先取出每个员工姓名的第一个字母
(2)然后把该字母转为小写
(3)最后把转换后的字母姓名中剩余的字母拼接
bash
SELECT CONCAT(LCASE(SUBSTRING(user_name,1,1)),SUBSTRING(user_name,2)) FROM employee数学函数

bash
# 数学运算
SELECT ABS(-3) FROM DUAL # 取绝对值
SELECT MOD(10,3) # 取模
SELECT CEILING (3.4) # 向上取整
SELECT FLOOR (3.9) # 向下取整
SELECT FORMAT(3.568923,3) # 保留小数位数:3位
SELECT LEAST(0,1,2) # 返回最小值
# 进制转换
SELECT CONV(10,10,2) # 进制转换:把 10 从 十进制 转为 二进制
SELECT BIN(2) FROM DUAL # 十进制转二进制
SELECT HEX(2) FROM DUAL # 十进制转十六进制
# 随机数
SELECT RAND() FROM DUAL # 返回 [0,1] 之间的随机数
SELECT RAND(1) FROM DUAL # 返回固定的随机数(指定SEED)日期函数

说明
DATE_ADD()函数和 DATE_SUB()函数中的 type 只能接收一个参数,如需计算多个时间单位,需要使用函数嵌套实现
这四个函数的日期类型可以是 date、datetime 或者 timestamp
(1)DATE_ADD() 中的 interval 后面可以是 year、month、day、hour、minute、second 等
(2)DATE_SUB() 中的 interval 后面可以是 year、month、day、hour、minute、second 等
(3)DATEDIFF(date1, date2)得到的是天数,而且是 date1 - date2 的天数,因此可以取负数
(4)DATE()
补充函数
DATE():返回日期部分
TIME():返回时间部分
UNIX_TIMESTAMP:返回 1970-01-01 到 现在的秒数
FROM_UNIXTIME():日期格式化,格式化参数为-->"%Y-%m-%d %H:%i:%s"
注意:在实际开发中,我们也经常使用 int 来保存一个 unix 时间戳,然后使用 from_unixtime () 进行转换,还是非常有实用价值的
bash
# 获取时间
SELECT NOW() FROM DUAL # 获取当前时间
SELECT CURRENT_DATE() FROM DUAL # 返回当前日期(年月日)
SELECT CURRENT_TIME() FROM DUAL # 返回当前时间(时分秒)
SELECT CURRENT_TIMESTAMP() FROM DUAL # 返回时间戳(年月日、时分秒)
# 指定获取时间部分
SELECT DATE(NOW()) FROM DUAL # 返回日期部分
SELECT TIME(NOW()) FROM DUAL # 返回时间部分
# 时间戳:返回1970-01-01 到 现在的秒数
SELECT UNIX_TIMESTAMP() FROM DUAL
# 日期格式化
SELECT FROM_UNIXTIME(1752751557,"%Y-%m-%d %H:%i:%s") FROM DUAL
# 时间计算
## 案例一:'2011-11-11' 和 '1990-1-1' 相差多少天
SELECT DATEDIFF('2011-11-11','1990-1-1')
## 案例二:计算 '18:20:56' 和 '23:56:23' 相差多久
SELECT TIMEDIFF('23:56:23','18:20:56')
## 案例三:计算 10 天后的时间
SELECT DATE_ADD(NOW(),INTERVAL 10 DAY)
## 案例四:计算 10 天前的时间
SELECT DATE_SUB(NOW(),INTERVAL 10 DAY)
## 案例五:计算 '年月日、时分秒' 后的时间(计算多个时间需要使用嵌套,因为只能接收一个type的时间参数)
SELECT
DATE_ADD(
DATE_ADD(
DATE_ADD(
DATE_ADD(
DATE_ADD(
DATE_ADD(NOW(), INTERVAL 2 YEAR),
INTERVAL 3 MONTH
),
INTERVAL 10 DAY
),
INTERVAL 5 HOUR
),
INTERVAL 30 MINUTE
),
INTERVAL 45 SECOND
)AS future_time FROM DUAL;
## 案例六:如果能活到 100 岁,计算还能活多少天(2006-07-05为例)
## 思路:出生日期加上 100 年减去当前时间
SELECT DATEDIFF(DATE_ADD('2006-07-05',INTERVAL 100 YEAR),NOW()) FROM DUAL加密函数
用途:用于用户密码的加密
MD5(str):返回一个长度为 32 的字符串,该种加密方式加密后不可逆
PASSWORD(str):从原文密码 str 计算并返回密码字符串,通常用于对数据库的用户密码加密
案例一:创建一个表
bash
CREATE TABLE `user`
(
id CHAR(1),
`name` CHAR(32),
`password` CHAR(32)
)案例二:添加数据,密码加密
bash
INSERT INTO `user` (`id`, `name`, `password`)
VALUES ('1', 'jack', MD5('123456'));系统函数
USER():查看数据库的用户,返回值:用户@IP 地址
DATABASE():查看当前数据库
bash
SELECT USER() FROM DUAL # 查询数据库用户
SELECT DATABASE() FROM DUAL # 查询当前所在数据库流程控制函数

IF
类似三元运算符:条件为真取第一个结果,否则取第二个结果
bash
SELECT IF(TRUE,'jack','jackson') FROM DUALIFNULL
传入两个参数,谁不为空返回谁
bash
SELECT IFNULL(NULL,'jack')SELECT CASE
指令:SELECT CASE WHEN 条件 THEN 执行语句... ELSE 执行语句 END
案例:查询表,如果匹配到对应的职位,就把职位从英文转为中文
bash
SELECT ename,(SELECT CASE
WHEN job='CLERK' THEN'职员'
WHEN job='MANAGER' THEN'经理'
WHEN job='SALESMAN' THEN'销售人员'
ELSE job END
)FROM emp⚠️ 判断是否为空
空判断:使用关键字IS判断,不要使用 =
bash
SELECT * FROM `user` WHERE `password` IS NULL