书写顺序
select distinct * from ‘表名’ where ‘限制条件’ group by ‘分组依据’ having ‘过滤条件’ order by limit ‘展示条数’
执行顺序
from – 查询
where – 限制条件
group by – 分组
having – 过滤条件
order by – 排序
limit – 展示条数
distinct – 去重
select – 查询的结果
正则:select * from emp where name regexp ‘^j.*(n|y)$’;
集合查询:max 、min 、avg 、sum 、count 、group_concat 。
内连接:inner join
左连接:left join
右连接:right join
全连接: 左连接 union 右连接
replace 替换
拼接:concat、concat_ws、group_concat
查询语句
select * from 表名 where 范围 – 选择查询
insert into 表名(field1,field2) values(value1,value2) – 插入
delete from 表名 where 范围 – 删除
update 表名 set field1=value1 where 范围 – 更新
select * from 表名 where field1 like ’%value1%’ – 查找
select * from 表名 order by field1,field2 [desc] – 排序:
select count as 需要统计总数的字段名 from 表名 – 总数
select sum(field1) as sumvalue from 表名 – 求和
select avg(field1) as avgvalue from 表名 – 平均
select max(field1) as maxvalue from 表名 – 最大
select min(field1) as minvalue from 表名 – 最小
查询实例
MySQL学生表、老师表、课程表和成绩表查询语句,全部亲测
原创zhimadiandianyuan 最后发布于2019-09-19 14:01:05 阅读数 6975 收藏
展开
建表可自行百度,重点为查询;
一、数据准备:
1.student学生表数据:
2.teacher老师表数据:
3.course课程表数据:
4.score成绩表数据:
二、数据查询
1.查询平均成绩大于60分的同学的学生编号和学生姓名和平均成绩:
语句:select st.StuId,st.StuName as st_name,avg(sc.StuScore) from score as sc,student as st where st.StuId = sc.StuId group by st.StuId having avg(sc.StuScore) > 60;
结果:
2.查询所有学生的学号、姓名、选课数、总成绩
语句:select st.StuId,st.StuName,count(sc.StuId),sum(sc.Stuscore) from student as st,score as sc where st.StuId = sc.StuId group by sc.StuId;
结果:
3.查询姓“张”的老师的个数
语句:select count(TeaId) from Teacher where TeaName like ‘张%’;
结果:
4.查询学过“张三”老师所教的所有课的同学的学号、姓名
语句:select Student.StuId,Student.StuName from student where StuId in (select score.StuId from score,course,teacher where score.CourseId = course.CourseId and course.TeaId = teacher.TeaId and Teacher.TeaName = ‘张三’);
结果:
5.查询没学过"张三"老师授课的学生的学号、姓名
语句:select Student.StuId,Student.StuName from student where StuId not in (select score.StuId from score,course,teacher where score.CourseId = course.CourseId and course.TeaId = teacher.TeaId and Teacher.TeaName = ‘张三’);
结果:
6.查询学过编号为“0001”的课程并且也学过编号为“0002”的课程的学生的学号、姓名
语句:select Student.StuId,Student.StuName from Student,Score where Student.StuId = Score.StuId and Score.CourseId = ‘0001’ and exists (select * from score as sc where sc.StuId = Score.StuId and sc.CourseId = ‘0002’);
结果:
7.查询课程编号为“0002”的总成绩
语句:select sum(StuScore) from score where CourseId = ‘0002’;
结果:
8.查询所有课程成绩小于等于60分的学生的学号、姓名
语句:select Student.StuId,Student.StuName from student where Student.StuId not in (select Student.StuId from student,score where Student.StuId = Score.StuId and StuScore > 60);
结果:
9.查询没有学全所有课的学生的学号、姓名
语句:select Student.StuId,Student.StuName from student,score where Student.StuId = Score.StuId group by Student.StuId,Student.StuName having count(courseId) < (select count(courseId) from course);
结果:
10.查询至少有一门课与学号为“0001”的学生所学课程相同的学生的学号和姓名
语句:select Student.StuId,Student.StuName from student,score where Student.StuId = Score.StuId and CourseId in (select courseId from score where StuId = ‘0001’);
结果:
11.查询和“0001”号同学所学课程完全相同的其他同学的学号
语句:select StuId from score where courseId in (select courseId from score where StuId = ‘0001’) group by StuId having count() = (select count() from score where StuId = ‘0001’);
结果:
12.查询各科成绩最高和最低的分: 以如下的形式显示:课程ID,最高分,最低分
语句:select CourseId as 课程ID,max(StuScore) as 最高分,min(StuScore) as 最低分 from score group by courseId;
结果:
13.按各科及格率的百分数从高到低排列,以如下形式显示:课程号课程名平均成绩及格百分数
语句:select Course.CourseId as 课程号,Course.CourseName as 课程名,avg(Score.StuScore) as 平均成绩,100 * sum(case when ifnull(Score.StuScore,0)>=60 then 1 else 0 end)/count(*) as 及格百分数 from course,score where Score.CourseId = Course.CourseId group by Score.CourseId order by 及格百分数 desc;
结果:
14.查询不同老师所教不同课程平均分从高到低显示
语句:select Teacher.teaId as 教师ID,Teacher.teaName as 教师姓名,Course.courseId as 课程ID,avg(Score.StuScore) as 平均 成绩 from score,teacher,course where score.courseId = Course.courseId and Course.teaId = Teacher.teaId group by Score.courseId order by avg(Score.StuScore) desc;
结果:
15.使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称
语句:select Score.courseId as 课程ID,courseName as 课程名称,sum(case when stuScore between 85 and 100 then 1 else 0 end) as ‘[100-85]’,sum(case when stuScore between 70 and 85 then 1 else 0 end) as ‘[85-70]’,sum(case when stuScore between 60 and 70 then 1 else 0 end) as ‘[70-60]’,sum(case when stuScore < 60 then 1 else 0 end) as ‘[<60]’ from Score,Course where Score.courseId = Course.courseId group by Score.courseId;
结果:
16.查询学生平均成绩及其名次
语句:select 1+(select count(distinct 平均成绩) from (select stuId,avg(stuScore) as 平均成绩 from Score group by stuId) as T1 where 平均成绩 > T2.平均成绩) as 名次,stuId as 学生学号,平均成绩 from (select stuId,avg(stuScore) 平均成绩 from Score group by stuId) as T2 order by 平均成绩 desc;
结果:
17.查询每门课程被选修的学生数
语句:select Course.courseName,count(Score.courseId) from Score,Course where Score.courseId = Course.courseId group by Score.courseId;
结果:
18.查询出只选修了一门课程的全部学生的学号和姓名
语句:select Student.stuId,Student.stuName from Student,Score where Score.stuId = Student.stuId group by Score.stuId having count(Score.courseId) = 1;
结果:
19.查询男生、女生人数
语句:select count(stuSex) from student where stuSex = ‘男’;select count(stuSex) from student where stuSex = ‘女’;
结果:;
20.查询姓“李”的学生名单
语句:select stuName from student where stuName like ‘李%’;
结果:
21.查询同名同姓学生名单并统计同名人数
语句:select stuName,count() from student group by stuName having count() > 1;
结果:
22.查询平均成绩大于85的所有学生的学号、姓名和平均成绩
语句:select Student.stuId,Student.stuName,avg(Score.stuScore) from Student,Score where Student.stuId = Score.stuId group by Student.stuId having avg(Score.stuScore) > 85;
结果:
23.查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
语句:select courseId,avg(stuScore) from score group by courseId order by avg(stuScore),courseId desc;
结果:
24.查询课程名称为“语文”且分数低于60的学生姓名和分数
语句:select Student.stuName,Score.stuScore from Student,Course,Score where Course.courseName = ‘语文’ and Course.courseId = Score.courseId and Score.stuId = Student.stuId and Score.stuScore < 60;
结果:
25.查询所有学生的选课情况
语句:select Score.stuId,Score.courseId,Student.stuName,Course.courseName from Score,Student,Course where Score.stuId = Student.stuId and Score.courseId = Course.courseId;
结果:
26.查询任何一门课程成绩在70分以上的学生学号、姓名、课程号和分数
语句:select distinct Student.stuId,Student.stuName,Score.courseId,Score.stuScore from Student,Score where Score.stuScore>=70 and Score.stuId = Student.stuId;
结果:
27.查询不及格的课程并按课程号从大到小排列
语句:select distinct courseId from Score where stuScore<60 order by courseId desc;
结果:
28.查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名
语句:select Student.stuId,stuName from Student,Score where Student.stuId = Score.stuId and courseId = ‘0003’ and stuScore >80;
结果:
29.查询选修“张三”老师所授课程的学生中成绩最高的学生姓名及其成绩
语句:select Student.stuName,Score.stuScore from Student,Score,Course,Teacher where Teacher.teaName = ‘张三’ and Teacher.teaId = Course.teaId and Course.courseId = Score.courseId and Score.stuId = Student.stuId and Score.stuScore = (select max(stuScore) from score where courseId = Course.courseId);
结果:
30.查询各个课程及相应的选修人数
语句:select courseId,count(*) from score group by courseId;
结果:
31.查询有2门不同课程成绩相同的学生的学号、学生成绩
解决思路: 将score进行裂变a,b项后,进行成绩相同但是学号不同的并列项进行判断,得出结果
语句:select distinct a.stuId,b.stuScore from Score a,Score b where a.stuScore = b.stuScore and a.courseId<>b.courseId;
结果:
32.统计每门课程的学生选修人数,要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号降序排序
语句:select courseId,count() from score group by courseId order by count() desc,courseId desc;
结果:
33.查询至少选修两门课程的学生学号
语句: select stuId from Score group by stuId having count(courseId) >=2;
结果:
34.查询全部学生都选修的课程的课程号和课程名
语句:select courseId,courseName from Course where courseId in (select courseId from score group by courseId);
结果:
35.查询没学过“张三”老师讲授的任一门课程的学生姓名
语句:select stuName from Student where stuId not in(select stuId from Course,Teacher,Score where Teacher.teaName = ‘张三’ and Teacher.teaId = Course.teaId and Course.courseId = Score.courseId);
结果:
36.查询两门以上不及格课程的同学的学号及其平均成绩
语句:select stuId,avg(ifnull(stuScore,0)) from score where stuId in (select stuId from score where stuScore <60 group by stuId having count(*) >2) group by stuId;
结果:
37.检索课程编号为“0003”且分数小于60的学生学号,结果按分数降序排列
语句:select stuId from score where courseId = ‘0003’ and stuScore < 60 order by stuScore desc;
结果:
38.查询"0001"课程比"0002"课程成绩高的学生的信息及课程分数
语句:select A.stuId from (select stuId,stuScore from Score where courseId = ‘0001’)A,(select stuId,stuScore from Score where courseId = ‘0002’)B where A.stuScore > B.stuScore and A.stuId = B.stuId;
结果: