分组查询:
需求:查询每个班级的人数
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