avg是查询平均数的函数
nvl是oracle中空则为另一个数。
这个语句是查询emp表中sal字段的平均值。
即总的sal值除以总行数得到的值。
例如
sal
1
2
null
3
4
这5行数据,运行之后,得到的值是2
分组查询(group by)
分组查询:
select deptno,max(sal) from emp group by deptno;
2查询每个职位的平均工资
select deptno,avg(sal) from emp group by deptno;
3查询每个部门的人数
select deptno,count() from emp group by deptno;
4查询工资大于1000的员工,每个部门的最大工资
select deptno,max(sal) from emp where sal>1000 group by deptno;
多字段分组查询:group by 字段1,字段2;
1查询每个部门下每个主管的手下人数
select deptno, mgr, count() from emp where mgr is not null group by deptno,mgr;
2查询emp表中每个部门的编号,人数,工资总和,最后根据人数进行升序排序,如果人数一致,根据工资总和降序排序
select deptno,count(),sum(sal) from emp group by deptno order by count() asc,sum(sal) desc;
3查询工资在1000-3000之间的员工信息,每个部门的编号,平均工资,最低工资,最高工资,根据平均工资进行升序排序排列
select deptno,avg(sal),min(sal),max(sal) from emp where sal between 1000 and 3000 group by deptno order by avg(sal)
4查询含有上级领导的员工,每个职业的人数,工资的总和,平均工资,最低工资,最后根据人数进行降序排列,如果人数一致,根据平均工资进行升序排列
select job, count(),avg(sal),min(sal) from emp where mgr is not null group by job order by count() desc,avg(sal) asc;
各种关键字的顺序
select from 表名 where grouphaving order by limit
having(结合group by使用)
having一般要结合分组查询和聚合函数使用,用于给聚合函数的内容添加条件
聚合函数的条件不能写在where后面
普通字段的条件写在where后面,聚合函数的条件写在having后面
1查询每个部门的平均工资,要求平均工资大于2000(c是别名的用法)
select deptno,avg(sal) c from emp group by deptno having c >2000;
2查询每个分类的平均单价,要求平均单价低于100
select category_id ,avg(price) a from t_item group by category_id having a<100;
3查询category_id分类为238和917的两个分类的平均单价
select category_id,avg(price) from t_item where category_id in(238,917) group by category_id;
4查询emp表中每个部门的平均工资高于2000的部门编号,部门人数,平均工资,最后根据平均工资降序排列
select deptno,count(),avg(sal) a from emp group by deptno having a>2000 order by a desc;
5查询emp表中工资在1000-3000之间的员工,每个部门编号,工资总和,平均工资,过滤掉平均工资低于2000的部门,按照平均工资进行升序排序
select deptno,sum(sal), avg(sal) a from emp where sal between 1000 and 3000 group by deptno having a>=2000 order by a asc;
6查询emp表中每年入职的人数
select extract(year from hiredate) year,count() from emp group by year;
7查询每个部门的最高平均工资
select deptno,avg(sal) from emp group by deptno order by avg(sal) limit 0,1;
子查询(嵌套查询)
子查询可以写在where或having后面当做查询条件的值
写在from后面,当做一张新表(但是必须要有别名)
select ename from (select from emp where sal>1000) newtable;
写在创建表的时候
create table emp_20 as (select from emp where deptno=20);
1查询emp表中工资最高的员工信息
select from emp where sal=(select max(sal) from emp);
2查询emp表中工资大于平均工资的所有员工的信息
select from emp where sal>(select avg(sal) from emp);
3查询工资高于20号部门最大工资的员工信息
select from emp where sal>(select max(sal) from emp where deptno=20);
4查询工资高于20号部门最大工资的员工信息
select from emp where sal>(select avg(sal) from emp);
5查询和Jones相同工资的其他员工信息
select from emp where job=(select job from emp where ename='jones' and ename!='jones');
6查询工资最低的员工的同事们的信息(同事=相同job)
select from emp where job=(select job from emp where sal=(select min(sal) from emp)) and sal !=(select min(sal) from emp);
7查询最晚入职的员工信息
select from emp where hiredate=(select max(hiredate) from emp);
8查询名字为King的部门编号和部门名称(需要用到dept表)
select deptno,dname from dept where deptno=(select deptno from emp where ename='king');
9查询有员工的部门信息(编号和名称)
select deptno ,dname from dept where deptno in (select distinct deptno from emp);
10查询平均工资最高的部门信息
select from dept where deptno in (select deptno from emp group by deptno having avg(sal)=(select avg(sal) from emp group by deptno order by avg(sal) desc limit 0,1));
关联查询
同时查询多张表的数据称为关联查询
1查询每一个员工的名称和其对应的部门名称
select eename,ddname from emp e,dept d where edeptno=ddeptno;
2查询在new york工作的所有员工的信息
select e from emp e,dept d where edeptno=ddeptno and dloc='new york';
笛卡尔积
如果关联查询不写关联关系则查询到的数据是两张表的乘积,这个乘积称为笛卡尔积,笛卡尔是一种错误查询方式的结果,工作切记不要出现
等值连接和内连接
等值连接:
select from A,B where Ax=Bx and Aage=18;
内连接:
select from A join B on Ax=Bx where Aage=18;(将关联关系写在on后面)
1查询每个员工的名称和其对应的部门名称
select eename,ddname from emp e join dept d on edeptno=ddeptno;
外连接
使用外连接查询得到的数据层除了两张表的交集数据以外和另外一张主表的全部数据,哪个表为主表通过left/rigth控制, left以join左边表为主表 rigth以join右边表为主表
1查询所有员工的名称和其对应的部门名称
select eename,ddname from emp e left join dept d on edeptno=ddeptno;
首先来看第一个decode函数,这个函数起基本语法是
decode(条件,值1,返回值1,值2,返回值2,值n,返回值n,缺省值);
并不能比较大小
这里可以在引入一个函数sign,sign是取数字符号的(select (-10) from dual;返回的是-1)
小于零返回-1,等于0返回0,大于0返回1
我们可以修改下你这个语句为:
SELECT ENAME 姓名,
DECODE(SIGN(SAL-3000),1,(SAL02),0,(SAL02),-1,
DECODE(SIGN(SAL-2000),1,(SAL015),0,(SAL015),-1,
DECODE(SIGN(SAL-1000),1,(SAL01),0,(SAL01),-1,0)))应缴税款
from EMP;
再看第二个,这里要用case搜索函数
SELECT ENAME 姓名,
CASE
WHEN SAL<1000 THEN 0
WHEN SAL>=1000 AND SAL<2000 THEN SAL01
WHEN SAL>=2000 AND SAL<3000 THEN SAL015
ELSE SAL02
END 应交税款
FROM EMP;
先说答案:B
我们一个一个分析
A:调过来,那么调过来以后,where sum(sal)>2500能实现吗,明显不能,所以A错误。
B。having是在分组的结果中寻找,也就是在每个deptno的分组中寻找相应的结果。这个结果不一定是你展示出来的,没展示出来的也可以,只要能满足是在分组中寻找就可以了。这里的max(sal)就是在分组中寻找该组的max值。
如果还是不明白,那么你可以在前面的显示部分加上一列max(sal),然后后面的where子句改为having子句,这样应该就能明白了。然后再去掉显示部分的max(sal),语句一样可以正常显示(显示内容与刚刚修改过的语句一样)。
只是修改后的语句与现在语句要显示的内容并不相同,这点要注意。
C:where要在group by之前才可以,所以C错误。group by后面只能跟having,cube,rollup,grouping等group by特有子句,不能跟where。
D:having是在诶个分组的结果中寻找相应内容,分组后的结果需要聚合函数(比如max,min,mid,sum,count等)才可以显示,而sal>2500不存在任何聚合函数,该选项错误。
where与having的区别:
在与group by连用的时候,where在groupby之前,是先过滤的条件,过滤后再分组(比如该语句中,如果先where sal>2500 group by deptno),那么就是先找到所有的sal>2500的行,这些行再按照deptno进行分组,如果sal<=2500,那么这部分就被直接过滤掉了,属于在本查询中没有用的内容。
having则是利用分组后的查询结果的过滤,这个查询结果可以是显性的(在查询内容中显示),也可以是隐性的(在查询结果中不显示),但是这个条件必须是“分组后的查询结果”,按照一般的理解也就是,比如是带有聚合函数的查询结果(当然如果是显性的,也可以用在前面起的别名,比如你在前面的给sum(sal)起了一个ss的别名,那么having后面可以直接写ss>2500,这样也可以。不过只在某些数据库中适用,并不是所有的数据库都能用,这点要注意。)
--注释
--select |字段名1,字段名2 from 表名;
--1)
--查询|检索|获取 所有员工的所有信息
--查询的数据: 员工的所有信息
--数据的来源:员工表 emp
--条件:
select from emp;
--2)
--查询所有的员工名字
select ename from emp;
--3)
--查询所有的员工编号和员工名称,员工上级的编号
--查询的数据: empno,ename,mgr
--数据的来源:员工表 emp
select empno,ename,mgr from emp;
--4)
--查询所有部门部门编号
select deptno from dept;
--5)
--查询出所有员工所在的部门的部门编号
select distinct deptno from emp;
--对查询数据进行去重(非字段去重) distinct
--6)
--查询出所有存在员工的部门的部门编号,以及员工名称
select deptno,ename from emp;
select distinct sal,deptno from emp;
--7)
--查询表达式,结果是表达式的值,显示的字段名就是表达式,计算值
select 1+1 from emp;
select 'a' from emp;
--8)
--给字段取别名 select 字段1 (as) 别名1,字段2 别名2 from 表名 别名; 表的别名不能加as
--查询所有员工的名称(别名为:名字),员工编号(编号)
--别名默认变大写,别名中的内容原封不动出现 ""->中的内容原封不动出现
select 123+456 "get sum" from emp;
select empno as 员工编号,ename "员工 姓名" from emp;
--9)
--字符串 '' 原封不动显示""
select distinct '哈哈' 笑 from emp e;
--10)
--字符串拼接 java中使用+ 这里使用||
--查询 ab--cd 表达式
select distinct 'ab-'||'-cd' from emp;
--查询所有的员工名字,给他们来一个前缀SXT
select 'sxt-'||ename from emp;
--11)
--伪列 : 不存在的列就是伪列 比如:表达式,字符串
--12)
--虚表: 在oracle中不存在的表,也可以说是这个表中没有任何数据,没有任何字段 --oracle中的虚表:dual
--虚表的作用:可以不使用distinct就可以去重的效果,因为里面没有数据,不会出现多行
select from dual;
select distinct 123456 from emp;
select 123456 from dual;
select sysdate from dual;
--比如查询当前时间
--13)
--给每一个员工在原来的基础上+100块钱奖金
--null 空
--null与数字运算,结果还为null
--null与字符串运算,结果原串
--nvl(参数1,参数2) 处理null使用 如果参数1为null,最终结果参数2,如果参数1不为null,最终的结果就是参数1
select comm 原奖金,comm||'100' 新奖金 from emp;
select comm 原奖金,nvl(comm,0)+100 新奖金 from emp
--一节结尾小练习
--查询所有员工的名字, 工种, 年薪(不带奖金)
select ename,job,sal12 年薪 from emp;
--查询所有员工的名字,工种,年薪(带12月奖金的)
select ename,job,(sal+nvl(comm,0))12 年薪 from emp;
--查询所有员工的名字, 工种, 年薪(带一次奖金的)
select ename,job,sal12+nvl(comm,0) 年薪 from emp;
--select |表达式|字符串|伪列|字段1 别名1,字段2 as 别名2 from 表名 别名|结果集 where 行过滤条件;
--执行流程: from-->where-->select确定结果集
-- 查询20部门的员工信息
--数据:
--来源: emp
--条件: deptno=20
select from emp where deptno=20;
-- > < >= <= = != <>
-- 查询工资大于1000的员工的姓名 工作岗位 工资 所属部门编号
--数据: ename,job,sal,deptno
--来源: emp
--条件: sal>1000
select ename,job,sal,deptno from emp where sal=1000;
-- 查询不在20部门工作的员工信息
select from emp where deptno != 20;
select from emp where deptno <> 20;
--where 中不能使用字段的别名
-- 查询员工的年薪大于20000的 员工名称、岗位 年薪
select ename 姓名,job 岗位,(sal+nvl(comm,0))12 sum from emp where ((sal+nvl(comm,0))12)>20000;
select ename 姓名,job 岗位,(sal+nvl(comm,0))12 sum from emp;
select 岗位, sum
from (select ename 姓名, job 岗位, (sal + nvl(comm, 0)) 12 sum from emp)
where sum > 20000;
-- 查询 any(任意一个) some(任意一个) all(所有)
select from emp where deptno = any(10,20);
select from emp where deptno = some(10,20);
--大于最小的
select from emp where sal> any(1500,2000); --薪资>1500的就可以
--大于最大的
select from emp where sal> all(1500,2000); --薪资>2000的就可以
-- 查询 工种不为’SALESMAN’的员工信息 (注意 内容区分大小写)
select from emp where not job ='SALESMAN';
--or或 and并且|都 not取反
-- -检索 工资 1600, 3000员工名称 岗位 工资
select ename,job,sal from emp where sal=1600 or sal=3000;
select ename,job,sal from emp where not (sal=1600 or sal=3000);
-- 工资在2000到3000之间的员工信息
select from emp where sal>2000 and sal<3000;
--between 小范围值 and 大范围的值 两者之间 <= >=
select from emp where sal between 1600 and 3000;
---查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门编号,工资
select ename ,deptno ,sal from emp where job='CLERK' and deptno=20;
-- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资
select ename ,deptno ,sal,job from emp where job='CLERK' or deptno=20;
--查询 岗位 不是 CLERK 员工名称 部门编号,工资
select ename ,deptno ,sal,job from emp where job!='CLERK';
select ename ,deptno ,sal,job from emp where not job='CLERK';
select ename ,deptno ,sal,job from emp where job<>'CLERK';
-- 查询 岗位 不为 CLERK 并且部门编号不为 20的员工名称 部门编号,工资
select ename ,deptno ,sal,job from emp where job!='CLERK' and deptno!=20;
select ename ,deptno ,sal,job from emp where not (job='CLERK' or deptno=20);
--存在佣奖金的员工名称
select ename,comm from emp where not comm is null;
select ename,comm from emp where comm is not null;
--不存在奖金的员工名称
select ename,comm from emp where comm is null;
--集合
--Union,并集(去重) 对两个结果集进行并集 *** 作,不包括重复行同时进行默认规则的排序;
--Union All,全集(不去重) 对两个结果集进行并集 *** 作,包括重复行,不进行排序 ;
--Intersect,交集(找出重复) 对两个结果集进行交集 *** 作,不包括重复行,同时进行默认规则的排序;
--Minus,差集( 减去重复 ) 对两个结果集进行差 *** 作,不包括重复行,同时进行默认规则的排序
--查询工资大于1500 或 含有佣金的人员姓名
select ename,sal,comm from emp where sal>1500 or comm is not null;
select ename,sal,comm from emp where sal>1500;
select ename,sal,comm from emp where comm is not null;
--并集
select ename,sal,comm from emp where sal>1500
Union
select ename,sal,comm from emp where comm is not null;
select ename,sal,comm from emp where sal>1500
Union all
select ename,sal,comm from emp where comm is not null;
--查询显示不存在雇员的所有部门号。
--求出所有的部门号
select deptno from dept;
--有员工的部门号
select distinct deptno from emp;
select deptno from dept
Minus
select distinct deptno from emp;
-- 查询显示存在雇员的所有部门号。
select deptno from dept
Intersect
select distinct deptno from emp;
--模糊匹配 like %任意任意字符 _一个任意字符 一起使用
--查询员工姓名中包含字符A的员工信息
select from emp where ename like '%A%';
--完全匹配
select from emp where ename like 'SMITH';
--查询员工姓名以'A'结尾的员工信息
select from emp where ename like 'A%';
--查询员工姓名中第二个字母为A的员工信息
select from emp where ename like '_A%';
insert into emp(empno,ename,sal) values(1000,'t_%test',8989);
insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000);
--escape('单个字符')指定转义符
--查询员工姓名中包含字符%的员工信息
select from emp where ename like '%B%%' escape('B');
--当执行插入数据,删除数据,修改的时候,默认开启事务
--可提交 commit
--可回滚 rollback
--多个人中任意一个值就可以
select from emp where sal=1600 or sal=3000 or sal=1500;
select from emp where sal in(1500,1600,3000);
--select 字段 from 结果集 where 行过滤条件 order by 排序字段 desc降序|asc升序(默认);
--执行流程: from--> where-->select-->排序
select empno,ename,sal from emp order by sal desc,empno asc;
--按照奖金升序排序,如果存在null值,所有的奖金null值的数据最先显示
select empno,ename,sal,comm from emp where deptno in (10,30) order by comm asc nulls first;
以上就是关于“select sal+nvl(comm,0)from emp”是什么意思全部的内容,包括:“select sal+nvl(comm,0)from emp”是什么意思、数据库高级查询2、oracle 数据库问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)