Oracle数据库:子查询、单行子查询,多行子查询,in,any,all语句,子查询的练习案例

2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开
测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库
这oracle比sql安全,强大多了,所以你需要学习,最重要的,你要是考网络警察公务员,这玩意你不会就别去报名了,耽误时间!
oracle系列文章:
【1】Oracle数据库:啥是oracle数据库?你为啥要学oracle?
【2】Oracle数据库:oracle 11g安装教程,已安装好的oracle各个文件夹的作用,oracle用户权限怎么样
【3】Oracle数据库:oracle启动,oracle客户端工具plsql安装教程和使用方法
【4】Oracle数据库:创建表空间,创建新用户,给用户分配对象、角色和系统权限,登录新用户建表
【5】Oracle数据库:链接配置,包括sqlnet.ora里面的transnames.ora配置数据库标识符SID,listener暂时简单了解
【6】Oracle数据库:net configureation assistant工具配置监听listener,配置本地网络访问服务器上的数据库
【7】Oracle数据库:oracle字符类型、数字类型、创建表表名的命名规则
【8】Oracle数据库:约束条件:主键约束、唯一约束、检查约束、非空约束、外键约束、默认值填写
【9】Oracle数据库:表的关系:一对多,一对一,多对多,一一继承和修改的关系,表不是重点,重点是数据和约束关系
【10】Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作
【11】Oracle数据库:约束行限制where语句,判断条件,比较条件,字符串日期格式,in,like,escape,null语句
【12】Oracle数据库:逻辑运算and,or,not和各种运算的优先级控制
【13】Oracle数据库:排序order by语句,select from where order by的执行先后顺序,各种样例
【14】Oracle数据库:oracle函数,单行函数,多行函数,upper,lower,initcap,字符串函数
【15】Oracle数据库:数字函数,日期函数,round,trunc,mod,months_between,add_months,next_day,last_day,sysdate
【16】Oracle数据库:oracle数据类型转换to_char()日期和数字转字符,to_number()字符转数字,to_date()字符转日期函数
【17】Oracle数据库:oracle函数嵌套,nvl函数,nvl2函数,nullif函数,coalesce合并函数
【18】Oracle数据库:条件表达式case when then else end,decode函数,oracle单行函数练习示例
【19】Oracle数据库:oracle多表查询,等值连接,非等值连接,自连接的sql语句和规则
【20】Oracle数据库:oracle外连接left/right/full outer join on,oracle扩展的左右外连接展示符号(+)
【21】Oracle数据库:自然连接natural join,using语句,注意避免写交叉连接
【22】Oracle数据库:oracle内连接inner join on,多表查询各种自链接、内连接、外连接的练习示例
【23】Oracle数据库:oracle组函数,聚合函数,多行函数,avg,sum,min,max,count,group by,having
【24】Oracle数据库:oracle嵌套分组函数(聚合函数),组函数的练习题,挺复杂的,用好decode函数,很有趣


文章目录

  • Oracle数据库:子查询、单行子查询,多行子查询,in,any,all语句,子查询的练习案例
    • @[TOC](文章目录)
  • oracle子查询,用得多
  • 单行子查询
  • 子查询也可以使用组函数min,max,avg,sum,count
  • 子查询的错误:多行返回,处理还是单行语句
  • 多行子查询
    • 多行子查询的in
    • 多行子查询的any
    • 多行子查询的all
  • 子查询的练习案例
  • 总结

oracle子查询,用得多

嵌套select???




子查询的优先级高
子查询只执行一次


看来有两类了

子查询返回结果是一个的话,对于主查询就是单行

多行子查询,结果返回多行,对于主查询就是多行


abel的薪水,返回的结果就是一个

不写子查询,看看啥情况

内连接

其他的人的表,自连接——不建议这么写,烦人

SQL> select em.last_name,em.salary from employees a,employees em where a.last_name = 'Abel' and em.salary > a.salary;LAST_NAME                     SALARY
------------------------- ----------
King                        24000.00
Kochhar                     17000.00
De Haan                     17000.00
Greenberg                   12008.00
Russell                     14000.00
Partners                    13500.00
Errazuriz                   12000.00
Ozer                        11500.00
Hartstein                   13000.00
Higgins                     12008.0010 rows selected

俩表
a表控制名字相同的那个链接条件
然后控制em表薪资大于a表薪资,a表薪资只看abel的

这挺烦的,这些规则确实很难记,但是就这样的没法搞

搞成子查询
先查abel的薪水

