mysql中的sql语句练习

# 查询"`course`"02"课程成绩高的学生的信息及课程分数
SELECT st.*, sc.`s_score` AS '语文', sc2.`s_score` AS '数学' FROM student st
LEFT JOIN score sc ON sc.`s_id` = st.`s_id` AND sc.`c_id` = "01"
LEFT JOIN score sc2 ON sc2.`s_id` = st.`s_id` AND sc2.`c_id` = "02"
WHERE sc.`s_score` > sc2.`s_score`; 

# 查询01课程比02课程成绩低的学生的信息及课程分数
SELECT st.*, sc.`s_score` AS '语文', sc2.`s_score` AS '数学' FROM student st
LEFT JOIN score sc ON sc.`s_id` = st.`s_id` AND sc.`c_id` = "01"
LEFT JOIN score sc2 ON sc2.`s_id` = st.`s_id` AND sc2.`c_id` = "02"
WHERE sc.`s_score` < sc2.`s_score`; 

#查询平均成绩大于60分的同学的学生编号和学生姓名和平均成绩
SELECT  st.`s_name`, st.`s_id`, ROUND(AVG(sc.`s_score`),2) FROM student st
LEFT JOIN score sc ON sc.`s_id` = st.`s_id` 
GROUP BY st.s_id HAVING(AVG(sc.`s_score`)) >= 60

#查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
SELECT  st.`s_name`, st.`s_id`, ROUND(AVG(sc.`s_score`),2) FROM student st
LEFT JOIN score sc ON sc.`s_id` = st.`s_id` 
GROUP BY st.s_id HAVING(AVG(sc.`s_score`)) < 60

#查询所有同学的学生编号,学生姓名,选课总数,所有的课程的总成绩
SELECT st.`s_name`, st.`s_id`, COUNT(sc.`c_id`) AS '选课的总数' , SUM(CASE WHEN sc.s_score IS NULL THEN 0 ELSE sc.s_score END ) AS "总成绩" FROM student st 
LEFT JOIN score sc ON sc.`s_id` = st.`s_id` GROUP BY st.`s_id`

# 查询李姓老师的数量
#注意点就是group by 必须与having过滤函数搭配使用
SELECT COUNT(*), t.t_name FROM teacher t GROUP BY t.t_name HAVING  (t.t_name LIKE '李%');


#查询学过张三老师授课的学生信息`score`
SELECT st.* FROM  student st
LEFT JOIN score sc ON st.`s_id` = sc.`s_id`
LEFT JOIN course cr ON sc.`c_id` = cr.`c_id`
LEFT JOIN teacher t ON cr.`t_id` = t.`t_id`
WHERE t.`t_name` = "张三"

#查询没学过张三老师授课的学生信息,查询学生ID不在张三老师名单列表中
SELECT s.* FROM student s WHERE  s.s_id NOT IN (SELECT st.s_id FROM  student st
LEFT JOIN score sc ON st.`s_id` = sc.`s_id`
LEFT JOIN course cr ON sc.`c_id` = cr.`c_id`
LEFT JOIN teacher t ON cr.`t_id` = t.`t_id`
WHERE t.`t_name` = "张三")

#查询学过编号为01,并且学过02的学生信息同学的信息,直接查询出对应的课程为01与02的学生信息,对学生编号做条件过滤
SELECT st.* ,sc.`c_id`, sc2.`c_id`FROM student st 
INNER JOIN score sc ON st.`s_id` = sc.`s_id` AND sc.`c_id` = "01"
INNER JOIN score sc2 ON st.`s_id` = sc2.s_id AND sc2.c_id = "02"
WHERE sc.`s_id` = sc2.s_id;

#查询学过编号为01,但是没有学过编号为02的课程的同学的信息,注意点就是必须使用inner join 否则会出现null的情况出现
SELECT s.* FROM student s 
INNER JOIN score sc ON s.`s_id` = sc.`s_id` AND sc.`c_id` = "01"
WHERE s.`s_id` NOT IN (
SELECT  st.`s_id` FROM student st 
INNER JOIN score sc2 ON st.`s_id` = sc2.s_id AND sc2.c_id = "02"
)

#查询没有全所有的课程的学生信息:思路:首先查询出学完所有课程的学生信息
SELECT st.*, COUNT(cr.c_id) FROM student st
INNER JOIN score sc ON st.s_id = sc.`s_id`
INNER JOIN course cr ON sc.`c_id` = cr.c_id
GROUP BY st.s_id  HAVING(COUNT(cr.c_id)) < 3;

