Apakah (dasar) kueri SQL secara semantik setara dengan Fungsi Orde Tinggi?


11

Apakah SQL pada dasarnya adalah turunan spesifik domain dari map + fold + filter?

Sepertinya saya bahwa SQL berikut:

SELECT name
FROM fruits
WHERE calories < 100 

hanyalah gula sintaksis untuk operasi peta + filter + lipatan berikut:

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; });

Apakah ini kebetulan, atau adakah kesetaraan semantik yang dapat dibuktikan? Bagaimana, kira-kira?

Saya tahu dalam prakteknya SQL memiliki banyak lonceng dan peluit tetapi pada intinya apakah ini hanya operasi peta-lipat-filter?

Artikel berikut ini relevan: http://blogs.msdn.com/b/doriancorompt/archive/2013/01/21/membawa-yang-meminta-power-of-sql-to-javascript.aspx


1
Bagaimana Anda memodelkan klausa JOIN atau GROUP BY?
Ixrec


2
Agas - Jika Anda membaca posting lain, Anda akan melihat bahwa mereka mengatakan kepada saya bahwa pertanyaan itu tidak pantas untuk Stackoverflow jadi setelah itu saya diposting di sini. Terkadang Anda tidak bisa menang dengan Stackoverflow. Entah posting ditutup karena tidak pantas, di forum yang salah, atau terlalu rumit sehingga tidak cocok untuk situs ini, atau sangat mudah Anda seharusnya menggunakan Google saja.
Sridhar Sarnobat

1
Oh, saya seharusnya menghapus posting lain. Selesai
Sridhar Sarnobat

1
@ Sridhar-Sarnobat: Biasanya, ketika sekelompok pengguna memilih untuk memigrasi pertanyaan Anda ke Programmers.SE, maka secara otomatis akan dimigrasikan. Anda menutup pertanyaan Anda sebelum mencapai 5 suara yang diperlukan.
Brian

Jawaban:


6

Lihatlah LINQ , yang mengambil konsep dasar di balik SQL dan menggeneralisasikannya ke pemrograman berorientasi objek. The Whereoperator adalah Filter rawa-standar, Selectoperator adalah proyeksi / Peta, dan sebagainya. Semua operasi query SQL dasar diwakili dalam LINQ, diimplementasikan menggunakan fungsi tingkat tinggi, jadi ya, Anda benar dalam pemahaman intuitif Anda tentang SQL.

Perbedaan besar antara contoh yang Anda miliki dan cara kerja database relasional adalah bahwa SQL dirancang dengan serangkaian perintah yang sangat terbatas. Ini bukan Turing-complete dan perancang basis data tahu apa yang bisa dan tidak bisa dilakukan, yang membuatnya jauh lebih mudah bagi mereka untuk merancang sistem untuk mengoptimalkan kueri ke tingkat yang jauh lebih besar daripada yang mungkin dengan Mapenumerasi sederhana kumpulan data elemen demi elemen.


Ini hanya menunjukkan bahwa fungsi tingkat tinggi dapat digunakan untuk mewujudkan operasi SQL, bukan keduanya saling terkait secara umum.
Bart van Ingen Schenau

1
@ Bart: Lalu pertanyaannya adalah "adakah kesetaraan semantik yang dapat dibuktikan?" Menerapkan satu hal dalam hal yang lain adalah teknik yang dihormati waktu untuk membuktikan kesetaraan dalam ilmu komputer. Misalnya, salah satu cara untuk membuktikan bahwa suatu bahasa adalah Turing-complete dengan menggunakannya untuk mengimplementasikan bahasa lain yang sudah dikenal sebagai Turing-complete.
Mason Wheeler

Untuk kesetaraan semantik, saya berharap Anda dapat menunjukkannya di kedua arah. Baik query SQL dapat diekspresikan dalam fungsi tingkat tinggi dan bahwa Anda dapat mengekspresikan fungsi tingkat tinggi dalam sintaks SQL.
Bart van Ingen Schenau

2
Mungkin saya tidak mengucapkan pertanyaan itu secara formal. Saya kira saya tidak perlu setara secara bidireksional dalam 100% kasus. Hanya saja pertanyaan khas melalui satu pendekatan dapat ditulis ulang sebagai yang lain.
Sridhar Sarnobat

2
Agar adil, OP memang frase pertanyaan sebagai "adalah query SQL setara dengan fungsi tingkat tinggi", bukan "adalah bahasa SQL setara dengan bahasa pemrograman fungsional", jadi tidak ada jawaban yang salah.
Ixrec

9

SQL didasarkan pada Relational Algebra dan Tuple Relational Calculus, bukan fungsi tingkat tinggi atau pemrograman fungsional. Sementara SELECT, FROM dan WHERE memiliki fungsi analog dalam bahasa lain, SQL sendiri tidak mendukung fungsi tingkat tinggi yang digeneralisasi, tetapi hanya fungsi "tingkat tinggi" yang didefinisikan oleh bahasa itu sendiri.

Karena SQL tidak memungkinkan Anda untuk menulis sendiri fungsi tingkat tinggi kustom Anda, tidak dapat dikatakan dengan otoritas apa pun bahwa bahasa mendukung fungsi tingkat tinggi.


Apakah aljabar / kalkulus relasional terkait dengan pemrograman fungsional sama sekali? Saya pikir bahasa relasional berasal dari teori himpunan tetapi saya tidak yakin apakah itu membuat mereka fungsional.
Sridhar Sarnobat

1
Itulah sebabnya "tingkat tinggi" dalam tanda kutip.
Robert Harvey
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.