Mengapa SQL dikenal sebagai bahasa berbasis relasi / fungsional?


14

Kami belajar bahwa sebagian besar bahasa diklasifikasikan sebagai salah satu dari keduanya, "berdasarkan hubungan" atau "tingkat tinggi". Saya belum pernah menggunakan SQL sebelumnya, tetapi dari membaca sintaksnya sepertinya lebih seperti sintaksis imperatif / tingkat tinggi daripada fungsional / berbasis relasi (Lisp, Haskell) ??

Atau bisa saja interpretasi saya terhadap catatan kuliah profesor saya salah ... tapi itu pasti daftar SQL sebagai salah satu bahasa berbasis relasi (sebagai lawan dari tingkat tinggi), dan itu menyamakan relasi berbasis dengan fungsional ... atau mungkin karena saya tidak mengerti mengapa fakta bahwa SQL berhubungan dengan basis data relasional membuat bahasa fungsional seperti yang seharusnya diimplementasikan? (dan mengapa 'berbasis relasi' sama dengan 'fungsional' ketika mengkategorikan bahasa pemrograman?)

Terima kasih :)

Jawaban:


14

Kami belajar bahwa sebagian besar bahasa diklasifikasikan sebagai salah satu dari keduanya, "berdasarkan hubungan" atau "tingkat tinggi".

