mysql中的其他知识点
聚合函数
mysql提供了五种聚合函数,max():最大值 min()最小值 sum()求和 avg()平均值 count()个数
例子:
-- 求老师表中最大年龄 最小年龄 年龄和 平均年龄 老师的个数
select max(age),min(age),sum(age),avg(age),count(id) from tbl_teacher;
分组查询
在sql中有个 group by 语句 将某一列相同数据 视为一组 然后进行查询 与聚合函数连用。
例子: 查询各个部门中最高薪资,最低工资,
select deptno, max(sal),min(sal),avg(sal) ,sum(sal) from emp group by deptno;
注意:如果使用group by 那么select后面只能跟聚合函数和分组的字段名
having: 表示分组后的条件。
例子: 查询各个部门中最高薪资且要求最高薪资不能少于3000的部门
select deptno, max(sal) from emp group by deptno having max(sal)>=3000;
** mysql的查询语句执行顺序**
sql语法:
select distinct *
from 表名
where 条件
group by 分组
having 分组条件
order by 排序
limit 分页。
上面为他得语法结构。顺序不能乱。
mysql执行引擎:执行得顺序。
1、from子句识别查询表的数据;
2、where子句基于指定的条件对记录进行筛选;
3、group by 子句将数据划分成多个组别,如按性别男、女分组;
4、有聚合函数时,要使用聚集函数进行数据计算;
5、Having子句筛选满足第二条件的数据;
6、执行select语句进行字段筛选
7、筛选重复数据;
8、对数据进行排序;
9、执行limit进行结果限定
验证执行顺序
-- 因为where的执行顺序高于select,再执行where时select并没有编译,where中不识别别名nl
select id,name,phone,age nl from tbl_teacher where nl>22;
-- 因为order by的执行顺序在select后,所有order by后可以跟别名
select id,name,phone,age nl from tbl_teacher order by nl;
-- where的执行顺序高于聚合函数,当where执行时 聚合函数并没有执行
select max(age) from tbl_teacher where max(age)>25 group by sex;
-- 因为having的执行顺序低于聚合函数,当having执行时聚合函数一定编译过了
select max(age) from tbl_teacher group by sex having max(age)>25;
嵌套查询
1.把一个查询的结果作为另一个查询的条件值。
例子:
查询研发部的员工信息。
[1]条件研发部---部门表
[2]查询的内容---员工表。
-- 根据上面查询的部门编号得到对应的员工信息
select * from emp where deptno=(select deptno from dept where dname='研发部');
-- 子查询先执行--在执行外部查询。
例子:查询比SCOTT入职早的员工信息。
select * from emp where hiredate<(select HIREDATE from emp where ename='SCOTT');
例子: 查找员工表中最高薪资的员工信息。
-- 例子: 查找员工表中最高薪资的员工信息。
-- [1]查询所有员工中最高的薪资
select max(sal) from emp;
-- [2]根据上面查询的薪资值 作为查询的条件
select * from emp where sal=(select max(sal) from emp);
联表查询
当我们查询的结果在n张表中,这时就需要联表查询。
查询员工信息以及对应的部门信息。
1.联表查询的种类
第一种: 内连接查询。
第二种: 外连接查询。
左外连接:
左外语法: select * from A left join B on 联表条件
右外连接:
右外语法: select * from A right join B on 联表条件
例子:
查询员工信息以及该员工对应的部门信息;
分析: 查询的字段不在一张表中,
-- 查询员工信息以及该员工对应的部门信息;如果联表查询时没有使用联表条件则出现笛卡儿积。A记录数*B记录数
select * from emp join dept on emp.DEPTNO=dept.deptno;
-- 查询所有员工以及员工对应的部门信息---没有部门的员工也查询出来
select * from emp left join dept on emp.DEPTNO=dept.DEPTNO;
-- 右链接: 把右表中所有数据查询出来,以及交集数据
select * from emp right join dept on emp.DEPTNO=dept.DEPTNO;