格式
SELECT 函数(表头名) FROM 库名.表名;
SELECT 函数(表头名) FROM 库名.表名 WHERE 条件;
字符函数(处理字符或字符类型)
LENGTH(str)
返字符串长度,以字节为单位(一个汉字3个字节)
mysql> select name from tarena.user where name = "root" ; +------+ | name | +------+ | root | +------+ 1 row in set (0.00 sec) mysql> select name , length(name) as 字节个数from tarena.user where name = "root" ; +------+--------------+ | name | 字节个数 | +------+--------------+ | root | 4 | +------+--------------+ 1 row in set (0.00 sec)
CHAR_LENGTH(str)
返回字符串长度,以字符为单位
mysql> select name , char_length(name) from tarena.employees where employee_id = 3 ; +-----------+-------------------+ | name | char_length(name) | +-----------+-------------------+ | 李玉英 | 3 | +-----------+-------------------+ 1 row in set (0.00 sec)
UPPER(str)和UCASE(str)
将字符串中的字母全部转换成大写
mysql> select name from tarena.user where uid <= 3 ; +--------+ | name | +--------+ | root | | bin | | daemon | | adm | +--------+ 4 rows in set (0.00 sec) mysql> select upper(name) from tarena.user where uid <= 3 ; +-------------+ | upper(name) | +-------------+ | ROOT | | BIN | | DAEMON | | ADM | +-------------+ 4 rows in set (0.00 sec)
LOWER(str)和LCASE(str)
将str中的字母全部转换成小写
mysql> select lower("ABCD") ; +---------------+ | lower("ABCD") | +---------------+ | abcd | +---------------+ 1 row in set (0.00 sec)
SUBSTR(s, start,end)
从s的start位置开始取出到end长度的子串
mysql> select name from tarena.employees where employee_id <= 3 ; +-----------+ | name | +-----------+ | 梁伟 | | 郭岩 | | 李玉英 | +-----------+ 3 rows in set (0.00 sec) //不是输出员工的姓 只输出名字 mysql> select substr(name,2,3) from tarena.employees where employee_id <= 3 ; +------------------+ | substr(name,2,3) | +------------------+ | 伟 | | 岩 | | 玉英 | +------------------+ 3 rows in set (0.00 sec)
INSTR(str,str1)
返回str1参数,在str参数内的位置
mysql> select name from tarena.user where uid <= 3 ; +--------+ | name | +--------+ | root | | bin | | daemon | | adm | +--------+ 4 rows in set (0.00 sec) mysql> select instr(name,"a") from tarena.user where uid <= 3 ; +-----------------+ | instr(name,"a") | +-----------------+ | 0 | | 0 | | 2 | | 1 | +-----------------+ 4 rows in set (0.00 sec)
TRIM(s)
返回字符串s删除了两边空格之后的字符串
mysql> select trim(" ABC "); +-----------------+ | trim(" ABC ") | +-----------------+ | ABC | +-----------------+ 1 row in set (0.00 sec)
日期函数
常用函数
函数 | 说明 | 函数 | 说明 |
curtime() | 获取时间 |
hour() |
获取小时 |
curdate() | 获取日期 | minute() | 获取分钟 |
now( ) | 获取日期和时间 | second() | 获取秒 |
year() | 获取年 | quarter() | 获取一年中第几季度 |
month() | 获取月 | monthname() | 获取月份名称 |
day()/week() | 获取日/一年中的第几周 | dayname() | 获取日期对应的星期名 |
date()/weekday() | 获取日期/一周中的周几 | dayofyear() | 获取一年中第几天 |
time() | 获取时间 | dayofmonth() | 获取一月中第几天 |
表orders:
ADDTIME(date,num)
添加时间
mysql> select order_num,addtime(order_date,10) from orders; +-----------+------------------------+ | order_num | addtime(order_date,10) | +-----------+------------------------+ | 20005 | 2023-09-01 00:00:10 | | 20006 | 2023-09-12 00:00:10 | | 20007 | 2023-09-30 00:00:10 | | 20008 | 2023-10-03 00:00:10 | | 20009 | 2023-10-08 00:00:10 | +-----------+------------------------+ 5 rows in set (0.02 sec)
ADDDATE(date,num)
添加日期
mysql> select order_num,adddate(order_date,10) from orders; +-----------+------------------------+ | order_num | adddate(order_date,10) | +-----------+------------------------+ | 20005 | 2023-09-11 00:00:00 | | 20006 | 2023-09-22 00:00:00 | | 20007 | 2023-10-10 00:00:00 | | 20008 | 2023-10-13 00:00:00 | | 20009 | 2023-10-18 00:00:00 | +-----------+------------------------+ 5 rows in set (0.00 sec)
DATEDIFF(date1,date2)
时间差:date1-date2
mysql> select order_num,datediff(order_date,curdate()) as day_difference from orders; +-----------+----------------+ | order_num | day_difference | +-----------+----------------+ | 20005 | -220 | | 20006 | -209 | | 20007 | -191 | | 20008 | -188 | | 20009 | -183 | +-----------+----------------+ 5 rows in set (0.01 sec)
数学函数
常用函数
函数 | 说明 | 函数 | 说明 |
abs() | 绝对值 | mod(x,y) | 求余x%y |
cos() | 余弦,参数为弧度 | pi() | 圆周率 |
floor(x) | 不大于x的最大整数 | ceiling(x) | 不小于x的最小整数 |
sqrt() | 平方根 | ceil(x) | 不小于x的最小整数 |
exp() | e的次方 | rand(x,n) | 四舍五入保留n位小数点 |
聚合函数
常用函数
函数 | 说明 |
sum(表头名) | 求和 |
avg(表头名) | 计算平均值 |
min(表头名) | 获取最小值 |
max(表头名) | 获取最大值 |
count(表头名) | 统计表头值个数(包括null) |
举例:
mysql> select * from orderitems; +-----------+------------+---------+----------+------------+ | order_num | order_item | prod_id | quantity | item_price | +-----------+------------+---------+----------+------------+ | 20005 | 1 | ANV01 | 10 | 5.99 | | 20005 | 2 | ANV02 | 3 | 9.99 | | 20005 | 3 | TNT2 | 5 | 10.00 | | 20005 | 4 | FB | 1 | 10.00 | | 20006 | 1 | JP2000 | 1 | 55.00 | | 20007 | 1 | TNT2 | 100 | 10.00 | | 20008 | 1 | FC | 50 | 2.50 | | 20009 | 1 | FB | 1 | 10.00 | | 20009 | 2 | OL1 | 1 | 8.99 | | 20009 | 3 | SLING | 1 | 4.49 | | 20009 | 4 | ANV03 | 1 | 14.99 | +-----------+------------+---------+----------+------------+ 11 rows in set (0.00 sec)
确定售出的商品总数(使用Orderltems中的数量列)
mysql> select sum(quantity) from orderitems; +---------------+ | sum(quantity) | +---------------+ | 174 | +---------------+ 1 row in set (0.00 sec)
if函数
if(条件,v1,v2) 如果条件是TRUE则返回v1,否则返回v2
ifnull(v1,v2) 如果v1不为NULL,则返回v1,否则返回v2
if():
mysql> select if(1 = 2 , "a","b"); +---------------------+ | if(1 = 2 , "a","b") | +---------------------+ | b | +---------------------+ 1 row in set (0.00 sec)
ifnull():
mysql> select ifnull("abc","xxx"); +---------------------+ | ifnull("abc","xxx") | +---------------------+ | abc | +---------------------+ 1 row in set (0.00 sec)
case函数
格式:
CASE 表头名
WHEN 值1 THEN 输出结果
WHEN 值2 THEN 输出结果
WHEN 值3 THEN 输出结果
ELSE 输出结果
END
或
CASE
WHEN 判断条件1 THEN 输出结果
WHEN 判断条件2 THEN 输出结果
WHEN 判断条件3 THEN 输出结果
ELSE 输出结果
END
如果表头名等于某个值,则返回对应位置then后面的值并结束判断,
如果与所有值都不相等,则返回else后面的结果并结束判断
举例:
mysql> select * from tarena.departments; +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 1 | 人事部 | | 2 | 财务部 | | 3 | 运维部 | | 4 | 开发部 | | 5 | 测试部 | | 6 | 市场部 | | 7 | 销售部 | | 8 | 法务部 | +---------+-----------+ 8 rows in set (0.03 sec)
输出部门类型
mysql> select dept_id,dept_name, -> case -> when dept_name="运维部" then "技术部" -> when dept_name="开发部" then "技术部" -> when dept_name="测试部" then "技术部" -> else "非技术部" -> end as 部门类型 from tarena.departments; +---------+-----------+--------------+ | dept_id | dept_name | 部门类型 | +---------+-----------+--------------+ | 1 | 人事部 | 非技术部 | | 2 | 财务部 | 非技术部 | | 3 | 运维部 | 技术部 | | 4 | 开发部 | 技术部 | | 5 | 测试部 | 技术部 | | 6 | 市场部 | 非技术部 | | 7 | 销售部 | 非技术部 | | 8 | 法务部 | 非技术部 | +---------+-----------+--------------+ 8 rows in set (0.00 sec)
或者
mysql> select dept_id, dept_name, -> case dept_name -> when '运维部' then '技术部门' -> when '开发部' then '技术部门' -> when '测试部' then '技术部门' -> else '非技术部门' -> end as 部门类型 from tarena.departments; +---------+-----------+-----------------+ | dept_id | dept_name | 部门类型 | +---------+-----------+-----------------+ | 1 | 人事部 | 非技术部门 | | 2 | 财务部 | 非技术部门 | | 3 | 运维部 | 技术部门 | | 4 | 开发部 | 技术部门 | | 5 | 测试部 | 技术部门 | | 6 | 市场部 | 非技术部门 | | 7 | 销售部 | 非技术部门 | | 8 | 法务部 | 非技术部门 | +---------+-----------+-----------------+ 8 rows in set (0.00 sec)