Oracle总结【SQL细节、多表查询、分组查询、分页】下

简介: 在之前已经大概了解过Mysql数据库和学过相关的Oracle知识点,但是太久没用过Oracle了,就基本忘了…印象中就只有基本的SQL语句和相关一些概念….写下本博文的原因就是记载着Oracle一些以前没注意到的知识点…以后或许会有用…实例与数据库概念

举例子:下面这段代码是错误的!!!

select max(avg(sal)) "部门平均工资的最大值",deptno "部门编号"
    from emp
    group by deptno;

为啥是错误的呢???分组中我们已经有了deptno字段了,而我们select 后面跟着也就是多行函数和该字段而已,为啥就错了呢?????我们如果在分组查询的时候,使用了多行函数嵌套的话,那么我们select字段后面只能跟随着它这么一个列,而不能再多了。max(avg(sal)) 相当于又分组了一次

当然了,如果我们仅仅是求出每个部门的平均工资,也就是下面这段代码,是完全没有问题的:

select avg(sal) "部门平均工资的最大值",deptno "部门编号"
    from emp
    group by deptno;

16.jpg


多表查询、子查询

当我们一张表不能把数据查询出来的时候,就需要连接其他的表一起查询….

当我们的查询条件还没知道的时候,我们就可以使用子查询….

一般地,子查询和多表查询的功能都是差不多的….

子查询出来的数据是单行单列的时候,一般我们都是用等于、大于等于、小于等操作符去限制查询条件…

如果是单列多行的时候,我们一般都是用IN、ANY、ALL操作符去筛选条件…

如果是多行多列,我们就看成该返回查询结果是一张表【Oracle分页就是这个原理】


值得注意的是多表查询的数学基础是笛卡尔积,也就是说:如果两张实体表进行连接,那么它会构成一张笛卡尔积表…也就是说:最终就只有一张笛卡尔积表

17.jpg



连接

在多表查询的时候,我们由于会产生笛卡尔积,于是在笛卡尔积表中会存在很多无关的数据…为了剔除这些数据,我们将用到where字句将笛卡尔积表筛选成有用的数据表

一般地,我们有几种连接:

  • 内连接
  • 等值连接【使用=号把条件筛选出来】
  • 非等值连接【使用between and等手段把条件筛选】
  • 外连接
  • 自连接

18.jpg

19.jpg


那现在问题来了,在Oracle中有的功能我们可以使用多表查询来完成,有的时候我们又可以使用子查询来完成,那么我们一般选择哪一个呢????

我们看下图来比较一下他们的优劣:

20.jpg


对于索引就是一个以空间换时间的概念..在数据量很大的时候,Oracle会为我们的数据创建索引,当扫描数据的时候,就可以根据索引来直接获取值….索引的算法也有几种【二叉树、稀疏索引、位图索引….等等】


21.jpg


综上所述:在Oracle中使用多表查询性能可能比子查询好一些


Oracle分页

在讲解JDBC的时候,我们就已经讲过Oracle与Mysql的分页问题了….详情可以看我的博文:http://blog.csdn.net/hon_3y/article/details/53790092

我们在这里还是加深一下印象:

Oracle中的分页是依靠着rownum这个伪列来实现的,由于rownum只能使用的是<=或者<来获取数据。。。因为rownum的值可能会经常变【加入一条数据,那么rownum就+1,讲道理rownum可以是无穷大的,因此不能使用>来进行操作】….

那么Oracle分页的思路是这样子的:

  • 先在子查询中获取前n条记录
  • 由于返回的是多行多列,因此我们可以看做成一张表
  • 那么将查询出来的数据放在from字句的后边
  • 外套的查询可以通过where字句来对子查询出来的数据进行过滤
  • 那么我们就可以查询出想要的数据了…

公式:

  • Mysql从(currentPage-1)*lineSize开始取数据,取lineSize条数据
  • Oracle先获取currentPagelineSize条数据,从(currentPage-1)lineSize开始取数据

小面试题

笔试题:有【1000亿】条会员记录,如何用最高效的方式将薪水字段清零,其它字段内容不变?

第一:从emp表中删除sal字段

  • alter table emp
  • drop column sal;      

第二:向emp表中添加sal字段,且内容默认0

  • alter table emp
  • add sal number(6) default 0;

操作表细节

进入回收站
drop table users;
查询回收站中的对象
show recyclebin;
闪回,即将回收站还原
flashback table 表名 to before drop;
flashback table 表名 to before drop rename to  新表名;
彻底删除users表
drop table users purge;
清空回收站
purge recyclebin;
为emp表增加image列,alter table 表名 add 列名 类型(宽度) 
alter table emp
add image blob;
修改ename列的长度为20个字节,alter table 表名 modify 列名 类型(宽度) 
alter table emp
modify ename varchar2(20);
删除image列,alter table 表名 drop column 列名
alter table emp
drop column image;
重名列名ename为username,alter table 表名 rename column 原列名 to 新列名
alter table emp
rename column ename to username;
将emp表重命名emps,rename 原表名 to 新表名
rename emp to emps;
  • number(5):
  • 最多5位数字
  • number(6,2):
  • 其中2表示最多显示2位小数,采用四舍五入,不足位数补0,同时要设置col … for …
  • 其中6表示小数+整数不多于6位
  • 其中整数位数不得多于4位,可以等于4位
  • varchar2(8):
  • 8表示字节

值得注意的是:修改表的时候,是不能回滚的!

Oracle中的级联操作:

  • 【on delete cascade】级联删除
  • 【on delete set null】将外键一方设置为null


目录
相关文章
|
2月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
278 8
|
9月前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
6月前
|
SQL Java 数据库连接
Java中实现SQL分页的方法
无论何种情况,选择适合自己的,理解了背后的工作原理,并能根据实际需求灵活变通的方式才是最重要的。
189 9
|
8月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的闪回版本查询
本文介绍了Oracle数据库的闪回版本查询(Flashback Version Query)功能,通过示例详细讲解了其使用方法。闪回版本查询可获取指定时间区间内行的不同版本,利用`versions between`子句实现。文中包含视频讲解,并通过创建测试表、插入数据及执行查询等步骤,演示如何获取历史版本信息和伪列详情,帮助用户深入了解该功能的实际应用。
190 13
|
7月前
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
279 6
|
7月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回事务查询
Oracle数据库的闪回事务查询(Flashback Transaction Query)是闪回版本查询的扩充,可用于审计或撤销已提交的事务。通过`flashback_transaction_query`视图,可生成还原特定事务的SQL语句。本文介绍了其基本概念,并通过实战演示如何使用该功能:从授权、开启UNDO数据增强,到创建测试表和事务,最后利用闪回查询撤销已提交的事务,验证数据恢复效果。附带视频讲解,帮助深入理解。
209 3
|
8月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
8月前
|
Oracle 关系型数据库 Linux
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
【YashanDB知识库】通过dblink查询Oracle数据时报YAS-07301异常
|
8月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
8月前
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】oracle dblink varchar类型查询报错记录
这篇文章主要介绍了 Oracle DBLINK 查询崖山 DB 报错的相关内容,包括 ODBC 安装配置、数据源配置、dblink 环境配置、问题原因分析及规避方法。问题原因是 dblink 连接其他数据库时 varchar 类型转换导致的,还介绍了 long 类型限制、char 等类型区别,规避方法是修改参数 MAX_STRING_SIZE 支持 32K。

推荐镜像

更多
下一篇
oss云网关配置