Tại sao SQL được gọi là ngôn ngữ dựa trên quan hệ / chức năng?


14

Chúng tôi đang học được rằng hầu hết các ngôn ngữ được phân loại là một trong hai, "dựa trên quan hệ" hoặc "mức độ cao". Tôi chưa bao giờ sử dụng SQL trước đây, nhưng khi đọc cú pháp của nó, nó có vẻ giống cú pháp cấp cao / cấp cao hơn là dựa trên chức năng / quan hệ (Lisp, Haskell) ??

Hoặc có thể là sự diễn giải của tôi về các ghi chú bài giảng của giáo sư của tôi là sai ... nhưng nó chắc chắn liệt kê SQL là một trong những ngôn ngữ dựa trên mối quan hệ (trái ngược với mức độ cao) và nó đánh đồng dựa trên quan hệ với chức năng ... hoặc có lẽ tôi không hiểu tại sao thực tế là SQL xử lý các cơ sở dữ liệu quan hệ lại tạo ra một ngôn ngữ chức năng theo cách nó nên được thực hiện? (và tại sao 'dựa trên quan hệ' tương đương với 'chức năng' khi phân loại ngôn ngữ lập trình?)

Cảm ơn :)

Câu trả lời:


14

Chúng tôi đang học được rằng hầu hết các ngôn ngữ được phân loại là một trong hai, "dựa trên quan hệ" hoặc "mức độ cao".

