1.聚合函数
1.count 记数
2.sum 求和
3.avg
*语法:select avg(列名) from 表名;
4.max
求最大值
5.min
求最小值
求一个班级数学平均分?
select avg(ifnull(math,0))from stu;
求一个班级总分平均分
select avg(ifnull(math,0))+english+chinese) from stu;
求班级英语最高分和最低分
select max(english)from stu
select min(english) from stu
补充:
isnull,ifnull以及nullif是什么,有什么区别??
1.isnull(参数1),isnull接受1个参数,如果参数是null,返回布尔值
2.fnull(参数1,参数2),ifnull接受2个参数,如果参数1是null,返回参数2的值,如3.ifnull(math,0)如果math是null,则返回值为0
nullif(参数1,参数2),nullif也接受两个参数,如果参数1和参数2相等,则返回null值(1
2.分组(重要)
1.使用group by字段进行分组的
首先创建一个orders表
create table orders(id int,product varchar(20),price float);
插入我们要用到的数据
insert into orders(id,product,price) values(1,"电视",900)
INSERT into orders(id,product,price) values(2,"洗衣机",100)
INSERT into orders(id,product,price) values(3,"电视",1000)
INSERT into orders(id,product,price) VALUES(4,"空调",800)
insert into orders(id,product,price) values(5,"电脑",2000)
insert into orders(id,product,price) values(6,"空调",1000)
练习:
对订单表中的商品归类后,显示每一类商品的总价
select product,sum(price),count(*) from orders group by product
select product,sum(price),count(*) from orders group by product
查询购买了几类商品,并且每类总价大于1000的商品
select product from orders group by product having sum(price)>1000;
总结:Having和where均可实现过滤,但在having可以使用聚合函数,where不能使用聚合函数,having通常跟在group by后,它作用于分组
select...from...where...group by...having...order by....
*固定的顺序:如果没有上述的条件,把关键字去掉就ok
3.多表查询
我们直接查询一下试试
select * from emp,dept
直接查询不加条件会有重复的内容出现,原因(笛卡尔积)
1.多表查询之内连接:
- 前提条件:两个表有联系,通过外键关联。
- 普通内链接
- 语法:关键字 ... inner join ... on 条件;
- 注意:
- 在inner join关键字之前写表1
- 在inner join关键字之后写表2
- on的后面写条件:(表1是dept,表2是emp) dept.did = emp.dno
- 语句: select * from dept inner join emp on dept.did = emp.dno; 2.隐式内链接(用的最多的)
- 语法:select ... from 表1,表2 where 表1.字段 = 表2.字段;
- 语句:select * from dept,emp where dept.did = emp.dno;
- 别名:select * from dept d,emp e where d.did = e.dno;
指定字段: select d.dname,e.ename,e.sal from dept d,emp e where d.did = e.dno
2.多表查询之外连接
1.左外连接
*语法:... 表1 left outer join 表2 on 表1.字段 = 表2.字段
*语句: select * from dept left outer join emp on dept.did = emp.dno;
*特点:看左表,默认把左表中的全部数据都查询出来,再查询出有关联的数据。
2.右外链接
*语法:... 表1 right outer join 表2 on 表1.字段 = 表2.字段
* 特点:看右表,默认把右表中的全部数据都查询出来,再查询出有关联的数据。
向dept和emp表中插入一些数据
insert into dept values (null,'牛宝宝部');
insert into dept values (null,'扯淡部');
insert into emp values (null,'陈冠希',100,null);
insert into emp values (null,'张柏芝',200,null);
* 测试
* 内链接测试:select * from dept d,emp e where d.did = e.dno;
* 左链接测试:select * from dept left join emp on dept.did = emp.dno;
* 右链接测试:select * from dept right join emp on dept.did = emp.dno;
语句: select * from dept right outer join emp on dept.did = emp.dno;
* 特点:看右表,默认把右表中的全部数据都查询出来,再查询出有关联的数据。
向dept和emp表中插入一些数据
insert into dept values (null,'牛宝宝部');
insert into dept values (null,'扯淡部');
insert into emp values (null,'陈冠希',100,null);
insert into emp values (null,'张柏芝',200,null);
* 测试
* 内链接测试:select * from dept d,emp e where d.did = e.dno;
* 左链接测试:select * from dept left join emp on dept.did = emp.dno;
* 右链接测试:select * from dept right join emp on dept.did = emp.dno;
4.多表查询的总结
如果两张表中的数据没有多余的数据,下面这些个查询的结果都是一样的。
1.普通内链接查询
* inner join .. on 条件;
2.隐式内链接查询
* select * from A,B where 条件;
3.左外链接查询
* left outer join ... on
4.右外链接查询
* right outer join ... on
* 如果两个表中有多余的数据,使用左链接,查询出的结果先把左表所有的数据全部都查询出来,再把两个表中有关联
的数据查询出。
* 如果两个表中有多余的数据,使用右链接,查询出的结果先把右表所有的数据全部都查询出来,再把两个表中有关联
的数据查询出。
1.你可能一个查询语句不能查出你想要的结果,你可以把多个查询结合到一起使用。
2.你编写的一个语句中包含多个select关键字。
3.问题:查询出英语的成绩大于英语的平均分的同学?
1.查询英语的平均分 select avg(english) from stu;
2.查询的学生的信息,条件,英语的成绩需要大于平均分。
* select * from stu where english > (select avg(english) from stu);
4.子查询的特点
* select * from 表 where 条件 > 子查询
* select * from (子查询会先产出结果)
select * from (select english from stu);
5.在where条件的后面使用运算符号
< > <= >= <>
all 所有 >all
* >all (5,6,7)
any 任意
>anyany 任意 >any
* >any (5,6,7)
dept emp
想要查询什么?
几张表
条件
查看聪聪所属的部门名称和员工名称?
* 查询什么?部门的名称 员工的名称
* 表:部门表和员工表
* 条件:聪聪所属的部门(去除笛卡尔积),只想查聪聪 name='聪聪'
select d.dname,e.ename from dept d,emp e where d.did = e.dno and e.ename = '聪聪';
统计每个部门的人数(按照部门名称统计)
* 查询:部门的名称和人数
* 表:部门和员工(人数)
* 条件:where d.did = e.dno 分组(部门分组)
select d.dname,count(*) from dept d,emp e where d.did = e.dno group by d.dname;
统计部门的平均工资(按部门名称统计)
* 查询:平均工资
* 表:部门 员工属性是工资
* 条件:where d.did = e.dno 分组(部门分组)
select d.dname,avg(e.sal) from dept d,emp e where d.did = e.dno group by d.dname;
统计部门的平均工资大于公司平均工资的部门
* 查询:部门
* 表:部门和员工
* 条件:部门的平均工资 > 公司的平均工资
select d.dname,avg(e.sal) from dept d,emp e where d.did = e.dno group by d.dname having
avg(e.sal) > (select avg(sal) from emp);