数据库常见的join方式有三种

本文详细介绍了SQL中的三种常见连接方式:内连接(inner join)、左外连接(left outer join)和右外连接(right outer join),并通过具体示例说明了它们的应用场景及特点。

 

 

数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论)。这三种连接方式都是将两个以上的表通过on条件语句,拼成一个大表。以下是它们的共同点:

1. 关于左右表的概念。左表指的是在SQL语句中排在left join左边的表,右表指的是排在left join右边的表。
2. 在拼成的大表中,左表排在左边,右表排在右边。
3. on条件语句最好用=号对两表相应的主外键进行连接。当然,也可以用其他操作符,如>, <, 来连接两表的任一字段,此时的关系将非常复杂,连接后的记录数也随之而变得不确定。如果在一些特殊的场合中需要用到这种方式,必须通过简单的实例加以确认,否则,连接结果很可能不是我们所想要的!
4. on条件语句不能省略。
5. 可以连锁使用join,每次使用join都令另一表与当前的表或连接的结果相连接。


在下文中,用到了两个表,"部门"表与"组织"表,其中,"部门"表有一名为"组织编号"的外键,指向"组织"表中的主键"编号"。

inner join

格式:select * from 部门 inner join 组织 on 部门.组织编号 = 组织.编号

目的:将两表中符合on条件的所有记录都找出来。

规律:

1. 拼出的大表记录不会增加。
2. 如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。

典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过=号将主外键进行连接,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。

备注:inner join 是默认的连接方式,可缩写为join。

转化为where子句:

select * from 部门, 组织 where 部门.组织编号 = 组织.编号

 

left outter join

格式: select * from 部门 left join 组织 on 部门.组织编号 = 组织.编号

格式: select * from 组织 left join 部门 on 组织.编号 = 部门.组织编号

目的:将左表的所有记录列出,右表中只要符合on条件的,与左表记录相拼合,不符合条件的,填以null值。

规律:

1. 选出所有符合条件的左表,如果左边与右表的关系是一对一的关系,则拼成的大表记录不会改变。
如果左边与右表的关系是多对一的关系,则拼成的大表记录也不会改变。
如果左边与右表的关系是一对多的关系,则拼成的大表记录会增加。对于每一具有一对多关系的左表记录,如果左表1:N与右表对应,那么会多出N-1条记录。例如,如果左表第一条记录1:3对应于右表,多出2条记录。如果左表第二条记录1:2对应于右表,则再多出1条记录。这样,总共多出3条记录。其他类推。
2. 如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。
3. 如果左边与右表的关系是一对多的关系,对于左表任一记录,如果右表没有记录与其相对应,则全部填以null值。

典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。

备注:left outter join可用left join代替。在有些数据库中,如HSqlDb, 只能使用left join而不能使用left outter join。

转化为where子句:

select * from 部门, 组织 where 部门.组织编号 = 组织.编号


right outter join

格式: select * from 部门 right join 组织 on 部门.组织编号 = 组织.编号

格式: select * from 组织 right join 部门 on 部门.组织编号 = 组织.编号

目的:将右表的所有记录列出,左表中只要符合on条件的,与右表记录相拼合,不符合条件的,填以null值。

规律:(与left outter join相反)

典型应用:可转化成left outter join。例如

select * from 组织 right join 部门 on 部门.组织编号 = 组织.编号

select * from 部门 left join 组织 on 部门.组织编号 = 组织.编号
的效果一样

备注:right outter join可用right join代替。在有些数据库中,如HSqlDb, 没有实现right join功能。

转化为where子句:

select * from 部门, 组织 where 部门.组织编号 = 组织.编号

 

[转]http://blog.javajia.com/blogger.php?op=ViewArticle&articleId=101&blogId=10

### 三种常见数据库类型及其架构图或示意图 #### 1. **关系型数据库(Relational Database)** 关系型数据库是基于关系模型的数据库,其数据以表格形式存储。每个表由行和列组成,行代表记录,列代表属性。MySQL 是一种典型的关系型数据库系统。在 MySQL 中,schema 可以等同于数据库本身[^1]。 - **架构特点**: - 数据存储在表中,通过主键和外键建立关系。 - 支持复杂的查询操作,如 JOIN、GROUP BY 等。 - 使用 SQL(Structured Query Language)作为查询语言。 - **架构图**: 下图展示了关系型数据库的基本架构,包括表、索引、存储引擎等组件。 ![关系型数据库架构图](https://example.com/relational_db_architecture.png) ```sql -- 创建表示例 CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; ``` --- #### 2. **图数据库(Graph Database)** 图数据库用于存储和查询图结构数据,其中节点表示实体,边表示实体之间的关系。例如,GraphX 是一个基于 Apache Spark 的图计算框架,它采用切点方式来分割图数据[^2]。 - **架构特点**: - 节点和边是核心数据结构。 - 支持高效的路径查询和关系分析。 - 常用于社交网络分析、推荐系统等领域。 - **架构图**: 下图展示了 GraphX 的切点方式,其中顶点表、路由表和边表共同表达完整的图结构。 ![图数据库架构图](https://example.com/graph_db_architecture.png) --- #### 3. **时序数据库(Time-Series Database)** 时序数据库专门用于存储时间序列数据,通常应用于监控系统、物联网设备数据采集等领域。时序数据库的核心在于高效的时间范围查询和大规模数据写入能力[^3]。 - **架构特点**: - 数据按时间戳排序存储。 - 支持压缩算法以减少存储空间。 - 提供高效的聚合查询功能,如求和、平均值等。 - **架构图**: 下图展示了时序数据库的基本架构,包括数据分片、索引和查询引擎等模块。 ![时序数据库架构图](https://example.com/timeseries_db_architecture.png) --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值