0%

MySQL 常用函数

MySQL自带了很多字符串处理、日期处理等函数,以及if expression等…

常用的课内已经学过的主要都是聚合函数,有AVGCOUNTMINMAXSUM等,但事实上MySQL还包含很多常用的函数,leetcode数据库部分简单、中等题随便一刷就知道自己学得有多浅薄了。

日期函数

  • curdate(): 返回当前日期
  • adddate(date, interval x day)subdate(...): 日期偏移,默认是天
  • date(x)time(x):试图将x转换成日期或时间
  • datediff(d1,d2)timediff(t1,t2): 计算d1—>d2的天数秒数
  • day(d)month(d)year(d):返回日期对应的部分

数学函数

  • CEIL(x)FLOOR(x): 返回大于等于x的最小数,小于等于x的最大数
  • LEAST(exp1,exp2,...)GREATEST(exp1,exp2,...): 返回表达式中最大值或最小值

高级函数

  • if(expr,v1,v2):expr?v1:v2

  • ifnull(expr,v)if(expr is null,v,expr)

  • nullif(expr1,expr2)if(expr1=expr2,null,expr1)

  • CASE expression:switch表达式,自带break

    1
    CASE expression
    2
        WHEN condition1 THEN result1
    3
        WHEN condition2 THEN result2
    4
       ...
    5
        WHEN conditionN THEN resultN
    6
        ELSE result
    7
    END

例题Leetcode 1158.市场分析 I

给定两个表Users和Orders,为每一位注册用户统计它在2019年的订单数:

1
Users table:
2
+---------+------------+----------------+
3
| user_id | join_date  | favorite_brand |
4
+---------+------------+----------------+
5
| 1       | 2018-01-01 | Lenovo         |
6
| 2       | 2018-02-09 | Samsung        |
7
| 3       | 2018-01-19 | LG             |
8
| 4       | 2018-05-21 | HP             |
9
+---------+------------+----------------+
10
11
Orders table:
12
+----------+------------+---------+----------+-----------+
13
| order_id | order_date | item_id | buyer_id | seller_id |
14
+----------+------------+---------+----------+-----------+
15
| 1        | 2019-08-01 | 4       | 1        | 2         |
16
| 2        | 2018-08-02 | 2       | 1        | 3         |
17
| 3        | 2019-08-03 | 3       | 2        | 3         |
18
| 4        | 2018-08-04 | 1       | 4        | 2         |
19
| 5        | 2018-08-04 | 1       | 3        | 4         |
20
| 6        | 2019-08-05 | 2       | 2        | 4         |
21
+----------+------------+---------+----------+-----------+
22
23
Result table:
24
+-----------+------------+----------------+
25
| buyer_id  | join_date  | orders_in_2019 |
26
+-----------+------------+----------------+
27
| 1         | 2018-01-01 | 1              |
28
| 2         | 2018-02-09 | 2              |
29
| 3         | 2018-01-19 | 0              |
30
| 4         | 2018-05-21 | 0              |
31
+-----------+------------+----------------+
1
select users.user_id as buyer_id,join_date,ifnull(cnt,0) as orders_in_2019 from
2
users left join(
3
    select user_id,count(*) as cnt
4
    from users inner join orders on user_id=buyer_id
5
    where year(order_date)=2019
6
    group by user_id
7
) as ret on users.user_id=ret.user_id

个人感觉SQL还是要多写多刷题才能学好。很多需求只有写过一遍才知道怎么写,很多SQL语句只有报错了才知道原来不符合语法规范。

leetcode应该算是练习SQL的一个比较好的平台了,毕竟你不需要为了检验自己写得对不对而建表造数据。

就我目前的所学知识,可能简单题都不一定能刷完吧,还是要加把劲啊。