Oracle分组查询、多表查询及rowid和rownum

Oracle数据库

分组:group by

语法
  1. 使用格式:select 数据 from 数据源 where 行过滤条件 group by 分组 having 组过滤信息 order by 排序字段
  2. 执行流程 : from -> where -> group by -> having -> select -> order by
  3. 注意事项:
    - select后面一旦出现组函数,不能使用非分组字段
    - 一旦分组,只能使用分组字段或者组函数
字段别名的使用注意

根据上述的执行流程,后面的流程可以使用前面流程定义的别名,反之不可

单行函数在分组中的使用
  • 单行函数不可以直接在分组的select后使用
  • 如需使用需在外层嵌套组函数

多表查询

92年语法
交叉连接(笛卡尔积)
  • 交叉连接的结果为表一的每一元组依次连接表二的各个元组,结果集为表一元组个数*表二元组个数
  • 语法为:
    select * from emp,dept where emp.deptno = dept.deptno;
    
  • 如果要使用的字段来自于多个数据源中都存在,需要指明限定词|出处
外连接(左连接、右连接)&等值连接
  • 左连接(右连接)的结果为左表的每一元组根据连接条件依次连接右表的各个元组,未连接成功的左表(右表)给与输出并将右表(左表)部分属性置为null。未连接成功的右表(左表)不予输出。左(右)连接的结果集个数为左(右)表元组个数。
  • 语法为:
    select * from emp e1,emp e2 where e1.mgr = e2.empno(+);
    
  • 使用左连接(右连接)必须指定连接条件,左连接(右连接)则在右表(左表)的属性后加(+)。
  • 不在等值连接条件后加如(+)符号的连接为等值连接
非等值连接
  • 表的连接条件不是等值连接条件时的连接为非等值连接
  • 若连接条件的属性名为不同表的同名属性则需指定表名,若不是则没有必要
  • 语法为:
    select * from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal;
    
自连接
  • 自连接是将相同的两个表当作不同的表来源做连接的一种方式。
  • 自连接可以使用以上的各种连接方式。
  • 自连接必须对至少一个表起别名。
99年语法
交叉连接
  • 结果集和注意事项同上92
  • 语法为:
    select * from emp cross join dept;
    
自然连接
  • 数据库底层自动对表的相同字段名进行等值筛选的连接
  • 自然连接后会合并相同字段名的列
  • 在通过等值筛选的前提下自然左(右)连接可以出现左(右)连接的效果
  • 联合查询的表中必须存储有相同字段名,若无相同字段名则进行的是交叉连接
等值连接
  • 语法为:
    select * from emp left join dept using(deptno); 
    
  • 使用左连接(右连接)必须指定连接条件,使用using作为连接条件时,using后的属性必须为双表共有属性。
非等值连接
  • 概念及注意事项同上92
  • 语法为:
    select * from emp join salgrade s on emp.sal between s.losal and s.hisal;
    
全连接
  • 全连接必须设置连接条件
  • 相当于即左连接又右连接
  • 语法为:
    select * from emp full join emp e2 on emp.mgr = e2.empno;
    
连表查询的执行流程
  • 数据库在from阶段进行表的连接,其余流程不变

rowid和rownum

  • rowid和rownum都是虚列,每个表都存在
  • rowid记录的是元组的物理地址,在元组插入表的时候存在,一旦存在不可改变
  • rownum表示某条记录在整个结果集中的位置,在查询输出的时候存在,每次查询都可能变化
  • 在对结果集使用order by排序的时候,rownum的顺序有可能是乱的,此时可以在外层嵌套查询实现rownum的有序
  • 在rownum有序的时候,可以通过对rownum筛选来实现限制输出某几个连续元组的效果
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值