SQL语句实战学习

打印 上一主题 下一主题

主题 593|帖子 593|积分 1779

参考:https://zhuanlan.zhihu.com/p/38354000
再次感谢作者的整理!!
1.数据已提前准备好了,已知有如下4张表:
学生表:student 

成绩表:score(学号,课程号,成绩)

 课程表:course

教师表:teacher

 
 2.1 简单查询
2.1.1 查询姓"曹"的学生名单
  1. SELECT * FROM student WHERE `name` LIKE '曹%'
复制代码


 

 
2.1.2 查询姓名中最后一个是"玉"的学生名单
  1. SELECT * FROM student WHERE `name` LIKE '%玉'<br>
复制代码


 

 
2.1.3 查询姓名中带"星"的学生名单
  1. SELECT * FROM student WHERE `name` LIKE '%星%'
复制代码

 
 
2.2 汇总查询
2.2.1 查询课程编号为"0002"的总成绩
  1. SELECT SUM(grade) as '总成绩' FROM score WHERE course_id='0002'
复制代码

 
2.2.2 查询选了课程的学生人数
  1. SELECT COUNT(DISTINCT stu_id)  as '选了课程的学生人数' FROM score # DISTINCT  去重
复制代码

 
 
2.3 分组查询

2.3.1 查询各科成绩最高和最低得分
  1. SELECT MAX(grade) as '最高分',MIN(grade) as '最低分' FROM score ORDER BY grade
复制代码

 
 
2.3.2 查询每门课程被选修的学生数
  1. SELECT course_id as '课程号' ,COUNT(stu_id) as '学生人数' FROM score GROUP BY course_id  
复制代码

2.3.3 查询学生中男、女人数
  1. SELECT sex,COUNT(sex) as '人数' FROM student GROUP BY sex
复制代码

 
 
2.4 带条件的分组查询

2.4.1 查询平均成绩大于60分学生的学号和平均成绩
  1. SELECT stu_id as '学号', AVG(grade) as '平均成绩' FROM score GROUP BY stu_id HAVING AVG(grade) > 60
复制代码

 
2.4.2 查询至少选修两门课程的学生学号以及课程数目
  1. SELECT stu_id as '学生学号', COUNT(course_id) as '课程数目' FROM score GROUP BY stu_id HAVING COUNT(course_id) > 2
复制代码

2.4.3 查询同名同姓学生名单并统计同名人数
  1. SELECT name as '学生名单' ,COUNT( name) as '同名人数' FROM student GROUP BY `name`
复制代码

 
2.4.4 查询不及格的课程并按照课程号从大到小排序
  1. SELECT course_id,grade from score WHERE grade < 85 ORDER BY grade DESC
复制代码

 
2.4.5 查询每门课程的平均成绩,结果按照平均成绩升序排序,平均成绩相同时,按照课程好降序排序
  1. SELECT course_id as '课程号',AVG(grade) as '平均成绩' from score GROUP BY course_id ORDER BY AVG(grade) and course_id
复制代码

 
2.4.6 查询其中课程编号为"0003"且分数小于90的学生学号,结果按照分数降序排列
  1. SELECT course_id , stu_id, grade from score WHERE course_id='0003' AND grade < 90 ORDER BY grade DESC
复制代码

2.4.7 查询课程号和选修此课程人数,查询结果按照人数排序降序,若人数相同,按照课程号升序排序
  1. SELECT course_id as '课程号', COUNT(course_id) as '课程人数' from score GROUP BY course_id ORDER BY COUNT(course_id) DESC,course_id ASC
复制代码

 
2.4.8 查询两门以上成绩不满85分的同学的学号及其平均成绩
  1. SELECT stu_id as '学号', AVG(grade) as '平均成绩' from score WHERE grade <= 85 GROUP BY stu_id HAVING COUNT(course_id) >= 2
复制代码

