sql常用函数与谓词小结

132 阅读3分钟

「这是我参与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 |
+------+---------+------+---------+
| 张三 | 语文    | 数学 | 外语    |
| 李四 | 语文    | 数学 | 外语    |
+------+---------+------+---------+