Mysql创建SQL子查询ALIAS

Rok*_*alj 3 mysql sql alias caching view

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

SELECT a, b, c FROM (LONG QUERY) X WHERE ...
Run Code Online (Sandbox Code Playgroud)

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

  1. 缩短和简化查询(还可以减少错误和代码重复)
  2. 可能优化性能.(我相信这是默认通过mysql查询缓存完成的)

直到现在,我一直这样做存储:

variable = LONG QUERY;
Query("SELECT a, b, c FROM ("+variable+") X WHERE ...");
Run Code Online (Sandbox Code Playgroud)

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

是否有可能创建一个简单的只读视图,这将产生无开销,所以我可以在任何地方做?我相信这是更有道理和可读的方式.

SELECT a, b, c FROM myTable WHERE ...
Run Code Online (Sandbox Code Playgroud)

Cod*_*ian 5

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

CREATE VIEW vMyLongQuery  
AS 
    SELECT a, b, c FROM (LONG QUERY) X WHERE ...
Run Code Online (Sandbox Code Playgroud)

然后可以像这样引用:

SELECT a, b, c FROM vMyLongQuery 
Run Code Online (Sandbox Code Playgroud)

有关语法的详细信息,请参阅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()等)
  • 不同
  • 通过...分组
  • HAVING
  • 限制
  • UNION或UNION ALL
  • 选择列表中的子查询
  • 引用没有基础表的文字

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

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

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