Mysql создать SQL подзапрос ALIAS - PullRequest
3 голосов
/ 09 ноября 2011

По сути, у меня несколько запросов вроде этого:

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

Дело в том, что я очень часто использую этот LONG QUERY.Я хочу дать этому подзапросу псевдоним, который в первую очередь:

  1. Сокращает и упрощает запросы (также уменьшает ошибки и дублирование кода)
  2. Возможно, оптимизировать производительность.(Я полагаю, что это делается по умолчанию путем кэширования запросов mysql)

До сих пор я делал это таким образом, чтобы хранить:

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

Что неплохо.Я ищу способ сделать это с помощью mysql для внутреннего использования.

Возможно ли создать простое представление только для чтения, которое не будет генерировать НИКАКИХ накладных расходов, чтобы я мог делать это везде?Я считаю, что это более понятный и понятный способ сделать это.

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

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

Обычно это так называемые представления.Например:

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.Вы также теряете преимущества индекса, когда данные присоединяются к искомому.

Как правило, план запросов merge не поддерживает ни одного из следующих представлений.

  • Агрегатные функции (SUM (), MIN (), MAX (), COUNT () и т. Д.)
  • DISTINCT
  • GROUP BY
  • HAVING
  • LIMIT
  • UNION или UNION ALL
  • Подзапрос в списке выбора
  • Ссылка на литералы без базовой таблицы

Так что если ваш подзапросиспользуя их, вы, скорее всего, ухудшите производительность.

Кроме того, внимательно прислушайтесь к совету OMG Ponies, представление НЕ совпадает с базовым классом.Представления имеют свое место в БД, но могут легко использоваться неправильно.Когда инженер приходит к базе данных из OO-фона, представления кажутся удобным способом продвижения наследования и возможности повторного использования кода.Часто люди в конечном итоге оказываются в положении, когда у них есть вложенные представления, соединенные с вложенными представлениями вложенных представлений.SQL обрабатывает вложенные представления, по сути беря определение каждого отдельного представления и превращая его в чудовище запроса, который заставит вашего администратора базы данных плакать.

Кроме того, вы следовали отличной практике в своем примере, и я призываю вас продолжитьэтот.Вы указали все свои столбцы индивидуально, никогда не используйте SELECT *, чтобы указать результаты вашего просмотра.Это, в конце концов, испортит ваш день.

0 голосов
/ 09 ноября 2011

Я не уверен, что это то, что вы ищете, но вы можете использовать хранимые процедуры для вызова запросов MySQL.Я не уверен, что вы можете использовать его в другом запросе?

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

...