#查询至少有一门课与学号为01的同学所学相同的同学的信息
SELECT DISTINCT st.* FROM student st
LEFT JOIN score sc ON st.s_id = sc.`s_id`
WHERE sc.`c_id`IN(
SELECT DISTINCT(sc.c_id) FROM student st 
LEFT JOIN score sc ON st.`s_id` = sc.`s_id`
WHERE sc.`s_id` = '01'
)

#查询两门及以上不及格学生的信息,学生id, 学生姓名, 平均成绩
SELECT st.s_id AS '学生id' , st.`s_name` AS '学生姓名' , AVG(sc.s_score) AS '平均成绩' FROM student st
LEFT JOIN score sc ON st.`s_id` = sc.`s_id`
WHERE st.`s_id` IN (
SELECT s_id FROM score WHERE s_score < 60 OR s_score IS NULL GROUP BY s_id HAVING(COUNT(*) > 2)
)
GROUP BY st.`s_id`

#检索"01"课程分数小于60,按分数降序排列的学生信息
SELECT st.`s_id` AS '学生编号', st.`s_birth` '学生生日', st.`s_name` '学生姓名', st.`s_sex` '学生分数', sc.`s_score` AS '学生分数' 
FROM student st LEFT JOIN score sc ON st.`s_id` = sc.`s_id` 
WHERE sc.`c_id` = "01" AND sc.`s_score` < 60 OR sc.`s_score` IS NULL 
ORDER BY sc.`s_score` DESC

#按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT st.s_id,st.s_name,sc4.s_score "平均分",sc.s_score "语文",sc2.s_score "数学",sc3.s_score "英语" FROM student st
LEFT JOIN score sc  ON sc.s_id=st.s_id  AND sc.c_id="01"
LEFT JOIN score sc2 ON sc2.s_id=st.s_id AND sc2.c_id="02"
LEFT JOIN score sc3 ON sc3.s_id=st.s_id AND sc3.c_id="03"
LEFT JOIN score sc4 ON sc4.s_id=st.s_id
GROUP BY st.s_id 
ORDER BY AVG(sc4.s_score) DESC

#查询学生的总成绩并进行排名
SELECT st.s_id,st.s_name,SUM(sc4.s_score) "学生的总成绩",sc.s_score "语文",sc2.s_score "数学",sc3.s_score "英语" FROM student st
LEFT JOIN score sc  ON sc.s_id=st.s_id  AND sc.c_id="01"
LEFT JOIN score sc2 ON sc2.s_id=st.s_id AND sc2.c_id="02"
LEFT JOIN score sc3 ON sc3.s_id=st.s_id AND sc3.c_id="03"
LEFT JOIN score sc4 ON sc4.s_id=st.s_id
GROUP BY st.s_id 
ORDER BY SUM(sc4.s_score) DESC

#查询不同老师所教不同课程平均分从高到低显示
SELECT t.t_id , AVG(sr.s_score) FROM teacher t 
LEFT JOIN course cs ON t.t_id = cs.t_id
LEFT JOIN score sr ON cs.c_id = sr.c_id
GROUP BY t.t_id ORDER BY AVG(sr.s_score) DESC

#查询所有课程的成绩第二名到第三名的学生信息及该课程成绩
SELECT a.s_id,a.c_id,a.s_score FROM score a
WHERE (SELECT COUNT(1) FROM score b WHERE b.c_id=a.c_id AND b.s_score>=a.s_score OR b.`s_score` IS NULL)<=3 ORDER BY a.c_id,a.s_score DESC

#查询每门课成绩最好的前两名
SELECT a.s_id,a.c_id,a.s_score FROM score a
WHERE (SELECT COUNT(1) FROM score b WHERE b.c_id=a.c_id AND b.s_score>=a.s_score)<=2 ORDER BY a.c_id

#查询每门课程被选修的学生数
SELECT COUNT(1) AS '课程被选修的学生数', sr.c_id AS '课程编号'  FROM student  st
LEFT JOIN score sr ON st.`s_id` = sr.s_id
GROUP BY sr.c_id

#查询出只选修了两门课程的学号与姓名
SELECT st.*, COUNT(1)  FROM student st 
LEFT JOIN score sr ON st.`s_id` = sr.s_id
GROUP BY st.s_id HAVING(COUNT(1)) = 2

#查询男生与女生的总数
SELECT st.`s_sex` AS '性别', COUNT(1) AS '总数' FROM student st GROUP BY st.`s_sex`