SQL> select em.last_name, em.salary from employees em where em.salary > (select m.salary from employees m where m.last_name = 'Abel'); LAST_NAME                     SALARY
------------------------- ----------
King                        24000.00
Kochhar                     17000.00
De Haan                     17000.00
Greenberg                   12008.00
Russell                     14000.00
Partners                    13500.00
Errazuriz                   12000.00
Ozer                        11500.00
Hartstein                   13000.00
Higgins                     12008.0010 rows selected

就通过子查询联合搞进去就OK了

子查询更符合人类的思维
舒服
子查询更符合人类的思维
舒服
子查询更符合人类的思维
舒服

单行子查询







雇员id是141的jobid是多少?

SQL> select job_id from employees e where e.employee_id = 141;JOB_ID
----------
ST_CLERK

那那些与这个id相同的人名和id是

SQL> select em.last_name,em.job_id from employees em where em.job_id = (select e.job_id from employees e where e.employee_id = 141);LAST_NAME                 JOB_ID
------------------------- ----------
Nayer                     ST_CLERK
Mikkilineni               ST_CLERK
Landry                    ST_CLERK
Markle                    ST_CLERK
Bissot                    ST_CLERK
Atkinson                  ST_CLERK
Marlow                    ST_CLERK
Olson                     ST_CLERK
Mallin                    ST_CLERK
Rogers                    ST_CLERK
Gee                       ST_CLERK
Philtanker                ST_CLERK
Ladwig                    ST_CLERK
Stiles                    ST_CLERK
Seo                       ST_CLERK
Patel                     ST_CLERK
Rajs                      ST_CLERK
Davies                    ST_CLERK
Matos                     ST_CLERK
Vargas                    ST_CLERK20 rows selected

job_id相同的那些人
查出来了
好说
判断条件要搞对


多了薪水,好说

SQL> select em.last_name,em.job_id from employees em where em.job_id = (select e.job_id from employees e where e.employee_id = 141) and em.salary > (select e.salary from employees e where e.employee_id = 143);LAST_NAME                 JOB_ID
------------------------- ----------
Nayer                     ST_CLERK
Mikkilineni               ST_CLERK
Bissot                    ST_CLERK
Atkinson                  ST_CLERK
Mallin                    ST_CLERK
Rogers                    ST_CLERK
Ladwig                    ST_CLERK
Stiles                    ST_CLERK
Seo                       ST_CLERK
Rajs                      ST_CLERK
Davies                    ST_CLERK11 rows selectedSQL> select em.last_name,em.job_id,em.salary from employees em where em.job_id = (select e.job_id from employees e where e.employee_id = 141) and em.salary > (select e.salary from employees e where e.employee_id = 143);LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Nayer                     ST_CLERK      3200.00
Mikkilineni               ST_CLERK      2700.00
Bissot                    ST_CLERK      3300.00
Atkinson                  ST_CLERK      2800.00
Mallin                    ST_CLERK      3300.00
Rogers                    ST_CLERK      2900.00
Ladwig                    ST_CLERK      3600.00
Stiles                    ST_CLERK      3200.00
Seo                       ST_CLERK      2700.00
Rajs                      ST_CLERK      3500.00
Davies                    ST_CLERK      3100.0011 rows selected

就是多一个比较条件就行了

子查询

sql语句是真的骚,挺多,听冗杂的

可以包含多个子查询,且关系

子查询也可以使用组函数min,max,avg,sum,count


好说

SQL> select min(salary) min from employees e;MIN
----------2100

最低薪水
然后查

SQL> select em.last_name, em.job_id, em.salary from employees em where em.salary = (select min(salary) min from employees e);LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Olson                     ST_CLERK      2100.00

这样的话,子查询中就有一个min的组函数了

having是过滤条件,这里面也可以用子查询,反正就是搞一个结果而已
就是java中的子函数
没啥稀奇

差部门id为50的人最低薪水是?

SQL> select min(e.salary) from employees e where e.department_id = 50;MIN(E.SALARY)
-------------2100

然后看那些部门的最低薪水,比这个还小
那就是按照部门分组

SQL> select em.department_id, min(em.salary) from employees em group by em.department_id having min(em.salary) > (select min(e.salary) from employees e where e.department_id = 50);DEPARTMENT_ID MIN(EM.SALARY)
------------- --------------100           690030           2500700090          1700020           600070          10000110           830080           610040           650060           420010           440011 rows selected

这就是按部门划分,然后找部门里面最低的薪水,这个最低,还要大于50号部门最低薪水的值

子查询的错误:多行返回,处理还是单行语句

当多行返回结果来了,你用单行比较运算,是不行的


多行子查询


多个行,那就是很多的比较了
比如

涉及到跟多个结果的对比
in是比较等于
而any和all是大于和小于

多行子查询的in


部门分组,找部门最低,然后显示他们的名字

首先找每个部门的最低薪水,那很多部门分组,的话,回来的结果很多个结果

SQL> select min(em.salary) from employees em group by em.department_id;MIN(EM.SALARY)
--------------6900250070001700060001000083002100610065004200440012 rows selected

12个部门

每个人的薪水=这些最低值
展示

SQL> select e.last_name,e.job_id,e.salary from employees e where e.salary = (select min(em.salary) from employees em group by em.department_id);
select e.last_name,e.job_id,e.salary from employees e where e.salary = (select min(em.salary) from employees em group by em.department_id)ORA-01427: 单行子查询返回多个行

你要是用=
报错了

把=改为in

才是多行子查询返回结果的正确姿势

SQL> select e.last_name,e.job_id,e.salary from employees e where e.salary in (select min(em.salary) from employees em group by em.department_id);LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Kochhar                   AD_VP        17000.00
De Haan                   AD_VP        17000.00
Ernst                     IT_PROG       6000.00
Lorentz                   IT_PROG       4200.00
Popp                      FI_ACCOUNT    6900.00
Colmenares                PU_CLERK      2500.00
Vollman                   ST_MAN        6500.00
Marlow                    ST_CLERK      2500.00
Olson                     ST_CLERK      2100.00
Patel                     ST_CLERK      2500.00
Vargas                    ST_CLERK      2500.00
Tucker                    SA_REP       10000.00
Tuvault                   SA_REP        7000.00
King                      SA_REP       10000.00
Sewall                    SA_REP        7000.00
Bloom                     SA_REP       10000.00
Kumar                     SA_REP        6100.00
Grant                     SA_REP        7000.00
Sullivan                  SH_CLERK      2500.00
Sarchand                  SH_CLERK      4200.00LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Perkins                   SH_CLERK      2500.00
Whalen                    AD_ASST       4400.00
Fay                       MK_REP        6000.00
Mavris                    HR_REP        6500.00
Baer                      PR_REP       10000.00
Gietz                     AC_ACCOUNT    8300.0026 rows selected

看到了吗,这些都是薪水最差劲的员工

gg

这就是多行子查询

多行子查询的any


满足其一条件即可
美滋滋

小于<(100,200,300)
或者
大于>(100,200,300)
只要满足一个就好了


查询不是it的所有员工
他们工资小于it的薪水

子查询是it的薪水那些员工们
不止一个人在这个岗位上,懂吧??多行返回的

SQL> select em.salary from employees em where em.job_id='IT_PROG';SALARY
----------9000.006000.004800.004800.004200.00

然后,其他的员工中,薪水小于这里面的都展示一下,其实就是小于9000的

