Mysql创建SQL子查询ALIAS

时间:2011-11-09 17:24:18

标签: mysql sql caching view alias

基本上,我有多个这样的查询:

SELECT a, b, c FROM (LONG QUERY) X WHERE ...

问题是,我经常使用这个LONG QUERY。我希望给这个子查询一个别名,主要是:

  1. 缩短&简化查询(也减少错误和代码重复)
  2. 可能优化性能。 (我相信这是默认情况下由mysql查询缓存完成的)
  3. 直到现在,我一直这样做才能存储:

    variable = LONG QUERY;
    Query("SELECT a, b, c FROM ("+variable+") X WHERE ...");
    

    哪个不错。我正在寻找一种方法在内部使用mysql。

    是否可以创建一个简单的只读视图来产生无开销,所以我可以在任何地方进行操作?我相信这是更多的适当者和可读的方式。

    SELECT a, b, c FROM myTable WHERE ...
    

2 个答案:

答案 0 :(得分:5)

通常这些被称为视图。例如:

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以两种方式mergetemptable实现视图。 merge选项几乎就是您现在正在执行的操作,您的视图将作为子查询合并到您的查询中。使用temptable它实际上将所有数据假脱机到temptable然后select/join到那个temptable。当数据加入temptable时,您也会失去索引优势。

首先,merge查询计划不支持您视图中的以下任何内容。

  • 聚合函数(SUM(),MIN(),MAX(),COUNT()等)
  • DISTINCT
  • GROUP BY
  • HAVING
  • LIMIT
  • UNION或UNION ALL
  • 选择列表中的子查询
  • 引用没有基础表的文字

因此,如果您的子查询使用这些,则可能会损害性能。

另外,注意OMG小马'小心建议,视图与基类不同。视图在数据库中占有一席之地但很容易被滥用。当工程师从OO背景进入数据库时​​,视图似乎是一种促进代码继承和可重用性的便捷方式。通常人们最终会发现自己处于嵌套视图的位置,这些视图连接到嵌套视图的嵌套视图。 SQL通过基本上获取每个单独视图的定义并将其扩展为将使DBA哭泣的查询的野兽来处理嵌套视图。

此外,您在示例中遵循了优秀的做法,我鼓励您继续这样做。您单独指定了所有列,从未使用SELECT *指定视图的结果。它最终会破坏你的一天。

答案 1 :(得分:0)

我不确定这是否是您正在寻找的,但您可以使用存储过程来调用mysql查询。我不确定你是否可以在另一个查询中使用它?

http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx