Mysql(二) 聚合函数 group by , having, inner join , limit
程序员文章站
2022-07-13 16:08:40
...
聚合函数
原列表,以此列表为基础,实现各种函数功能(因图片太大,作者只截取了部分)
1.求平均数
select AVG(sal) FROM emp;
2.求最大值
SELECT max(sal)FROM emp;
3.求最小数
SELECT min(sal) FROM emp;
4.求sal数量总数
SELECT count(sal) FROM emp;
分组函数不能单独用在where条件中,但能通过与select联合与where使用
分组查询
GROUP BY
GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)
这是一个数据库表:
通过deptno求出每种数据各有多少种
输入下列语句:
(此处为错误语句,原因上文已说)
select deptno,sal from emp group by deptno;
你以为结果是这样的:
当然这只是一厢情愿
实际是这样的:
若要得到如下结果,这就需要聚合函数的参与
使用下列sql语句即可得到如下结果:
select deptno,count(sal) from emp group by deptno;
查询过滤
having
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。
例如:
通过sql语句查询并过滤求出一个平均数大于1600小于2400的值:(两种方法)
select deptno d, ROUND(avg(sal),2)a from emp GROUP BY deptno HAVING a>1600 and a<2400;
select deptno d, ROUND(avg(sal),2) a from emp GROUP BY deptno HAVING a between 1600 and 2400;
平均数图
结果
链表
链表就是将两个不同的表,但拥有相同列名通过用inner join onlian
拼接在一个表中(此处显示表是虚表,不是真实存在数据库中,只是临时存在)
99版语法
SELECT *(一般不写星,直接写具体查询表的列名)from emp(表) e(别名)inner jion dept d on e.deptno=deptno;
具体
SELECT e.job,d.loc from emp e inner JOIN dept d on e.deptno=d.deptno;
92版语法:
SELECT e.*,d.*FROM emp e,dept d where e.deptno=d.deptno;
SELECT e.empno,d.loc FROM emp e,dept d where e.deptno=d.deptno;
SELECT *(一般不写星,直接写具体查询表的列名)from emp(表) e(别名)inner jion dept d on e.deptno=deptno;
具体
SELECT e.job,d.loc from emp e inner JOIN dept d on e.deptno=d.deptno;
92版语法:
SELECT e.*,d.*FROM emp e,dept d where e.deptno=d.deptno;
SELECT e.empno,d.loc FROM emp e,dept d where e.deptno=d.deptno;
附地址:http://blog.csdn.net/xiaoxiong_web/article/details/71107401
链表例子:
select d.dname 部门名称,xin.job 工作,xin.ename 员工名,xin.he 工资合, xin.bb 部门编号 from(SEL ECT job,ename,SUM(sal) he,deptno bb from emp GROUP BY deptno ) xin INNER JOIN dept
d on dept no
显示结果
显示结果
例:
SELECT xin.ss,d.dname from(SELECT deptno,sum(sal) ss from emp e GROUP BY deptno)xin INNER JOIN dept d
on xin.deptno=d.deptno;
效果图:
limit函数(分页):
在数据库中经常要取表中记录中间的记录,在sql语句中使用limit
select * from a limit 4,20
理解:从表中的第五行数据开始取数据,一共取出20条
这个用法可以实现sql语句分页,只需要传进页数和每条页数两个参数即可以实现分页select sal ,ename from emp ORDER BY sal
注:limit是从0开始计算,小技巧:若要跳到第4页数值则计算规则为
(4-1)*20 从第四页开始显示
代码:
select * from a limit 60,20
例:
:
每三行为一页,显示第三页,代码如下:
select sal ,ename from emp ORDER BY sal limit 6,3;
ps:
此文为作者随笔,书写并不规范。
下一篇: 【小练习】SQL_HAVING