当前位置: 首页 > news >正文

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

相关文章:

  • element与elementplus入门
  • 什么是 Promise?
  • Unity 管线简单讲解
  • 【谷粒商城踩坑记】第五坑 拖拽组件三级菜单拖不了问题
  • 在Cesium中使用ThreeJs材质(不是场景融合哦)
  • 运维网络排查工具介绍与使用
  • 《Android低内存设备性能优化实战:深度解析Dalvik虚拟机参数调优》
  • 1963. 使字符串平衡的最小交换次数
  • Elasticsearch:使用 AI SDK 和 Elastic 构建 AI 代理
  • 瑞数信息《BOTS自动化威胁报告》正式发布
  • Struct2中自定义的Filter失效问题
  • .gitattributes与git lfs
  • CSS SEO、网页布局、媒体查询
  • 游戏交易系统设计与实现(代码+数据库+LW)
  • 系统分析师常考题目《论面向对象分析方法及其应用》
  • 相生、相克、乘侮、复杂病机及对应的脏腑功能联系
  • react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析
  • 知识表示方法之一一阶谓词逻辑表示法(附详细示例)
  • 深入理解 JavaScript 的 `async/await`
  • 华为HCIE鸿蒙应用开发认证靠谱吗?
  • 菲律宾中期选举初步结果出炉,杜特尔特家族多人赢得地方选举
  • 外企聊营商|特雷通集团:税务服务“及时雨”
  • 美国务卿鲁比奥将前往土耳其参加俄乌会谈
  • 西北大学副校长范代娣成陕西首富?系家庭财富,本人已从上市公司退出
  • 中美是否计划讨论美方以芬太尼为由对华征收的特别关税?外交部回应
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额5万元