Пока я не сформулировал с чего начать. И дело не в самих правилах, с ними проблем нет. Хочется как-то структурно подойти к этим публикациям. Может быть сначала есть смысл рассказать про некоторые внутренние процессы, происходящие в базе, для большего погружения в проблему?
С другой стороны давят Даннинг с Крюгером, нашептывая "ты балбес, иди в сорцах поковыряйся" :)
Пока я собираюсь с мыслями, предлагаю всем интересующимся заглянуть в доку
https://github.com/antonrevyako/useful-links/blob/master/opensource-sql-tools.md
Например, там есть ссылки на реализацию mysql на go и репозиторий, где пытаются повторить postgres на go from the scratch.
Так же на глаза попался твиттер-тред (брррр) от Oracle Developer Advocate for SQL, где он рассказывает про различные проблемы, встречающиеся в запросах
https://twitter.com/ChrisRSaxon/status/1256233845642452994
Часть рекомендаций там с оракловским колоритом, но все равно может пригодиться.
Например, в pg есть такая бага, что count(*) работает на 10% медленнее, чем count(1). В оракле такой баги нет.
Давайте пока разберу одно правило из первых рекомендаций треда.
select * from ... where anything = NULL
ALWAYS returns no rows
Казалось бы, такое правило нужно только джунам. Кто не знает, что нельзя сравнивать с NULL'ом?
Если будет существовать правило, автоматом проверяющее на подобные вещи, то, во-первых, джун сможет за джуновскую зарплату не допускать ошибок, которые не допускают синьоры.
Во-вторых, такой же эффект будет наблюдаться при сравнении с колонкой или выражением, которое может принимать значение NULL.
Пример:
WHERE a < b + 1,
где b может быть NULL
Отдельный вопрос сможет ли разработчик всегда понять, что b может принимать 'значения' NULL или нет, но конкретно тут, возможно, хотелось бы трактовать NULL как 0.
Пример:
WHERE a = 'string' || b
Казалось бы,
'string' || bдолжен быть равен
'string', если b IS NULL.
Но фокус в том, что любые выражения с NULL дают NULL...
В этом случае стоит использовать CONCAT, который трактует NULL-значения как пустую строку.
Все ли об этом знают?