数据库中join的用法

数据库中join的用法,第1张

数据库中join的用法的用法你知道吗?下面我就跟你们详细介绍下数据库中join的用法的用法,希望对你们有用。

数据库中join的用法的用法如下:

一、join的用法

内连接、外连接

示例用表:

雇员表(Employee)

LastNameDepartmentID

Rafferty31

Jones33

Steinberg33

Robinson34

Smith34

JasperNULL

部门表(Department)

DepartmentID部门

31销售部

33工程部

34书记

35市场部

1、内连接:相等连接、自然连接、交叉连接

1)、显式的内连接与隐式连接(inner join == join )

显示连接:SELECT  * from   employee join  department on employee.DepartmentID = department.DepartmentID

等价于:

隐式连接:SELECT  * from   employee,department WHERE employee.DepartmentID = department.DepartmentID

注:当DepartmentID不匹配,就不会往结果表中生成任何数据。

2)、相等连接

提供了一种可选的简短符号去表达相等连接,它使用 USING 关键字。

SELECT  * from   employee join  department  using (DepartmentID)

注:与显式连接不同在于:DepartmentID只显示一列

3)、自然连接

比相等连接的进一步特例化。两表做自然连接时,两表中的所有名称相同的列都将被比较,这是隐式的。

自然连接得到的结果表中,两表中名称相同的列只出现一次.

select * from employee natural join department

注:在 Oracle 里用 JOIN USING 或 NATURAL JOIN 时,如果两表共有的列的名称前加上某表名作为前缀,

则会报编译错误: "ORA-25154: column part of USING clause cannot have qualifier"

或 "ORA-25155: column used in NATURAL join cannot have qualifier".

4)交叉连接(又称笛卡尔连接)

如果 A 和 B 是两个集合,它们的交叉连接就记为: A × B.

显示连接:

select * from employee cross join department

等价于

隐式连接:

select * from employee,department

2、外连接

并不要求连接的两表的每一条记录在对方表中都一条匹配的记录。

1)左连接(left outer join == left join)

若A表与B表左连接,A表对就的B表没有匹配,连接 *** 作也会返回一条记录,对应值为NULL。

如:

Jaspernull null null

Jones3333工程部

Rafferty3131销售部

Robinson3434书记

Smith3434书记

Steinberg3333工程部

若A表对应B表中有多行,则左表会复制和右表匹配行一样的数量,并组合生成连接结果。

如:select * from department  left join employee  on employee.departmentId = department.departmentId

31销售部Rafferty31

33工程部Jones33

33工程部Steinberg33

34书记Robinson34

34书记Smith34

35市场部nullnull

2)、右连接(right outer join == right join)

与左连接同(略)

3)、全连接(full outer join ==full join)

是左右外连接的并集. 连接表包含被连接的表的所有记录, 如果缺少匹配的记录, 即以 NULL 填充。

select * from employee full outer join department on employee.departmentId = department.departmentId

注:一些数据库系统(如 MySQL)并不直接支持全连接, 但它们可以通过左右外连接的并集(参: union)来模拟实现.

和上面等价的实例:

select * from employee left join department on employee.departmentId = department.departmentId

union all

select * from employee right join department on employee.departmentId = department.departmentId

注:SQLite 不支持右连接。

原文: RelaxHeart网 - Tec博客: 库Join查询:内联、左外联、右外联、取交集

示例:

在MySQL创建两张表:a_table、b_table

随便插入几条数据:

组合两个表中的记录,返回关联字段相符的记录,也就是两个表的交集

left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。

左表全部记录都会显示出来,右表只显示出满足条件的记录,不足的列全部显示NULL

right join 是 right outer join的简写,它的全程是右外连接,是外链接的一种。

右表全部记录都会显示出来,左表只显示满足条件的记录,不足的列全部显示NULL

有了内联、外联查询,有没有取并集查询呢?当然也有了:

注意:查询报错了!!!

左外查询 union 右外查询

UNION定义:UNION *** 作符用于合并两个或多个 SELECT 语句的结果集。

注意:

UNION 和 UNION ALL 区别:UNION ALL会列出所有结果,有重复,UNION没有重复

inner join: 如果查询的表中都有至少一个匹配,则返回行

left join: 即使右表中没有匹配,也从左表返回所有的行

right join: 即使左表中没有匹配,也从右表返回所有的行

full join: 只要其中一个表中存在匹配,就返回行,但是在mysql中不支持

union:合并多个查询语句的结果集(去重)

union all:合并多个查询语句的结果集(不去重)

更多文章: RelaxHeart网更多博文

SQL 的表关联关系主要有四种 inner join,left join,right join和full join,其区别和使用场景如下:

• inner join(内连接),在两张表进行连接查询时,只保留两张表中完全匹配的结果集。

• left join,在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。(一般left join 和right join 中都选择left join)

• right join,在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。

• full join,在两张表进行连接查询时,返回左表和右表中所有没有匹配的行。

full join 和union的功能一样,可以把两张表里没有匹配的行关联在一起。

在进行模型设计时,选择用哪种表关联方式会影响到你最终的物理表数据是否齐全,所以需要深刻理解每一种关联方式最终返回的值有哪些。

在模型设计时,要考虑业务场景,选择以哪张事实表作为主表。当门店流量表里某一天的数据为空时,意味着当天门店没有客流量,但是依然会产生房租水电等固定成本,所以选择门店流量表作为主表时,采取left join 的方式关联财务指标汇总表时,不会返回对应的房租水电等数据。 当有业务场景能够满足主表无数据产生,子表会有数据产生的情况表之间通过FULL JOIN 或者 UNION的方式 。

现在确定表之间用FULL JOIN 的方式进行关联了,返回表中对应门店流量表无数据产生给空值,源表为财务指标汇总表的数据展示其对应数据。我们的物理表门店成本月度分析表如图所示,日期和门店编码作为主键。可能会有人有疑问,为什么日期和门店字段有多个来源表和多个来源字段。还是用门店流量表和财务指标汇总表以门店和日期进行全关联,那么2张表中都有的门店日期字段,现在合并为一张表,只展示一个门店日期字段。我们可以想象取客流量的数据时需要门店流量表的门店日期字段才能匹配出对应数据,同理房租水电费也需要对应的财务指标汇总表里的日期门店才能匹配出对应的数据。这样是是不是很好理解为啥物理表的主键字段需要多个来源表和来源字段了。我们的物理表即门店月度分析表的 源表有几张就需要有几个门店日期字段作为来源字段。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9891427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存