何时在 mysql 中使用 Union [关闭]

Posted

技术标签:

【中文标题】何时在 mysql 中使用 Union [关闭]【英文标题】:When to use Union in mysql [closed] 【发布时间】:2017-06-04 21:10:19 【问题描述】:

有了 Union,你会在什么现实世界的情况下使用它?因为对我来说,对来自两个具有不同列用途/含义的表的两个选择查询使用联合是没有意义的。例如:

桌人:

id   name    age

1    mark    23
2    shawn   18

餐桌地址:

id   personID   address

1      1        some address
2      2        another random address

根据以上表格,您会以何种方式或出于任何原因使用联合查询?

编辑

基本上我的理解是,为了提高效率,您在将不同表中的相似信息处理到一个表中时使用 UNION,而不是总是单独查询或使用 JOIN 来处理相似信息。

编辑

或者当表(DB)的设计没有经过深思熟虑时。因为没有什么能阻止任何人设计一个不完美的数据库,因为时间限制以及当您不了解表的最终设计的全部范围时。

【问题讨论】:

问什么情况下使用UNION有什么问题?我不明白那是如何违反指导方针的...... @Shadow,这是一个合理的问题。如果您不想回答,请继续。 大多数“现实世界”情况都是设计不佳的模式和 OR 条件优化。 (恕我直言) 当使用JOIN或任何方式无法合理检索数据时,您仍想在单个查询中提取数据。 @BillKarwin 如果以正确的方式提出问题,这是一个合理的问题。这个问题写得非常糟糕,在我发表评论时的原始版本中,我不清楚 OP 的目的是什么。我仍然不清楚样本数据的目的是什么,不能使用联合。问题的语气带有偏见。从反对票和接近票来看,还有其他人对这个问题有类似的想法。 【参考方案1】:

一个简单的例子是在一个非规范化表的情况下,您出于给定原因想要对其进行规范化(但不更改原始表)。假设您有一个名为 Loan_Disbursements 的表,具有以下属性:

LoanID, Disbursement_Date, Disbursement_Amount, Refund_Date, Refund_Amount

您想将其规范化为以下内容(我知道,不是最好的名称):

LoanID, Activity_Date, Activity_Amount, Activity_Name

代码如下所示:

SELECT LoanID, Disbursement_Date AS Activity_Date, Disbursement_Amount AS Activity_Amount, 'Disbursement' AS Activity_Name
FROM Loan_Disbursements

UNION ALL

SELECT LoanID, Refund_Date AS Activity_Date, Refund_Amount AS Activity_Amount, 'Refund' AS Activity_Name
FROM Loan_Disbursements

当然,还有其他方法可以在一条 SQL 语句中实现相同的目的(例如使用两个派生表)。但是,您还需要评估查询计划以及性能是否存在差异。

作为旁注,如果您要问“在一个完美的世界中”,它会在哪里使用 - 这真的就像在问“在一个完美的世界中”,您为什么需要备胎。近二十年来,我还没有找到这个完美的世界。但是,这确实是乐趣的一部分。

希望对你有帮助。

干杯!

【讨论】:

没错,联合是为了提高效率。因为假设您有来自多个表的相似信息,并且有几个查询要对这些相似信息执行,所以对相似信息进行联合不是更有效,然后从那时起对这些查询中的每一个查询进行查询总是在做某种 JOIN? 但是你是对的,因为没有足够的时间或需要设计一个完美的数据库,就像任何事情一样,在这些情况下你需要备份选项。

以上是关于何时在 mysql 中使用 Union [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java servlet 时何时打开以及何时关闭 mysql 连接?

如何在 html 表中填充 UNION ALL 查询数据[关闭]

何时不使用承诺 [关闭]

何时关闭 MySQL 连接 discord.py

何时使用 MySQLdb 关闭游标

何时使用 MongoDB [关闭]