SQL> select e.last_name,e.job_id,e.salary from employees e where e.job_id !='IT_PROG' and e.salary < any(select em.salary from employees em where em.job_id='IT_PROG');LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Olson                     ST_CLERK      2100.00
Philtanker                ST_CLERK      2200.00
Markle                    ST_CLERK      2200.00
Gee                       ST_CLERK      2400.00
Landry                    ST_CLERK      2400.00
Perkins                   SH_CLERK      2500.00
Sullivan                  SH_CLERK      2500.00
Vargas                    ST_CLERK      2500.00
Patel                     ST_CLERK      2500.00
Marlow                    ST_CLERK      2500.00
Colmenares                PU_CLERK      2500.00
Himuro                    PU_CLERK      2600.00
OConnell                  SH_CLERK      2600.00
Grant                     SH_CLERK      2600.00
Matos                     ST_CLERK      2600.00
Mikkilineni               ST_CLERK      2700.00
Seo                       ST_CLERK      2700.00
Tobias                    PU_CLERK      2800.00
Geoni                     SH_CLERK      2800.00
Atkinson                  ST_CLERK      2800.00LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Jones                     SH_CLERK      2800.00
Gates                     SH_CLERK      2900.00
Baida                     PU_CLERK      2900.00
Rogers                    ST_CLERK      2900.00
Feeney                    SH_CLERK      3000.00
Cabrio                    SH_CLERK      3000.00
Khoo                      PU_CLERK      3100.00
Walsh                     SH_CLERK      3100.00
Davies                    ST_CLERK      3100.00
Fleaur                    SH_CLERK      3100.00
McCain                    SH_CLERK      3200.00
Stiles                    ST_CLERK      3200.00
Nayer                     ST_CLERK      3200.00
Taylor                    SH_CLERK      3200.00
Bissot                    ST_CLERK      3300.00
Mallin                    ST_CLERK      3300.00
Dellinger                 SH_CLERK      3400.00
Rajs                      ST_CLERK      3500.00
Ladwig                    ST_CLERK      3600.00
Dilly                     SH_CLERK      3600.00
Chung                     SH_CLERK      3800.00LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Everett                   SH_CLERK      3900.00
Bell                      SH_CLERK      4000.00
Bull                      SH_CLERK      4100.00
Sarchand                  SH_CLERK      4200.00
Whalen                    AD_ASST       4400.00
Mourgos                   ST_MAN        5800.00
Fay                       MK_REP        6000.00
Kumar                     SA_REP        6100.00
Johnson                   SA_REP        6200.00
Banda                     SA_REP        6200.00
Ande                      SA_REP        6400.00
Vollman                   ST_MAN        6500.00
Mavris                    HR_REP        6500.00
Lee                       SA_REP        6800.00
Popp                      FI_ACCOUNT    6900.00
Sewall                    SA_REP        7000.00
Grant                     SA_REP        7000.00
Tuvault                   SA_REP        7000.00
Marvins                   SA_REP        7200.00
Bates                     SA_REP        7300.00
Smith                     SA_REP        7400.00LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Cambrault                 SA_REP        7500.00
Doran                     SA_REP        7500.00
Sciarra                   FI_ACCOUNT    7700.00
Urman                     FI_ACCOUNT    7800.00
Kaufling                  ST_MAN        7900.00
Olsen                     SA_REP        8000.00
Smith                     SA_REP        8000.00
Weiss                     ST_MAN        8000.00
Fripp                     ST_MAN        8200.00
Chen                      FI_ACCOUNT    8200.00
Gietz                     AC_ACCOUNT    8300.00
Livingston                SA_REP        8400.00
Taylor                    SA_REP        8600.00
Hutton                    SA_REP        8800.0076 rows selected

看见any了吗
不能直接用小于<
需要<any
这样就是多行了
美滋滋

多行子查询的all


any是任意其一,or关系
而all就是全部都得满足,and关系
in是有其一=即可,也是or关系


最低薪水和薪水,不同
any是是任意其一即可
所以这里我们该any为all就是所有薪水都得比较
那自然是最低薪水了

```sql
SQL> select em.salary from employees em where em.job_id='IT_PROG';SALARY
----------9000.006000.004800.004800.004200.00

因此今后你查那些人,都得小于4200


```sql
SQL> select e.last_name,e.job_id,e.salary from employees e where e.job_id !='IT_PROG' and e.salary < all(select em.salary from employees em where em.job_id='IT_PROG');LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Bull                      SH_CLERK      4100.00
Bell                      SH_CLERK      4000.00
Everett                   SH_CLERK      3900.00
Chung                     SH_CLERK      3800.00
Ladwig                    ST_CLERK      3600.00
Dilly                     SH_CLERK      3600.00
Rajs                      ST_CLERK      3500.00
Dellinger                 SH_CLERK      3400.00
Mallin                    ST_CLERK      3300.00
Bissot                    ST_CLERK      3300.00
Taylor                    SH_CLERK      3200.00
Stiles                    ST_CLERK      3200.00
Nayer                     ST_CLERK      3200.00
McCain                    SH_CLERK      3200.00
Khoo                      PU_CLERK      3100.00
Walsh                     SH_CLERK      3100.00
Davies                    ST_CLERK      3100.00
Fleaur                    SH_CLERK      3100.00
Cabrio                    SH_CLERK      3000.00
Feeney                    SH_CLERK      3000.00LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Baida                     PU_CLERK      2900.00
Gates                     SH_CLERK      2900.00
Rogers                    ST_CLERK      2900.00
Geoni                     SH_CLERK      2800.00
Atkinson                  ST_CLERK      2800.00
Tobias                    PU_CLERK      2800.00
Jones                     SH_CLERK      2800.00
Mikkilineni               ST_CLERK      2700.00
Seo                       ST_CLERK      2700.00
Matos                     ST_CLERK      2600.00
Grant                     SH_CLERK      2600.00
Himuro                    PU_CLERK      2600.00
OConnell                  SH_CLERK      2600.00
Patel                     ST_CLERK      2500.00
Marlow                    ST_CLERK      2500.00
Colmenares                PU_CLERK      2500.00
Perkins                   SH_CLERK      2500.00
Sullivan                  SH_CLERK      2500.00
Vargas                    ST_CLERK      2500.00
Landry                    ST_CLERK      2400.00
Gee                       ST_CLERK      2400.00LAST_NAME                 JOB_ID         SALARY
------------------------- ---------- ----------
Markle                    ST_CLERK      2200.00
Philtanker                ST_CLERK      2200.00
Olson                     ST_CLERK      2100.0044 rows selected

