MySQL自带了很多字符串处理、日期处理等函数,以及if expression等…
常用的课内已经学过的主要都是聚合函数,有AVG
、COUNT
、MIN
、MAX
、SUM
等,但事实上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:v2ifnull(expr,v)
:if(expr is null,v,expr)
nullif(expr1,expr2)
:if(expr1=expr2,null,expr1)
CASE expression
:switch表达式,自带break1
CASE expression
2
WHEN condition1 THEN result1
3
WHEN condition2 THEN result2
4
...
5
WHEN conditionN THEN resultN
6
ELSE result
7
END
给定两个表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的一个比较好的平台了,毕竟你不需要为了检验自己写得对不对而建表造数据。
就我目前的所学知识,可能简单题都不一定能刷完吧,还是要加把劲啊。