#在select与from之间的字段信息可以表示整个组的信息
#count(*) 表示计数,就是统计每一组的记录条数
#as表示为字段重命名
#max()表示这一组中某个字段的最大值,适用于数值型
#min()表示这一组中某个字段的最小值,适用于数值型
#avg()表示这一组中某个字段的平均值,适用于数值型
#sum()表示这一组中某个字段的和,适用于数值型
#group by表示根据哪一个字段来分组
select sex as 性别, count(*) as 人数, max(age) as 最大年龄, min(id) as 最小id, avg(id) as 平均id, sum(age) as 年龄和
from stu
group by sex;
#先通过where过滤满足条件的记录,然后再根据group by来分组
select sex, count(*) as 人数
from stu
where id>2 and id<10
group by sex;
1、where根据条件过滤记录
2、group by分组
3、having在分组后再过滤
select sex, count(*) as 人数
from stu
where age>20
group by sex
having count(*)>1;
1、根据where过滤满足条件的记录
2、根据group by对过滤后的记录进行分组
3、根据having对分组后的数据再过滤
4、根据order by进行排序(根据组的信息来排序)ASC表示升序(默认)DESC表示降序
select addr, count(*) as 人数
from stu
where id not in(10)
group by addr
having count(*)>0
order by count(*) desc;
#查询id不等于10的所有记录的所有字段值,并且对age进行排序显示
select *
from stu
where id not in(10)
order by age;
#笛卡尔积:两张表中所有的记录都两两组合
select * from tstu, tclass;
#过滤笛卡尔积中满足条件的记录(条件是stu表中的外键值等于class表中的主键值)
select * from tstu, tclass
where tstu.f_tclass_id=tclass.id;
#指定显示两张表中的某些字段信息,
#from tstu s表示为tsu表定义一个对象
select s.id, s.name, s.sex, s.age, s.money, c.className
from tstu s, tclass c //此处是将表取别名
where s.f_tclass_id=c.id;
#1、查询班级名称、学生姓名、性别、缴费、
#2、相同班级的要放在一起,
#3、姓名根据字典顺序排列(默认升序)
#desc表示降序
select c.className, s.name, s.sex, s.money
from tstu s, tclass c
where s.f_tclass_id=c.id
order by c.id desc, s.name desc;
#查询各班级的名称和人数
#where过滤笛卡尔积
#group by分组查询
#order by对分组的信息进行排序
select c.className, count(*) as 人数
from tstu s, tclass c
where s.f_tclass_id=c.id
group by c.id
order by count(*);
1、查询各班名称和人数-->group by
2、但人数必须不少于2-->having
3、人数多的放在前面-->order by
select c.className as 班级, count(*) as 人数
from tstu s, tclass c
where s.f_tclass_id=c.id
group by c.id
having count(*)>=2
order by count(*) desc;
#查询没有人员的班级
#等价于select c.id, c.className from tclass c where id not in(1,2);
select c.id, c.className
from tclass c
where id in(
select distinct s.f_tclass_id
from tstu s
);