Por que você precisa colocar colunas que você mesmo criou (por exemplo select 1 as "number"
) depois HAVING
e não WHERE
no MySQL?
E existem desvantagens em vez de fazer WHERE 1
(escrever a definição inteira em vez de um nome de coluna)?
fonte
Por que você precisa colocar colunas que você mesmo criou (por exemplo select 1 as "number"
) depois HAVING
e não WHERE
no MySQL?
E existem desvantagens em vez de fazer WHERE 1
(escrever a definição inteira em vez de um nome de coluna)?
Por que você precisa colocar as colunas criadas por você mesmo (por exemplo, "selecione 1 como número") após HAVING e não WHERE no MySQL?
WHERE
é aplicado antes GROUP BY
, HAVING
é aplicado depois (e pode filtrar em agregados).
Em geral, você pode referenciar aliases em nenhuma dessas cláusulas, mas MySQL
permite referenciar SELECT
aliases de nível em GROUP BY
, ORDER BY
e HAVING
.
E existem desvantagens em vez de fazer "WHERE 1" (escrevendo a definição inteira em vez de um nome de coluna)
Se sua expressão calculada não contiver agregados, colocá-la na WHERE
cláusula provavelmente será mais eficiente.
Todas as outras respostas sobre esta questão não atingiram o ponto principal.
Suponha que temos uma tabela:
CREATE TABLE `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
E tenha 10 linhas com o ID e o valor de 1 a 10:
INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);
Tente as 2 consultas a seguir:
SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
Você obterá exatamente os mesmos resultados, poderá ver que a cláusula HAVING pode funcionar sem a cláusula GROUP BY.
Aqui está a diferença:
SELECT `value` v FROM `table` WHERE `v`>5;
Erro # 1054 - coluna desconhecida 'v' na 'cláusula where'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
A cláusula WHERE permite que uma condição use qualquer coluna da tabela, mas não pode usar aliases ou funções agregadas. A cláusula HAVING permite que uma condição use uma coluna (!) Selecionada, alias ou uma função agregada.
Isso ocorre porque a cláusula WHERE filtra os dados antes da seleção, mas a cláusula HAVING filtra os dados resultantes após a seleção.
Portanto, coloque as condições na cláusula WHERE serão mais eficientes se você tiver muitas linhas em uma tabela.
Tente EXPLAIN para ver a principal diferença:
EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| 1 | SIMPLE | table | range | value | value | 4 | NULL | 5 | Using where; Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
EXPLAIN SELECT `value` v FROM `table` having `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
Você pode ver WHERE ou HAVING usa índice, mas as linhas são diferentes.
SELECT value, COUNT(*) frequency FROM table GROUP BY value HAVING frequency > 10
...HAVING clause can use both column and alias.
para...HAVING clause can use either column or alias.
e alterar...WHERE clause will be more effective
para...WHERE clause will be more efficient
A principal diferença é que
WHERE
não pode ser usado em itens agrupados (comoSUM(number)
) enquantoHAVING
can.O motivo é que
WHERE
é feito antes do agrupamento eHAVING
é feito depois que o agrupamento é concluído.fonte
HAVING
é usado para filtrar agregações no seuGROUP BY
.Por exemplo, para verificar nomes duplicados:
fonte
Esses 2 parecerão iguais aos primeiros, pois ambos são usados para dizer sobre uma condição para filtrar dados. Embora possamos usar 'ter' no lugar de 'onde', em qualquer caso, há casos em que não podemos usar 'onde' em vez de 'ter'. Isso ocorre porque, em uma consulta de seleção, 'onde' filtra os dados antes de 'selecionar' enquanto 'possui' filtrar dados após 'selecionar'. Portanto, quando usamos nomes alternativos que não estão realmente no banco de dados, 'onde' não pode identificá-los, mas 'tendo' pode.
Ex: deixe a tabela Aluno conter student_id, nome, data de nascimento, endereço. Suponha que aniversário seja do tipo data.
fonte
WHERE
eHAVING
.E continua,
Trecho de: Forta, Ben. “Sams Ensina-se SQL em 10 Minutos (5ª Edição) (Sams Ensina-se ...).”.
fonte
Ter é usado apenas com agregação, mas onde com instruções de não agregação Se você tiver onde a palavra a coloca antes da agregação (agrupar por)
fonte