Oracle基础知识(5)--select...from...where...group by...having...order by...

1.列别名和表别名
--列别名
select 'Dear '||ename as 姓名 from emp;
--as可以省略
select 'Dear '||ename 姓名 from emp;
--别名可以加双引号,且别名中有空格时双引号不能省略
select 'Dear '||ename "姓 名" from emp;

--表别名
--查询10部门的员工姓名,工资和工作
select ename,sal,job from emp where deptno = 10;
--给emp表一个别名
select e.ename,e.sal,e.job from emp e where e.deptno=10;
--一旦给了表别名之后,所有字段的的使用都要:表别名.字段名


2.select...from...where...group by...having...order by...
--select... from ...必不可少
--select sysdate from dual;
--该语句的执行顺序:where...group by...having...order by...

*order by排序
--单列排序
--查询emp表中员工的姓名和工资,按照工资升序排列
select ename,sal from emp order by sal asc;
--查询emp表中员工的姓名和工资,按照工资升序排列
select ename,sal from emp order by sal asc;
--默认是升序
select ename,sal from emp order by sal;
--查询部门20的员工的姓名和工资,并按工资降序排列
select ename,sal from emp where deptno=20 order by sal desc;

--多列排序
--查询emp表中的员工的姓名,部门编号,工资,先按照部门进行升序排列,同部门内按照工资进行降序排列
select ename,deptno,sal from emp order by deptno asc,sal desc;
--多列排序:先按照字段1进行排序,在字段1的基础上再按照字段2进行排序

*伪列:rownum,rowid
--rownum是给查询结果的每一行编一个号
--rownum总是为满足条件的记录从1开始设序号,所以rownum总是从1开始的。
select rownum,e.* from emp e;
select rownum,e.* from emp e where deptno=30;
--查询emp表的前5条记录
select rownum,e.* from emp e where rownum<=5;
--查询emp表的3-5条记录
select * from (select rownum r,e.* from emp e) where r>=3 and r<=5;
--查询emp表中工资最高的前5名员工的姓名,工作,工资
select ename,job,sal from (select * from emp order by sal desc) where rownum<=5;
--查询表中工资最高的3-5名员工的姓名,工作,工资
--先按工资降序排列选出员工的姓名,工作,工资
select ename,job,sal from emp order by sal desc;--x
--再选出上表的3到5行
select * from (select rownum ro,e.* from x) where ro>=3 and row<=5;
--结果:
select * from
(select rowno ro,x.* from
(select ename,job,sal from emp order by sal desc)x)
where ro>=3 and ro<=5;

--rowid:表示的是记录的物理地址,唯一且固定
select rowid,e.* from emp e;

*聚合函数(max,min,avg,sum,count)
--求emp表中员工总数
select count(*) from emp;
select count(empno) from emp;
--求emp表中工资最高的那个员工的工资
select max(sal) from emp;
--求emp表中工资最低的与昂工的工资
select min(sal) from emp;
--求该公司员工的平均工资
select avg(sal) from emp;
--求该公司本月发放的总工资
select sum(sal+nvl(comm,0)) from emp;
--nvl(comm,0):判断comm是否为null,如果不是null,返回comm,如果是null,返回0

*group by
--求emp表中每个部门的员工的总人数,平均工资,请列出部门编号和总人数,以及平均工资
select deptno,count(*),avg(sal) from emp group by deptno;
--求部门10中的员工的个数,员工的平均工资,请列出部门编号和总人数及平均工资
select deptno,count(*),avg(sal) from emp where deptno=10 group by deptno;
--出现在select后面的字段,除了聚合函数之外,其他内容必定出现在group by之后
--查询部门10的工人数和平均工资

select count(*),avg(sal) from emp where deptno=10;

*having

--8.  having:主要是和group by连用,针对聚合函数条件进行二次条件限定的

--问题:查询emp表中每个部门的人数,找出人数大于3的部门,并按照总人数降序排列

select deptno,count(*) 

from emp

group by deptno

having count(*)>3 

order by count(*) desc; 

--注意事项:(1)聚合函数不能出现在from后面,where子句,group by后面,

--聚合函数可以出现在select子句,having子句,order by子句

--2where子句中放的是普通的条件,不涉及到聚合函数的条件

--3having子句中不能放普通条件,必须放与聚合函数有关的条件


 













你可能感兴趣的:(Oracle)