Возможно, немного не по теме, надеюсь, что вы сможете помочь мне разрешить небольшой спор.
История в том, что я работаю со сторонним приложением, у которого есть собственный встроенный механизм запросов SQL. Разработчик этого приложения на 100% убежден, что их реализация SQL соответствует всем стандартам. Я считаю, что это не так.
Рассмотрим следующий запрос:
Select Count(*)
From TableName
Where id = 1000
Если есть запись с идентификатором 1000, я получаю 1 запись в моем наборе результатов.
Однако, если нет записи с идентификатором 1000, я получаю 0 записей в моем наборе результатов. Я считаю, что должен получить 1 запись со значением 0, но сторонний разработчик говорит, что это правильно.
Я указал ему на это (что он предпочитает игнорировать) https://www.w3resource.com/sql/aggregate-functions/count-function.php
Если честно, я точно не знаю, насколько это «официально».
Я прав или я ошибся?
И, конечно, я понимаю, что сторонний разработчик в любом случае имеет право игнорировать это.
@Dai, он говорит, что правильно вернуть пустой набор результатов. Извините, это могло быть немного яснее


При оценке утверждения о том, что оно правильное или соответствует стандартам, мы должны обратиться к соответствующему органу, в данном случае к спецификации SQL-92 (которая является самой простой и наиболее широко применяемой спецификацией SQL, и поскольку более поздние спецификации не отменяют SQL-92). Избегайте веб-сайтов, которые представляют упрощенную, удобную для новичков или «реальную» версию спецификации при поиске авторитетного источника (поэтому ваш сторонний разработчик проявляет осторожность, игнорируя, например, w3resource.com или w3schools.com).
Спецификация SQL-92 определяет COUNT(*) в разделе 6.5. 6.5 <set function specification> (сегодня их часто называют «функциями группового агрегирования»). Он определяет AVG, MAX, MIN, SUM и COUNT. Нас интересует COUNT(*), который он определяет так (выделено мной):
The argument of
COUNT(*)and the argument source of a<general set function>is a table or a group of a grouped table as specified in Subclause 7.8, "", and Subclause 7.9, "<query specification>".Let
Tbe the argument or argument source of a<set function specification>.If
COUNT(*)is specified, then the result is the cardinality ofT.
В твоем случае:
FROM tableName WHERE id = 1000, это T.T возвращает нулевой результат, мощность этого результата равна нулю 0.COUNT(*) вернет значение 0 (которое также не является NULL, т.е. COUNT(*) никогда не оценивается как NULL, кстати), поэтому вы правы: у вас должна быть ровно 1 строка результатов, а не нулевые строки. Значит, он неправ.Обновлено: (от Гордона)
Обычно я этого не делаю, но простой способ выразить это так: запрос агрегирования без group byвсегда возвращает его. Это то, что определяет стандарт.
«Я считаю, что должен получить 1 запись со значением 0, но сторонний разработчик говорит, что это правильно» - говорит ли он, что правильно возвращать один результат с
0, или он говорит, что правильно получить пустой (0-рядный) набор результатов?