Mysql创建SQL子查询ALIAS
Posted
技术标签:
【中文标题】Mysql创建SQL子查询ALIAS【英文标题】:Mysql create SQL subquery ALIAS 【发布时间】:2011-11-09 17:24:17 【问题描述】:基本上,我有多个这样的查询:
SELECT a, b, c FROM (LONG QUERY) X WHERE ...
问题是,我经常使用这个 LONG QUERY。我希望给这个子查询一个别名,主要是:
-
缩短和简化查询(同时减少错误和代码重复)
可能优化性能。 (我相信这是通过mysql查询缓存默认完成的)
到目前为止,我一直是这样存储的:
variable = LONG QUERY;
Query("SELECT a, b, c FROM ("+variable+") X WHERE ...");
这还不错。我正在寻找一种在内部使用 mysql 执行此操作的方法。
是否有可能创建一个不会产生任何开销的简单只读视图,这样我就可以在任何地方做?我相信这是一种更合适且更易读的方式。
SELECT a, b, c FROM myTable WHERE ...
【问题讨论】:
每件事都会有一定程度的开销。 IME、SQL 不适合 Java/.NET/等代码重用。 SQL 缓存整个查询,而不是部分查询(包括区分大小写)。 我相信我听说过mySQL也缓存子查询。但是,我不知道这在多大程度上是正确的。 MySQL,也不是一般的 SQL(Oracle、SQL Server,也可能是 PostgreSQL)不缓存查询的一部分。 【参考方案1】:通常这些称为视图。例如:
CREATE VIEW vMyLongQuery
AS
SELECT a, b, c FROM (LONG QUERY) X WHERE ...
然后可以这样引用:
SELECT a, b, c FROM vMyLongQuery
有关语法的更多信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/create-view.html。
就性能而言,最佳情况下的性能将与您现在正在执行的操作非常接近,最坏情况下它会杀死您的应用。这取决于您如何处理视图以及 MySQL 如何处理它们。
MySQL 以merge
和temptable
两种方式实现视图。 merge
选项几乎就是您现在正在做的事情,您的视图作为子查询合并到您的查询中。使用一个临时表,它实际上会将所有数据假脱机到一个临时表中,然后将select/join
发送到该临时表中。将数据连接到临时表时,您也会失去索引优势。
请注意,merge
查询计划在您看来不支持以下任何一项。
因此,如果您的子查询使用这些,您可能会影响性能。
另外,请仔细听取 OMG Ponies 的建议,视图与基类不同。视图在数据库中占有一席之地,但很容易被滥用。当工程师从 OO 背景来到数据库时,视图似乎是一种促进代码继承和可重用性的便捷方式。通常,人们最终会发现自己处于将嵌套视图连接到嵌套视图的嵌套视图的位置。 SQL 处理嵌套视图的方法是从本质上获取每个单独视图的定义并将其扩展为会让您的 DBA 哭泣的查询。
此外,您在示例中遵循了出色的做法,我鼓励您继续这样做。您单独指定了所有列,永远不要使用 SELECT * 来指定视图的结果。它最终会毁了你的一天。
【讨论】:
您的回答是天赐良机。谢谢你的澄清!但我有一个问题,SQL 给了我错误:View's SELECT contains a subquery in the FROM clause
。恐怕我的查询无法以这种方式重写。
试着把视图写成子查询,不要试图封装整个查询。考虑发布您的代码,我们会尽力提供帮助。
真的很基础:CREATE VIEW updatesLast AS SELECT artistSiteID, timeID, number, rank FROM updates NATURAL JOIN (SELECT artistSiteID, MAX(timeID) as timeID FROM updates GROUP BY artistSiteID) Y
我对更新表的了解不够,无法帮助您将其重写为单个查询。看起来更新每个艺术家都有很多记录。无论哪种方式,这都是会损害性能的视图之一。【参考方案2】:
我不确定这是否是您要查找的内容,但您可以使用存储过程来调用 mysql 查询。我不确定你是否可以在另一个查询中使用它?
http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx
【讨论】:
以上是关于Mysql创建SQL子查询ALIAS的主要内容,如果未能解决你的问题,请参考以下文章