Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 count(100500) вопрос  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
;with cte(id) as
(
select 1
union all
select 1
union all
select 1
union all
select 1
union all
select null
)
select count(id) from cte

ожидаемо возвращает 4
а вот COUNT(100500) - столько же, сколько и COUNT(*)
MSDN говорит, что
"Expressions"
Is a combination of symbols and operators that the SQL Server Database Engine evaluates to obtain a single data value. Simple expressions can be a single constant, variable, column, or scalar function. Operators can be used to join two or more simple expressions into a complex expression.

Как сервер думает в этом случае?
1 авг 16, 15:38    [19482625]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
https://habrahabr.ru/post/271797/

Что константа, что * - планы генерируется одинаковые. Отличия были во времена до 2005, сейчас оптимизатор прекрасно о таких нюансах осведомлен.
1 авг 16, 15:44    [19482676]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
waszkiewicz,

одно NULL значения учитывает, другое нет. это точно 100500 вопрос про count
1 авг 16, 15:47    [19482691]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
вопрос не про план, а про результат
1 авг 16, 15:48    [19482696]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
_human
Member

Откуда:
Сообщений: 560
;with cte(id) as
(
select 1
union all
select 1
union all
select 1
union all
select 1
union all
select null
)
, abc as
(
select id, 100500 as stopiccot
from cte
) 

select count(id), count(100500), count(*), count(stopiccot) from abc


                                    
----------- ----------- ----------- -----------
4 5 5 5
Warning: Null value is eliminated by an aggregate or other SET operation.
1 авг 16, 15:48    [19482698]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
waszkiewicz,

select 100500 from cte
1 авг 16, 15:48    [19482701]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
waszkiewicz,
скорее, почему 100500<=>*
1 авг 16, 15:49    [19482704]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
waszkiewicz
вопрос не про план, а про результат

При константных данных, одинаковый план даст идентичный результат. Если это не так, то пишите баг на коннект.
1 авг 16, 15:49    [19482705]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
waszkiewicz
waszkiewicz,
скорее, почему 100500<=>*

а почему нет? посмотрите на вывод...
select 100500 from cte
1 авг 16, 15:53    [19482730]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
TaPaK,
так в этом и вопрос-то. Понять хочется. Подозреваю, что и из любой выборки count(100500) вернет столько же записей, сколько count(*). Так?
1 авг 16, 15:54    [19482740]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
waszkiewicz
Как сервер думает в этом случае?
Выражение 100500 принимает когда-нибудь значение NULL? Нет!
Значит, из результата никогда не исключаются никакие строки. Как и в случае с *.
Выражение id принимает когда-нибудь значение NULL? Да!
Ну так такие строки в результат COUNT не входят (отбрасываются, игнорируются).
О чём сервер честно извещает варнингом.
1 авг 16, 15:55    [19482749]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
waszkiewicz
TaPaK,
так в этом и вопрос-то. Понять хочется. Подозреваю, что и из любой выборки count(100500) вернет столько же записей, сколько count(*). Так?
Так. А в чём вопрос-то?
Поведение COUNT(*) в документации описывается отдельно.
Поэтому вопрос "почему 100500<=>* ?" теряет смысл.
1 авг 16, 15:57    [19482765]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
waszkiewicz
TaPaK,
так в этом и вопрос-то. Понять хочется. Подозреваю, что и из любой выборки count(100500) вернет столько же записей, сколько count(*). Так?

мда... выполни запрос что я написал и посмотри что выводит, посчитай на пальцах и подумай
1 авг 16, 15:57    [19482766]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
o-o
Guest
waszkiewicz
waszkiewicz,
скорее, почему 100500<=>*

нечего не понимаю, что не нравится-то?
count(нечто, отличное от звезды) считает то, что в скобках указано, за вычетом NULL.
указал там поле, посчитал значения поля за вычетом NULL.
указал там константу, отличную от NULL, посчитал эту константу столько раз, сколько строк в таблице.
указал NULL, получил 0.
что не сходится???
1 авг 16, 16:03    [19482806]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
o-o,

Экспедиция исследователей обнаружила одно племя, проживающее невдалеке
от Ниагарского водопада. Исследователей заинтересовал тот факт, что у
вождя племени сильно оттопырено правое ухо, а у всех жителей деревни на
лбу здоровенная шишка.
Чтобы понять феномен, исследователи притаились в кустах и стали
наблюдать за племенем.
Раннее утро. Из хижины выходит вождь, прислушивается и говорит: "А что
это за страшный грохот?"
Все племя хором, при этом стуча себя кулаком в лоб: "Дубина, это же
Ниагарский водопад".
1 авг 16, 16:10    [19482851]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
o-o
Guest
вот еще, шишку из-за него набивать
ограничимся предварительным диагнозом
Картинка с другого сайта.
1 авг 16, 16:23    [19482951]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
o-o,
ага, давай, газуй.
1 авг 16, 16:45    [19483074]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
o-o
Guest
waszkiewicz,
продолжай грызть кактус и не читать ответы.
приятного аппетита
1 авг 16, 17:06    [19483191]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Счетчик подсчитывает количество значений, а не количество строк. Судя по всему, у автора возник вопрос в связи с незнанием этого.
1 авг 16, 17:17    [19483258]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Владислав Колосов
Счетчик подсчитывает количество значений, а не количество строк. Судя по всему, у автора возник вопрос в связи с незнанием этого.
Почему?
Считает количество строк, для которых выражение IS NOT NULL
1 авг 16, 17:23    [19483296]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
o-o
Guest
iap
Владислав Колосов
Счетчик подсчитывает количество значений, а не количество строк. Судя по всему, у автора возник вопрос в связи с незнанием этого.
Почему?
Считает количество строк, для которых выражение IS NOT NULL

потому что это одно и то же:
посчитать число сейфов, где содержимое такой-то ячейки не налл
или посчитать число этих не наллов.
но как Колосов сказал, так доходчивее.
а то некоторые, сконцентрировавшись на сейфах, никак не понимают,
что при подсчете сейфов с указанием в скобках конкретных ячеек(id) или напрямую их содержимого (100500),
указанное в скобках это не украшение команды, а то, что проверяется на наллы при подсчете
1 авг 16, 17:35    [19483355]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
o-o
waszkiewicz
waszkiewicz,
скорее, почему 100500<=>*

нечего не понимаю, что не нравится-то?
count(нечто, отличное от звезды) считает то, что в скобках указано, за вычетом NULL.
указал там поле, посчитал значения поля за вычетом NULL.
указал там константу, отличную от NULL, посчитал эту константу столько раз, сколько строк в таблице.
указал NULL, получил 0.
что не сходится???


продолжаю грызть кактус

;with cte(id) as
(
select null
union all
select null
union all
select null
union all
select null
union all
select null
)
select count(1) from cte
1 авг 16, 17:51    [19483413]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
_abc___
Guest
waszkiewicz,

https://msdn.microsoft.com/en-us/library/ms175997.aspx
автор
COUNT(ALL expression) evaluates expression for each row in a group and returns the number of nonnull values.
1 авг 16, 18:09    [19483495]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
можно закрывать. Вкусные кактусы оказались
1 авг 16, 18:15    [19483518]     Ответить | Цитировать Сообщить модератору
 Re: count(100500) вопрос  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
waszkiewicz,

Если интересно, для понимания агрегации, еще пару вкусных кактусов =)
select count(*) where 1=2;
select count(*) where 1=2 group by ();
1 авг 16, 18:20    [19483539]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить