外贸网站建站k/郑州seo推广优化
子查询返回的值可以被外部查询使用,这样的复合查询等效与执行两个连续的查询.
1. 单行单列子查询
(>,<,=,<>,>=,<=)内部SELECT子句只返回一行结果
2.多行单列子查询
(all, any, in,not in)
all (>大于最大的,<小于最小的)
SQL> select ename, sal from emp where sal >all (2000,3000,4000);ENAME SAL
------------------------------ ----------
KING 5000SQL> -- 查找高于所有部门的平均工资的员工(>比子查询中返回的列表中最大的大才行)
SQL> select ename, job, sal from emp where sal > all (select avg(sal) from emp group by deptno);ENAME JOB SAL
------------------------------ --------------------------- ----------
JONES MANAGER 2975
FORD ANALYST 3000
SCOTT ANALYST 3000
KING PRESIDENT 5000SQL> -- 子查询结果
SQL> select avg(sal) from emp group by deptno;AVG(SAL)
----------
1566.66667
2916.666672175SQL>
3. 多行子查询中使用any
(>大于最小的,<小于最大的)
any的意思是:比子查询中返回的列表中最小的大就行
注意和all的区别,any强调的是只要有任意一个符合就行了,所以>any只要比最小的大就行了.
SQL>
SQL> select ename, sal from emp where sal>any(2000,3000,4000);ENAME SAL
------------------------------ ----------
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
FORD 3000
KING 50006 rows selected.SQL>
4. 多行子查询中使用in/not in
(逐个比较是否有匹配的值)
SQL>
SQL> select ename,sal from emp where sal in (800, 3000, 4000);ENAME SAL
------------------------------ ----------
SMITH 800
SCOTT 3000
FORD 3000SQL> -- NOT运算操作符可以使用在IN操作上,但不能使用在ANY,ALL操作.
SQL> select ename, sal from emp where sal not in (800,3000,4000);ENAME SAL
------------------------------ ----------
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
TURNER 1500
ADAMS 1100
JAMES 950
MILLER 1300
KING 500011 rows selected.SQL>
5. 多行多列的子查询返回多列结果
以SELECT主查询的WHERE子句中的多个列合并作为成对比较 条件.
SQL>
SQL> create table emp1 as select * from emp;Table created.SQL>
SQL> -- SMITH是20部门的员工
SQL> update emp1 set sal=1600,comm=300 where ename='SMITH';1 row updated.SQL> -- CLARK是10部门的员工
SQL> update emp1 set sal=1500,comm=300 where ename='CLARK';1 row updated.SQL> select * from emp1;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-DEC-80 1600 300 207499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307521 WARD SALESMAN 7698 22-FEB-81 1250 500 307566 JONES MANAGER 7839 02-APR-81 2975 207654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307698 BLAKE MANAGER 7839 01-MAY-81 2850 307782 CLARK MANAGER 7839 09-JUN-81 1500 300 107788 SCOTT ANALYST 7566 24-JAN-87 3000 207844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307876 ADAMS CLERK 7788 02-APR-87 1100 207900 JAMES CLERK 7698 03-DEC-81 950 307902 FORD ANALYST 7566 03-DEC-81 3000 207934 MILLER CLERK 7782 23-JAN-82 1300 107839 KING PRESIDENT 8000 17-NOV-81 5000 0 1014 rows selected.SQL>
5.2 要求:查找表中是与30部门的员工工资和奖金相同的其他部门的员工.
(现在20部门的SIMTH与30部门的ALLEN 有相同的工资和奖金)
多列子查询特点是主查询每一行中的列都要与子查询返回列表中的相应列同时进行比较,只有各列完全匹配时才显示主查询中的该数据行.分解一下:
5.3 第一步, 查询30号部门的工资和奖金的结果集
此例没有对comm的空值进行处理
SQL>
SQL> select sal,comm from emp1 where deptno=30;SAL COMM
---------- ----------1600 3001250 5001250 140028501500 09506 rows selected.SQL>
5.4 第二步,列出表中属于这个结果集的所有员工.
SQL> select * from emp1 where (sal,comm) in (select sal,comm from emp1 where deptno=30);EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-DEC-80 1600 300 207499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307521 WARD SALESMAN 7698 22-FEB-81 1250 500 307654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30SQL>
5.5 第三步,去掉30号部门
就显示出了在emp1表中与30部门中任意一个员工的工资和奖金完全相同的,但该员工不是来自30部门的员工信息.
SQL>
SQL> select * from emp1 where (sal,comm) in (select sal,comm from emp1 where deptno=30) and deptno <>30;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-DEC-80 1600 300 20SQL>
5.6 知识点:
1)成对比较是不能使用>any或>all等多行单列比较符的.
2)成对比较时的多列顺序和类型必须一一对应.
6. 与非成对比较(含布尔运算)的区别
SQL> select * from emp12 where sal in (select sal from emp1 where deptno=30)3 and nvl(comm,0) in (select nvl(comm,0) from emp1 where deptno=30)4 and deptno<>30;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-DEC-80 1600 300 207782 CLARK MANAGER 7839 09-JUN-81 1500 300 10SQL>
两个子查询返回的值分别与主查询中的sal和comm列比较,如果员工的工资与30部门任意一个员工相同,同时,奖金也与30部门任意一个员工相同,那么得到了两个员工的信息.
可见,成对比较(使用where (列,列))比非成对比较(使用where 列 and 列) 更为严苛
7. 关于布尔运算符not
7.1 not 否定后面的比较符
where empno=7788 where NOT (empno=7788)
where ename LIKE ‘S%’ where ename NOT LIKE ‘S%’
where deptno IN (20,30) where deptno NOT IN (20,30)
where sal BETWEEN 1500 AND 3000 where sal NOT BETWEEN 1500 AND 3000
where comm IS NULL where comm IS NOT NULL
where EXISTS (select子查询) where NOT EXISTS (select子查询)
7.2 not in 在子查询中的空值问题
"in"与"not in"遇到空值时情况不同,"not in"如果子查询的结果集中有空值,那么主查询得到的结果集也是空.
SQL>
SQL> select * from emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-DEC-80 800 207499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307521 WARD SALESMAN 7698 22-FEB-81 1250 500 307566 JONES MANAGER 7839 02-APR-81 2975 207654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307698 BLAKE MANAGER 7839 01-MAY-81 2850 307782 CLARK MANAGER 7839 09-JUN-81 2450 107788 SCOTT ANALYST 7566 24-JAN-87 3000 207844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307876 ADAMS CLERK 7788 02-APR-87 1100 207900 JAMES CLERK 7698 03-DEC-81 950 307902 FORD ANALYST 7566 03-DEC-81 3000 207934 MILLER CLERK 7782 23-JAN-82 1300 107839 KING PRESIDENT 8000 17-NOV-81 5000 0 1014 rows selected.SQL> -- 查询empno的值,在mgr里存在空值
SQL> select * from emp where empno not in (select nvl(mgr,0) from emp);EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-DEC-80 800 207499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307521 WARD SALESMAN 7698 22-FEB-81 1250 500 307654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307876 ADAMS CLERK 7788 02-APR-87 1100 207900 JAMES CLERK 7698 03-DEC-81 950 307934 MILLER CLERK 7782 23-JAN-82 1300 108 rows selected.SQL> -- 查找出没有下属的员工,即普通员工,(该员工号不在mgr之列的)
SQL> select * from emp where empno not in (select mgr from emp);EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-DEC-80 800 207499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307521 WARD SALESMAN 7698 22-FEB-81 1250 500 307654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307876 ADAMS CLERK 7788 02-APR-87 1100 207900 JAMES CLERK 7698 03-DEC-81 950 307934 MILLER CLERK 7782 23-JAN-82 1300 108 rows selected.SQL>
上面的结果不出所料,主查询没有返回记录.这个原因是在子查询中有一个空值,而对于not in这种形式,一旦子查询出现了空值,则主查询记录结果也就返回空了.
注意:not后不能跟单行比较符,只有not in组合,没有not any 和not all的组合,但 not后可以接表达式 如:
where empno not in(...)与where not empno in(...)两个写法都是同样结果,前者是not in组合,后者是not一个表达式.
SQL> -- 例:排除空值的影响
SQL> select ename from emp where empno not in (select nvl(mgr,0) from emp);ENAME
------------------------------
SMITH
ALLEN
WARD
MARTIN
TURNER
ADAMS
JAMES
MILLER8 rows selected.SQL>
8. from 中使用子查询(也叫内联视图)
例:员工的工资大于他所在的部门的平均工资的话,显示其信息.
分两步来考虑:
第一步,先看看每个部门的平均工资,再把这个结果集作为一个内联视图.
SQL>
SQL> select deptno,avg(sal) salavg from emp group by deptno;DEPTNO SALAVG
---------- ----------30 1566.6666710 2916.6666720 2175SQL>
第二步,把这个内联视图起一个别名b, 然后和emp 的别名e 做连接,满足条件即可.
SQL>
SQL> select e.ename, e.sal, e.deptno, b.salavg2 from emp e, (select deptno, avg(sal) salavg from emp group by deptno) b3 where e.deptno = b.deptno4 and e.sal > b.salavg;ENAME SAL DEPTNO SALAVG
------------------------------ ---------- ---------- ----------
ALLEN 1600 30 1566.66667
JONES 2975 20 2175
BLAKE 2850 30 1566.66667
SCOTT 3000 20 2175
FORD 3000 20 2175
KING 5000 10 2916.666676 rows selected.SQL>
9.关联子查询与非关联子查询
从主查询(外部)调用子查询(内部)来看,可以有关联与非关联子查询之分
9.1 非关联子查询:
子查询部分可以独立执行,Oracle的in子查询一般用于非关联子查询 ,首先执行子查询,并将结果列表存放在加了索引的临时表中.即在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询.
SQL> -- 例:得到30号部门工资高于本部门平均工资的员工的信息
SQL> select ename,sal,deptno from emp where deptno=30 and sal > (select avg(sal) from emp where deptno=30);ENAME SAL DEPTNO
------------------------------ ---------- ----------
ALLEN 1600 30
BLAKE 2850 30SQL>
9.2 关联子查询:
其子查询(内部,inner)会引用主查询(外部,outer)查询中的一列或多列.在执行时,外部查询的每一行都被一次一行地传递给子查询.
子查询依次读取外部查询传递来的每一值,并将其用到子查询上,直到外部查询所有的行都处理完为止.然后返回查询结果
9.2.1 实验准备
SQL> create table emp2 as (select e.empno, e.ename, d.loc, d.deptno from emp e, dept d where e.deptno = d.deptno(+));Table created.SQL> select * from emp2;EMPNO ENAME LOC DEPTNO
---------- ------------------------------ --------------------------------------- ----------7782 CLARK NEW YORK 107934 MILLER NEW YORK 107839 KING NEW YORK 107369 SMITH DALLAS 207566 JONES DALLAS 207788 SCOTT DALLAS 207876 ADAMS DALLAS 207902 FORD DALLAS 207499 ALLEN CHICAGO 307521 WARD CHICAGO 307654 MARTIN CHICAGO 307698 BLAKE CHICAGO 307844 TURNER CHICAGO 307900 JAMES CHICAGO 3014 rows selected.SQL>
9.2.2 设置null
SQL>
SQL> update emp2 set loc=null;14 rows updated.SQL> select * from emp2;EMPNO ENAME LOC DEPTNO
---------- ------------------------------ --------------------------------------- ----------7782 CLARK 107934 MILLER 107839 KING 107369 SMITH 207566 JONES 207788 SCOTT 207876 ADAMS 207902 FORD 207499 ALLEN 307521 WARD 307654 MARTIN 307698 BLAKE 307844 TURNER 307900 JAMES 3014 rows selected.SQL> commit;Commit complete.SQL>
9.2.3 通过关联查询将emp2表更新回原值.
SQL> update emp2 e set loc = (select d.loc from dept d where e.deptno = d.deptno);14 rows updated.SQL> rollback;Rollback complete.SQL>
9.3 关联查询中使用EXISTS和NOT EXISTS
EXISTS是在子查询里能否找到一个行值,如果子查询有行值,则立即停止子查询的搜索,然后返回逻辑标识TRUE, 如果子查询没有返回行值,则返回逻辑标识FALSE, 子查询要么返回T,要么返回F,以此决定了主查询的调用行的去留,然后主查询指针指向下一行,继续调用子查询..
9.3.1 EXISTS的例子
显示出emp表中那些员工不是普通员工(属于大小领导的).
SQL> -- 是否为领导
SQL>
SQL> select empno,ename,job,deptno from emp outer where exists(select 'X' from emp where mgr=outer.empno);EMPNO ENAME JOB DEPTNO
---------- ------------------------------ --------------------------- ----------7566 JONES MANAGER 207698 BLAKE MANAGER 307782 CLARK MANAGER 107788 SCOTT ANALYST 207902 FORD ANALYST 207839 KING PRESIDENT 106 rows selected.SQL>
说明:exists子查询中select 后的’X’只是一个占位,返回什么值无关紧要,它关心的是子查询中否’存在’,即子查询的where条件能否有’结果’.
一旦子查询一条记录满足where条件,则立即返回逻辑’TRUE’(就不往下查了).否则返回’FALSE’.
9.3.2 NOT EXISTS的例子
显示dept表中还没有员工的部门.
SQL> select deptno,dname from dept d where not exists (select 'X' from emp where deptno=d.deptno);DEPTNO DNAME
---------- ------------------------------------------40 OPERATIONSSQL>
对于关联子查询,在某种特定的条件下,比如子查询是个大表,且连接字段建立了索引,那么使用exists比in的效率可能更高.
10. 关于别名的使用
有表别名和列别名, 表别名用于多表连接或子查询中,列别名用于列的命名规范.
如果别名的字面值有特殊字符,需要使用双引号.如:"AB C"
10.1 必须使用别名的地方
10.1.1 两表连接后,select 投影中有相同命名的列,必须使用表别名区别标识
SQL> select ename, d. deptno from emp e, dept d where e. deptno=d. deptno;
-- 命名了别名.正确
SQL> create table emp1 as select deptno, avg(sal) salavg from emp group by deptno;
-- 表名无效
SQL> create table emp1 as select deptno, avg(sal) from emp group by deptno;
-- 或者
-- 表已创建
SQL> create table emp1(depno, abc) as select deptno, avg(sal) from emp group by deptno;
-- 命名了别名.正确
SQL> create view v as select deptno, avg(al) salavg from emp group by deptno;
-- 无效
SQL> create view v as select deptno, avg(sal) from emp group by deptno;
10.1.2 使用内联视图时, 若where子句还要引用select中函数的投影, 可使用别名.
SQL>
SQL> select * from (select avg(sal) salavg from emp) where salavg > 2000;SALAVG
----------
2073.21429SQL>
10.1.3 内联视图作为多表连接,主查询投影列在形式上不允许单行字段(或函数)与聚合函数并列
解决这个问题是使在内联视图中为聚合函数加别名,然后主查询的投影中引用其别名.
SQL>
SQL> select e.ename, e.sal, b.deptno,b.salavg from emp e, (select deptno, avg(sal) salavg from emp group by deptno) b where e.deptno = b.deptno;ENAME SAL DEPTNO SALAVG
------------------------------ ---------- ---------- ----------
SMITH 800 20 2175
ALLEN 1600 30 1566.66667
WARD 1250 30 1566.66667
JONES 2975 20 2175
MARTIN 1250 30 1566.66667
BLAKE 2850 30 1566.66667
CLARK 2450 10 2916.66667
SCOTT 3000 20 2175
TURNER 1500 30 1566.66667
ADAMS 1100 20 2175
JAMES 950 30 1566.66667
FORD 3000 20 2175
MILLER 1300 10 2916.66667
KING 5000 10 2916.6666714 rows selected.SQL>
10.1.4 rownum列是Oracle的伪列,加别名可以使它成为一个表列
这样才符合SQL99标准中的连接和选择.
SQL>
SQL> select * from (select ename,rownum rn from emp) where rn > 5;ENAME RN
------------------------------ ----------
BLAKE 6
CLARK 7
SCOTT 8
TURNER 9
ADAMS 10
JAMES 11
FORD 12
MILLER 13
KING 149 rows selected.SQL>
10.2 不能使用别名的地方
10.2.1 在一个独立的select结构的投影中使用了列别名,不能在其后的where 或having中直接引用该列别名
原因: from ——》where ——》group by ——》having ——》order by ——》select
SQL> select deptno,avg(sal) salavg from emp group by deptno having salavg > 2000;
select deptno,avg(sal) salavg from emp group by deptno having salavg > 2000*
ERROR at line 1:
ORA-00904: "SALAVG": invalid identifierSQL> select deptno,avg(sal) salavg from emp group by deptno having salavg>2000;
select deptno,avg(sal) salavg from emp group by deptno having salavg>2000*
ERROR at line 1:
ORA-00904: "SALAVG": invalid identifierSQL> from ——》where ——》group by ——》having ——》order by ——》select
10.2. 别名不能出现在表达式里
-- 错
SQL> SELECT cust_name AS "NAME", cust_credit_limit/2 AS MIDPOINT,MIDPOINT+100 AS "MAX LOWER LIMIT" FROM customers;
-- 对
SQL> SELECT cust_name AS "NAME", cust_credit_limit/2 AS MIDPOINT,cust_credit_limit/2+100 AS "MAX LOWER LIMIT" FROM customers;
11. 简单查询与复杂查询练习题
11.1 列出emp表中工资最高的前三名员工信息
SQL>
SQL> select * from emp order by sal desc;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7839 KING PRESIDENT 8000 17-NOV-81 5000 0 107902 FORD ANALYST 7566 03-DEC-81 3000 207788 SCOTT ANALYST 7566 24-JAN-87 3000 207566 JONES MANAGER 7839 02-APR-81 2975 207698 BLAKE MANAGER 7839 01-MAY-81 2850 307782 CLARK MANAGER 7839 09-JUN-81 2450 107499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307934 MILLER CLERK 7782 23-JAN-82 1300 107521 WARD SALESMAN 7698 22-FEB-81 1250 500 307654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307876 ADAMS CLERK 7788 02-APR-87 1100 207900 JAMES CLERK 7698 03-DEC-81 950 307369 SMITH CLERK 7902 17-DEC-80 800 2014 rows selected.SQL> select * from (select * from emp order by sal desc) where rownum < 4;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7839 KING PRESIDENT 8000 17-NOV-81 5000 0 107788 SCOTT ANALYST 7566 24-JAN-87 3000 207902 FORD ANALYST 7566 03-DEC-81 3000 20SQL>
-- 关于rownum 使用特别需要注意两点:
-- 1,rownum>时不会返回任何行,子查询后加别名方可.
-- 2,rownum<和and并用时,是在另一个条件基础上的rownum< ,而不是两个独立的条件的并集(intersect)
-- 如:
SQL>
SQL> select ename, sal, deptno from emp where deptno=10;ENAME SAL DEPTNO
------------------------------ ---------- ----------
CLARK 2450 10
MILLER 1300 10
KING 5000 10SQL> select ename,sal, deptno from emp where rownum <=1;ENAME SAL DEPTNO
------------------------------ ---------- ----------
SMITH 800 20SQL> select ename,sal, deptno from emp where rownum <=1 and deptno=10;ENAME SAL DEPTNO
------------------------------ ---------- ----------
CLARK 2450 10SQL>
11.2 列出emp表第5-第10名员工(按sal大--小排序)的信息(结果集的分页查询技术)
SQL>
SQL> select * from emp order by sal desc;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7839 KING PRESIDENT 8000 17-NOV-81 5000 0 107902 FORD ANALYST 7566 03-DEC-81 3000 207788 SCOTT ANALYST 7566 24-JAN-87 3000 207566 JONES MANAGER 7839 02-APR-81 2975 207698 BLAKE MANAGER 7839 01-MAY-81 2850 307782 CLARK MANAGER 7839 09-JUN-81 2450 107499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307934 MILLER CLERK 7782 23-JAN-82 1300 107521 WARD SALESMAN 7698 22-FEB-81 1250 500 307654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307876 ADAMS CLERK 7788 02-APR-87 1100 207900 JAMES CLERK 7698 03-DEC-81 950 307369 SMITH CLERK 7902 17-DEC-80 800 2014 rows selected.SQL> select t1.*, rownum rn from (select * from emp order by sal desc) t1 2 ;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RN
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ---------- ----------7839 KING PRESIDENT 8000 17-NOV-81 5000 0 10 17902 FORD ANALYST 7566 03-DEC-81 3000 20 27788 SCOTT ANALYST 7566 24-JAN-87 3000 20 37566 JONES MANAGER 7839 02-APR-81 2975 20 47698 BLAKE MANAGER 7839 01-MAY-81 2850 30 57782 CLARK MANAGER 7839 09-JUN-81 2450 10 67499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 77844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 87934 MILLER CLERK 7782 23-JAN-82 1300 10 97521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 107654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 117876 ADAMS CLERK 7788 02-APR-87 1100 20 127900 JAMES CLERK 7698 03-DEC-81 950 30 137369 SMITH CLERK 7902 17-DEC-80 800 20 1414 rows selected.SQL> select * from (select t1.*, rownum rn from (select * from emp order by sal desc) t1) where rn between 5 and 10;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RN
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ---------- ----------7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 57782 CLARK MANAGER 7839 09-JUN-81 2450 10 67499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 77844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 87934 MILLER CLERK 7782 23-JAN-82 1300 10 97521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 106 rows selected.SQL>
11.3 从列出emp表中显示员工和经理对应关系表.(emp自连接,利用笛卡尔积)
SQL> select a. empno, a. ename, a.mgr, b. empno, b. ename, b.mgr from emp a, emp b where a.mgr=b. empno;EMPNO ENAME MGR EMPNO ENAME MGR
---------- ------------------------------ ---------- ---------- ------------------------------ ----------7788 SCOTT 7566 7566 JONES 78397902 FORD 7566 7566 JONES 78397499 ALLEN 7698 7698 BLAKE 78397521 WARD 7698 7698 BLAKE 78397654 MARTIN 7698 7698 BLAKE 78397844 TURNER 7698 7698 BLAKE 78397900 JAMES 7698 7698 BLAKE 78397934 MILLER 7782 7782 CLARK 78397876 ADAMS 7788 7788 SCOTT 75667369 SMITH 7902 7902 FORD 75667566 JONES 7839 7839 KING 80007698 BLAKE 7839 7839 KING 80007782 CLARK 7839 7839 KING 800013 rows selected.SQL>
11.4 要求列出emp表中最高工资的员工所在工作地点,(emp+dept左外)
SQL> select max(sal) from emp;MAX(SAL)
----------5000SQL> select * from emp where sal = (select max(sal) from emp)2 ;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------------------------ --------------------------- ---------- --------------- ---------- ---------- ----------7839 KING PRESIDENT 8000 17-NOV-81 5000 0 10SQL> select a.ename, d.loc from2 (select * from emp where sal = (select max(sal) from emp)) a3 left join dept d on a.deptno = d.deptno;ENAME LOC
------------------------------ ---------------------------------------
KING NEW YORKSQL>
11.5 CTAS方法
建立dept1,在dept1表中增加一列person_count,要求根据emp表填写dept1表的各部门员工合计数(典型的关联查询).
SQL>
SQL> create table dept2 as select * from dept;Table created.SQL> -- 表中增加一列
SQL> alter table dept2 add person_count int;Table altered.SQL> -- 关联查询扫描
SQL> update dept2 d set person_count= (select count (*) from emp e where e. deptno=d. deptno);4 rows updated.SQL>
SQL> select * from dept2;DEPTNO DNAME LOC PERSON_COUNT
---------- ------------------------------------------ --------------------------------------- ------------10 ACCOUNTING NEW YORK 320 RESEARCH DALLAS 530 SALES CHICAGO 640 OPERATIONS BOSTON 0SQL>
11.6 复杂select查询,
以HR用户的几个表为例,显示欧洲地区员工的平均工资及人数(使用多表连接及内联视图)
SQL> select avg(salary), count(salary)2 from3 (select e. first_name, e. salary, d. department_id, l. location_id, c. country_id, r. region_id, r. region_name 4 from employees e, departments d, locations l, countries c, regions r5 where e. department_id=d. department_id and d. location_id=l. location_id6 and l. country_id=c. country_id and c. region_id=r. region_id)7 where region_name='Europe';AVG(SALARY) COUNT(SALARY)
----------- -------------8916.66667 36SQL>
11.7 同上题(使用嵌套子查询技术)
select avg(salary), count (*)
from employees
where department_id in(select department_idfrom departmentswhere location_id in(select location_id from locationswhere country_id in(select country_id from countrieswhere region_id=(select region_id from regionswhere region_name= 'Europe')))
);
AVG(SALARY) COUNT(SALARY)
----------- -------------
8916.66667 36-- 分解如下:SQL>
SQL> select region_id from regions where region_name = 'Europe';REGION_ID
----------1SQL> select country_id from countries where region_id = 1;COUNTR
------
BE
CH
DE
DK
FR
IT
NL
UK8 rows selected.SQL> select location_id from locations where country_id in('BE','CH','DE','DK','FR','IT','NL','UK');LOCATION_ID
-----------2900300027001000110031002400250026009 rows selected.SQL> select department_id from departments where location_id in (1000,1100,2400,2500,2600,2700,2900,3000,3100);DEPARTMENT_ID
-------------408070SQL> select avg(salary), count (*) from employees where department_id in (40,70,80);AVG(SALARY) COUNT(*)
----------- ----------8916.66667 36SQL>
相关文章:

