1.时间问题
1.1 DATE_SUB() 函数从日期减去指定的时间间隔
语法:DATE_SUB(date,INTERVAL expr type)
date参数是合法的日期表达式。expr参数是您希望添加的时间间隔。
type 参数可以是下列值:
1.2 DATE_ADD() 函数从日期减去指定的时间间隔
语法:DATE_ADD(date,INTERVAL expr type)
1.3 DATEDIFF() 函数返回两个日期之间的时间
语法:DATEDIFF(date1,date2)
2.时间格式:DATE_FORMAT()
3.LAG窗口函数(从上向下推),LEAD窗口函数(从下向上推)
LAG(<expression>[,offset[, default_value]])
OVER ( PARTITION BY expr,
ORDER BY expr [ASC|DESC],)
4.累计求和,累计求平均
使用窗口函数:
select sum(salary) over (order by emp_no) as running_total
select avg(salary) over (order by emp_no) as running_total
不使用窗口函数:
select sum(salary) as running_total
group by emp_no
select avg(salary) as running_total
group by emp_no
5.COALESCE( )函数
有就填,没有就判断下一个
如果出生日期不为空则将出生日期做为“重要日期”,如果出生日期为空则判断注册日期是否为空,如果注册日期不为空则将注册日期做为“重要日期”,如果注册日期也为空则将“2008年8月8日”做为“重要日期”。
SELECT FName,FBirthDay,FRegDay,
COALESCE(FBirthDay,FRegDay,'2008-08-08') AS ImportDay
FROM T_Person
6.行转列
已知表
希望:我们想实现这样的功能,就是将各学科作为单独的列来显示各个学生各科的成绩
SELECT `姓名`,
MAX(CASE WHEN `课程` = '语文' THEN `分数`END) '语文',
MAX(CASE WHEN `课程`= '数学' THEN `分数`END) '数学',
MAX(CASE WHEN `课程` = '物理' THEN `分数`END) '物理'
FROM Score
GROUP BY `姓名`
结果如下:
7.cross join 的用法(笛卡尔积)
SELECT * FROM [TABLE 1] CROSS JOIN [TABLE 2]