Подтвердить что ты не робот

Помимо декларативного языка, SQL является функциональным языком?

Почему да или почему?

4b9b3361

Ответ 1

SQL был разработан как декларативный язык, в том смысле, что вы скажете what, который хотите получить, и движок SQL решает how.

Однако SQL работает с множествами, а результаты функций могут быть в первом классе в Oracle, SQL Server и PostgreSQL.

Можно сказать, что SQL является функциональным языком, если функция принимает набор в качестве своего ввода и выдает в качестве своего вывода набор.

То есть вы можете написать что-то вроде этого:

SELECT  *
FROM    mytable t
JOIN    myfunction(x) f
ON      f.col1 = t.col2

или даже это:

SELECT  *
FROM    mytable t
CROSS APPLY
        myfunction(t.col2) f

(in SQL Server)

или это:

SELECT  t.*, myfunction(t.col2)
FROM    mytable t

(in PostgreSQL)

Это не входит в стандарт SQL.

Так же, как компилятор C++ пытается найти оптимальный способ умножить два float (в терминах простой алгебры), оптимизатор SQL пытается найти оптимальные способы умножения двух множеств (в терминах реляционной алгебры).

В C++ вы просто пишете a * b и полагаетесь на компилятор для создания оптимальной сборки для этого.

В SQL вы пишете SELECT * FROM a NATURAL JOIN b и полагаетесь на оптимизатор.

Однако при объявленной декларативности SQL (каламбур не предназначен) большинство реальных оптимизаторов могут выполнять только очень простые перезаписи запросов.

Скажем, ни один оптимизатор, о котором я знаю, не может использовать тот же эффективный план для этого запроса:

SELECT  t1.id, t1.value, SUM(t2.value)
FROM    mytable t1
JOIN    mytable t2
ON      t2.id <= t1.id
GROUP BY
        t1.id, t1.value

и для этого:

SELECT  id, value, SUM(t1.value) OVER (ORDER BY id)
FROM    mytable

не говоря уже о более сложных запросах.

Вот почему вам все еще нужно сформулировать свои запросы, чтобы они использовали эффективный план (при этом все же производили тот же результат), тем самым делая SQL немного меньше декларативного языка.

Недавно я опубликовал сообщение в своем блоге:

Ответ 2

Являются ли функции первоклассными объектами в SQL? едва. Поэтому я бы сказал нет.

Ответ 3

Нет, SQL не является функциональным языком. Парадигма несколько отличается. Обратите внимание, что существуют другие типы языков декларативного программирования, отличные от функциональных, канонический пример - логическое программирование и PROLOG.

Технически, реляционная алгебра (теоретическая основа SQL) на самом деле не завершена. Хотя современные диалоги SQL добавляют достаточно процедурные функции, так что можно реализовать хранимые процедуры и завершить процесс на этом уровне, один SQL-запрос не является полным вычислением. Реляционная алгебра обладает свойством полноты. Голелевская полнота подразумевает способность выражать любые вычисления, которые могут быть определены в терминах исчисления предикатов первого порядка - в основном то, что вы знаете как обычные логические выражения.

Ответ 4

Я думаю, что SQL и функциональные языки сильно отличаются друг от друга. В функциональном языке вычисление производится путем оценки функций. Функции не изменяют состояние. Все, что они делают, вычисляет значение из своих аргументов. Другими словами, функции не вызывают побочных эффектов. Функциональные языки - это общее назначение.

SQL - это язык, предназначенный для работы с системами управления реляционными базами данных. Его можно рассматривать как язык, специфичный для домена. Он предназначен для работы с "наборами" данных. Он может мутировать глобальное состояние (т.е. Базу данных) с помощью таких команд, как UPDATE. Нет понятия функций, оцениваемых по значению. Насколько я понимаю, SQL даже не завершает Turing.

Ответ 5

Декларативный и функциональный? Это будет электронная таблица.

Ответ 6

Нет единого истинного определения того, что является функциональным языком (или, что то, что является процедурным или объектно-ориентированным).

Но я не могу много думать о том, что указывает на функциональность SQL. Он не имеет функций, у него нет рекурсии, у него нет замыканий, у него нет вложенных функций, у него нет функций как первоклассных типов.

Более часто задаваемый вопрос заключается в том, является ли SQL языком программирования вообще. Это не завершается.

Ответ 7

Как правило, без расширений синтаксиса (например, PL/SQL, T-SQL) вы не можете писать функции.

Но он, безусловно, очень ориентирован на выражение, что является особенностью, присущей всем функциональным языкам.

Ответ 8

Так как точка функционального языка состоит в том, что вы программируете, ну, функции, я бы сказал нет. SQL - это программирование с отношениями (если вы даже можете назвать SQL языком программирования - в нем базовая форма, SQL не является полным Turing).