SQL连表查询跟一个个表查询那个快各有什么优点和缺点

id info id value
1 a 1 10
2 b 2 30
3 c
4 d

想得到
id value
1 10 //表2中存在
2 20 //表2中存在
3 0 //表2中不存在
4 0 //表2中不存在
一条sql语句来解决 速度快。。还是。。从表1中得到id,再在表2中查找是否有该条记录这个个表查询速度快
他们的各自的优点和缺点

SQL连表查询称为联合查询,一个个表查询是单查询。两者的区别和优缺点如下:

1、从开发效率来看:

联合查询是需要多个单查询进行逻辑组合才能完成的查询的工作,联合查询仅仅需要一个SQL就可以完成查询工作,即把业务逻辑放到了SQL中,由数据库来处理,相对来说开发效率会比较高些。

2、从查询效率来看:

单查询的可重用性较高,所以效率相较之联合查询会更高。

在数据库进行读写时,数据库会用锁机制,限制其他连接对其操作。由于联合查询查询速度比单个查询要慢很多,这样联合查询会增加锁的竞争关系,所以用单查询会更好。

3、从逻辑架构分层原则来看

关联关系代表了业务规则/逻辑,如果大量使用关联查询,就是把大量的业务规则和逻辑放在数据库来执行了,数据库消耗cpu、内存、io等资源会大大增加。

4、从资源利用率方面看

大部分场景下,并不是所有关联查询的结果都被有效使用了。例如后台管理的列表界面会分页显示,关联查询的结果集,只有当前页的数据被使用,但数据库需要消耗额外资源得到全部结果集。

5、从架构的伸缩性方面看

大量的关联查询会导致集中式的数据库架构很难向分布式架构转换,伸缩性方面的优化难度高。关联查询方便快速,开发效率比较好。

不使用关联查询在架构层面有很多优点,但对系统分析和设计、开发能力要求高。一般在互联网行业等用户数较多的情况下最好重视这方面。

题主的两个查询由于数据量不多,效率上基本没有差别,但在实际应用中要根据数据量、业务复杂度等去综合评估。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-04-25

SQL链接表查询称为联合查询,表查询是单个查询。其区别和优点如下:

1.从发展效率的角度看:

联合查询是需要多个单查询逻辑组合才能完成的查询工作,联合查询只需要一个SQL就可以完成查询工作,即将业务逻辑转化为SQL,由数据库来处理,相对来说,开发效率会更高。

2.从查询效率来看:

单个查询具有更好的可重用性,因此比联合查询更有效。

当读取或写入数据库时,数据库使用锁机制来限制其他连接对其进行操作。由于联邦查询比单个查询慢得多,它们会增加锁争用,因此单个查询更好。

3.从逻辑结构层面来看,分层原则

关联表示业务规则/逻辑。如果经常使用关联查询,就会将大量的业务规则和逻辑放入数据库中执行,这将大大增加CPU、内存、IO等资源的消耗。

4.从资源利用的角度来看

在大多数情况下,并不是所有相关查询的结果都得到了有效的使用。例如,后台管理的列表界面会显示分页、关联查询的结果集,只使用当前页面的数据,而数据库需要消耗额外的资源才能得到整个结果集。

5.从架构的可伸缩性的角度来看

大量的相关查询将导致集中式数据库体系结构难以转化为分布式体系结构,可扩展性优化也难以实现。关联查询方便快捷,开发效率更高。

不使用关系查询在体系结构级别上有很多优势,但是它需要大量的系统分析、设计和开发功能。一般在互联网行业,如用户数量最好重视这方面。

由于数据量小,两个查询的效率基本没有差别,但在实际应用中,需要根据数据量、业务复杂度等进行综合评价。

本回答被网友采纳
第2个回答  推荐于2017-10-11
一般情况下是一条语句来的快。
如果表2的数据比表1多出几个数量级的话,并且表2中该id字段有索引,则有可能使用多次查询会快点。

一次查询的优点是只需要一次连接,数据库查询的时候,连接是个耗时的操作。缺点是如果两个表数据多,则中间结果集太大,需要较多的内存资源。
多次查询的优缺点和一次查询正好反过来。另外多次查询也可以在程序中对每一次查询的中间结果做处理,这是一个灵活性。本回答被提问者和网友采纳
第3个回答  推荐于2017-09-27
数据量小的话,基本没有区别,
数据量大的话,一个个要快一些,相当于是用空间换时间,用join不需要查找是否存在记录,同样都是一个sql语句解决。
SELECT AT.ID,
(CASE WHEN BT.value IS NULL THEN 0
ELSE
BT.value
END) AS VALUE
FROM A AS AT
LEFT JOIN B AS BT ON AT.ID = BT.ID
第4个回答  2013-07-03
一条语句速度快,用join不需要查找是否存在记录,同样都是一个sql语句解决。
SELECT AT.ID,
(CASE WHEN BT.value IS NULL THEN 0
ELSE
BT.value
END) AS VALUE
FROM A AS AT
LEFT JOIN B AS BT ON AT.ID = BT.ID
相似回答