持续更新,建议关注收藏!
SQL进阶看这一篇就够了!
目录
- 1-datediff
- 2-生成排序序号
- 3-having注意
- 4-procedure + declare
- 5-弯弯绕绕
1-datediff
select id,datediff(end_date, start_date) as diff
from Tasks
order by diff desc
limit 3;
- datediff(date1,date2) 调用函数来运算时间差
参数类型为date
2-生成排序序号
SELECT row_number() over() as score_rank, sno, (course1 + course2 + course3) as total_score
from score
order by total_score desc,sno
limit 1,4 #limit start从0开始
- ROW_NUMBER() 是一种窗口函数,用来根据查询的顺序为每一行分配一个唯一的序号(行号)。行号是从 1 开始递增的,默认情况下,行号是按照查询结果的顺序来分配的。
- OVER() 子句定义了窗口的范围。窗口可以是整个结果集,也可以按某些条件进行分组或排序。如果没有提供任何 ORDER BY,那么 ROW_NUMBER() 将根据查询返回的原始顺序分配行号。
ROW_NUMBER() OVER (ORDER BY score DESC) AS score_rank
--ROW_NUMBER() 配合 ORDER BY 使用,可以根据某个列的排序顺序来分配行号
3-having注意
select course_id from courses group by course_id
having count(distinct student_id)=(select count(distinct student_id)from courses)
order by course_id
HAVING (DISTINCT student_id) = (SELECT DISTINCT student_id FROM courses);或HAVING (DISTINCT student_id) in (SELECT DISTINCT student_id FROM courses);
都是错误的
HAVING 中不可以使用 DISTINCT:
HAVING 子句用于在 GROUP BY 后过滤数据,它期望一个 布尔表达式,通常涉及聚合函数(比如 COUNT、SUM、AVG 等)。
DISTINCT 关键字一般用于 SELECT 语句中,用来选择唯一值,或者在聚合函数中使用来去重,但不能在 HAVING 中直接使用 DISTINCT 来对单列进行过滤。
4-procedure + declare
create procedure GetTotalTeacher ()
begindeclare totalTeacher int default 0;select count(*) into totalTeacher from teachers;select totalTeacher;
end
- CREATE PROCEDURE GetTotalTeacher():
这是存储过程的定义语法,GetTotalTeacher 是存储过程的名字,括号中的内容可以包含输入参数(在这个例子中没有任何参数)
一旦存储过程被创建,你可以使用 CALL 来调用存储过程并获取结果。
CALL GetTotalTeacher();
调用存储过程后,它将返回 teachers 表中的教师数量。 - DECLARE 用于在存储过程中声明局部变量。在这里,totalTeacher 变量被声明为 INT 类型,初始值为 0。
- SELECT INTO 用于将查询结果存入变量。这里使用 SELECT COUNT(*) INTO totalTeacher FROM teachers 来查询 teachers 表中的记录总数并将其存入 totalTeacher 变量。
- 通过 SELECT 来返回存储在 totalTeacher 变量中的值,这样你可以看到查询结果。
5-弯弯绕绕
按班级显示出各班级中全科过线的人数
select class,count(*) pass_count from students stu
inner join score sc on stu.sno=sc.sno
where course1>=60 and course2>=60 and course3>=60
group by class