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, и я не уверен, что другое программное обеспечение может потерять что-то.