-
sum(order_date = customer_pref_delivery_date)
函数可以用来代替count(*)
实现有条件的计数,因为sum()
求的是括号里的判断成立的条数,也就是成立则为 1 1 1,不成立就是 0 0 0,所以可以相加来计数
-
可以用
where (product_id, order_date) in (select product, min(order_date) from product)
来实现group by
后的最大最小化查询
-
(★)在用左连接时,要注意有的条件是放在
on
后面,还是放在where
后面。有的条件放在where
后面时,有可能把主表的信息也会删除掉。
-
要求年份在某一年时,可直接用
year()=xxxx
,而不是between xxxx-01-01 and xxxx-12-31
,同理,月份、天等也一样
-
(★)
date_format(date, format)
用于以不同的格式显示日期/时间数据,即将日期型数据转化为字符串型数据。date参数是合法的日期,format规定日期/时间的输出格式。比如date_format('2019-01-02', '%Y-%m')
,可将2019-01-02转化为2019-01,date_format('2019-01-02', '%y-%m')
则是转化为19-01,date_format('2019-01-02', '%Y-%M')
则是转化为2019-January
-
select distinct a, b, ……
时,distinct
应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段
-
(★)对于
group by
后的最大最小值筛选,可以先将待筛选的字段降序或升序排列,再用limit 1
-
(★)对于要查询截止某个日期(如2019-07-27,包含这一天)近多少(如30)天的结果,可用
where datediff('2019-07-27', activity_date) < 30
-
(★★★)当用
group by
分组后,不能用select
输出每个组中每个元素,只会输出每个组中的第一个元素,同样也不能用if()
进行逐行判断。但可以用sum
或avg
等之类的函数,也不能用having product_key in
或having product_key not in
或having product_key =
,可以用having count(distinct product_key) =
-
(★★)聚合函数不能嵌套
count()
,比如select max(count(*))
,会报错,可以对count(*)
加别名,或者用all
,或者和7一样,用limit
,而且聚合函数是针对每个分组的,即不能select max(num) from my_numbers group by num having count(*)=1
-
(★)窗口函数中,
over()
中的order by
后可以跟多个字段,和普通的order by
一样,用逗号隔开,partition by
也一样,也可以跟多个字段
-
(★)窗口函数中,
over()
内用rows
限定范围:
CURRENT ROW
边界是当前行,一般和其他范围关键字一起使用
UNBOUNDED PRECEDING
边界是分区中的第一行
UNBOUNDED FOLLOWING
边界是分区中的最后一行
expr PRECEDING
边界是当前行减去expr
的值
expr FOLLOWING
边界是当前行加上expr
的值
比如,over(partition by Id order by Month asc rows between 2 preceding and CURRENT ROW)
的窗口范围是从前两行到当前行,共3行
-
inner join
不加连接条件即为全连接,sqrt()
为求根号,power(3, 2)
为求幂运算,结果为9
-
在涉及到日期差的问题中,除了用d
atediff()
函数,还可以用visited_on >= (select min(visited_on) from customer) + 6
,特别是涉及到where
后的最大最小等函数