数据库基本功之复杂查询的子查询
子查询返回的值可以被外部查询使用,这样的复合查询等效与执行两个连续的查询. 1. 单行单列子查询 (>,<,,<>,>,<)内部SELECT子句只返回一行结果 2.多行单列子查询 (all, any, in,not in) all (>大于最大的,<小于最小的) SQL> select ename, sal from…...

脑机接口科普0019——大脑的分区及功能
本文禁止转载!!!! 在前文脑机接口科普0018——前额叶切除手术_sgmcy的博客-CSDN博客科普中,有个这样的一张图: 这个图呢,把大脑划分为不同的区域,然后不同的区域代表不同的功能。 …...

阿里云服务器使用教程:CentOS 7 安装JDK及Tomcat(以jdk1.8、tomcat9.0.37为例)
目录 1、下载JDK及Tomcat的安装包并上传至服务器 2、安装JDK 3、安装Tomcat 4、Tomcat启动后无法打开Tomcat首页的原因 1、下载JDK及Tomcat的安装包并上传至服务器 (1)下载JDK1.8版本压缩包 官网:Java Downloads | Oracle (…...

Ubuntu20.04下安装vm17+win10/11
一、安装vmware17 1、官网下载 vmware官网:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html 2、安装依赖 sudo apt update sudo apt install build-essential linux-headers-generic gcc make3、权限和安装 到下载的目录下…...

Kalman Filter in SLAM (1) ——Data Fusion and Kalman Filter(数据融合和卡尔曼滤波)
文章目录0. 参考资料1. Intro Example 例子引入1.1. 测量硬币直径1.2. 思考2. Data Fusion 数据融合2.1. 数据融合在做什么?2.2. 数据融合的前提——不确定度2.3. 数据融合的结果——统计意义下的最优估计3. State Space Representation 状态空间表达式3.1. 状态方程…...

黑马程序最后
这里写自定义目录标题内建stl常用算法adjacent_findbinary_searchcountcount if常用排序算法常用拷贝和替换replace常用算术生成算法常用集合算法https://gitee.com/jiangjiandong/Cpp-0-1-Resource/blob/master/%E7%AC%AC5%E9%98%B6%E6%AE%B5-C%E6%8F%90%E9%AB%98%E7%BC%96%E7…...

u盘系统文件删除后的五种恢复方法
U盘是我们日常生活中使用较为普遍的移动存储设备,由于其便携性和易用性广受人们的欢迎。然而,在我们使用U盘的过程中,经常会出现误删文件的情况,例如本来要作为启动盘的u盘,误删里面的系统文件怎么办?当U盘…...

【玩转c++】List讲解和模拟底层实现
本期主题:list的讲解和模拟实现博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐1.list的介绍和使用1.1.list的介绍1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&…...

【Python】特征编码
特征编码1. 独热编码(离散变量编码) sklearn.preprocessing.OneHotEncoder1.1 原理 & 过程1.2 封装函数2. 连续变量分箱(连续变量编码) sklearn.preprocessing.KBinsDiscretizer2.1 原理2.2 等宽分箱 KBinsDiscretizer(strategyuniform)2.3 等频分箱 KBinsDiscretizer(stra…...

前端开发者必备的Nginx知识
nginx在应用程序中的作用 解决跨域请求过滤配置gzip负载均衡静态资源服务器…nginx是一个高性能的HTTP和反向代理服务器,也是一个通用的TCP/UDP代理服务器,最初由俄罗斯人Igor Sysoev编写。 nginx现在几乎是众多大型网站的必用技术,大多数情…...

在 KubeSphere 中开启新一代云原生数仓 Databend
作者:尚卓燃(https://github.com/PsiACE),Databend 研发工程师,Apache OpenDAL (Incubating) PPMC。 前言 Databend 是一款完全面向云对象存储的新一代云原生数据仓库,专为弹性和高效设计,为您…...

华为OD机试 - 最优资源分配(C 语言解题)【独家】
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:最优资源…...

求数组的中心索引
给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点…...

Ubuntu 搭建NextCloud私有云盘【内网穿透远程访问】
文章目录1.前言2.本地软件安装2.1 nextcloud安装2.2 cpolar安装3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5. 结语1.前言 对于爱好折腾的电脑爱好者来说,Linux是绕不开的、必须认识的系统(大部分服务器都是采用Linux操作系统&a…...

如何使用vue创建一个完整的前端项目
搭建Vue项目的完整流程可以分为以下几个步骤:安装Node.js和npm:Vue.js是基于Node.js开发的,因此在开始搭建Vue项目之前,需要先安装Node.js和npm(Node.js的包管理器)。可以从官网下载Node.js安装包并安装。安…...

http组成及状态及参数传递
http组成及状态及参数传递 早期的网页都是通过后端渲染来完成的:服务器端渲染(SSR,server side render): 客户端发出请求 -> 服务端接收请求并返回相应HTML文档 -> 页面刷新,客户端加载新的HTML文档&…...

USART_GetITStatus与 USART_GetFlagStatus的区别
文章目录共同点不同点USART_GetITStatus函数详解USART_GetFlagStatus函数共同点 都能访问串口的SR寄存器 不同点 USART_GetFlagStatus(USART_TypeDef USARTx, uint16_t USART_FLAG):* 该函数只判断标志位(访问串口的SR寄存器)。在没有使能…...

Java 系列之 Springboot
系列文章目录 文章目录系列文章目录前言一、Springboot 简介?1.1 什么是启动器?1.2 Springboot 优点1.3 Springboot 核心二、搭建方式2.1 搭建方式一2.2 搭建方式二2.3 搭建方式三三、启动原理3.1 初始化SrpingApplication对象3.2 执行run()方法1. 加载监…...

乐山持点科技:抖客推广准入及准出管理规则
抖音小店平台新增《抖客推广准入及准出管理规则》,本次抖音规则具体如下:第一章 概述1.1 目的及依据为维护精选联盟平台经营秩序,保障精选联盟抖客、商家、消费者等各方的合法权益;根据《巨量百应平台服务协议》、《“精选联盟”服务协议(推广…...

Steam流
Steam流 Stream 流是什么,为什么要用它? Stream是 Java8 新引入的一个包( java.util.stream),它让我们能用声明式的方式处理数据(集合、数组等)。Stream流式处理相较于传统方法简洁高效&#…...

Nuxt实战教程基础-Day01
Nuxt实战教程基础-Day01Nuxt是什么?Nuxt.js框架是如何运作的?Nuxt特性流程图服务端渲染(通过 SSR)单页应用程序 (SPA)静态化 (预渲染)Nuxt优缺点优点缺点安装运行项目总结前言:本教程基于Nuxt2,作为教程的第一天,我们先…...

栈和队列详细讲解+算法动画
栈和队列 栈stack 栈也是一种线性结构相比数组,栈对应的操作数数组的子集只能从一端添加元素,也只能从一端取出元素这一端称为栈顶 栈是一种后进先出的数据结构Last in Firt out(LIFO)在计算机的世界里,栈拥有者不可思议的作用 栈的应用 …...

【Unity3D小技巧】Unity3D中判断Animation以及Animator动画播放结束,以及动画播放结束之后执行函数
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在日常开发中,可能会遇到要判断Animation或者Anima…...

【1】熟悉刷题平台操作
TestBench使用 与quartus中testbench的写法有些许。或者说这是平台特有的特性!! 1 平台使用谨记 (1)必须删除:若设计为组合逻辑,需将自动生成的clk删除 若不删除,会提示运行超时错误。 &#…...

计算机网络:RIP协议以及距离向量算法
RIP协议 RIP是一种分布式的基于适量向量的路由选择协议,最大优点是简单。要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的唯一最佳(最短)距离记录,最多包含15个路由器,距离为16就表示网络不可达&…...

[数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(课后习题+答案解析)
1. 简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 数据 数据是客观事物的符号表示,是所有能输人到计算机中并被计算机程序处理的符号的总称。数据是信息的载体,能够被计算机识别、存储和加工 数据元素…...

JS_countup.js 的简单使用,数字滚动效果
countup.js countup.js 是一个轻量级,无依赖的JavaScript类,通过简单的设置就可以达到数字滚动的效果 官网:https://inorganik.github.io/countUp.js/ 源码 var CountUpfunction(target,startVal,endVal,decimals,duration,options){var …...

【C++知识点】STL 容器总结
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...

C++---背包模型---装箱问题(每日一道算法2023.3.9)
注意事项: 本题是"动态规划—01背包"的扩展题,dp和优化思路不多赘述。 题目: 有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积(正整数)。 要求 n 个物品中,任取若…...

if-else if与switch的练习1:输入两个数,输出两个数的加减乘除的值
1.if-else if的练习 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice…...