从 2 个或更多表中获取数据:选择还是加入?

Posted

技术标签:

【中文标题】从 2 个或更多表中获取数据:选择还是加入?【英文标题】:Getting data from 2 or more tables: select or join? 【发布时间】:2014-03-03 01:17:06 【问题描述】:

假设有 2 个或更多表。

表 A:身份证、姓名、生日

表 B:bID、petType、petName

表 C:cID、***Username

我想获得类似身份证件、姓名、生日、一个人拥有的猫的数量、堆栈溢出的用户名

我们可以

使用连接来连接所有 3 个表 select * from tableA... tableB... tableC... 使用多个选择语句,select a.*, (select count(*) from tableB where petType = 'cat') as numberOfCats, (select...) as stackUsername from tableA a 或其他我不知道的方式

我的问题是什么时候使用 select、joins 或有更好的方法?

更新:

这是另一个问题。如果我有 3 个 *** 帐户,Tom 有 1 个,Peter 有 2 个, 使用

A left join B left join C

将返回总共 6 行

select a.*, select count(*) from tableB where..., select top 1 ***Username from tableC

返回 3 行,因为有 3 个人

如果我只想为 tableA 中的每个人提供一行数据,而不管他/她有多少个 *** 帐户,我可以使用联接来实现类似的功能吗?

谢谢

【问题讨论】:

【参考方案1】:

可能会针对每个结果行扫描选定的子选择(案例 2),而连接的表/视图/子选择仅计算一次:节省内存和连接时间(使用预建索引)。一旦习惯了讲 SQL,就会发现 JOIN 语法容易阅读很多倍。

【讨论】:

嗨,我可以说如果我做这样的事情与连接相比会浪费更多的内存吗? select a.*, select col1 from tableC where..., select col2 from tableC where..., select col3 from tableC where...

以上是关于从 2 个或更多表中获取数据:选择还是加入?的主要内容,如果未能解决你的问题,请参考以下文章

获取具有2个或更多条件的foreach循环的值

如何从不同的表中获取最大版本并加入表?

在堆栈中嵌入 2 个或更多导航控制器

如果表中的行数很大(200 万),NDB cluster7.5(MySQL 5.7)在获取数据时会花费更多时间

从 2 个表中获取记录数 - 一对多关系

如何使用 grep 命令获取连续有六个或更多辅音的单词列表?