Como venho do mundo MSSQL estou confuso, o que acontece em consultas onde tem cláusula group by e outras colunas em select que não passam por funções agregadas.
Fiquei chocado quando o MySql executou uma consulta assim
select * from myTable
group by columnThatIsNotPk
Ou mexa assim http://sqlfiddle.com/#!9/b30bf5/1
Minhas perguntas são:
- Existe uma explicação de quais dados vou obter para colunas que não existem na cláusula group by?
- É correto usar consultas como essa?
- Perco ou ganho performances com consultas como essa?
- O MySql implementa as agregações First e Last como o JetEngine no ACCESS e, infelizmente, falta o recurso no mecanismo MSSQL?
Para a pergunta sobre agregados: Veja
only_full_group_by
, que foi adicionado no MySQL 5.7.5. Antes disso, você obteve valores aleatórios para as colunas não baseadas naGROUP BY
(s) coluna(s). Depois disso, a instrução está com erro (a menos que você desative esse sinalizador).Quanto a saber se há um ganho de desempenho? Quem se importa, se você receber lixo?
SELECT *
provavelmente nunca é mais rápido (além de digitar) do queSELECT ...
com colunas especÃficas.Quanto a
FIRST
,LAST
, e outras "funções de janela", elas estão disponÃveis no MariaDB 10.2 e MySQL 8.0 (mas ainda não estão prontas para o horário nobre). Existem soluções alternativas, geralmente usandoLIMIT 1
.Outra coisa para aprender se você estiver migrando para o MySQL: Aprenda sobre
AUTO_INCREMENT
como um substituto não drop-inSEQUENCEs
.