- null 很特殊,查询的时候需要is而不是=;
- 使用子表时最好重新命下名,参考link第十部分;
- natural join的格式:
select attributes from a natural join b
更详细的用法;
- 在文本格式中,要小心空格错误,
'hello world'与'hello world '
肉眼看着一样,在计算机内部就是两码事!!!如果使用distinct相关的指令,就会造成某些难以察觉的错误; - 如何查找每一个月的最后一个周五,参考MySQL 找每个月最后一个星期五 – 函数定义与使用中的代码:
select date_sub(last_day(CURRENT_DATE), interval mod((dayofweek(last_day(CURRENT_DATE)-6)),7) day )
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
考虑其中的dayofweek(date)函数,它是计算date在一周的第几天。例如:星期天是第一天,因此dayofweek()返回一,依此类推。
1. 为了简化说明,现在假设f = dayofweek,参数date可以假想成一系列整数,其中:
- f(1) = 1, f(2) = 2, ... , f(7) = 7
- f(x + 7) = f(x)
- f(x + y) = f(f(x) + f(y))
2. 设当月最后一天对应的date为b, 令a = b - 7, 那么最终的的答案x必在(a, b]上;
3. 由于f(x + 7) = f(x),所以f(-x) = f(7 - x),当前要求的x是星期五,因此可以得出f(x) = 6。**不难得到**f(-x) = 7 - f(x) = 1(可以简单验证下,具体证明费点时间);
4. 设delta = b - x,那么有b - a = b - x + x - a = delta + x - a = 7, 即delta = 7 + a - x,那么就有f(delta) = f(a + 7 - x),明显delta是一个介于[1, 7]的数,所以,delta = f(a + 7 - x);
5. 而f(a + 7 - x) = f(f(a) + f(7 - x)) = f(f(a) + 1) = f(a + 1),因此delta = f(a + 1),或者可以说b = x + f(b - 7 + 1) = x + f(b - 6),即x = b - f(b - 6);
6. 以上,已经离正确答案非常接近了,至少是在最后一天不是星期五的情况下是正确的。但是当最后一天恰好是星期五的时候,可以得到f(b) = 6,所以f(b - 6) = f(0) = 7,即x = b - 7,显然与实际情况不符,可以取模7,将答案修正,因此最终答案是x = b - f(b - 6) mod 7.
- 刚开始学习数据库,后面会继续查漏补缺。