#查询名字中含"风"字的学生信息
SELECT * FROM student WHERE s_name LIKE "%风%"#查询同名同姓的学生,并且统计人数
SELECT COUNT(1), st.s_name,  st.s_sex FROM student st GROUP BY st.s_name, st.s_sex HAVING COUNT(1) > 1

#查询1990年出生的学生名单
SELECT st.* FROM student st WHERE st.`s_birth`  LIKE '1990%'

#查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
SELECT sr.c_id, AVG(s_score) AS '平均成绩' FROM score sr GROUP BY sr.c_id ORDER BY AVG(s_score) DESC, sr.c_id ASC

#查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩 
SELECT AVG(sr.`s_score`), st.* FROM student st LEFT JOIN score sr ON st.`s_id` = sr.s_id GROUP BY st.`s_id` HAVING AVG(sr.`s_score`) >= 85

#查询课程名称为"数学",且分数低于60的学生姓名和分数 
SELECT st.`s_name` '学生姓名' , sr.s_score '分数' FROM student st LEFT JOIN score sr ON st.`s_id` = sr.s_id
LEFT JOIN course cr ON sr.c_id = cr.c_id WHERE cr.c_name = "数学" AND sr.s_score < 60

#查询所有学生的课程及分数情况
SELECT st.`s_id` '学生姓名', sc1.s_score '语文分数', sc2.s_score '数学分数', sc3.s_score '英语分数' FROM 
student st LEFT JOIN score sc ON st.`s_id` = sc.`s_id`
LEFT JOIN score sc1 ON st.`s_id` = sc1.s_id AND sc1.c_id = '01' 
LEFT JOIN score sc2 ON st.`s_id` = sc2.s_id AND sc2.c_id = '02'
LEFT JOIN score sc3 ON st.`s_id` = sc3.s_id AND sc3.c_id = '03'
GROUP BY st.`s_id`

#查询不及格的课程
SELECT DISTINCT(cs.c_id) FROM score sc LEFT JOIN course cs ON sc.`c_id` = cs.c_id
WHERE sc.s_score < 60 

#查询课程编号为01且课程成绩在80分以上的学生的学号和姓名
SELECT st.*, sc.`s_score` FROM student st INNER JOIN score sc ON st.`s_id` = sc.`s_id`
AND sc.`c_id` = "01" AND sc.`s_score` > 80

# 求每门课程的学生人数
SELECT COUNT(1) '学生人数' FROM student st INNER JOIN score sr ON st.`s_id` = sr.s_id GROUP BY sr.c_id

-- 统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,
-- 若人数相同,按课程号升序排列
SELECT cs.c_name, COUNT(1) FROM score sc LEFT JOIN course cs ON sc.`c_id` = cs.c_id
GROUP BY cs.c_id HAVING  COUNT(1) > 5 ORDER BY COUNT(1) DESC, cs.c_id ASC

-- 检索至少选修两门课程的学生学号
SELECT st.*, COUNT(1) FROM student st INNER JOIN score sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id` HAVING COUNT(1) >= 2

-- 查询选修了全部课程的学生信息
SELECT st.*, COUNT(1) FROM student st INNER JOIN score sc ON st.`s_id` = sc.`s_id`
GROUP BY st.`s_id` HAVING COUNT(1) >= 3

-- 查询各学生的年龄
SELECT st.`s_birth` , st.`s_id`, st.`s_name` FROM student st GROUP BY st.s_id 

-- 查询下周过生日的学生  主要就是查询当前的周数与
SELECT st.* FROM student st 
WHERE WEEK(NOW())+1=WEEK(DATE_FORMAT(st.`s_birth`,'%Y%m%d'))

-- 查询本月过生日的学生信息
SELECT st.* FROM student st WHERE MONTH(NOW()) = MONTH(DATE_FORMAT(st.`s_birth`, '%Y%m%d'))

-- 查询上个月过生日的学生信息
SELECT st.* FROM student st WHERE (MONTH(NOW()) - 5) MOD 12 = MONTH(DATE_FORMAT(st.s_birth,'%Y%m%d'))

-- 校验
SELECT MONTH(DATE_FORMAT(st.s_birth,'%Y%m%d')) FROM student st;
-- 增加一个时间戳的验证
SELECT TIMESTAMPADD(MONTH,1,NOW()) FROM student st;
SELECT st.* FROM student st 
WHERE MONTH(TIMESTAMPADD(MONTH,1,NOW()))=MONTH(DATE_FORMAT(st.s_birth,'%Y%m%d'))











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值