Чи (базові) запити SQL семантично еквівалентні функціям вищого порядку?


12

Чи в основному SQL є доменним екземпляром map + fold + filter?

Мені здається, що наступний SQL:

SELECT name
FROM fruits
WHERE calories < 100 

- це лише синтаксичний цукор для наступної карти + фільтр + операція складання:

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?
Іксрек

1
@Ixrec: Ось так
Мейсон Уілер

2
gnat - Якщо ви прочитаєте іншу публікацію, ви побачите, що вони сказали мені, що питання є невідповідним для Stackoverflow, тому згодом я опублікував тут. Ви не можете перемогти з Stackoverflow іноді. Або публікація закрита через те, що вона не відповідає, на неправильному форумі або занадто складна, тому не підходить для цього веб-сайту, або це так просто, що ви мали б просто скористатися Google.
Шрідхар Сарнобат

1
О, я повинен видалити інший пост. Зроблено.
Шрідхар Сарнобат

1
@ Шрідхар-Сарнобат: Зазвичай, коли купа користувачів проголосує за перенесення вашого питання на Programmers.SE, воно буде автоматично перенесено. Ви закрили своє запитання, перш ніж воно набрало необхідних 5 голосів.
Брайан

Відповіді:


6

Погляньте на LINQ , який бере основні поняття за SQL та узагальнює його до об'єктно-орієнтованого програмування. WhereОператор є болотно-стандартним фільтром, то Selectоператор є проекція / на мапі, і так далі. Усі основні операції із запитом SQL представлені в LINQ, реалізованому за допомогою функцій вищого порядку, так що так, ви правильні в своєму інтуїтивному розумінні SQL.

Велика різниця між прикладом, який ви отримали, і тим, як працює реляційна база даних, полягає в тому, що SQL розроблений з дуже обмеженим набором команд. Це не є повним Тьюрінгом, і дизайнери баз даних знають, що він може, а що не може зробити, що робить їх набагато простіше розробити систему для оптимізації запитів набагато більшою мірою, ніж це було б можливо при простому Mapперерахуванні набору даних елемент за елементом.


Це лише демонструє, що функції вищого порядку можна використовувати для реалізації SQL-операцій, а не те, що вони взагалі пов'язані між собою.
Барт ван Інген Шенау

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

Щодо смислової еквівалентності, я б очікував, що ви зможете показати це в обох напрямках. І те, що SQL запити можуть бути виражені у функціях вищого порядку, і що ви можете висловити функцію вищого порядку у синтаксисі SQL.
Барт ван Інґен Шенау

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

2
Щоб бути справедливим, ОП зробив фразу питання , як «є SQL запитів еквівалентна функції вищого порядку», а не "є SQL мову еквівалентний функціональної мови програмування», так що ні один відповідь невірна.
Іксрек

10

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

Оскільки SQL не дозволяє писати власні власні функції вищого порядку, не можна сказати, що мова підтримує функції вищого порядку.


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

1
Ось чому "вищого порядку" є в лякальних котируваннях.
Роберт Харві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.