Разница между GROUP BY HAVING и SELECT MAX () GROUP BY

Я новичок в SQL и меня смущает разница в следующих двух запросах:

SELECT MAX (версия), * FROM table WHERE primary_key = @key GROUP BY location

ВЫБРАТЬ версию, * ИЗ таблицы WHERE primary_key = @key ГРУППА ПО местоположению HAVING version = MAX (version)

Предполагая, что таблица выглядит примерно так:

primary_key | version | location | data

Если я правильно понимаю, оба запроса выбирают запись максимальной версии в каждом месте (среди тех, у которых @key в качестве первичного ключа). Так есть ли разница между двумя запросами? Или разница только в производительности?


person tpoker    schedule 27.06.2017    source источник
comment
databasejournal. com / features / mysql / article.php / 3469351 /.   -  person mohan111    schedule 27.06.2017
comment
Ничего такого. Оба они производят одну и ту же синтаксическую ошибку.   -  person Strawberry    schedule 27.06.2017
comment
@ mohan111 Статья не очень хорошая, в ней используются разные логические подходы, чтобы очертить разницу между обладанием и группировкой по ... Итак, результат очевидно отличается. (С group by он просто смотрит на copies_in_stock, с having он ссылается на max (псевдоним MAX(copies_in_stock)) .. Если бы он вместо этого использовал FROM writer WHERE MAX(copies_in_stock) > 5 GROUP BY poet;, он получил бы тот же результат, как если бы предложение having использовалось в псевдониме агрегирования по copies_in_stock.   -  person dognose    schedule 27.06.2017


Ответы (2)


Вы пропустили имя таблицы
использование * звездочки (все столбцы), когда вы используете функцию агрегирования, устарело и в большинстве БД не допускается

SELECT MAX(version) 
FROM your_table  
WHERE primary_key = @key 
GROUP BY location

SELECT version
FROM your_table
WHERE primary_key = @key 
GROUP BY location 
HAVING version = MAX(version)

два запроса отличаются, потому что во втором результирующий запрос является фильтром для соответствия имеющемуся условию

когда-либо работали над результатом запроса (вместо этого, когда работайте непосредственно с источником строки для запроса), и да, второй работает медленнее, чем первый ... в большинстве случаев разница может быть незаметной

person scaisEdge    schedule 27.06.2017
comment
Спасибо, что остановились на *. Используя *, я пытался сосредоточиться на остальных столбцах, выбранных в двух запросах: если мы выберем более одного столбца в приведенном выше примере (например, версия, данные), гарантировано ли, что выбранные «данные» будут в той же строке, где происходит максимальная версия transaction_version? - person tpoker; 27.06.2017
comment
Вы имеете в виду, что если столбец не входит в группу, он находится в списке выбора ... Тогда в этом случае не гарантируется, что результирующие значения будут такими же, как и в строке, где у вас есть объединенный результат .. (обычно отображается первое, объединенное с помощью выборка запроса), и по этой причине использование * или использование столбца, не входящего в группу, устарело и в большинстве баз данных не разрешено ... надеюсь, я ясно .. - person scaisEdge; 27.06.2017
comment
Да, вы были! Спасибо за разъяснения. - person tpoker; 27.06.2017

См. Ссылку ниже, может быть полезно: http://www.dofactory.com/sql/group-by

person Kris Rudra    schedule 27.06.2017