Oracle SQL中join方式总结
在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图、物化视图等联结)。SQL JOIN其实是一个逻辑概念,像NEST LOOP JOIN、 HASH JOIN等是表连接的物理实现方式。

为了更直观的了解以上join方式,我们通过俩个测试表来进行测试,首先是建表语句:
create table U (
name varchar2(20),
gender varchar2(10)
);
create table D(
name varchar2(20),
sal number(6,0)
);
insert into U values('tom','male');
insert into U values('jerry','male');
insert into U values('tina','female');
insert into U values('ying','female');
COMMIT;
insert into D
select 'ying',10000 from dual union all
select 'tom',5000 from dual union all
select 'sam',3000 from dual union all
select 'jeck',4500 from dual;
COMMIT;
内连接:INNER JOIN
内连接:也称为等值连接,返回两张表都满足条件的部分
注释:inner join 就等于 join

inner join 表示返回俩个表或记录连接字段的匹配记录。它有三种实现方式,如下图所示:
select U.NAME,U.GENDER,D.SAL
from U inner join D on U.NAME = D.NAME;
我的报表 1
NAME GENDER SAL
---------------------------------------- -------------------- ----------
ying female 10000
tom male 5000
select u.name,u.gender,d.sal
from u,d
where u.name=d.name;
我的报表 1
NAME GENDER SAL
---------------------------------------- -------------------- ----------
ying female 10000
tom male 5000
select name, u.gender,d.sal
from u inner join d using(name);
我的报表 1
NAME GENDER SAL
---------------------------------------- -------------------- ----------
ying female 10000
tom male 5000
注意:inner join 可以使用简写join方式,如下所示,但是建议使用inner join。
select u.name,u.gender,d.sal
from u join d
on u.name=d.name;
我的报表 1
NAME GENDER SAL
---------------------------------------- -------------------- ----------
ying female 10000
tom male 5000
select name ,u.gender,d.sal
from u join d using(name);
我的报表 1
NAME GENDER SAL
---------------------------------------- -------------------- ----------
ying female 10000
tom male 5000
外链接:OUTER JOIN
外连接分为外左连接(left outer join)和外右连接(right outer join)
注释:left outer join 与 left join 等价, 一般写成left join
right outer join 与 right join等价,一般写成right join
1.全连接:full join
全外连接是在结果中除了显示满足连接的条件的行外,还显示了join两侧表中所有满足检索条件的行
全连接:包含左、右俩个表的所有行,不管另一表中是否存在与其匹配的行。不符合条件的,则以空值代替。如下所示:
select u.name,u.gender,d.name,d.sal
from u full join d
on
u.name=d.name
我的报表 1
NAME GENDER NAME SAL
---------- -------------------- ---------- ----------
ying female ying 10000
tom male tom 5000
sam 3000
jeck 4500
tina female
jerry male
FULL OUTER JOIN的韦恩图如下:

2.左外连接:LEFT JOIN
左连接,取左边的表的全部,右边的表按条件,符合的显示,不符合则显示null
举例:select <select list> from A left join B on A.id=B.id
LEFT OUTER JOIN (with common data)韦恩图如下:

上面是左外连接(带公共数据)的查询方法,那么还有一种就是不包含的,表示如下:

左外连接:又叫左连接,意思是包含左边表所有记录,右边所有匹配的记录,如果没有则用空补齐。换句话说就是,列出左边表全部的,及右边表符合条件的,不符合条件的以空值代替。
select u.name,u.gender,d.name,d.sal
from u left join d
on u.name=d.name;
我的报表 1
NAME GENDER NAME SAL
---------- -------------------- ---------- ----------
ying female ying 10000
tom male tom 5000
tina female
jerry male
select u.name,u.gender,d.name,d.sal
from u,d
where u.name = d.name(+);
我的报表 1
NAME GENDER NAME SAL
---------- -------------------- ---------- ----------
ying female ying 10000
tom male tom 5000
tina female
jerry male
3.右外连接:RIGHT JOIN
右连接:取右边的表的全部,左边的表按条件,符合的显示,不符合则显示null
举例:select <select list> from A right join B on A.id=B.id

