Предложение MySQL "WITH"

Я пытаюсь использовать MySQL для создания представления с предложением "WITH"

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname

Но похоже, что MySQL не поддерживает это.

Я думал, что это довольно стандартно, и я уверен, что Oracle поддерживает это. Есть ли способ заставить MySQL использовать предложение «WITH»? Я пробовал это с движком MyISAM и innoDB. Оба они не работают.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
104
0
224 040
8

Ответы 8

Oracle поддерживает СО.

Это выглядело бы так.

WITH emps as (SELECT * FROM Employees)
SELECT * FROM emps WHERE ID < 20
UNION ALL
SELECT * FROM emps where Sex = 'F'

@ysth WITH сложно использовать в Google, потому что это обычное слово, которое обычно исключается из поиска.

Вы хотели бы взглянуть на ВЫБРАТЬ документы, чтобы увидеть, как работает факторинг подзапроса.

Я знаю, что это не отвечает на OP, но я убираю любую путаницу, которая могла начаться.

Во всяком случае, мое замешательство не прояснилось. Вы хотите сказать, что предложения WITH нет, но есть инструкция WITH?

ysth 28.11.2008 05:38

Ах я вижу. Это предложение select, которое предшествует select. Можно ли его использовать и в CREATE VIEW? Чем это отличается от присоединения к подзапросу? Я не вижу в Интернете примеров, где имя после WITH имеет параметры - как они работают?

ysth 28.11.2008 05:46

Это совсем другое. Обратите внимание, что одна и та же подзапрос используется дважды без необходимости определять ее дважды. Конечно, вы можете скопировать / вставить туда тот же запрос, но это простой пример. Представьте, что предложение WITH продолжалось для страницы и использовалось 4 раза в основном запросе. тогда вы это оцените.

Mark Brady 02.12.2008 18:28

Я связался с документами, которые должны объяснить синтаксис. Насколько в поле зрения. Конечно, там это работает.

Mark Brady 02.12.2008 18:30

Обновление: MySQL 8.0 наконец-то получает функцию общих табличных выражений, включая рекурсивные CTE.

Об этом сообщается в блоге: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

Ниже мой предыдущий ответ, который я написал в 2008 году.


MySQL 5.x не поддерживает запросы, использующие синтаксис WITH, определенный в SQL-99, также называемый Общие табличные выражения..

Это был запрос функции для MySQL с января 2006 года: http://bugs.mysql.com/bug.php?id=16244

Другие продукты СУБД, поддерживающие общие табличные выражения:

SQLite поддерживает Предложение WITH с версия 3.8.3, выпущенного 03.02.2014.

Martijn 04.02.2014 20:40

Я добавил в список H2 и Firebird.

a_horse_with_no_name 04.02.2014 22:14

@a_horse_with_no_name, спасибо за дополнения. Возможно, нам удастся заставить MySQL повысить приоритет этого старого запроса функции!

Bill Karwin 04.02.2014 22:19

@BillKarwin: Я не верю, что MySQL когда-либо реализует функцию современной СУБД Любые (проверка ограничений, оконная функция, индекс по выражениям, частичный индекс, отложенные ограничения ...).

a_horse_with_no_name 04.02.2014 22:21

@a_horse_with_no_name, они, кажется, придают гораздо более высокий приоритет масштабируемости. Они долгое время сосредоточились на том, чтобы сделать свои внутренние устройства более масштабируемыми, чтобы использовать преимущества современного оборудования. Но я думаю, что они пренебрегли возможностями SQL.

Bill Karwin 04.02.2014 22:25

@a_horse_with_no_name, MySQL 5.7 теперь поддерживает индексы для «виртуальных столбцов», что дает вам решение для индексов выражений. Просто подождите еще десять лет, пока не появятся другие упомянутые вами функции. :-)

Bill Karwin 27.05.2015 02:39

MySQL теперь принадлежит Oracle. Зачем Oracle хотеть сделать MySQL эквивалентом Oracle DB? Они хотят, чтобы MySQL был ограничен небольшими проектами, чтобы в больших проектах использовалась база данных Oracle.

Blake McBride 06.06.2016 19:33

@BlakeMcBride, Вы ошибаетесь, ваш комментарий FUD и фактически не имеет под собой никаких оснований. Oracle также владеет другими продуктами для баз данных, которые делают то, чего не удается Oracle DB. Примеры: TimesTen, BerkeleyDB. Они приобрели эти базы данных, чтобы расширить свой рынок. MySQL доминирует на рынке веб-приложений, а Oracle DB - нет, поэтому они приобрели MySQL. Oracle не имеет смысла ограничивать MySQL. Я разговаривал с разработчиками Oracle MySQL на конференции в апреле, и они фактически работают над внедрением WITH для MySQL.

Bill Karwin 06.06.2016 19:57

@BillKarwin, мне очень жаль. Часть информации я получил от Билла Карвина, который сказал, что они никогда не будут реализовывать современные функции БД. Я заметил, что ты теперь ас Oracle. Хм.

