--2.查询工作在CHICAGO并且入职日期最早的前两名员工姓名,入职日期
SELECTROWNUM,ename ,hiredate
FROM(SELECT ename,hiredate FROM emp e,dept d WHERE e.deptno = d.deptno ORDERBY hiredate ASC)WHEREROWNUM<=2
以上几个例子就非常明显的特征:排序之后再用伪列编号!只能这么写!:::
分页查询(重要)
分页查询可以分为未排序的和排序的两种 未排序的分页查询:(子查询全部查出,然后取5-10条,效率低) SELECTROWNUM,b.*FROM
(SELECTROWNUM rw,empno,ename FROM emp) b WHERE rw <=5*2AND rw >5*1
抽象成:WHERE rw <=页尺寸*当前页AND rw >页尺寸*(当前页-1) 未排序的分页查询:(子查询全查出前十条,然后在外面去除前5条,效率高) SELECTROWNUM,b.*FROM
(SELECTROWNUM rw,empno,ename FROM emp WHEREROWNUM<=5*2) b WHERE rw >5*1
以上可以看出,分页查询要查询的内容都在FROM中的子查询中! 指定排序条件的分页查询:
按照日期先后顺序进行分页查询,每页显示3条记录。 SELECT c.*FROM
(SELECTROWNUM rw, b.*FROM
(SELECTROWNUM,empno,ename,hiredate FROM emp ORDERBY hiredate) b WHEREROWNUM<=页尺寸*当前页) c WHERE rw>页尺寸*(当前页-1)
用的时候只需要换最内层的语句就好了。 章节课后题
--1.查询工资高于编号为7782的员工工资,并且和7369员工从事相同工作的员工编号,姓名,工资
SELECT empno,ename,sal FROM emp WHERE sal>(SELECT sal FROM emp WHERE empno =7782) AND job =(SELECT job FROM emp WHERE empno =7369) --2.查询工资最高的员工姓名,工资
SELECT ename,sal FROM emp WHERE sal =(SELECTMAX(sal)FROM emp )
--3.查询部门最低工资高于30号部门最低工资的部门的编号、名称及部门最低工资 SELECT e.deptno,d.dname,MIN(sal)FROM emp e, dept d WHERE e.deptno = d.deptno GROUPBY e.deptno,d.dname
HAVINGMIN(sal)>(SELECTMIN(sal)FROM emp WHERE deptno =30)
第八章集合运算
联合运算:去除重复行,自动按照第一列升序排列 完全联合运算:不去除重复行,不会排序, 联合运算的注意事项:,联合的列数与列属性必须一致,但是列名可以不一样;每个查询结
果不能含有自己的order by语句,只能联合完成之后,在最后使用orderby语句;可以联合多个select语句;查询结果级的名字以第一个select语句中的名字为准。 练习1:
--1.分别使用联合运算及完全联合运算完成,按照时间升序顺序,查询员工7839 的工作岗位列表。
SELECT job ,NULLFROM emp WHERE empno =7839 UNION
SELECT job, begindate FROM emp_jobhistory WHERE empno =7839 SELECT job ,NULLFROM emp WHERE empno =7839 UNIONALL
SELECT job, begindate FROM emp_jobhistory WHERE empno =7839
--2.使用多表连接,查询每个部门的部门名称,部门人数没有人数的部门显示零
SELECT d.dname,COUNT(e.empno) FROM emp e,dept d
WHERE e.deptno(+)= d.deptno GROUPBY d.deptno,d.dname
--3.使用联合运算,查询每个部门的部门名称,部门人数没有人数的部门显示零
SELECT d.dname,COUNT(e.empno) FROM emp e,dept d
WHERE e.deptno(+)= d.deptno GROUPBY d.deptno,d.dname UNION
SELECT dname,0 FROM dept d
WHERE deptno NOTIN(SELECT deptno FROM dept WHERE deptno ISNOTNULL) --4.联合运算,查询10,20号部门的员工
SELECT empno,ename FROM emp WHERE deptno IN(10,20) SELECT empno,ename FROM emp WHERE deptno =10 UNION
SELECT empno,ename FROM emp WHERE deptno =20 --5.利用集合运算打印出如图结果,(课件上) SELECT deptno,loc,NULL,NULLFROM dept UNION
SELECT deptno,null,ename,hiredate FROM emp
相交运算(intersect)共有部分 相减运算(minus)减去共有部分
第九章高级子查询
嵌套子查询单行,多行,多列 子查询
相关子查询(子查询中引用了父查询中的一个列)
第七章的子查询就是嵌套子查询,嵌套在where 、having、from子句中,嵌套子查询基本上是子查询先执行一次,然后用子查询的结果来确认取消父查询结果。 练习1.
--1.查询比自己所在职位平均工资高的员工姓名、职位 --相关子查询
SELECT ename,job FROM emp e WHERE sal >(SELECTAVG(sal)FROM emp WHERE job = e.job GROUPBY job) --嵌套子查询
SELECT ename,e.job FROM emp e,(SELECT job,AVG(sal) avgsal FROM emp GROUPBY job) b WHERE b.job = e.job AND e.sal > b.avgsal
--1.查询所有部门的名称和人数 --分组函数和多表连接
SELECT dname,COUNT(empno) FROM emp e,dept d
WHERE e.deptno = d.deptno GROUPBY dname --嵌套子查询
SELECT dname , ce 人数
FROM(SELECT deptno,COUNT(empno) ce FROM emp GROUPBY deptno) d,dept e WHERE e.deptno = d.deptno(+) --相关子查询
SELECT dname,(SELECTCOUNT(empno)FROM emp WHERE deptno = d.deptno) FROM dept d
--2.查询那些员工是经理 --嵌套子查询
SELECT*FROM emp WHERE empno IN(SELECTDISTINCT mgr FROM emp) --相关子查询
SELECT*FROM emp e WHERE(SELECTCOUNT(empno)FROM emp WHERE mgr = e.empno )>0 --3.查询至少调动过两次岗位的员工编号,姓名,岗位 SELECT*FROM emp e
WHERE(SELECTCOUNT(empno)FROM job_history WHERE e.empno = job_history.empno)>=2 --查询每个部门中工资最低的两个员工的编号,姓名,工资。 SELECT*FROM emp e
WHERE(SELECTCOUNT(empno)FROM emp WHERE deptno = e.deptno AND sal > e.sal)<=1 练习2:
--1,列出至少有一个雇员的所有部门名称 SELECT*FROM dept d
WHEREEXISTS(SELECT'1'FROM emp WHERE d.deptno = deptno) --2,列出一个雇员都没有所有部门名称 SELECT*FROM dept d
WHERENOTEXISTS(SELECT'1'FROM emp WHERE d.deptno = deptno)
第十章层次查询
层次查询:自然树结构,遍历树,修建分支,用level分等级, SELECTlevel,ename ||'report to'||--查询层次数和名字 PRIOR ename \--查询上一级名字
LPAD(ename,LENGTH(ename)+(LEVEL-1)*2,'*') --结构化输出层次报告 FROM emp
WHERE ename !='HIGGINS'--只删除higgins这一个节点,higgin子节点不删除 STARTWITH ename ='KING' --从KING开始
CONNECTBYPRIOR empno = mgr--按照从顶向下层次查询
AND ename !='HIGGINS'--从higgins这个节点开始,后面的全部去掉
第十一章数据操作和事务控制(DML && TPL)
数据查询语言:DQL--------select 数据操作语言:DML--insert,update,delete,merge操作行数据,相关子查询常用于 他们的Where子句中 5大语句事务处理语言:TPL---commit,rollback对DML操作的确认取消,保持数据一致性 数据定义语言:DDL--------create,alter,drop truncate 数据控制语言:DCL--------grant,revoke INSERTINTO dept(deptno,dname,loc)VALUES(50,'development','SY') 插入日期’01-1月-2018’-----默认日期格式 ‘to_date(‘2000-04-01’,’YYYY-MM-DD’)’ INSERTINTO tablename1 SELECT*FROM tablename2 WHERE conditions...插入多条数据相当于复制了 UPDATE emp SET sal = sal+100,deptno =10WHERE deptno =10 Set设置更改的列,where限定更改的行。
有一个比较有意思的例子在这里说一下, 这个可以叫嵌套更新
--修改工作地点在NEW YORK,CHICAGO的员工的工资,工资增加500
UPDATE emp SET sal = sal+500WHERE deptno =(SELECT deptno FROM emp WHERE loc IN('NEW YORK','CHICAGO')) 相关更新如下:
--修改员工表的dname列,填相应部门名称,该列与部门表中的数据对应
UPDATE emp e SET dname =(SELECT dname FROM dept WHERE deptno = e.deptno)
DELETEFROM emp WHERE job ='CLERK' 事务
什么是事务:
每一组相关的DML或select语句,加上TPL,DDL或DCL就算是一个完整的事务 事务的特性:原子性,一致性,隔离性,持久性。
事务自动开启:上一个事务结束后,遇到第一个DML语句