Konsep-konsep itu ortogonal. "Relation-based" berarti bahwa semantik bahasa didasarkan pada konsep relasi, yaitu asosiasi banyak-ke-banyak antara dua set (relasi adalah fondasi matematika di belakang tabel SQL). "Tingkat tinggi" berarti bahasa tersebut mengandung banyak abstraksi yang menyembunyikan banyak detail teknis yang mendasarinya (seperti lokasi memori, register CPU, akses disk, operasi bitwise, dll.). SQL tentu saja berbasis relasi, karena tujuan utamanya adalah untuk menggambarkan data relasional dan operasi di atasnya. SQL juga tingkat yang cukup tinggi; itu tidak menyediakan sarana apa pun untuk mengakses byte pada disk secara langsung, dan tidak memberi tahu Anda perincian tentang bagaimana ia menyimpan datanya (setidaknya SQL standar tidak;

Faktanya, ada lebih banyak sumbu di mana bahasa pemrograman (dan data) dapat diklasifikasikan; yang sangat menarik adalah deklaratif vs imperatif . Bahasa deklaratif menggambarkan apa sesuatu adalah ; bahasa imperatif menggambarkan cara melakukan sesuatu. DDL bagian dari SQL sebagian besar deklaratif, meskipun kata kunci penting yang tampak (" CREATE TABLE", ' DROP DATABASE', dll), dan bahkan bagian manipulasi data ( SELECT, UPDATE, INSERT, DELETE) masih cukup deklaratif. Properti SQL yang sangat menarik adalah bahwa ia tidak lengkap Turing: Anda tidak dapat menulis loop tanpa batas dalam standar ANSI SQL sederhana.

Pemrograman fungsional berpusat pada beberapa ide inti:

  • fungsi adalah warga negara kelas satu (yaitu, mereka dapat digunakan sebagai nilai, sebagai input ke fungsi lain, dan sebagai output dari fungsi lain)
  • fungsi tingkat tinggi (fungsi yang beroperasi pada fungsi, atau fungsi yang mengembalikan fungsi)
  • kemurnian (fungsi murni adalah yang tidak memiliki efek samping; fungsi murni tidak dapat melakukan I / O, tidak dapat membaca atau memodifikasi keadaan global, dan tidak dapat mengambil argumen referensi non-const. Fungsi murni sangat menarik karena mereka akan selalu menghasilkan output yang sama dengan input yang sama)

SQL tentu tidak berputar di sekitar fungsi sebagai alat utama untuk memodelkan hal-hal, tetapi itu agak merangkul ide kemurnian - permintaan yang sama dijalankan pada database yang sama akan menghasilkan hasil yang sama, setiap kali (kecuali untuk pemesanan). Memanggil SQL sebagai bahasa 'fungsional' sedikit sulit meskipun IMO.


ANSI SQL sudah selesai Turing. Anda dapat menanamkan Sistem Tag Siklik menggunakan CTE (diperkenalkan dalam SQL: 1999) dan Windowing (SQL: 2003).
Jörg W Mittag

@ JörgWMittag: mungkin bisa melakukan sesuatu yang mirip dengan pemicu ...
jmoreno

"Berbasis relasi berarti semantik bahasa didasarkan pada konsep relasi, yaitu hubungan banyak-ke-banyak antara dua set (relasi adalah fondasi matematika di belakang tabel SQL)" - Relasi, dalam RDBMS , bukan "hubungan" antara set data, itu adalah satu set tupel. Tabel, tampilan, atau hasil kueri, semuanya "relasi".
David Aldridge

12

SQL tidak penting karena proses HOW query dan hubungan diselesaikan tidak didefinisikan oleh programmer, melainkan oleh kompiler / pengoptimal / interpreter. SQL adalah bahasa deklaratif - Dalam SQL, Anda menyatakan hubungan. Ini membangun struktur data (yang lagi-lagi tidak didefinisikan secara fisik dengan bahasa tetapi dengan implementasinya) menggunakan sisipan, pembaruan, dan penghapusan.

Penggunaan relasi kemudian dilakukan dengan menggunakan kueri (pernyataan SELECT), yang fungsional karena tidak memiliki efek samping.

Seluruhnya melilit model relasional .


Saya pikir Anda bisa membuat kasus yang lebih kuat. Kueri adalah set, tetapi mereka juga berfungsi pada set. Query adalah objek kelas pertama dalam sql (khususnya, Anda dapat membuat sarang atau
menamainya

5

SQL sebenarnya bukan bahasa yang berfungsi sebagaimana deklaratif. Bahasa fungsional, secara umum, menekankan gaya deklaratif daripada imperatif untuk meminimalkan efek samping. Ini dapat menyebabkan beberapa orang menyebut SQL sebagai fungsional, tetapi tidak akurat. Ini deklaratif dengan elemen prosedural.


1
Tetapi kueri (pernyataan pilihan) adalah fungsi (matematika murni) dan objek kelas pertama di langauge. Ini membuat bahasa berfungsi.
nomen

3

Apakah mungkin catatan Anda diacak?

Saya belum pernah mendengar tentang bahasa pemrograman yang dibagi antara "berbasis hubungan" dan "tingkat tinggi". Tingkat rendah / Tingkat tinggi biasanya digunakan untuk membedakan assembler dan C dari bahasa yang memberikan dukungan langsung untuk struktur yang lebih abstrak. Hubungan adalah struktur yang cukup abstrak, jadi saya akan mengatakan apa pun yang mendukung hubungan tingkat tinggi menurut definisi.

SQL murni biasanya digambarkan sebagai bahasa deklaritif, dengan beberapa bit prosedural ditempelkan oleh berbagai vendor. Fakta bahwa SQL tidak mendukung fungsi karena variabel bagi saya segera mendiskualifikasi dari menjadi bahasa fungsional.


Query adalah fungsi murni pada set / relasi, dan merupakan objek kelas satu dalam bahasa. Benar-benar fungsional.
nomen

1

SQL adalah bahasa relasional, set-based yang memiliki fungsi prosedural tertempel.

Saya tidak tahu apakah saya akan menganggap SQL fungsional, namun ia memiliki beberapa aspek bahasa fungsional. Varian modern SQL (dengan bit prosedural) jelas tidak fungsional.


-1

Saya pikir, SQL adalah gula sintaksis di sekitar aljabar relasional + sesuatu yang lebih. Aljabar relasional memiliki banyak kekuatan bahasa fungsional, ia memang memanfaatkan fungsi dari daya pengekspresan yang sangat tinggi (seleksi, proyeksi, penggantian nama, bergabung, persatuan, persimpangan ...). Tapi sejauh yang saya tahu, perawatan dasar aljabar relasional biasanya tidak memiliki yang setara dengan operator lambda, meskipun dapat diperpanjang dengan operator rekursi dengan cara yang mulus.

Saya pikir hubungan aljabar bukan bahasa aljabar. SQL, dengan subqueries-nya, telah pindah dari aljabar relasional murni ke gaya yang lebih fungsional, tetapi tanpa operator lambda, saya pikir itu bukan bahasa fungsional penuh. Saya tidak tahu apakah itu dapat diperluas ke bahasa fungsional penuh dengan cara yang mulus, saya tidak ahli dalam bidang ini. Haskell memiliki beberapa perpustakaan dengan tujuan bahasa database tingkat tinggi.


-1

Saya tidak tahu semua subtilitas dari apa yang diperlukan agar suatu bahasa dapat dikualifikasikan sebagai fungsional tetapi Sql Server memperkenalkan cara yang sangat interresting untuk bekerja dengan fungsi. Klausa khusus membuat fungsi dapat berinteraksi bersama dalam permintaan. Itu disebut Terapkan. Ketika saya menjelaskannya kepada mantan programmer APL, dia memberi tahu saya bahwa ada klausa serupa di APL untuk tujuan yang sama. Terapkan klausa memungkinkan untuk melewati set atribut dari baris tabel atau baris fungsi tabel sebagai input ke fungsi lain. Yang sedang berkata, saya memberlakukan batasan pada jenis fungsi tabel untuk menulis agar dianggap fungsional. Itu harus dinyatakan sebagai inline, yang berarti dinyatakan sebagai pernyataan pilih tunggal. Ini memaksakan tidak memiliki variabel. Pertanyaan seperti itu dengan banyak logika dapat ditulis menyediakan Anda menggunakan ekspresi tabel umum yang kemudian memungkinkan untuk mengubah ekspresi menjadi kolom, semacam variabel tidak dapat diubah yang dapat digunakan kembali dalam CTE lainnya. Pada akhirnya, fungsi menjadi makro yang sangat besar yang membuat pengoptimal bebas untuk mengoptimalkan cara yang diperlukannya. Satu-satunya kekurangan adalah beberapa trik sederhana untuk menulis logika bersyarat dan mendeklarasikan beberapa data yang mendukung logika dalam kueri. Terakhir beberapa fungsi menggunakan klausa over diperlukan sebagai cara untuk membawa hasil sebagai nilai yang dapat digunakan dalam satu baris dari baris lain tetapi akan agak lama untuk berkolaborasi di sini. Satu-satunya hal yang kurang adalah beberapa trik sederhana untuk menulis logika kondisional dan menyatakan beberapa data yang mendukung logika dalam kueri. Terakhir beberapa fungsi menggunakan klausa over diperlukan sebagai cara untuk membawa hasil sebagai nilai yang dapat digunakan dalam satu baris dari baris lain tetapi akan agak lama untuk berkolaborasi di sini. Satu-satunya hal yang kurang adalah beberapa trik sederhana untuk menulis logika kondisional dan menyatakan beberapa data yang mendukung logika dalam kueri. Terakhir beberapa fungsi menggunakan klausa over diperlukan sebagai cara untuk membawa hasil sebagai nilai yang dapat digunakan dalam satu baris dari baris lain tetapi akan agak lama untuk berkolaborasi di sini.

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.