Blake McBride 07.06.2016 17:51

@BlakeMcBride, в прошлом я писал, что MySQL, похоже, слишком сосредоточен на улучшении внутренней масштабируемости за счет застоя в функциях языка SQL. Тогда это было правдой, но после приобретения Oracle у них появилось больше инженерных ресурсов, так что теперь они могут делать и то, и другое.

Bill Karwin 07.06.2016 19:29

@BillKarwin, надеюсь, вы правы, но Oracle уже довольно давно владеет MySQL, и кажется, что такие вещи, как CTE и оконные функции, давно назрели. Следовательно, трудно не предположить, что Oracle на самом деле не заинтересована возвращать SQL в MySQL.

Mark 29.07.2016 19:49

@Mark, я посетил группу инженеров MySQL на конференции в апреле 2016 года, и они сказали, что теперь работают над функциями CTE для MySQL 8.

Bill Karwin 29.07.2016 20:02

Oracle не пренебрегает и / или не ограничивает MySQL. MySQL больше ориентирован на производительность OLTP и используется для этого многими предприятиями AAA, но ему не хватает аналитических возможностей. Понятно, что Oracle пытается дифференцировать свои продукты, добавляя функции в MySQL, когда чувствует, что он отстает от внешних конкурентов с открытым исходным кодом, таких как PostgreS.

rpd 03.02.2017 13:10

Обновлен ответ выше с помощью Informix 14.10, которая добавила поддержку в 2019 году.

Bill Karwin 28.07.2020 22:18

У вас правильный синтаксис:

WITH AuthorRating(AuthorName, AuthorRating) AS
   SELECT aname         AS AuthorName,
          AVG(quantity) AS AuthorRating
   FROM Book
   GROUP By Book.aname

Однако, как отмечали другие, MySQL не поддерживает эту команду. WITH был добавлен в SQL: 1999; новейшая версия стандарта SQL - SQL: 2008. Вы можете найти дополнительную информацию о базах данных, поддерживающих различные функции SQL: 1999, на Википедия.

MySQL традиционно немного отстает в поддержке стандарта SQL, в то время как коммерческие базы данных, такие как Oracle, SQL Server (недавно) и DB2, следовали им чуть более внимательно. PostgreSQL также обычно хорошо соответствует стандартам.

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

Возможно, вас заинтересует что-то вроде этого:

select * from (
    select * from table
) as Subquery

не могли бы вы объяснить подзапрос? Могу ли я выбрать * из ((выбрать * из таблицы1) ОБЪЕДИНЕНИЕ ВСЕХ (выбрать * из таблицы2)) Группировать по чему-то?

user677607 06.06.2012 00:54

@Kathy Привет, Subquery - это имя, которое я использовал для самой производной таблицы. Когда вы используете from ( ... ), вы создаете что-то вроде временной таблицы (производной таблицы), и для нее требуется имя. Вот почему я использовал as Subquery. Отвечая на ваш вопрос, да, вы можете, но вам нужно будет указать имя внешней производной таблицы (непосредственно перед Group By). Надеюсь, это помогло.

Mosty Mostacho 06.06.2012 07:02

@MostyMostacho Привет, пожалуйста, покорми меня немного с ложечки? Я изо всех сил пытаюсь преобразовать его в MySQL. Вы можете взглянуть на это? связь или ответьте на мой вопрос здесь, возможно? связь

Pranav 03.07.2015 23:05

Вы когда-нибудь пробовали временную таблицу? Это решило мою беседу:

create temporary table abc (
column1 varchar(255)
column2 decimal
);
insert into abc
select ...
or otherwise
insert into abc
values ('text', 5.5), ('text2', 0815.8);

Затем вы можете использовать эту таблицу при каждом выборе в этом сеансе:

select * from abc inner join users on ...;

Замечу: stackoverflow.com/questions/343402/… вы не можете открыть таблицу дважды :-(

Claus 26.02.2013 13:02

Мое решение для небольших наборов данных в таблицах: создать таблицу abc2 как abc; вставить в abc2 выбрать * из abc;

Claus 26.02.2013 13:05

Основываясь на ответе @Mosty Mostacho, вот как вы могли бы сделать что-то эквивалентное в MySQL для конкретного случая определения того, какие записи не существуют в таблице и не находятся в какой-либо другой базе данных.

select col1 from (
   select 'value1' as col1 union
   select 'value2' as col1 union
   select 'value3' as col1
) as subquery
left join mytable as mytable.mycol = col1
where mytable.mycol is null
order by col1

Вы можете использовать текстовый редактор с возможностями макросов для преобразования списка значений в указанное в кавычках предложение select union.

MariaDB теперь поддерживает WITH. MySQL пока нет. https://mariadb.com/kb/en/mariadb/with/

   WITH authorRating as (select aname, rating from book)
   SELECT aname, AVG(quantity)
   FROM authorRating
   GROUP BY aname

Другие вопросы по теме