mysql中group by,having,order by,limit,distinct的用法和简单的的多表查询
分组查询:关键字group by的用法
group:组
by:通过
group by :通过....。
分组group by列名:通过指定列来分组
一般情况下在题目中出现 "每个" "各个" "不同的" 这一类词语时基本都会用到group by 分组关键字
语法: select 列名 from表名 group by列名;
多字段分组语法:select * from 表名 group by 列名1 ,列名2;
分组后的筛选 having的用法
功能:类似于where
注意: 不能代替where,位置不能再group by 前面。且having 后面可以跟列名
也可以跟聚合函数。
语法:select * from 表名 group by 列名 having 条件表达式;
1.查询各个部门员工平均工资大于2500的员工部门编号;
2.查询各个部门各个岗位的工资大于1500的员工;
3.查询部门编号30的各个岗位平均工资;
having 和 where的区别:
1.where 是对分组前的数据进行筛选;
2.having 是对分组后的数据进行筛选;
3.having 后面可以跟列名,函数;
4.where 不能对分组后的数据进行筛选;
5.where 后面不能跟函数;
排序关键字 order by :
注意:
1.mysql中查询结果是按升序排序;
2.查询时排序后如果要求升序或降序那么,需要将两种排序的关键字补充上;
3.方法一:升序排序关键字asc 用法 order by 列名 asc;
4.方法二:降序排序关键字desc 用法 order by 列名 desc;
5.多字段排序:order by 列名1 [asc]desc,列名2[asc] desc ------先按列1排序如果列1值相同则按列2排序;
1.查询工资大于2000的员工信息按工资降序排序;
select * from emp where sal>2000 order by sal desc;
2.查询每个岗位平均工资按岗位降序排序;
select job,avg(sal) from emp order by job desc;
3.查询每个部门平均工资按部门降序排序;
select deptno ,avg(sal) from emp group by deptno order by deptno desc;
4.查询部门10的员工信息按工资降序排序;
select * from emp where deptno=10 order by sal desc;
5.查询工资大于等于3000的员工信息按员工编号降序排序;
select * from emp where sal>=3000 order by empno desc;
6.查询各个部门的员工的姓名并按部门编号降序排序;
select deptno,ename from emp order by deptno desc;
7.查询emp表,输出每个部门的各个职位的平均工资,并按部门编号升序、平均工资降序排序。
select deptno,job,avg(sal) from emp group by deptno,job order by deptno asc,avg(sal) desc;
查询关键字limit的用法
limit一般是用在order by后面
limit又有限制的意思,我们可以抽象的理解为截取
limit m,n------意思是从m+1条开始,连续取n条数据
例如: select * from emp order by sal lirmit 0,3;
意思是:查询emp,表员工所有信息按工资升序排序,只显工资的1-3位;
1.查询工资第五高的人信息;
select ename ,sal from emp order by sal desc limit 4,1;
2.查询工资倒数第三的人信息;
select ename ,sal from emp order by sal asc limit 2,1;
模糊匹配:关键字like
like: 像......
模糊匹配支持两种字符匹配符号
第一种:% 匹配任意个字符;
第二种:_ 匹配一个任意字符;
用法:一般是用在where 条件表达式中;
例如:查询名字中含R的员工姓名和工资;
select ename ,sal from emp where ename like'%R%';
例如:查询名字是四个字符的员工姓名和工资;
select ename,sal from emp where ename like"____";
去重: 关键字distinct
作用:就是将查询出来的列值相同的进行去重
例如:查询有多少个领导;
select count(distinct mgr) from emp;
多表查询
说明:多表查询就是根据查询需要的数据,但是数据部分在不同的表中,查询的时候需要多个表来获取数据。
查询步骤:
第一步:需要先分析即将查询的数据和给出的条件分别属于哪些表;
第二步:根据表中的列,来分析表与表之间的联系有哪些
直接关系:两张表之间有相同的列
间接关系:两张表之间没有相同的列,但是可以通过其他表建立联系;
第三步:mysql语句的编写
语法:
select 别名1.列名1,别名2.列名2
from 表名1 as 别名1, 表名2 as 别名2
where 别名1.相同列=别名2.相同列
and 其他条件语句;
语句一共有四个部分:
第一部分是确定要查询显示的列
第二部分是确定数据来源于哪些表
第三部分是建立两张表的关系,一般用的是两张表相同列名的列
第四部分阐述题目中的其他条件
- 查询部门编号10上班的员工姓名,城市,部门编号;
select ename,loc,e.deptno
from emp e,dept d
where e.deptno=d.deptno and e.deptno=10;
-
查询在NEW YORK 上班的员工工号和员工姓名和员工工资和部门名字;
select e.empno,ename,sal,d.dname -- 查询的列
from emp e,dept d -- 查询的数据源
where -- 条件关键字
e.deptno=d.deptno -- 建立连接
and d.loc='NEW YORK'; -- 筛选条件 -
查询芝加哥员工的平均工资
select d.loc '城市',round(avg(sal),2)'平均工资'
from emp e,dept d
where
e.deptno=d.deptno
and
d.loc='CHICAGO';
4.查询research部门有多少员工;
-
第一种方式(不存在重名时可以用这种方法)
select d.dname '部门',count(e.ename) '员工'
from emp e,dept d
where
e.deptno=d.deptno and d.dname='RESEARCH'; -
第二种方式(防止有重名的因素干扰)
select dname'部门',count(empno)'员工' from emp e ,dept d
where
e.deptno=d.deptno and dname='RESEARCH'; -
查询在dallas和new york上班有多少人
select count(empno) -- 查询的列
from emp e,dept d --查询的数据来源
where
e.deptno=d.deptno --建立表之间的联系
and (loc='DALLAS' or loc='NEW YORK');--题目中的筛选条件
4.查询sales部门的最低工资的员工姓名和工号
---第一种子查询方式
select ename ,empno from emp e,dept d
where e.deptno=d.deptno and dname='SALES' and sal=(select min(sal) from emp e ,dept d where e.deptno=d.deptno and dname='SALES');
---第二种截取方式
select ename ,empno from emp e,dept d
where e.deptno=d.deptno and dname='SALES' order by sal limit 1;
-- 查询每年要给RESEARCH部门划多少工资钱
select sum(sal*12) from emp e,dept d
where e.deptno=d.deptno
and dname='RESEARCH';
-- 查询ACCOUNTING部门员工的平均工资
select d.deptno,avg(sal) from emp e,dept d
where e.deptno=d.deptno
and dname='ACCOUNTING' group by deptno;