「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
函数(常用30-50)
算数函数
- abs(数值):绝对值
- mod(被除数,除数):取余数
- round(对象数值,保留小数的位数):四舍五入。保留小数的位数可为参数,注意可能出错。
字符串函数
- concat(str1,str2, str3):拼接
- length(str):长度
- lower(str):转小写
- upper(str):转大写
- replace(src, str_before, str_after):替换
- substring(对象字符串 FROM 截取的起始位置 FOR 截取的字符数 ):截取字符串。索引值起始为1
日期函数
- current_date():当前年月日
- current_time():当前时间:时分秒
- current_timestamp():当前时间,年月日时分秒
- extract(日期元素 FROM 日期):截取日期元素
-
- 日期元素可以是:year,month,day,hour,minute,second
转换函数
- cats(转化前值 as 想要转化的数据类型) 类型转换
-
- 数据类型:singed integer,date。。。
- coalesce(data1, data2, data3...):将null值转化为其他值
-
- 参数可变
- 返回参数中从左开始第一个不是null的值
聚合函数
- count(),avg(),max(),min()
- count(*)包括null,其它情况聚合函数都会排除null,参数是具体列名
- max/min适用于几乎所有,sum/avg适用于数值类
- distinct排除重复值,可用于参数中
谓词
返回真值的函数
- 真值:true,false,unkonwn
- 谓词:
-
- like:字符串匹配
-
-
- like 'dd%':0+,匹配开头
- like 'dd%dd':匹配中间
-
-
-
- like '%dd':匹配结尾
- 符号:%匹配0+个任意字符,_匹配1+各任意字符
-
-
- between:范围查询
-
-
- 范围查询,需要2个参数,包含两个临界值
- between 100 and 1000:[100, 1000]
-
-
- is null,is not null
-
-
- null不能用=判断,要用is null 或is not null
-
-
- in: 简写的or
-
-
- 简写的or,in(10,50, 100):是三者之一即可
- 有in 也有not in
-
-
-
- 不管是in 还是not in,结果都不包括null
- 支持子查询,in(select 子句):更灵活
-
-
- exists
-
-
- 可以用in/not in替代
- 判断是否存在满足某种条件的记录:返回true/false
-
-
-
- 参数通常是个子查询:exist(select 子句)
- 有exist也有not exist
-
case 表达式
分为简单表达式与搜索表达式。后者包含前者,可只学习后者。
依次判断when是否为真,是执行then后语句,都不满足,执行else后表达式。end不要省略。
else 不写则默认else null。
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
.
.
.
ELSE <表达式>
END
SELECT product_name,
CASE WHEN product_type = '衣服' THEN CONCAT('A : ',product_type)
WHEN product_type = '办公用品' THEN CONCAT('B : ',product_type)
WHEN product_type = '厨房用具' THEN CONCAT('C : ',product_type)
ELSE NULL
END AS abc_product_type
FROM product;
-- 实现行转列
-- 对按照商品种类计算出的销售单价合计值进行行列转换
SELECT SUM(CASE WHEN product_type = '衣服' THEN sale_price ELSE 0 END) AS sum_price_clothes,
SUM(CASE WHEN product_type = '厨房用具' THEN sale_price ELSE 0 END) AS sum_price_kitchen,
SUM(CASE WHEN product_type = '办公用品' THEN sale_price ELSE 0 END) AS sum_price_office
FROM product;
+-------------------+-------------------+------------------+
| sum_price_clothes | sum_price_kitchen | sum_price_office |
+-------------------+-------------------+------------------+
| 5000 | 11180 | 600 |
+-------------------+-------------------+------------------+
1 row in set (0.00 sec)
-- CASE WHEN 实现数字列 score 行转列
SELECT name,
SUM(CASE WHEN subject = '语文' THEN score ELSE null END) as chinese,
SUM(CASE WHEN subject = '数学' THEN score ELSE null END) as math,
SUM(CASE WHEN subject = '外语' THEN score ELSE null END) as english
FROM score
GROUP BY name;
+------+---------+------+---------+
| name | chinese | math | english |
+------+---------+------+---------+
| 张三 | 93 | 88 | 91 |
| 李四 | 87 | 90 | 77 |
+------+---------+------+---------+
-- CASE WHEN 实现文本列 subject 行转列
SELECT name,
MAX(CASE WHEN subject = '语文' THEN subject ELSE null END) as chinese,
MAX(CASE WHEN subject = '数学' THEN subject ELSE null END) as math,
MIN(CASE WHEN subject = '外语' THEN subject ELSE null END) as english
FROM score
GROUP BY name;
+------+---------+------+---------+
| name | chinese | math | english |
+------+---------+------+---------+
| 张三 | 语文 | 数学 | 外语 |
| 李四 | 语文 | 数学 | 外语 |
+------+---------+------+---------+