Зачем вам создавать столбцы, которые вы создаете самостоятельно (например, select 1 as "number"
) после HAVING
, а не WHERE
в MySQL?
И есть ли какие-либо недостатки вместо выполнения WHERE 1
(запись всего определения вместо имени столбца)?
Зачем вам создавать столбцы, которые вы создаете самостоятельно (например, select 1 as "number"
) после HAVING
, а не WHERE
в MySQL?
И есть ли какие-либо недостатки вместо выполнения WHERE 1
(запись всего определения вместо имени столбца)?
Почему вам нужно разместить столбцы, которые вы создаете сами (например, "выберите 1 как число" ) после HAVING, а не WHERE в MySQL?
WHERE
применяется до GROUP BY
, HAVING
применяется после (и может фильтровать по агрегатам).
В общем, вы можете ссылаться на псевдонимы ни в одном из этих предложений, но MySQL
позволяет ссылаться на псевдонимы уровня SELECT
в GROUP BY
, ORDER BY
и HAVING
.
И есть ли какие-либо недостатки вместо выполнения "ГДЕ 1" (запись всего определения вместо имени столбца)
Если ваше вычисленное выражение не содержит каких-либо агрегатов, размещение его в предложении WHERE
, скорее всего, будет более эффективным.
Все ответы не попали в ключевую точку.
Предположим, что у нас есть таблица:
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
И имеют 10 строк с id и значением от 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);
Попробуйте выполнить следующие два запроса:
SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
Вы получите точно такие же результаты, вы можете видеть, что предложение HAVING может работать без предложения GROUP BY.
Здесь разница:
SELECT `value` v FROM `table` WHERE `v`>5;
Ошибка # 1054 - Неизвестный столбец 'v' in 'where clause'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
Предложение WHERE требует, чтобы условие являлось столбцом в таблице, но предложение HAVING может использовать либо столбец, либо псевдоним.
Это потому, что предложение WHERE фильтрует данные перед выбором, но предложение HAVING фильтрует данные после выбора.
Таким образом, условия в выражении WHERE будут более эффективными, если в таблице будет много строк.
Попробуйте EXPLAIN, чтобы увидеть ключевое различие:
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 |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
Вы можете видеть, что WHERE или HAVING использует индекс, но строки разные.
Основное отличие состоит в том, что WHERE
нельзя использовать для сгруппированного элемента (например, SUM(number)
), тогда как HAVING
может.
Причина заключается в том, что WHERE
выполняется до группировки и HAVING
выполняется после завершения группировки.
HAVING
используется для фильтрации на агрегатах в GROUP BY
.
Например, чтобы проверить наличие повторяющихся имен:
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
Эти 2 будут чувствовать себя такими же, как и раньше, поскольку оба используются для описания условий для фильтрации данных. Хотя мы можем использовать "вместо", где в любом случае есть случаи, когда мы не можем использовать "где вместо". Это происходит потому, что в выбранном запросе "где фильтрует данные до", выберите "после фильтрации" после выбора. Таким образом, когда мы используем псевдонимы, которые фактически не находятся в базе данных, "где can not идентифицировать их, но" может ".
Пример: пусть таблица Student содержит student_id, имя, день рождения, адрес. День рождения имеет дату типа.
SELECT * FROM Student WHERE YEAR(birthday)>1993; /*this will work as birthday is in database.if we use having in place of where too this will work*/
SELECT student_id,(YEAR(CurDate())-YEAR(birthday)) AS Age FROM Student HAVING Age>20;
/*this will not work if we use ‘where’ here, ‘where’ don’t know about age as age is defined in select part.*/
WHERE фильтрует перед группировкой данных, а фильтры HAVING после группировки данных. Это важное различие; строки, которые исключаются предложением WHERE, не будут включены в группу. Это может изменить рассчитанные значения, которые, в свою очередь, могут повлиять на то, какие группы фильтруются на основе использования этих значений в предложении HAVING.
Отрывок из: Форта, Бен. "Sams Teach Yourself SQL за 10 минут (4-е издание) (Sams Teach Yourself...)".
Используется только с агрегацией, но где с операторами без агрегации Если у вас есть слово, помещенное перед агрегацией (group by)
Предложение HAVING используется для фильтрации значений из группы. Прежде чем мы далее давайте рассмотрим формат SQL-заявления.
SELECT SalesOrderID, SUM (UnitPrice * OrderQty) AS TotalPrice FROM Sales.SalesOrderDetail WHERE LineTotal > 100 GROUP BY SalesOrderID ИМЕЮЩИЙ СУММ (UnitPrice * OrderQty) > 10000
Ключевая точка, которая также является основным различием между предложением WHERE и HAVING в SQL, заключается в том, что условие, указанное в предложении WHERE, используется при извлечении данных (строк) из таблицы, а данные, которые не проходят условие, не будут с другой стороны, предложение HAVING позже используется для фильтрации суммированных данных или сгруппированных данных.
Короче, если оба предложения WHERE и HAVING используются в запросе SELECT с агрегированной функцией или предложением GROUP BY, она будет выполняться перед предложением HAVING.