区别就是把上面一个案例的any改为all了
你瞅瞅就知道

舒服吧

子查询的练习案例


先看z的部门是啥
子查询

SQL> select e.department_id from employees e where e.last_name = 'Zlotkey';DEPARTMENT_ID
-------------80

然后找,其他人在这80部门的别人

SQL> select em.last_name,em.department_id from employees em where em.department_id = (select e.department_id from employees e where e.last_name = 'Zlotkey') and em.last_name != 'Zlotkey';LAST_NAME                 DEPARTMENT_ID
------------------------- -------------
Russell                              80
Partners                             80
Errazuriz                            80
Cambrault                            80
Tucker                               80
Bernstein                            80
Hall                                 80
Olsen                                80
Cambrault                            80
Tuvault                              80
King                                 80
Sully                                80
McEwen                               80
Smith                                80
Doran                                80
Sewall                               80
Vishney                              80
Greene                               80
Marvins                              80
Lee                                  80LAST_NAME                 DEPARTMENT_ID
------------------------- -------------
Ande                                 80
Banda                                80
Ozer                                 80
Bloom                                80
Fox                                  80
Smith                                80
Bates                                80
Kumar                                80
Abel                                 80
Hutton                               80
Taylor                               80
Livingston                           80
Johnson                              8033 rows selected

好说


平均薪水是子查询
好说

SQL> select em.last_name,em.salary from employees em where em.salary > (select avg(e.salary) from employees e);LAST_NAME                     SALARY
------------------------- ----------
King                        24000.00
Kochhar                     17000.00
De Haan                     17000.00
Hunold                       9000.00
Greenberg                   12008.00
Faviet                       9000.00
Chen                         8200.00
Sciarra                      7700.00
Urman                        7800.00
Popp                         6900.00
Raphaely                    11000.00
Weiss                        8000.00
Fripp                        8200.00
Kaufling                     7900.00
Vollman                      6500.00
Russell                     14000.00
Partners                    13500.00
Errazuriz                   12000.00
Cambrault                   11000.00
Zlotkey                     10500.00LAST_NAME                     SALARY
------------------------- ----------
Tucker                      10000.00
Bernstein                    9500.00
Hall                         9000.00
Olsen                        8000.00
Cambrault                    7500.00
Tuvault                      7000.00
King                        10000.00
Sully                        9500.00
McEwen                       9000.00
Smith                        8000.00
Doran                        7500.00
Sewall                       7000.00
Vishney                     10500.00
Greene                       9500.00
Marvins                      7200.00
Lee                          6800.00
Ozer                        11500.00
Bloom                       10000.00
Fox                          9600.00
Smith                        7400.00
Bates                        7300.00LAST_NAME                     SALARY
------------------------- ----------
Abel                        11000.00
Hutton                       8800.00
Taylor                       8600.00
Livingston                   8400.00
Grant                        7000.00
Hartstein                   13000.00
Mavris                       6500.00
Baer                        10000.00
Higgins                     12008.00
Gietz                        8300.0051 rows selected

好说

SQL> select em.last_name,em.job_id from employees em where em.salary > (select avg(e.salary) from employees e) order by em.salary;LAST_NAME                 JOB_ID
------------------------- ----------
Mavris                    HR_REP
Vollman                   ST_MAN
Lee                       SA_REP
Popp                      FI_ACCOUNT
Tuvault                   SA_REP
Sewall                    SA_REP
Grant                     SA_REP
Marvins                   SA_REP
Bates                     SA_REP
Smith                     SA_REP
Cambrault                 SA_REP
Doran                     SA_REP
Sciarra                   FI_ACCOUNT
Urman                     FI_ACCOUNT
Kaufling                  ST_MAN
Weiss                     ST_MAN
Smith                     SA_REP
Olsen                     SA_REP
Fripp                     ST_MAN
Chen                      FI_ACCOUNTLAST_NAME                 JOB_ID
------------------------- ----------
Gietz                     AC_ACCOUNT
Livingston                SA_REP
Taylor                    SA_REP
Hutton                    SA_REP
McEwen                    SA_REP
Hall                      SA_REP
Faviet                    FI_ACCOUNT
Hunold                    IT_PROG
Sully                     SA_REP
Bernstein                 SA_REP
Greene                    SA_REP
Fox                       SA_REP
King                      SA_REP
Tucker                    SA_REP
Baer                      PR_REP
Bloom                     SA_REP
Zlotkey                   SA_MAN
Vishney                   SA_REP
Abel                      SA_REP
Cambrault                 SA_MAN
Raphaely                  PU_MANLAST_NAME                 JOB_ID
------------------------- ----------
Ozer                      SA_REP
Errazuriz                 SA_MAN
Greenberg                 FI_MGR
Higgins                   AC_MGR
Hartstein                 MK_MAN
Partners                  SA_MAN
Russell                   SA_MAN
De Haan                   AD_VP
Kochhar                   AD_VP
King                      AD_PRES51 rows selected

