Являются ли (базовые) запросы SQL семантически эквивалентными функциям высшего порядка?


11

Является ли SQL в основном специфичным для домена экземпляром map + fold + filter?

Мне кажется, что следующий SQL:

SELECT name
FROM fruits
WHERE calories < 100 

просто синтаксический сахар для следующей операции map + filter + fold:

var fruits = [{id : 1, name: 'orange', calories : 100},
    {id : 2, name : 'banana',  calories : 150},
    {id : 3, name: 'apple', calories : '50'}];

fruits.map(function(fruit) { return { name : fruit.name, calories : fruit.calories })
    .filter(function(obj) { return obj.calories < 100 })
    .reduce(function (accumulator, obj) { accumulator + "\n" + val.name; });

Это совпадение или есть смысловая семантическая эквивалентность, которая может быть доказана? Как примерно?

Я знаю, что на практике в SQL много наворотов, но по своей сути это просто операция фильтра карты-сгиба?

Следующая статья актуальна: http://blogs.msdn.com/b/doriancorompt/archive/2013/01/21/bringing-the-querying-power-of-sql-to-javascript.aspx


1
Как бы вы смоделировали предложение JOIN или GROUP BY?
Ixrec


2
Гнат - Если вы прочитаете другой пост, вы увидите, что мне сказали, что этот вопрос не подходит для Stackoverflow, поэтому позже я разместил здесь. Вы не можете выиграть с Stackoverflow иногда. Либо сообщение закрывается за то, что оно неуместно, на неправильном форуме, либо слишком сложное, поэтому не подходит для этого сайта, либо это так просто, что вам просто следовало использовать Google.
Шридхар Сарнобат

1
О, я должен удалить другой пост. Выполнено.
Шридхар Сарнобат

1
@ Sridhar-Sarnobat: Обычно, когда несколько пользователей голосуют за перенос вашего вопроса в Programmers.SE, он автоматически переносится. Вы закрыли свой вопрос до того, как он набрал необходимые 5 голосов.
Брайан

Ответы:


6

Взгляните на LINQ , который берет основные понятия, лежащие в основе SQL, и обобщает его для объектно-ориентированного программирования. WhereОператор является болотно-стандартным фильтром, то Selectоператор является проекция / на карте, и так далее. Все основные операции SQL-запросов представлены в LINQ, реализованы с использованием функций высшего порядка, так что да, вы правы в своем интуитивном понимании SQL.

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


Это только демонстрирует, что функции высшего порядка могут использоваться для реализации операций SQL, а не то, что эти два связаны друг с другом в целом.
Барт ван Инген Шенау

1
@ Барт: Тогда вопрос был "есть ли смысловая семантическая эквивалентность, которая может быть доказана?" Реализация одной вещи с точки зрения другой - проверенный временем метод доказательства эквивалентности в информатике. Например, один из способов доказать, что язык является полным по Тьюрингу, используя его для реализации другого языка, который уже известен как полный по Тьюрингу.
Мейсон Уилер

Для семантической эквивалентности я ожидаю, что вы можете показать это в обоих направлениях. И эти запросы SQL могут быть выражены в функциях более высокого порядка, и что вы можете выразить функцию более высокого порядка в синтаксисе SQL.
Барт ван Инген Шенау

2
Может быть, я не сформулировал вопрос достаточно формально. Я думаю, мне не нужно, чтобы он был двунаправленным эквивалентом в 100% случаев. Просто типичные запросы с помощью одного подхода могут быть переписаны как другой.
Шридхар Сарнобат

2
Чтобы быть справедливым, ОП сделал фразу вопрос , как «являются SQL запросов эквивалентна функции высшего порядка», а не «является SQL язык эквивалентен функционального языка программирования», так что ни один ответ неверен.
Иксрек

9

SQL основан на реляционной алгебре и реляционном исчислении кортежей, а не на функциях высшего порядка или функциональном программировании. Хотя SELECT, FROM и WHERE имеют аналогичные функции в других языках, сам SQL не поддерживает обобщенные функции высшего порядка, а только те функции «высшего порядка», которые определяет сам язык.

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


Связана ли реляционная алгебра / исчисление с функциональным программированием? Я думаю, что реляционные языки являются производными от теории множеств, но я не уверен, что это делает их функциональными.
Шридхар Сарнобат

1
Вот почему «высший порядок» в страшных кавычках.
Роберт Харви
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.