SQL: нужны ли нам ЛЮБЫЕ/НЕКОТОРЫЕ и ВСЕ ключевые слова?

Я использую SQL (SQL Server, PostgreSQL) более 10 лет, и до сих пор я никогда не использовал ключевые слова ANY/SOME и ALL в моем производственном коде. Всю ситуацию, с которой я столкнулся, я мог уйти с IN, MAX, MIN, EXISTS, и я думаю, что это более читаемо.

Например:

-- = ANY
select * from Users as U where U.ID = ANY(select P.User_ID from Payments as P);

-- IN
select * from Users as U where U.ID IN (select P.User_ID from Payments as P);

или

-- < ANY
select * from Users as U where U.Salary < ANY(select P.Amount from Payments as P);

-- EXISTS
select * from Users as U where EXISTS (select * from Payments as P where P.Amount > U.Salary);

Используя ANY/SOME и ALL:

Итак, вопрос: я что-то упускаю? есть ли какая-то ситуация, когда ANY/SOME и ALL блестят над другими решениями?

Ответ 1

Я нахожу ЛЮБОЕ и ВСЕЕ полезными, когда вы не просто проверяете равенство или неравенство. Рассмотрим

'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);

как использовал мой ответ на этот вопрос.

ANY, ALL, и их отрицания могут значительно упростить код, который в противном случае требовал бы нетривиальных подзапросов или CTE, и они значительно недоиспользуются в моем представлении.

Считаем, что ANY будет работать с любым оператором. Это очень удобно с LIKE и ~, но будет работать с tsquery, критериями членства в массиве, проверками ключа hstore и т.д.

'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])

или

'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])

Без ANY или ALL вам, вероятно, придется выражать их как подзапрос или CTE в списке VALUES с агрегатом для создания одного результата. Конечно, вы можете сделать это, если хотите, но я буду придерживаться ANY.

Здесь есть одна настоящая оговорка: в более старых версиях Pg, если вы пишете ANY( SELECT ... ), вы почти наверняка будете лучше в плане производительности с EXISTS (SELECT 1 FROM ... WHERE ...). Если вы используете версию, в которой оптимизатор превратит ANY (...) в соединение, вам не нужно беспокоиться. Если есть сомнения, проверьте вывод EXPLAIN.

Ответ 2

Нет, я никогда не использовал ключевые слова ANY, ALL или SOME, и я никогда не видел, чтобы они использовались в коде других людей. Я предполагаю, что это булевой синтаксис, например различные необязательные ключевые слова, которые появляются в некоторых местах в SQL (например, AS).

Имейте в виду, что SQL был определен комитетом.

Ответ 3

Я пробовал что-либо, но ничего не пропустил, только другой тип привычки, только если я использую условие Not. существует и в необходимо будет добавить не в то время, пока какой-либо/некоторые просто меняют оператор на <>. я использую только сервер sql, и я не уверен, что другое программное обеспечение может потерять что-то.