排序好

很多部门应该有u的名字

SQL> select e.department_id from employees e where e.last_name like '%u%';DEPARTMENT_ID
-------------60603050508080808080808080805050505018 rows selected

这些部门都有这种人

SQL> select em.employee_id,em.last_name from employees em where em.department_id in (select e.department_id from employees e where e.last_name like '%u%');EMPLOYEE_ID LAST_NAME
----------- -------------------------107 Lorentz106 Pataballa105 Austin

很多


departments表查部门id
还有employee表,根据部门id查e表里面的列

1–返回部门id

SQL> select d.department_id from departments d where d.location_id = 1700;DEPARTMENT_ID
-------------103090100110120130140150160170180190200210220230240250260DEPARTMENT_ID
-------------27021 rows selected

很多部门,显然是多表子查询,用in
再看e表

SQL> select e.last_name,e.department_id,e.job_id from employees e where e.department_id in (select d.department_id from departments d where d.location_id = 1700);LAST_NAME                 DEPARTMENT_ID JOB_ID
------------------------- ------------- ----------
King                                 90 AD_PRES
Kochhar                              90 AD_VP
De Haan                              90 AD_VP
Greenberg                           100 FI_MGR
Faviet                              100 FI_ACCOUNT
Chen                                100 FI_ACCOUNT
Sciarra                             100 FI_ACCOUNT
Urman                               100 FI_ACCOUNT
Popp                                100 FI_ACCOUNT
Raphaely                             30 PU_MAN
Khoo                                 30 PU_CLERK
Baida                                30 PU_CLERK
Tobias                               30 PU_CLERK
Himuro                               30 PU_CLERK
Colmenares                           30 PU_CLERK
Whalen                               10 AD_ASST
Higgins                             110 AC_MGR
Gietz                               110 AC_ACCOUNT18 rows selected

好说,in语句搞定


king的雇员id,看看谁的manager_id是king

SQL> select e.employee_id from employees e where e.last_name = 'King';EMPLOYEE_ID
-----------156100

俩人

谁向他们汇报嗯【他们就是经理】
in

SQL> select em.last_name from employees em where em.manager_id in (select e.employee_id from employees e where e.last_name = 'King');LAST_NAME
-------------------------
Kochhar
De Haan
Raphaely
Weiss
Fripp
Kaufling
Vollman
Mourgos
Russell
Partners
Errazuriz
Cambrault
Zlotkey
Hartstein14 rows selected


看看部门ex的部门id是啥呢
这在departments表里面
然后才能调用employees表

SQL> select d.department_id from departments d where d.department_name = 'Executive';DEPARTMENT_ID
-------------90

貌似就一个结果
可能会有多个结果

SQL> select e.department_id,e.last_name,e.job_id from employees e where e.department_id in (select d.department_id from departments d where d.department_name = 'Executive');DEPARTMENT_ID LAST_NAME                 JOB_ID
------------- ------------------------- ----------90 King                      AD_PRES90 Kochhar                   AD_VP90 De Haan                   AD_VPSQL> select e.department_id,e.last_name,e.job_id from employees e where e.department_id = (select d.department_id from departments d where d.department_name = 'Executive');DEPARTMENT_ID LAST_NAME                 JOB_ID
------------- ------------------------- ----------90 King                      AD_PRES90 Kochhar                   AD_VP90 De Haan                   AD_VP

2种方法都行
只要结果是一行,可以当多行用


子查询是看u名字的部门
另外薪水还得高于平均薪水

俩子查询

SQL> select avg(salary) from employees;AVG(SALARY)
-----------
6461.831775SQL> select em.department_id from employees em where em.last_name like '%u%';DEPARTMENT_ID
-------------60603050508080808080808080805050505018 rows selected

