基本上,我有多个这样的查询:
SELECT a, b, c FROM (LONG QUERY) X WHERE ...
问题是,我经常使用这个LONG QUERY。我希望给这个子查询一个别名,主要是:
直到现在,我一直这样做才能存储:
variable = LONG QUERY;
Query("SELECT a, b, c FROM ("+variable+") X WHERE ...");
哪个不错。我正在寻找一种方法在内部使用mysql。
是否可以创建一个简单的只读视图来产生无开销,所以我可以在任何地方进行操作?我相信这是更多的适当者和可读的方式。
SELECT a, b, c FROM myTable WHERE ...
答案 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以两种方式merge
和temptable
实现视图。 merge
选项几乎就是您现在正在执行的操作,您的视图将作为子查询合并到您的查询中。使用temptable它实际上将所有数据假脱机到temptable然后select/join
到那个temptable。当数据加入temptable时,您也会失去索引优势。
首先,merge
查询计划不支持您视图中的以下任何内容。
因此,如果您的子查询使用这些,则可能会损害性能。
另外,注意OMG小马'小心建议,视图与基类不同。视图在数据库中占有一席之地但很容易被滥用。当工程师从OO背景进入数据库时,视图似乎是一种促进代码继承和可重用性的便捷方式。通常人们最终会发现自己处于嵌套视图的位置,这些视图连接到嵌套视图的嵌套视图。 SQL通过基本上获取每个单独视图的定义并将其扩展为将使DBA哭泣的查询的野兽来处理嵌套视图。
此外,您在示例中遵循了优秀的做法,我鼓励您继续这样做。您单独指定了所有列,从未使用SELECT *指定视图的结果。它最终会破坏你的一天。
答案 1 :(得分:0)
我不确定这是否是您正在寻找的,但您可以使用存储过程来调用mysql查询。我不确定你是否可以在另一个查询中使用它?
http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx