Уточнение количества SQL

Возможно, немного не по теме, надеюсь, что вы сможете помочь мне разрешить небольшой спор.

История в том, что я работаю со сторонним приложением, у которого есть собственный встроенный механизм запросов 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

Если честно, я точно не знаю, насколько это «официально».

Я прав или я ошибся?

И, конечно, я понимаю, что сторонний разработчик в любом случае имеет право игнорировать это.

«Я считаю, что должен получить 1 запись со значением 0, но сторонний разработчик говорит, что это правильно» - говорит ли он, что правильно возвращать один результат с 0, или он говорит, что правильно получить пустой (0-рядный) набор результатов?

Dai 16.10.2018 01:03

@Dai, он говорит, что правильно вернуть пустой набор результатов. Извините, это могло быть немного яснее

Hursey 16.10.2018 01:11
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При оценке утверждения о том, что оно правильное или соответствует стандартам, мы должны обратиться к соответствующему органу, в данном случае к спецификации 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 T be the argument or argument source of a <set function specification>.

If COUNT(*) is specified, then the result is the cardinality of T.

В твоем случае:

  • «Источник аргумента» - это часть вашего запроса FROM tableName WHERE id = 1000, это T.
  • Поскольку ваш T возвращает нулевой результат, мощность этого результата равна нулю 0.
  • Таким образом, COUNT(*) вернет значение 0 (которое также не является NULL, т.е. COUNT(*) никогда не оценивается как NULL, кстати), поэтому вы правы: у вас должна быть ровно 1 строка результатов, а не нулевые строки. Значит, он неправ.

Обновлено: (от Гордона)

Обычно я этого не делаю, но простой способ выразить это так: запрос агрегирования без group byвсегда возвращает его. Это то, что определяет стандарт.

Другие вопросы по теме