主查询联合俩条件

SQL> select e.last_name, e.department_id, e.job_id from employees e where e.department_id in(select em.department_id from employees em where em.last_name like '%u%') and e.salary > (select avg(salary) from employees);LAST_NAME                 DEPARTMENT_ID JOB_ID
------------------------- ------------- ----------
Hunold                               60 IT_PROG
Vollman                              50 ST_MAN
Kaufling                             50 ST_MAN
Fripp                                50 ST_MAN
Weiss                                50 ST_MAN
Livingston                           80 SA_REP
Taylor                               80 SA_REP
Hutton                               80 SA_REP
Abel                                 80 SA_REP
Bates                                80 SA_REP
Smith                                80 SA_REP
Fox                                  80 SA_REP
Bloom                                80 SA_REP
Ozer                                 80 SA_REP
Lee                                  80 SA_REP
Marvins                              80 SA_REP
Greene                               80 SA_REP
Vishney                              80 SA_REP
Sewall                               80 SA_REP
Doran                                80 SA_REPLAST_NAME                 DEPARTMENT_ID JOB_ID
------------------------- ------------- ----------
Smith                                80 SA_REP
McEwen                               80 SA_REP
Sully                                80 SA_REP
King                                 80 SA_REP
Tuvault                              80 SA_REP
Cambrault                            80 SA_REP
Olsen                                80 SA_REP
Hall                                 80 SA_REP
Bernstein                            80 SA_REP
Tucker                               80 SA_REP
Zlotkey                              80 SA_MAN
Cambrault                            80 SA_MAN
Errazuriz                            80 SA_MAN
Partners                             80 SA_MAN
Russell                              80 SA_MAN
Raphaely                             30 PU_MAN36 rows selected
SQL> select e.last_name, e.salary, e.employee_id from employees e where e.department_id in(select em.department_id from employees em where em.last_name like '%u%') and e.salary > (select avg(salary) from employees);LAST_NAME                     SALARY EMPLOYEE_ID
------------------------- ---------- -----------
Hunold                       9000.00         103
Vollman                      6500.00         123
Kaufling                     7900.00         122
Fripp                        8200.00         121
Weiss                        8000.00         120
Livingston                   8400.00         177
Taylor                       8600.00         176
Hutton                       8800.00         175
Abel                        11000.00         174
Bates                        7300.00         172
Smith                        7400.00         171
Fox                          9600.00         170
Bloom                       10000.00         169
Ozer                        11500.00         168
Lee                          6800.00         165
Marvins                      7200.00         164
Greene                       9500.00         163
Vishney                     10500.00         162
Sewall                       7000.00         161
Doran                        7500.00         160LAST_NAME                     SALARY EMPLOYEE_ID
------------------------- ---------- -----------
Smith                        8000.00         159
McEwen                       9000.00         158
Sully                        9500.00         157
King                        10000.00         156
Tuvault                      7000.00         155
Cambrault                    7500.00         154
Olsen                        8000.00         153
Hall                         9000.00         152
Bernstein                    9500.00         151
Tucker                      10000.00         150
Zlotkey                     10500.00         149
Cambrault                   11000.00         148
Errazuriz                   12000.00         147
Partners                    13500.00         146
Russell                     14000.00         145
Raphaely                    11000.00         11436 rows selected

其实用子查询,更符合逻辑思维
尽量不要用自连接
自连接太烦了真的

我们先分析要子查询的条件
好好学习


总结

提示:重要经验:

1)
2)学好oracle,即使经济寒冬,整个测开offer绝对不是问题!同时也是你考公网络警察的必经之路。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

