插入记录(一)
一次性插入多条记录
insert into
exam_record(uid, exam_id, start_time, submit_time, score)
values
(1001, 9001, '2021-09-01 22:11:12', '2021-09-01 23:01:12', 90),
(1002, 9002, '2021-09-04 07:01:02', null, null)
插入记录(二)
将一张表的数据插入到另一张表 insert into table select…
insert into exam_record_before_2021( uid,exam_id,start_time,submit_time, score)
select uid,exam_id,start_time,submit_time, score from exam_record
where year(submit_time)<'2021' and score is not null;
插入记录(三)
不管数据存不存在都插入 replace into 如果数据存在就先删除后插入
replace into examination_info(exam_id,tag,difficulty,duration,release_time)
values(9003,'SQL','hard',90,'2021-01-01 00:00:00');
开窗函数
开窗函数与聚合函数一样,也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,开窗函数主要分两类:一类是聚合开窗函数,一类是排序开窗函数。
聚合开窗函数
【max|min|count|avg|sum】 over(parttition by 字段 order by 字段)
排序开窗函数
row_number ()
rank() :
dense_rank():
union的使用细节
union是将两个SQL查询结果合并起来,但是要求SQL返回结果的列的个数相同。
在联合order by使用时,要求两个sql 查询出的字段必须完全一致,且只能使用一个order by,且order by 在最后一条sql使用,意寓为对连接好的查询整体进行order by
SELECT * FROM t1 WHERE username LIKE 'l%'
UNION
SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score
关于解决最新的SQL版本中ONLY_FULL_GROUP_BY报错的办法
ONLY_FULL_GROUP_BY的语义就是确定select 中的所有列的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值。MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝。
所以只需要在非group by的列上加==any_value()==就可以了
select date_format(submit_time,"%Y%m") submit_month,
count(question_id) month_q_cnt,
any_value(round(count(question_id)/day(last_day(submit_time)),3)) avg_day_q_cnt
from practice_record
where year(submit_time)=2021
group by submit_month
CASE…WHEN THEN…WHEN THEN
SELECT
STUDENT_NAME,
(CASE WHEN score < 60 THEN '不及格'
WHEN score >= 60 AND score < 80 THEN '及格'
WHEN score >= 80 THEN '优秀'
ELSE '异常' END) AS REMARK
FROM
TABLE