何时在 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 连接?