257 votes

OÙ vs ayant

Pourquoi avez-vous besoin de placer les colonnes que vous créez vous-même (par exemple ) après et pas `` dans MySQL ?

Et y a-t-il des inconvénients au lieu de faire `` (écrire la définition entier plutôt qu’un nom de colonne) ?

330voto

Quassnoi Points 191041

Pourquoi est-ce que vous avez besoin de placer les colonnes que vous créez vous-même (par exemple "select 1 comme nombre") après AVOIR pas dans MySQL?

WHERE est appliqué avant l' GROUP BY, HAVING est appliqué après (et peut filtrer sur les agrégats).

En général, vous pouvez faire référence à des alias dans aucune de ces clauses, mais MySQL permet de référencement SELECT niveau alias en GROUP BY, ORDER BY et HAVING.

Et existe-il des inconvénients au lieu de faire ", OÙ "1" (écrit l'intégralité de la définition à la place d'un nom de colonne)

Si votre expression calculée ne contient aucun des agrégats, de la mettre en WHERE clause sera probablement plus efficace.

316voto

Fishdrowned Points 471

Toutes les réponses sur n'a pas touché le point clé.

Supposons que nous avons un tableau:

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

Et 10 colonnes avec deux id et la valeur de 1 à 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);

Essayez les 2 requêtes:

SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows

Vous aurez exactement les mêmes résultats, vous pouvez voir la clause HAVING permet de travailler sans clause GROUP BY.

Voici la différence:

SELECT `value` v FROM `table` WHERE `v`>5;

Erreur #1054 - Unknown column 'v' in 'where clause'

SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows

LORSQUE la clause exige une condition pour être une colonne dans une table, mais la clause HAVING peut utiliser les deux colonnes et alias.

C'est parce que la clause where filtre les données avant de les sélectionner, mais AYANT la clause de filtres de données après la sélectionner.

Mettez donc les conditions de la clause where sera plus efficace si vous avez beaucoup de beaucoup de lignes dans une table.

Essayez d'EXPLIQUER à voir la différence:

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 |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+

Vous pouvez voir OÙ ou AYANT des utilisations de l'index, mais les lignes sont différentes.

64voto

David Brunelle Points 2705

La différence principale est que ne peuvent pas être utilisés sur des élément groupé (comme ) alors que `` can.

La raison est le est fait *avant* le regroupement et se fait après le regroupement est effectué.

40voto

Kevin McKelvin Points 1790

sert à filtrer les agrégations dans votre .

Par exemple, pour vérifier les noms en double :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X