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

Это - функция, которая не имеет никакого имени. Для, например, в c# можно использовать

numberCollection.GetMatchingItems<int>(number => number > 5);

для возврата чисел, которые больше, чем 5.

number => number > 5

часть лямбды здесь. Это представляет функцию, которая берет параметр (число) и возвращает булево значение (число> 5). Метод GetMatchingItems использует эту лямбду на всех объектах в наборе и возвращает объекты соответствия.

25
задан 20 July 2009 в 12:52
поделиться

8 ответов

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

5
ответ дан 28 November 2019 в 18:31
поделиться

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

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

2
ответ дан 28 November 2019 в 18:31
поделиться

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

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

9
ответ дан 28 November 2019 в 18:31
поделиться

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

Однако 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

SQL Server )

или это:

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

PostgreSQL )

Однако это не является частью стандарта SQL .

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

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

В SQL вы пишете SELECT * FROM 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

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

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

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

26
ответ дан 28 November 2019 в 18:31
поделиться

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

9
ответ дан 28 November 2019 в 18:31
поделиться

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

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

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

2
ответ дан 28 November 2019 в 18:31
поделиться

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

0
ответ дан 28 November 2019 в 18:31
поделиться

Ссылка на Google: MapReduce: упрощенная обработка данных в больших кластерах

Появился в :
OSDI'04: Шестой симпозиум по разработке и реализации операционных систем,
Сан-Франциско, Калифорния, декабрь 2004 г.

Эта ссылка содержит ссылку на PDF-файл и HTML-слайд.

Существует также страница Википедии с описанием со ссылками на реализацию.

Также критика,

Дэвид ДеВитт и Майкл Стоунбрейкер, ведущие эксперты в области параллельных баз данных и не имеющие общих архитектур, сделали несколько противоречивых заявлений о широте круга проблем, для решения которых можно использовать MapReduce. Они назвали его интерфейс слишком низкоуровневым и задались вопросом, действительно ли он представляет собой сдвиг парадигмы, о котором заявляли его сторонники. Они оспаривают утверждения сторонников MapReduce о новизне, ссылаясь на Teradata как на образец предшествующего уровня техники, существующего более двух десятилетий; они сравнили программистов MapReduce с программистами Codasyl, отметив, что оба "

[Доступно для просмотра (ложь)]

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

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

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

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

5
ответ дан 28 November 2019 в 18:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: