一些数据库练习

--------------------------------表结构私发----------------------------------

-- 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数

SELECT ss.*, 语文.s_score, 数学.s_score 
FROM score 语文, score 数学, student ss 
WHERE ss.s_id = 语文.s_id    AND          -- 找同一个学生
            ss.s_id = 数学.s_id AND 
            语文.c_id = '01' AND
            数学.c_id = '02' AND
            语文.s_score > 数学.s_score ;
SELECT ss.*, 语文.s_score as yuwen, 数学.s_score as math
FROM student ss 
LEFT JOIN score 语文 ON ss.s_id = 语文.s_id    AND 语文.c_id = '01' 
LEFT JOIN score 数学 ON ss.s_id = 数学.s_id AND 数学.c_id = '02' 
WHERE 语文.s_score > 数学.s_score ;

-- 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数

SELECT ss.*, 语文.s_score as yuwen, 数学.s_score as math
FROM student ss 
LEFT JOIN score 语文 ON ss.s_id = 语文.s_id    AND 语文.c_id = '01' 
LEFT JOIN score 数学 ON ss.s_id = 数学.s_id AND 数学.c_id = '02' 
WHERE 语文.s_score < 数学.s_score ;

-- 3、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

SELECT ss.s_id, ss.s_name, count(score.c_id), SUM(score.s_score)
FROM student ss 
LEFT JOIN score ON ss.s_id = score.s_id  -- 将学生id一样的课程统计
GROUP BY ss.s_id, ss.s_name ;

-- 4、查询学过"张三"老师授课的同学的信息

SELECT ss.*
FROM student ss
LEFT JOIN score on ss.s_id = score.s_id
LEFT JOIN course on score.c_id = course.c_id
LEFT JOIN teacher on teacher.t_id = course.t_id
where  teacher.t_name = '张三' ;

-- 1.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
-- (包括有成绩的和无成绩的)

SELECT ss.s_id, ss.s_name, AVG(score.s_score) as avgscore
FROM student ss
LEFT JOIN score ON ss.s_id = score.s_id
GROUP BY ss.s_id, ss.s_name
HAVING avgscore < 60 OR avgscore IS null ;

-- 2.查询"李"姓老师的数量

SELECT COUNT(tt.t_name)
FROM teacher tt 
WHERE tt.t_name LIKE '李%' ;

-- 3.查询没学过"张三"老师授课的同学的信息

SELECT ss.*
FROM student ss
where ss.s_id not in(
    SELECT score.s_id
    FROM score, course, teacher
    where score.c_id = course.c_id AND teacher.t_id = course.t_id
    AND teacher.t_name = '张三' 
) ;

-- 4.查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

SELECT ss.*
FROM student ss
INNER JOIN score sc1 ON sc1.s_id = ss.s_id AND sc1.c_id='01'
INNER JOIN score sc2 ON sc2.s_id = ss.s_id AND sc2.c_id='02' ;

# 1.按平均成绩从高到低显示所有学生的所有课程成绩以及平均成绩

SELECT a.s_name, 语文.s_score as yuwen, 数学.s_score as math, 英语.s_score as english, AVG(s4.s_score) as avgScore
FROM student a
LEFT JOIN score 语文 ON a.s_id = 语文.s_id AND 语文.c_id = '01' 
LEFT JOIN score 数学 ON a.s_id = 数学.s_id AND 数学.c_id = '02' 
LEFT JOIN score 英语 ON a.s_id = 英语.s_id AND 英语.c_id = '03' 
LEFT JOIN score s4 ON a.s_id = s4.s_id
GROUP BY a.s_name
ORDER BY avgScore DESC ;

# 总成绩2,3名
-- SELECT a.*, 语文.s_score as yuwen, 数学.s_score as math, 英语.s_score as english, SUM(s4.s_score) as sumScore
-- FROM student a
-- LEFT JOIN score 语文 ON a.s_id = 语文.s_id AND 语文.c_id = '01' 
-- LEFT JOIN score 数学 ON a.s_id = 数学.s_id AND 数学.c_id = '02' 
-- LEFT JOIN score 英语 ON a.s_id = 英语.s_id AND 英语.c_id = '03' 
-- LEFT JOIN score s4 ON a.s_id = s4.s_id
-- GROUP BY a.s_name
-- ORDER BY sumScore DESC 
-- LIMIT 1,2    ;

# 2.查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

(SELECT s.*, sc.c_id as '课程ID', sc.s_score as "成绩"
FROM student s
LEFT JOIN score sc ON s.s_id = sc.s_id 
WHERE sc.c_id='01' ORDER BY sc.s_score desc LIMIT 1,2)
UNION ALL
(SELECT s.*, sc.c_id, sc.s_score 
FROM student s
LEFT JOIN score sc ON s.s_id = sc.s_id 
WHERE sc.c_id='02' ORDER BY sc.s_score desc LIMIT 1,2)
UNION ALL
(SELECT s.*, sc.c_id, sc.s_score 
FROM student s
LEFT JOIN score sc ON s.s_id = sc.s_id 
WHERE sc.c_id='03' ORDER BY sc.s_score desc LIMIT 1,2) ;
#方法二:
-- 先把课程里面的id和名称挑出来
SELECT kc.c_id, kc.c_name, "第二名" as "名次",
    (SELECT s_name from student 
        LEFT JOIN score ON score.s_id = student.s_id
        WHERE score.c_id = kc.c_id ORDER BY score.s_score desc LIMIT 2,1
    ) as 姓名, 
    (SELECT s_score from score 
        where score.c_id = kc.c_id 
        ORDER BY score.s_score DESC LIMIT 2,1
    ) as 成绩,
    "第三名" as "名次",
    (SELECT s_name from student 
        LEFT JOIN score ON score.s_id = student.s_id
        WHERE score.c_id = kc.c_id ORDER BY score.s_score desc LIMIT 3,1
    ) as 姓名,
    (SELECT s_score from score 
        where score.c_id = kc.c_id 
        ORDER BY score.s_score DESC LIMIT 3,1
    ) as 成绩
FROM course kc GROUP BY kc.c_id;

# 3.查询学生平均成绩及其名次 

set @rankScore:=0; 
SELECT @rankScore:= @rankScore+1 as '排名',tab.* FROM
(SELECT student.s_id, student.s_name, IFNULL(AVG(score.s_score),0) as avgScore
FROM student 
LEFT JOIN score ON score.s_id = student.s_id
GROUP BY student.s_id 
ORDER BY avgScore desc) tab ;

# 4.查询各科成绩前三名的记录

(SELECT s.*, sc.c_id as '课程ID', sc.s_score as "成绩"
FROM student s
LEFT JOIN score sc ON s.s_id = sc.s_id 
WHERE sc.c_id='01' ORDER BY sc.s_score desc LIMIT 3)
UNION ALL
(SELECT s.*, sc.c_id, sc.s_score 
FROM student s
LEFT JOIN score sc ON s.s_id = sc.s_id 
WHERE sc.c_id='02' ORDER BY sc.s_score desc LIMIT 3)
UNION ALL
(SELECT s.*, sc.c_id, sc.s_score 
FROM student s
LEFT JOIN score sc ON s.s_id = sc.s_id 
WHERE sc.c_id='03' ORDER BY sc.s_score desc LIMIT 3)

# 5.查询本月过生日的学生

SELECT s.s_name, s.s_birth
FROM student s
WHERE MONTH(s.s_birth) = MONTH(CURDATE()) ;

# 6.查询下周过生日的学生

SELECT s.s_name, s.s_birth
FROM student s
WHERE WEEK(s.s_birth) = WEEK(NOW())+1 ;


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱尔斯Jules

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值