ГДЕ ПРОТИВ ИМЕЮЩИХ

213

Зачем вам создавать столбцы, которые вы создаете самостоятельно (например, select 1 as "number") после HAVING, а не WHERE в MySQL?

И есть ли какие-либо недостатки вместо выполнения WHERE 1 (запись всего определения вместо имени столбца)?

Теги:
where-clause

8 ответов

274
Лучший ответ

Почему вам нужно разместить столбцы, которые вы создаете сами (например, "выберите 1 как число" ) после HAVING, а не WHERE в MySQL?

WHERE применяется до GROUP BY, HAVING применяется после (и может фильтровать по агрегатам).

В общем, вы можете ссылаться на псевдонимы ни в одном из этих предложений, но MySQL позволяет ссылаться на псевдонимы уровня SELECT в GROUP BY, ORDER BY и HAVING.

И есть ли какие-либо недостатки вместо выполнения "ГДЕ 1" (запись всего определения вместо имени столбца)

Если ваше вычисленное выражение не содержит каких-либо агрегатов, размещение его в предложении WHERE, скорее всего, будет более эффективным.

234

Все ответы не попали в ключевую точку.

Предположим, что у нас есть таблица:

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 использует индекс, но строки разные.

  • 26
    Я ценю, что вы упомянули EXPLAIN!
  • 0
    Поскольку предложение HAVING фильтрует данные после выбора, предложение WHERE будет более эффективным. Так что, если это правда, когда мы должны использовать HAVING вместо WHERE?
Показать ещё 8 комментариев
60

Основное отличие состоит в том, что WHERE нельзя использовать для сгруппированного элемента (например, SUM(number)), тогда как HAVING может.

Причина заключается в том, что WHERE выполняется до группировки и HAVING выполняется после завершения группировки.

39

HAVING используется для фильтрации на агрегатах в GROUP BY.

Например, чтобы проверить наличие повторяющихся имен:

SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
  • 1
    Это правда для некоторых дошедших до нас. Вы все еще можете поместить все свое «Где» в предложении о наличии.
  • 0
    Также см. Stackoverflow.com/questions/2905292/…
6

Эти 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.*/
  • 0
    Этот пример из реальной жизни полностью проясняет разницу между WHERE и HAVING .
  • 0
    Четко показывает разницу между Иметь и где. Благодарю.
2

WHERE фильтрует перед группировкой данных, а фильтры HAVING после группировки данных. Это важное различие; строки, которые исключаются предложением WHERE, не будут включены в группу. Это может изменить рассчитанные значения, которые, в свою очередь, могут повлиять на то, какие группы фильтруются на основе использования этих значений в предложении HAVING.

Отрывок из: Форта, Бен. "Sams Teach Yourself SQL за 10 минут (4-е издание) (Sams Teach Yourself...)".

1

Используется только с агрегацией, но где с операторами без агрегации Если у вас есть слово, помещенное перед агрегацией (group by)

0
  • A Предложение WHERE - это записи фильтров из результата. фильтр происходит до того, как будут созданы какие-либо группы.
  • Предложение 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню