关于oracle中的半连接(r3笔记55天)
时间:2022-05-04
本文章向大家介绍关于oracle中的半连接(r3笔记55天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
表的连接在sql语句中尤为重要。外连接,内连接,半连接,反连接等等各种连接,看似简单的一个连接里面还是有不少的细节的。对于sql调优来说也是很重要的。 像下面的形式的sql就属于半连接,使用了in子句,对于exists的实现也是属于半连接。
--in半连接
SQL> select dname from dept dept where deptno in (select deptno from emp emp);
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
--exists半连接
SQL> select dname from dept dept where exists (select null from emp emp where emp.deptno=dept.deptno)
2 /
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
可能对于上面两种连接大家不以为然,认为把需要用到的表直接放在from子句后效果是一致的,答案也不是肯定的。 比如下面的形式,可能输出的结果就多了很多。大概14条记录,但是通过半连接的方式会输出3行记录。
SQL> select dept.dname from dept dept,emp empwhere dept.deptno=emp.deptno;
DNAME
--------------
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
14 rows selected.
所以说如果要得到一个相同的输出结果,还是需要distinct+inner join
SQL> select distinct dept.dname from dept dept,emp emp where dept.deptno=emp.deptno;
DNAME
--------------
ACCOUNTING
RESEARCH
SALES
对于半连接的可替换实现,大体有以下几种方式
--使用集合
select dept.dname from dept dept,
(select deptno from dept
intersect
select deptno from emp emp)b
where dept.deptno=b.deptno ;
DNAME
--------------
ACCOUNTING
RESEARCH
SALES
--使用any
SQL> select dept.dname from dept dept where deptno=any(select deptno from emp emp);
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
--使用distinct和内连接
SQL> select distinct emp.deptno from dept dept,emp emp
where dept.deptno=emp.deptno;
DEPTNO
----------
30
20
10
SQL> select distinct dept.deptno from dept dept,emp emp
where dept.deptno=emp.deptno;
DEPTNO
----------
30
20
10
大体说了下关于半连接的一些实现,可能在实际的使用中,最直观的感受还是通过执行计划来看到。 启用了半连接,在执行计划中会有semi的字样。
也可以手动指定不需要走半连接。使用Hint no_semijoin
- 在java中使用redis
- springmvc学习笔记--json--返回json的日期格式问题
- springmvc学习笔记--mybatis--使用插件自动生成实体和mapper
- velocity的一些用法
- String.split()用法以及特殊分隔符注意,ps:|
- Mybatis在idea中错误:Invalid bound statement (not found)
- java字符编码和oracle乱码
- ehcache报错
- java继承覆盖与向上转型,权限
- java变量的加载顺序
- java类的初始化和对象的创建顺序
- 附近的人位置距离计算方法
- java中复制对象通过反射或序列化
- Java String.split()用法小结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何监控 Linux 服务器状态的方法
- Linux 文件系统的操作实现
- win10系统下安装superset的步骤
- Ubuntu下使用python3中的venv创建虚拟环境
- vsftpd配置虚拟用户登录的方法
- Linux 删除特殊字符文件名或目录的方法
- 详解Linux环境变量配置全攻略
- Linux lsof命令使用详解
- Ubuntu删除多余内核的方法
- 详解Linux下crontab的使用与注意事项
- Linux内核设备驱动之Linux内核基础笔记整理
- Ubuntu18.04 Server版安装及使用(图文)
- Ubuntu18.04安装vsftpd的实现代码
- ubuntu系统theano和keras的安装方法
- Linux安装Jenkins步骤及各种问题解决(页面访问初始化密码)