SQL练习题(4),持续更新中

声明:所有题目均是百度搜索,再由自己整理出来的,并非自己出的题。

1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名

student 表

name course score
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90

解法一:

每门课都大于80分,也就是说学生的所有课的最小分数大于80分MIN(score)>80再根据名称进行排序,HAVING在分组的后的结果种进行筛选

SELECT NAME FROM `student` GROUP BY NAME HAVING MIN(score)>80;

解法二:

先查出每个学生的姓名和每门课程的最小分的结果集

再在查出的结果集的基础上查询姓名,并使用大于80分的条件进行筛选

SELECT NAME FROM (
SELECT NAME, MIN(score) AS msc FROM `student` GROUP BY NAME) AS t1 
WHERE t1.msc>80;

解法三:

先查出有任一门课程分数小于80分的学生姓名的结果集

再排除掉上述结果集里的姓名,便查出大于80分的学生姓名,需用DISTINCT去重

SELECT DISTINCT NAME FROM `student` WHERE NAME NOT IN (
SELECT NAME FROM `student` WHERE score<80);

解法四:

使用NOT EXISTS特性,不关心子查询中的结果,

如果子查询有返回记录,那么就排除当前记录,

如果子查询没有返回记录,那么就输出当前记录。

SELECT DISTINCT NAME FROM `student`t1 WHERE NOT EXISTS (
SELECT * FROM `student` t2 WHERE t1.name=t2.name AND t2.score<80);

解法五:

将score<80作为单独的一列,满足条件为1,不满足为0

再通过相加可以得到和,满足条件和=0也就是每一门分数都大于80才会得0.

SELECT NAME FROM `student` GROUP BY NAME HAVING SUM(score<80)=0;

解法六:

查出所有记录条数

查出大于80分的记录条数

再使用两个记录条数比对,查两个的并集

SELECT * FROM
(SELECT NAME,COUNT(1) AS c1 FROM `student` GROUP BY NAME) t1,
(SELECT NAME,COUNT(1) AS c2 FROM `student` WHERE score>80 GROUP BY NAME) t2
WHERE t1.name=t2.name AND t1.c1=t2.c2;

解法七:

1.与解法六思路类似,在分组的结果上使用每个学生的分数记录条数和大于80分的记录条数进行比较,相等则说明都每门课程大于80分。

SELECT NAME FROM `student` GROUP BY NAME HAVING COUNT(1)=SUM(IF (score>80,1,0));

解法八:

左连接查询,通过连接表查询出t2表中王五的数据为null

再根据条件筛选出t2表中名字为null的

SELECT DISTINCT t1.`name` FROM `student` AS t1

LEFT JOIN (SELECT * FROM `testscore` WHERE score<=80) AS t2

ON t1.name=t2.name

WHERE t2.name IS NULL;

(求最高分成绩的学生信息)思路

-- 先找出最高分,查出来的结MAX(score)=100

SELECT MAX(score) FROM `student`

-- 再找出所有分数等于最高分的成绩

SELECT * FROM `student` WHERE score=100

-- 然后两条语句结合 (不相关子查询)

SELECT * FROM `testscore` WHERE score=(SELECT MAX(score) FROM `testscore`);

(求 每个同学最高分的成绩)

解法一:

SELECT NAME,MAX(score) FROM `student` GROUP BY NAME;

解法二:

相关子查询:依赖外部查询的数据,外部查询每执行一次,子查询就执行一次

SELECT * FROM `student` t1 WHERE t1.`score`=(
SELECT MAX(score) FROM `student` t2 WHERE t2.`name`=t1.`name`);

-- (求大于平均分的成绩信息)

SELECT * FROM `student` WHERE score > (SELECT AVG(score) FROM `student`);

2. 现有学生表如下:

自动编号 学号 姓名 课程编号 课程名称 分数

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值