2.4.9 查询各科成绩前两名的记录
  1. (SELECT *  from score WHERE course_id = '0001' ORDER BY grade DESC LIMIT 2) union
  2. (SELECT *  from score WHERE course_id = '0002' ORDER BY grade DESC LIMIT 2) union
  3. (SELECT *  from score WHERE course_id = '0003' ORDER BY grade DESC LIMIT 2);
复制代码

 
2.5 汇总查询

 
2.5.1 查询学生的成绩并进行排名

 
  1. SELECT stu_id , SUM(grade) FROM score GROUP BY stu_id ORDER BY SUM(grade)
复制代码

 
2.5.2 查询平均成绩大于80分的学生的学号和平均成绩
  1. SELECT stu_id ,AVG(grade) FROM score GROUP BY stu_id HAVING AVG(grade) > 80  
复制代码

 
2.5.3 查询所有课程成绩小于85分的学生的学号、姓名
  1. SELECT id , name  FROM student WHERE  id in (SELECT stu_id  FROM score GROUP BY stu_id HAVING AVG(grade) < 85);
复制代码

 
2.5.3 查询没有学全所有课程的学生的学号、姓名
  1. SELECT id , name  FROM student WHERE  id in ( SELECT stu_id  FROM score GROUP BY stu_id HAVING COUNT(course_id) < 3);
复制代码

 
2.5.4 查询1996年出生的学生名单
  1. SELECT * FROM student WHERE year(brith) = 1996
复制代码

 
2.5.5 查询各学生的年龄
  1. SELECT id,`name`,TIMESTAMPDIFF(year,brith,now()) from student;
复制代码
 
 
2.6 多表查询

2.6.1 查询所有学生的学号、姓名、选课数、总成绩
  1. SELECT s1.id , s1.`name`, COUNT(s2.course_id) as 'count', SUM(grade) FROM student as s1 JOIN score as s2 WHERE s1.id = s2.stu_id GROUP BY s2.stu_id
复制代码

 
2.6.2 查询平均成绩大于85分的所有学生的学号、姓名、平均成绩
  1. SELECT s1.id , s1.`name`, AVG(grade) FROM student as s1 JOIN score as s2 WHERE s1.id = s2.stu_id GROUP BY s2.stu_id HAVING  AVG(grade) > 85
复制代码

 
2.6.3 查询学生的选课情况:学号、姓名、课程号、课程名称
  1. SELECT s1.id as '学号', s1.`name` as '姓名', s2.course_id as '课程号' ,c1.`name` as '课程名称' FROM student as s1 JOIN score as s2 JOIN course as c1 WHERE s1.id = s2.stu_id  and s2.course_id = c1.id;
复制代码
 
2.6.4 查询出每门课程的大于80得人数和不大于80的人数
  1. SELECT course_id, SUM(CASE WHEN grade > 80 THEN 1 ELSE 0 END) as '大于80', SUM(CASE WHEN grade <= 80 THEN 1 ELSE 0 END) as '小于80' FROM score  GROUP BY course_id
复制代码
 

 
 
2.6.6. 查询课程编号为"0003"且课程成绩在90分以上的学生的学号和姓名
  1. SELECT s.course_id as '课程号',c1.`name` as '课程号',
  2. sum(case when s.grade >= 60 and s.grade < 70 then 1 else 0 end) as '[60,70)',
  3. sum(case when s.grade >= 70 and s.grade < 80 then 1 else 0 end) as '[70,80)',
  4. sum(case when s.grade >= 80 and s.grade < 90 then 1 else 0 end) as '[80,90)',
  5. sum(case when s.grade >= 90 and s.grade < 100 then 1 else 0 end) as '[90,100)'
  6. from score as s join course as c1 where s.course_id = c1.id group by s.course_id;  
复制代码

 
 
2.6.7 数据的行列如何互换?
  1. SELECT  s2.id as '学号',s2.`name` as '姓名'
  2. from score as s1 join student as s2 where s1.stu_id = s2.id AND s1.course_id = '0003' AND s1.grade > 90;
复制代码

 
 
 
2.7 多表连接查询

