ORACLE学习系列二

本学习笔记由本人整理而成,转载请注明出处

———————————————————————————

###like模糊查询。%表示0到多个字符。_表示单个字符。如查询ename中第三个字母是A的职员信息:
select *from emp where ename like '__A%';
###查询包含夏津的记录
select * from LSB_GTDJ_JBXX_ZS where TRANAME like '%夏津%';

###IN和NOT IN(list)。list表示值列表
###查询职位是manager或者clerk的员工。注意字符串内区分大小写
select *from emp where job IN ('MANAGER','CLERK');
###查询不是部门10或20的员工
select *from emp where deptno NOT IN (10,20);

###BETWEEN...AND...用来查询符合某个值域范围条件的数据。不在哪个范围:not between ... and...
###查询薪水在1500-3000之间的职员信息
select *from emp where sal between 1500 and 3000;

###IS NULL和 IS NOT NULL。空值NULL是一个特殊的值,比较的时候不能使用“=”
###查询哪些职员的奖金数据为NULL
SELECT * FROM emp where comm IS NULL;

###ALL和ANY不能单独使用。any:任何一个       all:所有
>ANY:大于最小                        <ANY:小于最大
>ALL:大于最大                         <ALL:小于最小
select *from emp where sal>any(3500,4000,4500);
##查询ACCOUNTTING部门以外的其他部门的编号、名称及所在地
select deptno,dname,loc from dept where dname != 'ACCOUNTING';

###查询条件中使用表达式
select *from emp where sal*12>10000 and sal*12<20000;

###【DISTINCT】过滤重复
###查询每个部门的职位,去掉重复值
select distinct deptno,job from emp;
##查询并显示SALES部门的职位job
select distinct e.job from emp e,dept d where e.deptno = d.deptno and d.dname ='SALES';

###【排序】
###order by必须出现在select中的最后一个字句,默认升序排列
select *from emp order by deptno;
###ASC升序,DESC降序。null值视作最大值。默认升序排列,降序排列需要指明。
select *from emp order by sal DESC;
###多个列排序:对每个列需要单独设置排序方式
select *from emp order by deptno ASC,sal DESC;
##已知员工每月收入为:薪资+绩效*0.8,如果绩效为null,则表示绩效为0.查询员工姓名及月收入(列名为money),并按照月收入升序排列
select ename,nvl2(comm,sal+comm*0.8,sal)money from emp order by money;

###【聚合函数】
###MAX和MIN,获取列或表达式的最大值、最小值。可以用来统计任何类型的数据类型,包括数字、字符和日期
##获取机构下的最高薪水和最低薪水
select max(sal),min(sal) from emp;
##最早和最晚的入职时间,参数是日期
select max(hiredate),min(hiredate) from emp;
##查询员工最高工资和最低工资的差距,并显示列名为difference
select max(sal)-min(sal) difference from emp;

###AVG和SUM用来统计列或表达式的平均值和和值
##获得机构下全部职员的平均薪水和薪水综合
select avg(sal),sum(sal) from emp; 
###count用来计算表中的记录条数
##获取职员表中一共有多少名职员记录
select count(*) from emp;
##获得职员表中有多少人是有职位的,忽略null值
select count(job) from emp;
##查询各部门的平均绩效,如果绩效为null,则按数值0进行统计
select deptno,avg(nvl(comm,0)) from emp group by deptno;

###【分组】
##group by:获取每个部门的平均薪水,保留两位小数
select deptno,round(avg(sal),2) from emp group by deptno;
##HAVING子句:对分组后的结果进一步限制,必须跟在group by后面,不能单独存在
select deptno,max(sal) from emp group by deptno having max(sal)>4000;
#查询各个管理者属下员工的最低工资,其中最低工资不能低于800,且没有管理者的员工不计算在内
select mgr,min(sal) from emp where mgr is not null group by mgr having min(sal)>=800;
#查询各个部门的平均绩效,如果绩效为null,则按数值0统计
select deptno,avg(nvl(comm,0)) avg_comm from emp group by deptno; 
#查询每个部门中每个职位的最高薪水
select deptno,job,max(sal) from emp group by deptno,job;

###【关联查询】
###笛卡尔积:假设两个表的记录条数分别是X和Y,笛卡尔积将返回X*Y条记录
select count(*) from emp;
select count(*)  from dept;
select emp.ename,dept.dname from emp,dept;
###等值连接
##查询职员的姓名、职位以及所在部门的名字和所在城市,使用两个相关的列做等值操作
select e.ename,e.job,d.dname,d.loc from emp e,dept d where e.deptno = d.deptno;
###内连接:返回所有满足连接条件的记录
select e.ename,d.dname from emp e join dept d on(e.deptno=d.deptno); 
等价于: select e.ename,d.dname from emp e, dept d where e.deptno=d.deptno;
###外连接:不仅返回满足连接条件的记录,还将返回不满足连接条件的记录
##emp表做驱动表left outer join,on后面是连接条件
select e.ename,d.dname from emp e left outer join dept d on e.deptno=d.deptno;
##dept表做驱动表right outer join
select e.ename,d.dname from emp e right outer join dept d on e.deptno=d.deptno;
###全外连接full outer join
select e.ename,d.dname from emp e full outer join dept d on e.deptno=d.deptno;
###自连接
##查出每个职员的经理名字,以及它们的职员编码。join同一张表emp,给emp起了两个别名worker和manager.
select worker.empno w_empno,worker.ename w_ename,manager.empno m_empno,manager.ename m_ename
from emp worker join emp manager on worker.mgr=manager.empno;
#查询员工姓名和他的管理者姓名
select worker.ename ename,manager.ename mgr_name from emp worker join emp manager on worker.MGR=manager.EMPNO;

###实例
##not between...and...查询工资不在4000到5000之间的员工的姓名和工资
select ename,sal from emp where sal not between 4000 and 5000;
##一职员工每月收入为薪资+绩效*0.8,若绩效为null则视为0,查询员工姓名及月收入(列明money),并按照月收入升序排序
select ename,sal+nvl(comm,0)*0.8 money from emp order by money;
##查询所有部门的名称、所在地、员工数量以及平均工资
select d.dname,d.loc,e.emp_count,e.sal_avg from dept d join 
(select deptno,count(1) emp_count,avg(sal) sal_avg from emp group by deptno) e
on d.DEPTNO=e.DEPTNO;
##查询每名员工的姓名及其管理者的姓名
select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
##查询每个管理者姓名及其下属员工的姓名
select e1.ename,e2.ename from emp e1,emp e2 where e1.empno = e2.mgr;
##找出emp表中工资高于他们所在部门平均工资的员工
select * from emp e1 
where e1.sal > (select avg(sal) from emp e2 where e1.Deptno = e2.Deptno)
##找出emp中那些工资高于他们所在部门的管理者工资的员工
select e1.ename,e1.sal from emp e1 join emp e2 on e1.mgr=e2.empno
where e1.sal>any(e2.sal) and e1.mgr = e2.empno;
##列出所有薪水高于平均薪水值的员工信息
select a.ename,a.sal from emp a,(select avg(sal) sal from emp)b where a.sal>b.sal;
##查出每门课程都大于80分的学生姓名
select name,count(*) from student where fenshu > 80 group by name having count(*)=3;
或:
select distinct name from student where name not in (select distinct name from student where grade <=80);

猜你喜欢

转载自blog.csdn.net/weixin_41038867/article/details/81703530