数据库常用函数

本文详细介绍了SQL中的RANK、DENSE_RANK和ROW_NUMBER的区别,并提供了多个查询示例,包括按成绩排序、统计总成绩、计算平均分等。此外,还涉及窗口函数在分组排序中的应用,如计算排名、找出各科最高分以及限定范围查询等高级查询技巧。
摘要由CSDN通过智能技术生成

分组排序

RANK、DENSE_RANK以及ROW_NUMBER区别

RANK、DENSE_RANK以及ROW_NUMBER区别_小妞贼毒的博客-CSDN博客_row_number和rank和dense_rank

条件表达式函数

case when

SQL之CASE WHEN用法详解_涛声依旧叭的博客-CSDN博客_case when

student

1001    张三    18
1002    张四    17
1003    张五    18
1004    张六     19

grade

1    1001    语文    85
2    1001    数学    81
3    1002    英语    75
4    1002    语文    78
5    1002    数学    79
6    1003    数学    90
7    1003    语文    87
8    1003    英语    78
9    1004    英语    90
10    1004    数学    56

#查询所有学生的数学成绩,显示学生姓名name,分数,由高到低
SELECT a.name,b.score FROM student a, grade b WHERE a.id = b.id AND kemu = '数学' ORDER BY score DESC;

#统计每个学生的总成绩,显示字段:姓名,总成绩
SELECT a.NAME,SUM(b.score) as sum_score FROM student a, grade b WHERE a.id = b.id GROUP BY NAME ORDER BY sum_score ASC;

#统计每个学生的总成绩(由于学生可能有重复名字),学生id,姓名,总成绩
SELECT a.id,a.name,SUM(b.score) as sum_score FROM student a, grade b WHERE a.id = b.id GROUP BY a.id;

#列出各门课程成绩最好的学生,要求显示字段:学号,姓名,科目,成绩
SELECT b.id,a.name,b.kemu,MAX(b.score)FROM student a,grade b where a.id = b.id GROUP BY kemu;

SELECT @@sql_mode;

set session sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

# 课程成绩最好的前两名
SELECT *
FROM
(
	SELECT b.id,a.name,b.kemu,b.score,row_number() over(partition by kemu order by score desc) as rk
	FROM student a,grade b 
	where a.id = b.id
) tmp
WHERE rk <= 2;

#计算每个人的平均成绩,要求显示字段:学号,姓名,平均成绩
SELECT a.id, a.name, AVG(b.score) AS avg_score from student a, grade b WHERE a.id = b.id GROUP BY name;

#计算每个人的成绩,总分数,平均分,
SELECT a.id,a.name,
SUM(CASE WHEN b.kemu = '语文' THEN score ELSE 0 END) AS 语文,
SUM(CASE WHEN b.kemu = '数学' THEN score ELSE 0 END) AS 数学,
SUM(CASE WHEN b.kemu = '英语' THEN score ELSE 0 END) as 英语,SUM(score),AVG(score)
FROM student a, grade b
WHERE a.id = b.id GROUP BY id;

#列出各门课程的平均成绩
SELECT kemu,AVG(score) FROM grade GROUP BY kemu;

# 问题
SET @ranking = 0;
SELECT a.id, a.name, b.kemu,b.score, (@ranking := @ranking + 1) AS 排名
FROM student a, grade b
WHERE a.id = b.id AND kemu = '数学' ORDER BY score DESC;

#列出数学成绩的排名
SELECT *
FROM
(
	SELECT b.id,a.name,b.kemu,b.score,DENSE_RANK()over(partition by kemu order by score desc) AS 排名
	FROM student a,grade b 
	where a.id = b.id
) tmp
WHERE kemu = '数学';

#列出数学成绩前3名的学生
SELECT a.id,a.name,b.kemu,b.score
from student a,grade b
where a.id = b.id AND kemu = '数学'
ORDER BY score DESC
limit 3;

#查询数学成绩第2和第3名的学生
SELECT a.id,a.name,b.kemu,b.score
from student a,grade b
where a.id = b.id AND kemu = '数学'
ORDER BY score DESC
limit 1,2; # 起点为1 查询的数量为2

#查询第3名到后面所有的学生数学成绩
SELECT a.id,a.name,b.kemu,b.score
from student a,grade b
where a.id = b.id AND kemu = '数学'
ORDER BY score ASC
limit 2,1000;

#统计英语课程少于80分的
SELECT a.id,a.name,b.kemu,b.score
from student a,grade b
where a.id = b.id AND kemu = '英语' AND score<80;

#查找每科成绩前2名
SELECT *
FROM(
SELECT a.id,a.name,b.kemu,b.score,ROW_NUMBER() over(PARTITION by kemu ORDER BY score DESC) as pm
from student a,grade b
where a.id = b.id
) c
WHERE pm <= 2;

#查询xuesheng表每门课都大于80分的学生姓名
SELECT NAME
from student a,grade b
where a.id = b.id
GROUP BY NAME
HAVING MIN(score)>80

SELECT NAME
from student WHERE name not in(
SELECT NAME
from student a,grade b
where a.id = b.id
and score<80)
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值