Oracle数据库:子查询、单行子查询,多行子查询,in,any,all语句,子查询的练习案例相关推荐

  1. oracle数字加 39,Oracle数据库之SQL单行函数—数字函数-Oracle

    Oracle数据库之SQL单行函数-数字函数 1.三角函数 SIN  ASIN  SINH COS  ACOS  COSH TAN  ATAN  TANH 对于上述三角函数,见名知意.做一个间断的练习 ...

  2. Oracle filter 函数,Oracle数据库之SQL单行函数---字符函数续

    前一篇博客练习了一些字符函数,之后自己又去下查阅了相关的资料,上一篇博客中还有很多的 字符函数没有练习到,这次主要是对上次的一些未用到的字符函数进行一些补充练习. ascii() 返回与指定的字符对应 ...

  3. oracle审计查询sql语句,Oracle 数据库审计

    保证数据库的安全有两种方式,一种是通过权限的存取控制机制,即通过预先控制来防止安全事件的发生:另一种是数据库审计,即对数据库活动做跟踪记录,当发生安全事件时,通过对数据库活动记录进行审计来发现并修复安 ...

  4. Oracle数据库查询语句

    1 oracle数据库查询表的所有数据–select * from 表名;(* 代表所有) 2 oracle数据库查询表中指定字段的值–select 字段名1,字段名2,--from 表名: 3 or ...

  5. oracle数据库中关于部门工资前三高的查询(重点学习思路)

    在oracle数据库中我使用的是Scott登录进行的部门工资前三高的查询,可能有很多方法,但是我没想到,于是请教大神提供了一种方法: 查询每个部门的工资最高前三名 1,方法一 select deptn ...

  6. oracle 数据库基础配置,Oracle数据库网络服务配置基础、SQL编程详解-Oracle

    Oracle数据库是目前世界上流行的关系数据库管理系统,系统可移植性好.使用方便.功能强,适用于各类大.中.小.微机环境.Oracle数据库的主要内容包括:表空间.用户权限.四种约束等基础概念,DDL ...

  7. Oracle数据库简介与习题

    Oracle作业和知识点 作业一 关于数据控制语言中,收回所授予的权限的语句是(B). A.create B.revoke C.grant D.update ORACLE中 char类型与varcha ...

  8. Oracle 数据库操作

    1.创建数据库文件: create tablespace [database_name] logging datafile 'F:\oracle\database_name.dbf' size 500 ...

  9. python访问数据库如何解决高并发_使用 Python 和 Oracle 数据库实现高并发性

    随着趋势发展的核心转向更多而不是更快发展,最大限度地提高并发性的重要性日益凸显.并发性使得编程模式发生了新的转变,可以编写异步代码,从而将多个任务分散到一组线程或进程中并行工作.如果您不是编程新手并且 ...

  10. cmd导入oracle库文件,cmd 导入oracle数据库

    从服务器将Oracle数据库导出到本地Oracle数据库的方法 原文:从服务器将Oracle数据库导出到本地Oracle数据库的方法 1.将服务器上的Oracle数据库导入到本地   在CMD模式下执 ...

最新文章

  1. 利用Event和MapFile进程共享信息
  2. 什么是以太坊,它是区块链2.0的代表,它又什么特点?
  3. 微生物组—宏基因组分析专题培训开课啦!10月北京
  4. 最全 | Redis可视化工具横向评测
  5. 扩展虚拟机Ubuntu磁盘容量空间
  6. 帝国cms与mysql数据库_帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
  7. centos7 批量创建samba用户_蜗牛星际基于centos7的NAS系统配置
  8. 产品经理经验谈100篇(四)-B端交互设计规范
  9. 使用图形芯片加速电子自动化设计应用程序
  10. python定义一个类savingaccount表示银行账户_c#教程之c#模拟银行atm机示例分享
  11. 富士康iPhone生产线自动化进展太缓,所以无法遵守中国的加班条例?
  12. L2TP/L2TP over IPSec
  13. ssh 远程连接、上传下载命令
  14. PHP中使用imagick生成PSD文件缩略图
  15. 彻底卸载anaconda教程
  16. jquery 移动端 ui 组件库 移动端前端UI库—Frozen UI、SUI Mobile、light7、WeUI、jqweui
  17. [OfficeExcel] 王佩丰老师OfficeExcel2010 7-10讲 函数 学习笔记
  18. AWSome Day 2019 线上云技术课堂(1)
  19. Axure,Justinmind以及Mockplus的交互设置方式对比
  20. 解决:steps/make_fbank.sh: line 132: run.pl: command not found

热门文章

  1. 攻壳机动队中的塔奇克马有灵魂吗?烧脑深度思考,慎点
  2. 云原生不可变基础设施
  3. 备忘录模式(设计模式_20)
  4. Java EE 7 Hands-on Lab,CDI deployment failure:WELD-000072,解决办法
  5. 聊聊旷厂黑科技 | 五彩斑斓的黑,旷视“算”出来了!
  6. idea pom引入依赖 Dependency ‘xxx‘ not found less... (Ctrl+F1) Inspect
  7. Criteo启动上海数据中心,加大对中国市场的投入
  8. 中小学在线学习云平台最新社区版 自适应手机端 ASP v1.0
  9. Linux 工具 | 第1篇:高级流控-TC+HTB+IFB+内核模块
  10. excel 错位插入_excel表格错位怎么解决?excel数据错位