欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > mysql语句 聚合+分组+内外链接

mysql语句 聚合+分组+内外链接

2025/7/26 2:04:45 来源:https://blog.csdn.net/m0_62923286/article/details/146353087  浏览:    关键词:mysql语句 聚合+分组+内外链接

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.多表查询之内连接:
   

  1. 前提条件:两个表有联系,通过外键关联。
  2. 普通内链接
    • 语法:关键字 ... inner join ... on 条件;
    • 注意:
      • inner join关键字之前写表1
      • inner join关键字之后写表2
      • on的后面写条件:(表1dept,表2empdept.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.字段

* 特点:看右表,默认把右表中的全部数据都查询出来,再查询出有关联的数据。

deptemp表中插入一些数据

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;

* 特点:看右表,默认把右表中的全部数据都查询出来,再查询出有关联的数据。

deptemp表中插入一些数据

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);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词