右外连接:又叫右链接,意思是包括右边表所有记录,匹配左边表的记录,如果没有则以空补齐。换句话说,列出右边全部的,及左边符合条件的,不符合条件的则以空值代替。
select u.name,u.gender,d.name,d.sal
from u right join d
on u.name = d.name;
我的报表 1
NAME GENDER NAME SAL
---------- -------------------- ---------- ----------
tom male tom 5000
ying female ying 10000
jeck 4500
sam 3000
select u.name,u.gender,d.name,d.sal
from u,d
where u.name(+)=d.name;
我的报表 1
NAME GENDER NAME SAL
---------- -------------------- ---------- ----------
tom male tom 5000
ying female ying 10000
jeck 4500
sam 3000
交叉连接(CROSS JOIN)
交叉连接:返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积
笛卡尔积
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员
举例:
现在,我们有两个集合A和B。
A = {0,1} B = {2,3,4}
集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。
从以上的数据分析我们可以得出以下两点结论:
1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;
2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;
交叉连接两种写法
交叉连接有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。
例如:下面的语句1和语句2的结果是相同的。
语句1:隐式的交叉连接,没有CROSS JOIN。
SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME
FROM ORDERS O , CUSTOMERS C
WHERE O.ID=1;
语句2:显式的交叉连接,使用CROSS JOIN。
SELECT O.ID,O.ORDER_NUMBER,C.ID,
C.NAME
FROM ORDERS O CROSS JOIN CUSTOMERS C
WHERE O.ID=1;
select * from u cross join d;
我的报表 1
NAME GENDER NAME SAL
---------- -------------------- ---------- ----------
tom male ying 10000
tom male tom 5000
tom male sam 3000
tom male jeck 4500
jerry male ying 10000
jerry male tom 5000
jerry male sam 3000
jerry male jeck 4500
tina female ying 10000
tina female tom 5000
tina female sam 3000
我的报表 2
NAME GENDER NAME SAL
---------- -------------------- ---------- ----------
tina female jeck 4500
ying female ying 10000
ying female tom 5000
ying female sam 3000
ying female jeck 4500
Oracle SQL中join方式总结的更多相关文章
- SQL Server Join方式
原文:SQL Server Join方式 0.参考文献 Microsoft SQL Server企业级平台管理实践 看懂SqlServer查询计划 1.测试数据准备 参考:Sql Server中的表访 ...
- Oracle SQL中实现indexOf和lastIndexOf功能
Oracle SQL中实现indexOf和lastIndexOf功能 https://www.2cto.com/database/201305/210470.html
- Oracle sql 优化の常用方式
1.不要用 '*' 代替所有列名,特别是字段比较多的情况下 使用select * 可以列出某个表的所有列名,但是这样的写法对于Oracle来说会存在动态解析问题.Oracle系统通过查询数据字典将 ' ...
- 关于sql中join
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- Oracle sql 中的字符(串)替换与转换[转载]
1.REPLACE 语法:REPLACE(char, search_string,replacement_string) 用法:将char中的字符串search_string全部转换为字符串repla ...
- 【总结】Oracle sql 中的字符(串)替换与转换
1.REPLACE 语法:REPLACE(char, search_string,replacement_string) 用法:将char中的字符串search_string全部转换为字符串repla ...
- SQL中join和cross join的区别
SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...
- my sql中join的操作
SQL标准中的Join的类型: 首先,设置表employees和department的数据为: 1.inner join … on操作类型 内连接inner join是基于连接谓词将两张表(如A和 ...
- SQL中JOIN 的用法
关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...
随机推荐
- Mysql—— 内连接、左连接、右连接以及全连接查询
CREATE TABLE `a_table` ( `a_id` int(11) DEFAULT NULL, `a_name` varchar(10) DEFAULT NULL, `a_part` va ...
- 低代码开发,推荐一款Web 端自动化神器:Automa
1. Automa介绍 又到了优秀工具推荐的时候了,今天给大家分享一款前端自动化操作神器: Automa . 首先了解一下Automa是什么? Automa它定位是一款 Chrome 插件,也就意味着 ...
- Django笔记&教程 6-1 表单(Form)介绍
Django 自学笔记兼学习教程第6章第1节--表单(Form)介绍 点击查看教程总目录 1 介绍 如果网站要让用户输入并提交数据(比如注册登录),则需要用到表单. 单纯的html也能写出表单,格式一 ...
- 大爽Python入门教程 2-3 字符串,列表,字典
大爽Python入门公开课教案 点击查看教程总目录 除了通用的序列方法, 列表和字符串还有些自己的专属方法. 后面介绍有些是英中文对照介绍(英文来自官方文档), 便于大家更深入的去理解其意思. 灵活的 ...
- Python 数据类型常用的内置方法(二)
目录 Python 数据类型常用的内置方法(二) 1.字符串类型常用内置方法 1.upper.lower.isupper.islower 2.startswith.endswith 3.format ...
- Springboot 加载配置文件源码分析
Springboot 加载配置文件源码分析 本文的分析是基于springboot 2.2.0.RELEASE. 本篇文章的相关源码位置:https://github.com/wbo112/blogde ...
- 使用.NET5、Blazor和Electron.NET构建跨平台桌面应用
Electron.NET是一个嵌入了ASP.NET Core的Electron的封装,通过Electron.NET可以构建基于.NET5的跨平台的桌面应用,使得开发人员只需要使用ASP.NET Cor ...
- Linux——搭建Apache(httpd)服务器
一.基本概念 Apache(或httpd)是Internet上使用最多的Web服务器技术之一,使用的传输协议是http超文本传输协议(一个基于超文本的协议),用于通过网络连接来发送和接受对象. 有两个 ...
- [APIO2020]有趣的旅途
注意到第一个点是可以钦定的. 那么我们考虑在重心的子树里反复横跳. 每次选择不同子树里的深度最大的点. 在同一颗子树里可能会在lca处出现问题. 那么我们选择重心,要考虑到会不会出现一颗子树不够选的操 ...
- python-django-数据查询条件
查询用户的状态是2或者是4的情况 空值和空字符串是不一样的东西!!! 需要注意的是: 项目setting.py里面的时区采用的是美国的时区,我们不要使用这个时区 使用这个时区的,我们输入的日期会进行转 ...