2.7.1 查询课程号为"0001"的课程分数小于90的学生信息,按照分数降序排列
  1. # 使用max()聚合函数将三个结果中的最大的提取出<br>select stu_id,
  2. MAX(case course_id when '0001' then grade else 0 end )  as '课程号0001',
  3. max((case course_id when '0002' then grade else 0 end)) as '课程号0002',
  4. max((case course_id when '0003' then grade else 0 end)) as '课程号0003'
  5. FROM score group by stu_id;
复制代码

 
 
2.7.2 查询不同老师所教的不同课程的平均分从高到低显示
  1. select s2.id,s2.name,s1.course_id,s1.grade FROM score as s1 JOIN student as s2
  2. WHERE s1.stu_id = s2.id AND s1.course_id = '0001' HAVING grade < 90 ORDER BY grade desc
复制代码

 
 
2.7.3 查询课程名称为"数学",且分数低于90的学生姓名和分数
  1. select c1.teacher_id, s1.course_id, c1.`name`, avg(grade)
  2. FROM score as s1 JOIN course as c1
  3. WHERE s1.course_id = c1.id GROUP BY c1.teacher_id ORDER BY AVG( s1.grade) DESC
复制代码

 
 
2.7.4 查询两门及其以上课程小于85的同学的学号,姓名及其平均成绩
  1. select s2.`name` as '学生姓名', s1.grade as '分数'
  2. FROM score as s1 JOIN course as c1 JOIN student as s2
  3. WHERE s1.course_id = c1.id AND s1.stu_id = s2.id
  4. AND c1.`name` = '数学' and s1.grade < 90
复制代码

 
 
2.7.5 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
  1. select s1.id as '学号',s1.name as '姓名',avg(s2.grade) as '平均成绩'
  2. from student as s1 join score as s2 on s1.id = s2.stu_id and s2.grade < 85
  3. group by s2.stu_id having count(s1.id) >= 2;
复制代码

 
 
2.7.6 查询课程编号为“0002”的课程比“0001”的课程成绩高的所有学生的学号
  1. SELECT
  2. DISTINCT s1.stu_id as '学生编号', s1.course_id as '课程编号', s1.grade as '学生成绩'
  3. FROM score AS s1 JOIN score AS s2
  4. ON s1.stu_id = s2.stu_id
  5. WHERE s1.course_id != s2.course_id  AND s1.grade = s2.grade
复制代码

 
 
2.7.7 查询学过编号为“0001”的课程并且也学过编号为“0002”的课程的学生的学号、姓名
  1. SELECT
  2. DISTINCT  a.stu_id,a.grade as '0002成绩',b.grade as '0001成绩'
  3. FROM
  4. (SELECT stu_id,grade FROM score WHERE course_id = '0002' ) as a
  5. join
  6. (SELECT stu_id,grade FROM score WHERE course_id = '0001' ) as b
  7. ON a.stu_id = b.stu_id
  8. where a.grade > b.grade;
复制代码

 
 
2.7.8 查询学过“陈独秀”老师所教的所有课的同学的学号、姓名
  1. SELECT
  2. a.stu_id as '学号',s1.`name` as '姓名'
  3. FROM
  4. (SELECT stu_id FROM score WHERE course_id = '0002' ) as a
  5. join
  6. (SELECT stu_id FROM score WHERE course_id = '0001' ) as b
  7. ON a.stu_id = b.stu_id
  8. JOIN student as s1 on s1.id = b.stu_id
复制代码

 
 
2.7.9 查询至少有一门课与学号为“0001”的学生所学课程相同的学生的学号和姓名`
  1. [/code]SELECT
  2. s1.id,s1.`name`
  3. FROM student as s1
  4. WHERE s1.id in
  5. (SELECT DISTINCT(stu_id) from score WHERE course_id in (SELECT course_id FROM score WHERE stu_id = '0001'))
  6. AND s1.id != '0001';
  7. [code]
复制代码


 
 
2.7.10 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
  1. <em id="__mceDel"><em id="__mceDel"> </em></em>
复制代码

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表