搞懂下面的学生成绩查询例子,基本可以满足百分之九十的数据库查询需求。以下代码都是本人经过亲自运营测试发布的,请放心直接拷贝运行
有三张表 1,stu字段有id,name,gender 2,kecheng字段有id,kecheng_name, 3,stu_kecheng字段有id,stu_id,kecheng_id,score得分
根据上述提示完成以下查询:
1,查询选修了的MySQL的学生姓名; 2,查询张三同学选修了的课程名字; 3,查询只选修了1门课程的学生学号和姓名 4,查询选修了至少3门课的学生信息 5,查询选修了所有课程的学生 6,查询选修了课程的总人数 7,查询所学课程至少有一门跟张三所 学课程相同的学生信息 8,查询两门及两门以上不及格同学 的平均分
查询之前如果对三个表的对应信息没有任何理解可以先使用多表连接查询下这三个表都是对应着什么数据
select * from stu as s inner join stu_kecheng as k on stu_id=s.id inner join kecheng as sk on sk.id=k.kecheng_id; // 三表的完整数据源
1,查询选修了的MySQL的学生姓名
select name from stu as c
inner join stu_kecheng as s on c.id=s.id
inner join kecheng as k on k.id= s.id
where k.kecheng_name='mysql';
// 第一种方法使用连接查询 连接三个表查询
select name from stu where id in(
select stu_id from stu_kecheng where kecheng_id=(
select id from kecheng where kecheng_name='mysql'
)
);
// 第二种方法 用子查询方法查询出三个表中需要的内容
2,查询张三同学选修了的课程名字
select kecheng_name from kecheng where id in(
select kecheng_id from stu_kecheng where stu_id=(
select id from stu where name='张三'
)
); // 第一种方法 使用子查询方式查询
select kecheng_name from kecheng as k inner join stu_kecheng as s on k.id=s.kecheng_id inner join stu as st on st.id=s.stu_id where st.name='张三';
// 第二种方法 使用多表连接查询
3,查询只选修了1门课程的学生学号和姓名
select st.id,st.name from kecheng as k inner join stu_kecheng as s on k.id=s.kecheng_id inner join stu as st on st.id=s.stu_id group by kecheng_name having count(kecheng_name)=1; // 第一种方法 使用连接查询
select id,name from stu where id in(
select stu_id from stu_kecheng group by stu_id having count(kecheng_id)=1
);
// 第二种方法 ,使用子查询连接方式查询
4,查询选修了至少3门课的学生信息
select * from stu where id in(
select stu_id from stu_kecheng group by stu_id having count(*)>=3
);
// 第一种方法,子查询方式查询(group by 如果是kecheng_id 则会根据课程id分类 并不会查出课程的数量 group by 学生id)
select * from stu as s inner join
stu_kecheng as k on stu_id=s.id inner join
kecheng as sk on sk.id=k.kecheng_id group by stu_id having count(*)>=3;
// 第二种方法,多表连接方式查询
5,查询选修了所有课程的学生(同题4)
6,查询选修了课程的总人数
select count(*) from (
select id from stu_kecheng group by stu_id
) as y; (仅仅是单表即可完成的任务 只不过是需要在原有表上进行加工 让查询出来的数据作为数据源再进行查询并进行简单计算,不必想太多 select作为一个数据源(单表)的时候 不要忘了在后面加上 as ‘起名’ 不然容易报错)// 使用的子查询
7,查询所学课程至少有一门跟张三所学课程相同的学生信息(稍有难度的查询)
select * from stu where id in( //直接从学生表中查询学生的信息
select stu_id from stu_kecheng where kecheng_id in( //第三层 从学生课程表中查出这些对应的学生的学号(学生id是多少)
select kecheng_id from stu_kecheng where stu_id=( // 第二层从课程表中查出与张三选择一样课程的 课程id
select id from stu where name='张三' // 第一层 查出学生表中张三对应的学号是多少
)
)
); // 倒着向上推
【select kecheng_name from kecheng where id in(select kecheng_id from stu_kecheng where stu_id=(select id from stu where name='张三'));
// 此处的where后的where不可用'='号筛选条件,因为id的筛选值可能是多个,所以要用in来筛选 出来的多个值】
8,查询两门及两门以上不及格同学的平均分
select avg(score) from stu_kecheng where score<80 group by stu_id having count(stu_id)>=2; // 两门以上不合格可在where处直接筛选,然后用stu_id分组之后直接对不合格的同学把score进行平均值处理