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) ?
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) ?
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érencementSELECT
niveau alias enGROUP BY
,ORDER BY
etHAVING
.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.
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.
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.