多表联查,分组查询

分组查询:
需求:查询每个班级的人数
select count(*) from student group by gradeId;
把所有的学生按年级分组 年级一样的分到一个组

需求:查询每个科目的平均分 并且按升序排序
select avg(studentResult),subjectId from result group by subjectId order by avg(studentResult);

需求:查询所有学生男女生的个数
select COUNT(*),sex from student group by sex;

需求:查询班级上人数大于等于5人的班级有哪些班级
select COUNT(*),gradeId from student group by gradeId having COUNT(*)>=5;
如果分组过后 还要加上条件的话 就应该把where改成having关键字

需求:查询每个班上的男女人数分别多少个(多列分组)
select gradeId,sex,count(*) from student group by gradeId,sex;

ppt 22页
有个A的表 有字段id A1 B1 C1
1    1001    P1    70
2    1002    P2    60
3    1001    P1    100
4    1002    P1    80
5    1002    P2    90

问:select A1,B1,max(C1) from A;这句sql语句什么结果?
这种情况下 先看 select A1 from A 有多少条数据?A1字段B1字段和max(C1)查询出来的个数是否一致,如果数据个数不一致就会报错!!!

多表查询/连接查询
需求:现在查询出来的student学生数据可以看到他是哪个班级的吗?
我们只看到gradeId是1,2,3的数字 但看不到具体是哪个班级的。所以我们需要多表查询。
分析:我们查询语句都是from student 去student表前查数据 能查询年级表的名字吗?
解决:select name,age,name from student,grade;
出现问题:1.语句中两个name字段 sql语言它知道哪个是student的name哪个是grade的name吗?
2.现在就从student表和grade表中去拿数据但是得到的结果不对,有笛卡尔积的现象。

上面两个问题解决办法:1.表明name是哪个表的:
select student.name,age,grade.name....
2.表名表与表之间的关系:
select student.name,age,grade.name from student,grade where student.gradeId=grade.id;

优化:1.表名太长写起来麻烦,可以给表名取一个别名(小名)
select s.name,s.age,g.name from student s,grade g where s.gradeId=g.id;
2.*****以后的用法:就用连接查询   关键字  join    on
select s.name,s.age,g.name from student join grade g on s.gradeId=g.id;

left join 和 right join 左外连接和右外连接的区别
select s.name,s.age,g.name from student s left join grade g on s.gradeId=g.id;
在join的左边是student表  join的右边是grade表
left join:当左边的student表的gradId出现null值时  能查询出student表gradeId是null值的数据
如果用right join:以右边的grade表为准,左边的student表中的gradeId出现NULL值时就查询不出来

inner join 内连接 可以看成直接 join 的语句一样的效果

多表查询:3表查询:
需求:查询出成绩表中的数据,查询分数但是要求看到学生的姓名和科目的名字
select r.studentResult,s.name,su.name from result r
join student s on s.id = r.studentId
join subject su on su.id=r.subjectId


 

猜你喜欢

转载自blog.csdn.net/MD_ASCE/article/details/81664679
今日推荐