• Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询


    Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询

    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函数,很有趣
    【25】Oracle数据库:子查询、单行子查询,多行子查询,in,any,all语句,子查询的练习案例
    ————前面这些都是数据库查询语言的重要知识,一定要牢牢掌握和熟悉
    后面的相对简单一点
    【26】Oracle数据库:数据库操纵语言DML,插入insert into where,更新update where,删除delete where
    【27】Oracle数据库:oracle事务处理语言TCL,commit,rollback,savepoint语句
    【28】Oracle数据库:oracle数据定义语言DDL,查询表、序列、索引、视图、创建表,修改表的列alter,rename to,删除表数据truncate和表drop
    【29】Oracle数据库:oracle用命令定义非空not null,unique唯一性,主键primary key,外键foreign key,check检查,启用enable,禁用disable约束


    oracle创建数据库的其他对象:视图、序列、索引、同义词

    视图

    在这里插入图片描述

    没听懂,什么鬼?????

    部门id是80的窗口?
    开发过程中,往往是通过视图来简化查询的

    但是不建议修改啥的

    在这里插入图片描述
    根据自己的需求,构建视图,然后就不要查整个表了
    就查视图

    应该就是把子集搞出来,当单独的表????

    好像是,这样避免了每次我们都去写半天命令,查询啥的

    懂了

    在这里插入图片描述
    它能通过很多表来抽取数据

    在这里插入图片描述
    在这里插入图片描述

    但我最终视图的目的仍然还是用查看数据,而不是操作

    创建简单视图create view as

    在这里插入图片描述
    子查询就是你平常的查询,然后把它as一个视图
    好说
    view
    在这里插入图片描述
    在这里插入图片描述

    SQL> create view emp80 as select e.employee_id,e.last_name,e.salary from employees e;
    
    View created
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    其实就是一个子集数据,新表

    SQL> select * from emp80;
    
    EMPLOYEE_ID LAST_NAME                     SALARY
    ----------- ------------------------- ----------
            100 King                        24000.00
            101 Kochhar                     17000.00
            102 De Haan                     17000.00
            103 Hunold                       9000.00
            104 Ernst                        6000.00
            105 Austin                       4800.00
            106 Pataballa                    4800.00
            107 Lorentz                      4200.00
            108 Greenberg                   12008.00
            109 Faviet                       9000.00
            110 Chen                         8200.00
            111 Sciarra                      7700.00
            112 Urman                        7800.00
            113 Popp                         6900.00
            114 Raphaely                    11000.00
            115 Khoo                         3100.00
            116 Baida                        2900.00
            117 Tobias                       2800.00
            118 Himuro                       2600.00
            119 Colmenares                   2500.00
    
    EMPLOYEE_ID LAST_NAME                     SALARY
    ----------- ------------------------- ----------
            120 Weiss                        8000.00
            121 Fripp                        8200.00
            122 Kaufling                     7900.00
            123 Vollman                      6500.00
            124 Mourgos                      5800.00
            125 Nayer                        3200.00
            126 Mikkilineni                  2700.00
            127 Landry                       2400.00
            128 Markle                       2200.00
            129 Bissot                       3300.00
            130 Atkinson                     2800.00
            131 Marlow                       2500.00
            132 Olson                        2100.00
            133 Mallin                       3300.00
            134 Rogers                       2900.00
            135 Gee                          2400.00
            136 Philtanker                   2200.00
            137 Ladwig                       3600.00
            138 Stiles                       3200.00
            139 Seo                          2700.00
            140 Patel                        2500.00
    
    EMPLOYEE_ID LAST_NAME                     SALARY
    ----------- ------------------------- ----------
            141 Rajs                         3500.00
            142 Davies                       3100.00
            143 Matos                        2600.00
            144 Vargas                       2500.00
            145 Russell                     14000.00
            146 Partners                    13500.00
            147 Errazuriz                   12000.00
            148 Cambrault                   11000.00
            149 Zlotkey                     10500.00
            150 Tucker                      10000.00
            151 Bernstein                    9500.00
            152 Hall                         9000.00
            153 Olsen                        8000.00
            154 Cambrault                    7500.00
            155 Tuvault                      7000.00
            156 King                        10000.00
            157 Sully                        9500.00
            158 McEwen                       9000.00
            159 Smith                        8000.00
            160 Doran                        7500.00
            161 Sewall                       7000.00
    
    EMPLOYEE_ID LAST_NAME                     SALARY
    ----------- ------------------------- ----------
            162 Vishney                     10500.00
            163 Greene                       9500.00
            164 Marvins                      7200.00
            165 Lee                          6800.00
            166 Ande                         6400.00
            167 Banda                        6200.00
            168 Ozer                        11500.00
            169 Bloom                       10000.00
            170 Fox                          9600.00
            171 Smith                        7400.00
            172 Bates                        7300.00
            173 Kumar                        6100.00
            174 Abel                        11000.00
            175 Hutton                       8800.00
            176 Taylor                       8600.00
            177 Livingston                   8400.00
            178 Grant                        7000.00
            179 Johnson                      6200.00
            180 Taylor                       3200.00
            181 Fleaur                       3100.00
            182 Sullivan                     2500.00
    
    EMPLOYEE_ID LAST_NAME                     SALARY
    ----------- ------------------------- ----------
            183 Geoni                        2800.00
            184 Sarchand                     4200.00
            185 Bull                         4100.00
            186 Dellinger                    3400.00
            187 Cabrio                       3000.00
            188 Chung                        3800.00
            189 Dilly                        3600.00
            190 Gates                        2900.00
            191 Perkins                      2500.00
            192 Bell                         4000.00
            193 Everett                      3900.00
            194 McCain                       3200.00
            195 Jones                        2800.00
            196 Walsh                        3100.00
            197 Feeney                       3000.00
            198 OConnell                     2600.00
            199 Grant                        2600.00
            200 Whalen                       4400.00
            201 Hartstein                   13000.00
            202 Fay                          6000.00
            203 Mavris                       6500.00
    
    EMPLOYEE_ID LAST_NAME                     SALARY
    ----------- ------------------------- ----------
            204 Baer                        10000.00
            205 Higgins                     12008.00
            206 Gietz                        8300.00
            300 Lu                          23233.00
            301 Lu                          23233.00
    
    109 rows selected
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131

    再次查询就不用写别名了

    视图,并不是存了数据,而是间接去查询原始那个表

    在这里插入图片描述

    SQL> create view emp60 as select e.employee_id id_number,e.last_name name,e.salary * 12 ann_salary from employees e;
    
    View created
    
    
    SQL> select * from emp60;
    
    ID_NUMBER NAME                      ANN_SALARY
    --------- ------------------------- ----------
          100 King                          288000
          101 Kochhar                       204000
          102 De Haan                       204000
          103 Hunold                        108000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    还是记住,我们仍然就是是间接查询数据,而不是存储数据哦

    在这里插入图片描述

    SQL> select e.id_number,e.ann_salary from emp60 e;
    
    ID_NUMBER ANN_SALARY
    --------- ----------
          100     288000
          101     204000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    有了视图,咱就可以间接查询数据,比较容易了
    开发中据说用得很多的

    创建复杂视图:表格的来源多,有函数,有分组啥的

    在这里插入图片描述

    在这里插入图片描述
    只考虑查询语句:
    部门名称在departments表
    薪水在employees表
    分组,部门id

    SQL> select d.department_name,min(e.salary),max(e.salary),avg(e.salary) from employees e,departments d where e.department_id = d.department_id group by d.department_name;
    
    DEPARTMENT_NAME                MIN(E.SALARY) MAX(E.SALARY) AVG(E.SALARY)
    ------------------------------ ------------- ------------- -------------
    Administration                          4400          4400          4400
    Development                            23233         23233         23233
    Accounting                              8300         12008         10154
    Executive                              17000         24000 19333.3333333
    IT                                      4200          9000          5760
    Purchasing                              2500         11000          4150
    Human Resources                         6500          6500          6500
    Public Relations                       10000         10000         10000
    Shipping                                2100          8200 3475.55555555
    Finance                                 6900         12008 8601.33333333
    Sales                                   6100         14000 8955.88235294
    Marketing                               6000         13000          9500
    
    12 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    将上面的命令创建为视图

    SQL> create view dept as select d.department_name name,min(e.salary) min,max(e.salary) max,avg(e.salary) avg from employees e,departments d where e.department_id = d.department_id group by d.department_name;
    
    View created
    
    
    SQL> select * from dept;
    
    NAME                                  MIN        MAX        AVG
    ------------------------------ ---------- ---------- ----------
    Administration                       4400       4400       4400
    Development                         23233      23233      23233
    Accounting                           8300      12008      10154
    Executive                           17000      24000 19333.3333
    IT                                   4200       9000       5760
    Purchasing                           2500      11000       4150
    Human Resources                      6500       6500       6500
    Public Relations                    10000      10000      10000
    Shipping                             2100       8200 3475.55555
    Finance                              6900      12008 8601.33333
    Sales                                6100      14000 8955.88235
    Marketing                            6000      13000       9500
    
    12 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    复杂视图,必须在函数后面另起一个别名

    这样才好存
    在这里插入图片描述

    我们在定义视时,名称之后直接加括号,按顺序写名字

    SQL> create view dept2(name,minsal,maxsal,avgsal) as select d.department_name,min(e.salary),max(e.salary),avg(e.salary) from employees e,departments d where e.department_id = d.department_id group by d.department_name;
    
    View created
    
    
    SQL> select * from dept2;
    
    NAME                               MINSAL     MAXSAL     AVGSAL
    ------------------------------ ---------- ---------- ----------
    Administration                       4400       4400       4400
    Development                         23233      23233      23233
    Accounting                           8300      12008      10154
    Executive                           17000      24000 19333.3333
    IT                                   4200       9000       5760
    Purchasing                           2500      11000       4150
    Human Resources                      6500       6500       6500
    Public Relations                    10000      10000      10000
    Shipping                             2100       8200 3475.55555
    Finance                              6900      12008 8601.33333
    Sales                                6100      14000 8955.88235
    Marketing                            6000      13000       9500
    
    12 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    懂了吧
    两种方法都行,第二种更简单直白

    了解:视图中的DML操作——不建议搞,我们主要为了查

    在这里插入图片描述

    这些可以学,但是不必搞
    在这里插入图片描述
    简单视图可以
    复杂视图不能改

    SQL> select * from emp80;
    
    EMPLOYEE_ID LAST_NAME                     SALARY
    ----------- ------------------------- ----------
            100 King                        24000.00
            101 Kochhar                     17000.00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这个当时就是简单的视图可以改
    把id为100的删除
    delete

    SQL> delete from emp80 e where e.employee_id=100;
    delete from emp80 e where e.employee_id=100
    
    ORA-02292: 违反完整约束条件 (HR.DEPT_MGR_FK) - 已找到子记录
    
    • 1
    • 2
    • 3
    • 4

    最终你还是要回去删除原来那个表的

    SQL> delete from emp80 e where e.employee_id=190;
    
    1 row deleted
    
    
    SQL> rollback;
    
    Rollback complete
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    你知道可以删除就行,最好别这么搞,不直观
    最好直接操作本表

    为了人家改变视图
    那我们拒绝DML操作
    在这里插入图片描述
    在这里插入图片描述

    SQL> create view emp as select * from employees with read only;
    create view emp as select * from employees with read only
    
    ORA-00955: 名称已由现有对象使用
    
    SQL> create view emp60 as select * from employees with read only;
    create view emp60 as select * from employees with read only
    
    ORA-00955: 名称已由现有对象使用
    
    SQL> create view emp_v as select * from employees with read only;
    
    View created
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注意,视图的名字和表的名字,不能重复,否则select 没法查

    get

    SQL> delete from emp_v v where v.LAST_NAME='xxx';
    delete from emp_v v where v.LAST_NAME='xxx'
    
    ORA-42399: 无法对只读视图执行 DML 操作
    
    • 1
    • 2
    • 3
    • 4

    这样你就被拒绝了,不能操作
    美滋滋

    还是那句话,不建议通过视图操作dml

    那如何通过plsql工具创建视图呢
    好说,右击view,新建
    在这里插入图片描述
    通过这个操作来生成命令

    在这里插入图片描述

    create or replace view emp90 as
      select employee_id,last_name,department_name
        from employees e,departments d
       where e.department_id=d.department_id
    
    • 1
    • 2
    • 3
    • 4

    实际上都一样,我们要熟悉命令
    在这里插入图片描述
    选中命令执行,就可以得到视图了

    SQL> select * from emp90;
    
    EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME
    ----------- ------------------------- ------------------------------
            100 King                      Executive
            101 Kochhar                   Executive
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    搞定了
    在这里插入图片描述
    直接跟我drop table 表名;
    一个样

    之前我还不会删除,现在知道了

    SQL> drop view emp50;
    
    View dropped
    
    
    SQL> select * from emp50;
    select * from emp50
    
    ORA-00942: 表或视图不存在
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    灰常简单的

    但是这不会删除原表的数据
    这也不能回滚哦

    内建视图——子查询一定会给你内建一个视图,引用这数据

    在这里插入图片描述
    我们之前已经见过了

    本质还是教你怎么搞子查询

    部门的最高薪水是子查询哦——系统一定会自己建内建视图
    然后再去查雇员表,查其他信息

    SQL> select max(e.salary) from employees e group by e.department_id;
    
    MAX(E.SALARY)
    -------------
            12008
            11000
             7000
            23233
            24000
            13000
            10000
            12008
             8200
            14000
             6500
             9000
             4400
    
    13 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    最高薪水搞定
    它在子查询时,一定会用这个子查询的内建视图

    SQL> select em.last_name,em.department_id,em.salary,ea.maxsal from employees em,(select e.department_id,max(e.salary) maxsal from employees e group by e.department_id) ea where em.department_id=ea.department_id and em.salary < ea.maxsal;
    
    LAST_NAME                 DEPARTMENT_ID     SALARY     MAXSAL
    ------------------------- ------------- ---------- ----------
    Faviet                              100    9000.00      12008
    Chen                                100    8200.00      12008
    Sciarra                             100    7700.00      12008
    Urman                               100    7800.00      12008
    Popp                                100    6900.00      12008
    Khoo                                 30    3100.00      11000
    Baida                                30    2900.00      11000
    Tobias                               30    2800.00      11000
    Himuro                               30    2600.00      11000
    Colmenares                           30    2500.00      11000
    Kochhar                              90   17000.00      24000
    De Haan                              90   17000.00      24000
    Fay                                  20    6000.00      13000
    Gietz                               110    8300.00      12008
    Weiss                                50    8000.00       8200
    Kaufling                             50    7900.00       8200
    Vollman                              50    6500.00       8200
    Mourgos                              50    5800.00       8200
    Nayer                                50    3200.00       8200
    Mikkilineni                          50    2700.00       8200
    
    LAST_NAME                 DEPARTMENT_ID     SALARY     MAXSAL
    ------------------------- ------------- ---------- ----------
    Landry                               50    2400.00       8200
    Markle                               50    2200.00       8200
    Bissot                               50    3300.00       8200
    Atkinson                             50    2800.00       8200
    Marlow                               50    2500.00       8200
    Olson                                50    2100.00       8200
    Mallin                               50    3300.00       8200
    Rogers                               50    2900.00       8200
    Gee                                  50    2400.00       8200
    Philtanker                           50    2200.00       8200
    Ladwig                               50    3600.00       8200
    Stiles                               50    3200.00       8200
    Seo                                  50    2700.00       8200
    Patel                                50    2500.00       8200
    Rajs                                 50    3500.00       8200
    Davies                               50    3100.00       8200
    Matos                                50    2600.00       8200
    Vargas                               50    2500.00       8200
    Taylor                               50    3200.00       8200
    Fleaur                               50    3100.00       8200
    Sullivan                             50    2500.00       8200
    
    LAST_NAME                 DEPARTMENT_ID     SALARY     MAXSAL
    ------------------------- ------------- ---------- ----------
    Geoni                                50    2800.00       8200
    Sarchand                             50    4200.00       8200
    Bull                                 50    4100.00       8200
    Dellinger                            50    3400.00       8200
    Cabrio                               50    3000.00       8200
    Chung                                50    3800.00       8200
    Dilly                                50    3600.00       8200
    Gates                                50    2900.00       8200
    Perkins                              50    2500.00       8200
    Bell                                 50    4000.00       8200
    Everett                              50    3900.00       8200
    McCain                               50    3200.00       8200
    Jones                                50    2800.00       8200
    Walsh                                50    3100.00       8200
    Feeney                               50    3000.00       8200
    OConnell                             50    2600.00       8200
    Grant                                50    2600.00       8200
    Partners                             80   13500.00      14000
    Errazuriz                            80   12000.00      14000
    Cambrault                            80   11000.00      14000
    Zlotkey                              80   10500.00      14000
    
    LAST_NAME                 DEPARTMENT_ID     SALARY     MAXSAL
    ------------------------- ------------- ---------- ----------
    Tucker                               80   10000.00      14000
    Bernstein                            80    9500.00      14000
    Hall                                 80    9000.00      14000
    Olsen                                80    8000.00      14000
    Cambrault                            80    7500.00      14000
    Tuvault                              80    7000.00      14000
    King                                 80   10000.00      14000
    Sully                                80    9500.00      14000
    McEwen                               80    9000.00      14000
    Smith                                80    8000.00      14000
    Doran                                80    7500.00      14000
    Sewall                               80    7000.00      14000
    Vishney                              80   10500.00      14000
    Greene                               80    9500.00      14000
    Marvins                              80    7200.00      14000
    Lee                                  80    6800.00      14000
    Ande                                 80    6400.00      14000
    Banda                                80    6200.00      14000
    Ozer                                 80   11500.00      14000
    Bloom                                80   10000.00      14000
    Fox                                  80    9600.00      14000
    
    LAST_NAME                 DEPARTMENT_ID     SALARY     MAXSAL
    ------------------------- ------------- ---------- ----------
    Smith                                80    7400.00      14000
    Bates                                80    7300.00      14000
    Kumar                                80    6100.00      14000
    Abel                                 80   11000.00      14000
    Hutton                               80    8800.00      14000
    Taylor                               80    8600.00      14000
    Livingston                           80    8400.00      14000
    Johnson                              80    6200.00      14000
    Ernst                                60    6000.00       9000
    Austin                               60    4800.00       9000
    Pataballa                            60    4800.00       9000
    Lorentz                              60    4200.00       9000
    
    95 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113

    里面的
    from employees em,(select e.department_id,max(e.salary) maxsal from employees e group by e.department_id) ea
    就是到处em表
    同时给后面按照部门划分的,取部门id和部门内部最高的薪水的数据构建内建视图——别名ea
    这真挺复杂的
    然后
    where em.department_id=ea.department_id and em.salary < ea.maxsal;
    这句话本质上是两个表的内连接条件
    真复杂啊沃日

    然后才是选择列展示我们要的信息

    SQL> select em.last_name,em.department_id,em.salary,ea.maxsal

    这太狗了

    内建视图是真的狗
    这就是之前说过了的子查询
    复杂子查询,返回多个结果,其实就当一个新的表格
    它可以临时存储子查询的数据

    内建视图用于topN分析——之前我写过很多排序算法

    在这里插入图片描述
    这数据结构与算法中写的很多的东西

    做排名的,取topN就行

    在这里插入图片描述
    排序是order by 排序

    另外,控制n行
    外查询限制行数rownum伪列,分页查询
    实际上就是查询特定列,而不是全部数据都展示
    没错,否则速度很慢

    生成连续的1开始的值

    SQL> select rownum,e.last_name from employees e;
    
        ROWNUM LAST_NAME
    ---------- -------------------------
             1 Abel
             2 Ande
             3 Atkinson
             4 Austin
             5 Baer
             6 Baida
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    绝对连续的行号
    topN分析是需要用这个行号的
    where 指定返回n行,就是取前几条
    在这里插入图片描述
    先找到薪水的排序顺序
    再取前三条

    SQL> select rownum,e.last_name,e.salary from employees e order by e.salary desc;
    
        ROWNUM LAST_NAME                     SALARY
    ---------- ------------------------- ----------
             1 King                        24000.00
           108 Lu                          23233.00
           109 Lu                          23233.00
             2 Kochhar                     17000.00
             3 De Haan                     17000.00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    工资降序排序

    SQL> select rownum,em.last_name,em.salary from (select e.last_name,e.salary from employees e order by e.salary desc) em where rownum <= 3;
    
        ROWNUM LAST_NAME                     SALARY
    ---------- ------------------------- ----------
             1 King                        24000.00
             2 Lu                          23233.00
             3 Lu                          23233.00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    首先通过内建视图拿到原始表中排序好的数据

    SQL> select rownum,e.last_name,e.salary from employees e order by e.salary desc;
    
        ROWNUM LAST_NAME                     SALARY
    ---------- ------------------------- ----------
             1 King                        24000.00
           108 Lu                          23233.00
           109 Lu                          23233.00
             2 Kochhar                     17000.00
             3 De Haan                     17000.00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    然后外查询,我们要伪列rownum,然后控制只取前三条
    where rownum <= 3;
    展示
    select rownum,em.last_name,em.salary
    搞定

    这就是通过内建视图玩topN分析

    在这里插入图片描述
    入职时间

    SQL> select e.last_name,e.hire_date from employees e order by e.hire_date;
    
    LAST_NAME                 HIRE_DATE
    ------------------------- -----------
    De Haan                   2001/1/13
    Mavris                    2002/6/7
    Higgins                   2002/6/7
    Baer                      2002/6/7
    Gietz                     2002/6/7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    前面四个

    SQL> select rownum,em.last_name,em.hire_date from (select e.last_name,e.hire_date from employees e order by e.hire_date) em where rownum <=4;
    
        ROWNUM LAST_NAME                 HIRE_DATE
    ---------- ------------------------- -----------
             1 De Haan                   2001/1/13
             2 Mavris                    2002/6/7
             3 Higgins                   2002/6/7
             4 Baer                      2002/6/7
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    rownum就是自己
    其他的别加哦

    这不就把资格最老的人查出来了呗

    好说啊

    子查询产生内建视图
    然后把这个结果集,给主查询选取前topN条

    oracle 分页查询

    节约空间
    在这里插入图片描述
    一下子全部打印,gg
    我之前遇到过3000数据就炸了
    你把查询的东西都放在内存中,就会溢出,资源不够

    最好就是分页查询

    通过rownum搞定

    不同的数据库产品,对于分页的支持不同
    oracle通过内建视图中的结果集来展示,通过topN对rownum来取,这个我们上面说了
    mysql是通过limit来实现分页的,从第start开始取,取n条,就像字符串截取函数一样

    来,我们实践一波
    在这里插入图片描述

    SQL> select em.* from (select rownum rn,e.* from employees e) em where em.rn>=1 and em.rn<=10;
    
            RN EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DATE   JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
    ---------- ----------- -------------------- ------------------------- ------------------------- -------------------- ----------- ---------- ---------- -------------- ---------- -------------
             1         100 Steven               King                      SKING                     515.123.4567         2003/6/17   AD_PRES      24000.00                                      90
             2         101 Neena                Kochhar                   NKOCHHAR                  515.123.4568         2005/9/21   AD_VP        17000.00                       100            90
             3         102 Lex                  De Haan                   LDEHAAN                   515.123.4569         2001/1/13   AD_VP        17000.00                       100            90
             4         103 Alexander            Hunold                    AHUNOLD                   590.423.4567         2006/1/3    IT_PROG       9000.00                       102            60
             5         104 Bruce                Ernst                     BERNST                    590.423.4568         2007/5/21   IT_PROG       6000.00                       103            60
             6         105 David                Austin                    DAUSTIN                   590.423.4569         2005/6/25   IT_PROG       4800.00                       103            60
             7         106 Valli                Pataballa                 VPATABAL                  590.423.4560         2006/2/5    IT_PROG       4800.00                       103            60
             8         107 Diana                Lorentz                   DLORENTZ                  590.423.5567         2007/2/7    IT_PROG       4200.00                       103            60
             9         108 Nancy                Greenberg                 NGREENBE                  515.124.4569         2002/8/17   FI_MGR       12008.00                       101           100
            10         109 Daniel               Faviet                    DFAVIET                   515.124.4169         2002/8/16   FI_ACCOUNT    9000.00                       108           100
    
    10 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这样就前10条
    这经常是pandas包读取Excel表
    中的head()函数
    对吧

    SQL> select em.* from (select rownum rn,e.* from employees e) em where em.rn>=11 and em.rn<=20;
    
            RN EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DATE   JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
    ---------- ----------- -------------------- ------------------------- ------------------------- -------------------- ----------- ---------- ---------- -------------- ---------- -------------
            11         110 John                 Chen                      JCHEN                     515.124.4269         2005/9/28   FI_ACCOUNT    8200.00                       108           100
            12         111 Ismael               Sciarra                   ISCIARRA                  515.124.4369         2005/9/30   FI_ACCOUNT    7700.00                       108           100
            13         112 Jose Manuel          Urman                     JMURMAN                   515.124.4469         2006/3/7    FI_ACCOUNT    7800.00                       108           100
            14         113 Luis                 Popp                      LPOPP                     515.124.4567         2007/12/7   FI_ACCOUNT    6900.00                       108           100
            15         114 Den                  Raphaely                  DRAPHEAL                  515.127.4561         2002/12/7   PU_MAN       11000.00                       100            30
            16         115 Alexander            Khoo                      AKHOO                     515.127.4562         2003/5/18   PU_CLERK      3100.00                       114            30
            17         116 Shelli               Baida                     SBAIDA                    515.127.4563         2005/12/24  PU_CLERK      2900.00                       114            30
            18         117 Sigal                Tobias                    STOBIAS                   515.127.4564         2005/7/24   PU_CLERK      2800.00                       114            30
            19         118 Guy                  Himuro                    GHIMURO                   515.127.4565         2006/11/15  PU_CLERK      2600.00                       114            30
            20         119 Karen                Colmenares                KCOLMENA                  515.127.4566         2007/8/10   PU_CLERK      2500.00                       114            30
    
    10 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这有点骚啊

    对吧,好说

    SQL> select em.* from (select rownum rn,e.* from employees e) em where em.rn between 11 and 20;
    
            RN EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DATE   JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
    ---------- ----------- -------------------- ------------------------- ------------------------- -------------------- ----------- ---------- ---------- -------------- ---------- -------------
            11         110 John                 Chen                      JCHEN                     515.124.4269         2005/9/28   FI_ACCOUNT    8200.00                       108           100
            12         111 Ismael               Sciarra                   ISCIARRA                  515.124.4369         2005/9/30   FI_ACCOUNT    7700.00                       108           100
            13         112 Jose Manuel          Urman                     JMURMAN                   515.124.4469         2006/3/7    FI_ACCOUNT    7800.00                       108           100
            14         113 Luis                 Popp                      LPOPP                     515.124.4567         2007/12/7   FI_ACCOUNT    6900.00                       108           100
            15         114 Den                  Raphaely                  DRAPHEAL                  515.127.4561         2002/12/7   PU_MAN       11000.00                       100            30
            16         115 Alexander            Khoo                      AKHOO                     515.127.4562         2003/5/18   PU_CLERK      3100.00                       114            30
            17         116 Shelli               Baida                     SBAIDA                    515.127.4563         2005/12/24  PU_CLERK      2900.00                       114            30
            18         117 Sigal                Tobias                    STOBIAS                   515.127.4564         2005/7/24   PU_CLERK      2800.00                       114            30
            19         118 Guy                  Himuro                    GHIMURO                   515.127.4565         2006/11/15  PU_CLERK      2600.00                       114            30
            20         119 Karen                Colmenares                KCOLMENA                  515.127.4566         2007/8/10   PU_CLERK      2500.00                       114            30
    
    10 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    between and
    好说

    SQL> select em.rn,em.last_name,em.salary from (select rownum rn,e.* from employees e) em where em.rn between 11 and 20;
    
            RN LAST_NAME                     SALARY
    ---------- ------------------------- ----------
            11 Chen                         8200.00
            12 Sciarra                      7700.00
            13 Urman                        7800.00
            14 Popp                         6900.00
            15 Raphaely                    11000.00
            16 Khoo                         3100.00
            17 Baida                        2900.00
            18 Tobias                       2800.00
            19 Himuro                       2600.00
            20 Colmenares                   2500.00
    
    10 rows selected
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    有了内建视图,分页非常简单的

    rownum分页是要把伪列放在子查询中,因为我们展示的下一个10天
    而topN分析是去排序结果的前几条
    没有取下几条的能力哦

    很完美,学的可以


    总结

    提示:重要经验:

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

  • 相关阅读:
    Chapter6视觉处理基础
    吴恩达机器学习课程笔记3-4
    如何将jpg转化为png?
    【CVE-2024-38077】核弹级Windows RCE漏洞如何自检并修复该漏洞(附批量漏洞检测工具及分析伪代码)
    如何快速通过pmp考试,求攻略?
    linux 系统中安装docker
    OpenMP 入门
    练习题37:命名空间练习
    多线程相关问题
    接口设计与优化
  • 原文地址:https://blog.csdn.net/weixin_46838716/article/details/127603029