Sql Structure query language Dml Insert update select merge delete 不隐含commit Ddl Create drop Dcl Grant revoke Crud 单表查询 select ename,sal from emp where empno = 7521 单表查询 and or not 逻辑运算符 + - * / mod > = < >= <= between and like in is null select * from emp where sal >2000 and sal < 5000 select * from emp where sal between 2000 and 5000 select * from emp where sal in (800,1600,1250) select * from emp where sal=800 or sal=1600 select * from emp where ename like '%S' select * from emp where ename like '__A%' select * from emp; select * from dept; select distinct deptno from emp; select * rom emp order by sal desc; select * from emp order by sal desc wehere rownum<6; select * from emp order by deptno,sal desc dual select field from table select field from dual select lower('aaaBBBcCdDDD') from dual select upper('adafFFddfdfdf') from dual select initcap('aaaAAAd') from dual --首字母大写 select concat('aaa','bbbb') from dual --连接 select concat(ename,deptno) from emp select substr('abcdfghigjklmn',3,3) from dual select substr('abcdfghigjklmn',-3,3) from dual select substr('abcdfghigjklmn',-3,-2) from dual select length('adbc') from dual select instr('abcdefg','f') from dual select trim(' hello everyon !! ') from dual select trim(leading ' ' from ' hello everyon !! ') from dual --去掉左边的空格 select trim(trailing ' ' from ' hello everyon !! ') from dual --去掉右边的空格 replace select replace('AAAAaaBBBBB','a','z') from dual round trunc mod select round(25.56,1) from dual select round(25.56,-1) from dual select round(254.56,-1) from dual select trunc(25.56),trunc(25.536,2),trunc(25.56,-1) from dual select mod(10,3) from dual select trunc(10/3) from dual --转换 to_char select to_char('aaaa') from dual select sysdate from dual select to_char(sysdate) from dual to_date select to_date('2010-10-10 17:41','yyyy-mm-dd hh24:mi:ss') from dual --聚合函数 count sum avg max min select count(empno) from emp select sum(sal),max(sal),min(sal) from emp; 第二课 多表查询 子查 询 select deptno,avg(sal) from emp group by deptno select deptno,sum(sal) from emp group by deptno select deptno,job,sum(sal) from emp group by deptno,job --1.查询每个部门的员工数量 select deptno,count(deptno) from emp group by deptno --2.查询每个部门的员工数量大于4 select deptno,count(deptno) from emp group by deptno having count(deptno)>4 --3.查询每个部门的员工数量大于4,部门要显示部门名称 select e.deptno,d.dname,count(e.deptno) from emp e,dept d where e.deptno=d.deptno group by e.deptno,d.dname having count(e.deptno)>4 select * from emp e,dept d where e.deptno=d.deptno; --4.查询每个部门的员工数量,没有的也要显示[外连接,不写加号的为主] select d.deptno,count(e.empno) from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno --5.列出所有员工的姓名及其直接上级的姓名[自连接] select e.ename empname, m.empno mgrname from emp e,emp m where e.mgr=m.empno(+) --6.查询高于平均工资的员工工资[相关子查询] select avg(sal) from emp select * from emp where sal > (select avg(sal) from emp) --7.查询低于10号部门工资的所有员工 select * from emp where sal<all(select sal from emp where deptno=10) select * from emp where sal<any(select sal from emp where deptno=10) 第三课 高级查询 集合操作符 Case 层次化查询 扩展的group by函数 分析函数 union --不包含重复行 union all --返回所有的,包含重复行,并集 intersect --返回共有的,交集 minus --差集 create table dept1 as select * from dept; create table dept1 as select * from dept where 1=2 select * from dept2 delete frmo drop table dept1 create table dept2 as select * from dept insert into dept2 values(60,'bbb','bbb') select * from emp union select from emp2 case case search_expression when ... then result when ... then result else end select * from emp; select ename,job,deptno, case deptno when 10 then 'aaa' when 20 then 'bbb' else 'ccc' end from emp; select ename,deptno, case when deptno=10 then 'aaa' when deptno=20 then 'bbb' else 'ccc' end from emp; select ename,sal, case when sal>4000 then 'AAA' when sal<4000 and sal>200 then 'BBB' else 'CCC' end from emp --层次化查询 --根节点:顶端节点 --父节点: --子节点: --叶节点: select level,column,expression from table where condition start with condition connect by prior condition select * from emp; select * from emp start with empno=7839 connect by prior empno=mgr select count(distinct level) from emp start with empno=7839 connect by prior empno=mgr select level from emp start with empno=7839 connect by prior empno=mgr select level,lpad(' ',2*level-1)||ename as ename from emp start with empno=7839 connect by prior empno=mgr 第四课 Group by扩展函数 分析函数 rollup cube group by rollup(A,B) (A,B) (A) group by cube(A,B,C) (A,B,C) (A,B)(A,C)(B,C)(A)(B)(C) --最终都会对全表进行group by select * from imp; select deptno,job,count(*) from emp group by (deptno,job) select deptno,job,count(*) from emp group by (deptno,job) order by deptno select deptno,job,count(*) from emp group by rollup(deptno,job) select deptno,job,count(*) from emp group by cube(deptno,job) --1.每个部门的平均薪资,总平均薪资 select deptno,round(avg(sal),2) from emp group by rollup(deptno) --2.每个部门每年每种工作的平均薪资,总平均薪资 select deptno,to_char(hiredate,'yyyy'),job,avg(sal) from emp group by cube(deptno,to_char(hiredate,'yyyy'),job) --3.工资最低的后4名员工 select * from (select * from emp order by sal asc) where rownum <5 --分析函数 function_name(<arg0>,<arg1>...) over (<partition-clause><order-by-clause><window-clause>) --4.查询每个部门中每个岗位的收入和 select deptno,job,sum(sal) from emp group by job,deptno order by deptno --5.查询每个部门中每个岗位的收入和并且同时查询每个部门的收入总和 select deptno,job,sum(sal) as sum_dept_job,sum(sum(sal)) over(partition by deptno) as sum_dept from emp group by job,deptno order by deptno 第五课 --1.查询每个部门中岗位的总工资占部门40%以上的部门,并显示具体占百分之多少 select t.*,100*round(sum_dept_job/sum_dept,2)||'%' as percent from( select deptno,job, sum(sal) as sum_dept_job, sum(sum(sal)) over(partition by deptno) as sum_dept from emp group by job,deptno order by deptno) t where t.sum_dept_job > t.sum_dept * 0.4 --2.查询工资最低的后4名员工 select * from (select * from emp order by sal) where rownum <5 800 900 1100 1250 1259 1300 评级 rank 1,2,3,4,4,6 dense_rank 1,2,3,4,4,5 row_number 1,2,3,4,5,6 select e.*,rank() over(order by sal) as rank from emp e select * from ( select e.*,rank() over(order by sal) as rank from emp e) where rank <=4 select e.sal,rank() over(order by sal) as rank,dense_rank() over(order by sal) as dense_rank, row_number() over(order by sal) as row_number from emp e --3.查询工资最高的两名 select * from (select e.* ,rank() over(order by sal desc) as rank from emp e) where rank<=2 select * from (select e.* ,rank() over(order by sal desc nulls last) as rank from emp e) where rank<=2 --4.查询总薪水最高的部门和最低的部门 第六课 --4.查询总薪水最高的部门和最低的部门 select min(deptno) keep(dense_rank first order by sum(sal) desc) first, min(deptno) keep(dense_rank last order by sum(sal) desc) last from emp group by deptno --1.滚动 效果 --2.查询所有人的工资,并查询比该员工高的员工中最低的那个员工的工资,和比该员工工资低的最高的那个人工资。 select ename,sal,lead(sal) over(order by sal),lag(sal) over(order by sal) from emp; --3.查询所有人的工资,并查询比该员工高的员工中最低的那个员工的工资,和比该员工工资低的最高的那个人工资。, --如果出现最高或最低,取反数 nvl(a,b) select ename,sal,nvl(lead(sal) over(order by sal),min(sal) over()),nvl(lag(sal) over(order by sal),max(sal) over()) from emp; --通过制定一批记录, --查询每个部门发的工资并同时查询所有部门发的工资 select deptno,sum(sal),sum(sum(sal)) over() all_sal from emp group by deptno rows between ... preceding and ... following select deptno,sal,sum(sal),sum(sum(sal)) over(order by deptno rows between unbounded preceding and unbounded following) all_sal from emp group by deptno select sum(sal) from emp group by select empno,sum(sal) over(order by deptno) from emp select empno,sum(sal) over(order by deptno rows between unbounded preceding and unbounded following) from emp --查询每个部门发的工资,并同时查询截止至当前部门发的工资 select deptno,sum(sal),sum(sum(sal)) over(order by deptno rows between unbounded preceding and current row) from emp group by deptno select deptno,sum(sal),sum(sum(sal)) over(order by deptno rows between unbounded preceding and 0 following) from emp group by deptno