Процедурные и непроцедурные различия в языке запросов
Проходя через реляционную алгебру, я столкнулся с термином "процедурный язык запросов". Так в чем же разница между процедурным языком запросов и непроцедурным языком запросов?
2 ответа
В процедурном языке запросов, таком как реляционная алгебра, вы пишете запрос как выражение, состоящее из отношений и операторов алгебры, таких как объединение, перекрестное произведение, проекция, ограничение и т. Д. Как в арифметическом выражении (например, 2 / (3 + 4)
) операторы имеют порядок (в примере сложение выполняется перед делением). Так, например, вы объединяете результаты двух разных проекций, а затем выполняете ограничение и т. Д. Подобный язык называется процедурным, поскольку каждое выражение устанавливает определенный порядок выполнения своих операторов.
Напротив, языки запросов, такие как реляционное исчисление и хорошо известный язык запросов SQL, называются "непроцедурными", поскольку они выражают ожидаемый результат только через его свойства, а не порядок операторов, которые будут выполняться для его создания. Например, с выражением SQL, например:
SELECT t1.b
FROM t1
WHERE t1.b > 10
мы указываем, мы хотим, чтобы все кортежи отношения t1
для которого t1.b > 10
верно, и из них мы хотим, чтобы значение t1.b
, но мы не указываем, нужно ли сначала выполнить проекцию, а затем ограничение или сначала ограничение, а затем проекцию. Представьте себе сложный SQL-запрос с множеством объединений, условий, ограничений и т. Д. Можно разработать множество различных порядков выполнения запроса (и в действительности задача оптимизатора запросов состоит в том, чтобы разработать эффективный порядок выполнения этих операций, чтобы трансформировать этот декларативный запрос в процедурный).
Существует миф, что нотации реляционной алгебры являются процедурными, а нотации реляционного исчисления - нет. Но каждому выражению отношения соответствует определенное выражение исчисления с той же древовидной структурой. Так что это не может быть процедурным, когда исчисление не является. Вы можете реализовать / выполнить запрос в любой нотации для каждого дерева выражений - или нет.
Язык (запроса) является процедурным, когда он должен использовать цикл или иным образом полагаться на состояние. Альтернативу часто называют декларативной или функциональной.
Любая нотация базы данных, которая обновляет базу данных, является процедурной, включая SQL. Но это не "запрос". Обычно СУБД имеют расширения для SQL, которые позволяют частично контролировать выполнение запросов и / или порядок хранения данных в терминах концепций реализации; это не процедурный. Но это не SQL.