Những khái niệm này là trực giao. "Dựa trên mối quan hệ" có nghĩa là ngữ nghĩa của ngôn ngữ dựa trên khái niệm về mối quan hệ, nghĩa là, mối quan hệ nhiều-nhiều giữa hai bộ (quan hệ là nền tảng toán học đằng sau các bảng SQL). "Cấp cao" có nghĩa là ngôn ngữ chứa nhiều trừu tượng ẩn nhiều chi tiết kỹ thuật cơ bản (như vị trí bộ nhớ, thanh ghi CPU, truy cập đĩa, hoạt động theo bit, v.v.). SQL chắc chắn dựa trên mối quan hệ, vì mục đích chính của nó là mô tả dữ liệu quan hệ và các hoạt động dựa trên nó. SQL cũng ở mức khá cao; nó không cung cấp bất kỳ phương tiện nào để truy cập trực tiếp các byte trên đĩa và nó không cho bạn biết bất kỳ chi tiết nào về cách lưu trữ dữ liệu của nó (ít nhất là SQL tiêu chuẩn không;

Trong thực tế, có nhiều trục khác theo đó các ngôn ngữ lập trình (và dữ liệu) có thể được phân loại; một điều đặc biệt thú vị là khai báo so với mệnh lệnh . Ngôn ngữ khai báo mô tả một cái gì đó gì ; ngôn ngữ bắt buộc mô tả làm thế nào để làm một cái gì đó. DDL một phần của SQL là chủ yếu là khai báo, mặc dù các từ khóa bắt buộc-looking (" CREATE TABLE", ' DROP DATABASE', vv), và thậm chí cả phần thao tác dữ liệu ( SELECT, UPDATE, INSERT, DELETE) là vẫn còn khá tường thuật. Một thuộc tính rất thú vị của SQL là nó không hoàn thành Turing: bạn không thể viết một vòng lặp không giới hạn trong SQL ANSI tiêu chuẩn đơn giản.

Các trung tâm lập trình chức năng xung quanh một vài ý tưởng cốt lõi:

  • các hàm là các công dân hạng nhất (nghĩa là chúng có thể được sử dụng làm giá trị, làm đầu vào cho các chức năng khác và làm đầu ra từ các chức năng khác)
  • các hàm bậc cao hơn (các hàm hoạt động trên các hàm hoặc các hàm trả về các hàm)
  • độ tinh khiết (một hàm thuần túy là một hàm không có tác dụng phụ; một hàm thuần túy không thể thực hiện bất kỳ I / O nào, nó không thể đọc hay sửa đổi bất kỳ trạng thái toàn cầu nào và nó không thể lấy các đối số tham chiếu không phải là hằng số. luôn luôn tạo ra cùng một đầu ra với cùng một đầu vào)

SQL chắc chắn không xoay quanh các chức năng như là công cụ chính để mô hình hóa mọi thứ, nhưng nó phần nào nắm lấy ý tưởng thuần túy - cùng một truy vấn chạy trên cùng một cơ sở dữ liệu sẽ mang lại kết quả tương tự, mọi lúc (trừ khi đặt hàng). Gọi SQL là ngôn ngữ 'chức năng' là một chút khó khăn mặc dù IMO.


ANSI SQL đã hoàn tất. Bạn có thể nhúng Hệ thống thẻ Cyclic bằng CTE (được giới thiệu trong SQL: 1999) và Windowing (SQL: 2003).
Jörg W Mittag

@ JörgWMittag: có thể có thể làm điều gì đó tương tự với các trình kích hoạt ...
jmoreno 30/03/2015

"Dựa trên mối quan hệ có nghĩa là ngữ nghĩa của ngôn ngữ dựa trên khái niệm về mối quan hệ, nghĩa là mối quan hệ nhiều-nhiều giữa hai tập hợp (quan hệ là nền tảng toán học đằng sau các bảng SQL)" - Một mối quan hệ, trong RDBMS , không phải là tập dữ liệu đặt cược "mối quan hệ", nó là một bộ dữ liệu. Một bảng, một khung nhìn hoặc kết quả của một truy vấn, đều là "quan hệ".
David Aldridge

12

SQL không bắt buộc vì quá trình truy vấn và các mối quan hệ được giải quyết không được xác định bởi người lập trình, mà là bởi trình biên dịch / trình tối ưu hóa / trình thông dịch. SQL là ngôn ngữ khai báo - Trong SQL, bạn khai báo các mối quan hệ. Điều này xây dựng một cấu trúc dữ liệu (một lần nữa không được xác định về mặt vật lý với ngôn ngữ mà bằng cách thực hiện nó) bằng cách sử dụng các phần chèn, cập nhật và xóa.

Việc sử dụng các mối quan hệ sau đó được thực hiện bằng cách sử dụng các truy vấn (câu lệnh CHỌN), có chức năng ở chỗ chúng không có tác dụng phụ.

Toàn bộ điều được bao bọc xung quanh mô hình quan hệ .


Tôi nghĩ rằng bạn có thể làm cho một trường hợp mạnh mẽ hơn. Truy vấn là tập hợp, nhưng chúng cũng là chức năng trên tập hợp. Truy vấn là đối tượng hạng nhất trong sql (đặc biệt, bạn có thể làm tổ họ hoặc tên họ)
Tên của

5

SQL không thực sự nhiều ngôn ngữ chức năng như nó là khai báo. Các ngôn ngữ chức năng, nói chung, nhấn mạnh phong cách khai báo trên mệnh lệnh để giảm thiểu tác dụng phụ. Điều này có thể khiến một số người coi SQL là chức năng, nhưng nó không chính xác. Đó là tuyên bố với các yếu tố thủ tục.


1
Nhưng các truy vấn (câu lệnh chọn) là các hàm (toán học thuần túy) và các đối tượng lớp đầu tiên trong ngôn ngữ. Điều này làm cho ngôn ngữ chức năng.
Tên của

3

Có thể là ghi chú của bạn được xáo trộn?

Tôi chưa bao giờ nghe nói về các ngôn ngữ lập trình như được phân chia giữa "mức độ quan hệ" và "mức độ cao". Cấp độ thấp / Cấp độ cao thường được sử dụng để phân biệt trình biên dịch chương trình và C với các ngôn ngữ cung cấp hỗ trợ trực tiếp cho các cấu trúc trừu tượng hơn. Quan hệ là một cấu trúc khá trừu tượng, vì vậy tôi muốn nói bất cứ điều gì hỗ trợ quan hệ đều ở cấp độ cao.

SQL thuần thường được mô tả là ngôn ngữ khai báo, với một số bit thủ tục được xử lý bởi các nhà cung cấp khác nhau. Thực tế là SQL không hỗ trợ các hàm như các biến dường như ngay lập tức khiến tôi không đủ điều kiện để trở thành một ngôn ngữ chức năng.


Các truy vấn là các hàm thuần túy trên các tập hợp / quan hệ và là các đối tượng hạng nhất trong ngôn ngữ. Ipso facto chức năng.
Tên của

1

SQL là một ngôn ngữ dựa trên tập hợp, quan hệ đã có chức năng thủ tục được giải quyết.

Tôi không biết nếu tôi xem xét chức năng SQL, tuy nhiên nó có một số khía cạnh của ngôn ngữ chức năng. Các biến thể hiện đại của SQL (với các bit thủ tục) chắc chắn không hoạt động.


-1

Tôi nghĩ rằng, SQL là một cú pháp cú pháp xung quanh đại số quan hệ + một cái gì đó nhiều hơn. Đại số quan hệ có rất nhiều sức mạnh của các ngôn ngữ chức năng, nó thực sự tận dụng các chức năng có sức mạnh biểu đạt rất cao (lựa chọn, chiếu, đổi tên, tham gia, kết hợp, giao nhau ...). Nhưng theo tôi biết, điều trị cơ bản của đại số quan hệ thường không có toán tử lambda tương đương, mặc dù nó có thể được mở rộng với toán tử đệ quy một cách liền mạch.

Tôi nghĩ đại số quan hệ là một ngôn ngữ đại số. SQL, với các truy vấn con của nó, đã chuyển từ đại số quan hệ thuần túy sang một phong cách chức năng hơn, nhưng không có toán tử lambda, tôi nghĩ nó không phải là một ngôn ngữ chức năng đầy đủ. Tôi không biết liệu nó có thể được mở rộng sang một ngôn ngữ chức năng đầy đủ một cách liền mạch hay không, tôi không phải là chuyên gia trong lĩnh vực này. Haskell có một số thư viện với mục tiêu là các ngôn ngữ cơ sở dữ liệu cấp cao.


-1

Tôi không biết tất cả các khả năng của những gì nó cần để một ngôn ngữ đủ điều kiện là chức năng nhưng Sql Server đã giới thiệu một cách rất can thiệp để làm việc với các chức năng. Một mệnh đề đặc biệt làm cho các hàm có thể tương tác với nhau trong một truy vấn. Nó được gọi là Áp dụng. Khi tôi nói điều đó với một cựu lập trình viên APL, anh ta nói với tôi rằng một điều khoản tương tự đã tồn tại trong APL cho một mục tiêu tương tự. Mệnh đề áp dụng cho phép chuyển tập hợp các thuộc tính từ hàng của bảng hoặc hàng của hàm bảng làm đầu vào cho hàm khác. Điều đó đang được nói, tôi đã áp đặt một hạn chế về loại chức năng bảng để viết để được coi là chức năng. Phải được khai báo là nội tuyến, có nghĩa là được thể hiện dưới dạng một câu lệnh chọn duy nhất. Áp đặt này không có biến. Các truy vấn như vậy với rất nhiều logic có thể được viết cung cấp cho bạn sử dụng các biểu thức bảng chung để sau đó cho phép biến các biểu thức thành cột, một loại biến không thể thay đổi có thể được sử dụng lại trong CTE khác. Cuối cùng, chức năng trở thành một macro rất lớn giúp trình tối ưu hóa tự do tối ưu hóa theo cách nó cần. Điều duy nhất mọi người thiếu là một số thủ thuật đơn giản để viết logic điều kiện và khai báo một số dữ liệu hỗ trợ trong truy vấn. Cuối cùng, một số hàm sử dụng mệnh đề over là cần thiết như một cách ro mang lại kết quả như một giá trị có thể sử dụng được trong một hàng từ các hàng khác nhưng nó sẽ hơi dài để kết hợp ở đây. Điều duy nhất mọi người thiếu là một số thủ thuật đơn giản để viết logic điều kiện và khai báo một số dữ liệu hỗ trợ trong truy vấn. Cuối cùng, một số hàm sử dụng mệnh đề over là cần thiết như một cách ro mang lại kết quả như một giá trị có thể sử dụng được trong một hàng từ các hàng khác nhưng nó sẽ hơi dài để kết hợp ở đây. Điều duy nhất mọi người thiếu là một số thủ thuật đơn giản để viết logic điều kiện và khai báo một số dữ liệu hỗ trợ trong truy vấn. Cuối cùng, một số hàm sử dụng mệnh đề over là cần thiết như một cách ro mang lại kết quả như một giá trị có thể sử dụng được trong một hàng từ các hàng khác nhưng nó sẽ hơi dài để kết hợp ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.