Tại sao bạn lại sử dụng các chức năng được lưu trữ trong MySQL

Tiếp tục với loạt bài Thủ tục và Hàm được lưu trữ (xem phần 1, phần 2 hoặc phần 3), tháng này chúng ta sẽ tập trung vào Hàm được lưu trữ. Hầu hết những gì chúng tôi đã trình bày trong các hướng dẫn trước đó đều có liên quan ở đây, vì vậy tôi khuyên bạn nên đọc những hướng dẫn đó trước nếu chưa có

Chức năng được lưu trữ là gì

Nếu lập trình thủ tục là mới đối với bạn, bạn có thể tự hỏi sự khác biệt giữa Thủ tục được lưu trữ và Hàm được lưu trữ là gì. Không quá nhiều thực sự. Hàm luôn trả về kết quả và có thể được gọi bên trong câu lệnh SQL giống như các hàm SQL thông thường. Tham số hàm tương đương với tham số thủ tục IN, vì các hàm sử dụng từ khóa RETURN để xác định nội dung được trả lại. Các hàm được lưu trữ cũng có nhiều hạn chế hơn một chút về những câu lệnh SQL mà chúng có thể chạy so với các thủ tục được lưu trữ

Một ví dụ về chức năng được lưu trữ

Dưới đây là một ví dụ về một chức năng được lưu trữ

mysql> DELIMITER |
mysql>
 CREATE FUNCTION WEIGHTED_AVERAGE (n1 INT, n2 INT, n3 INT, n4 INT)
  RETURNS INT
   DETERMINISTIC
    BEGIN
     DECLARE avg INT;
     SET avg = (n1+n2+n3*2+n4*4)/8;
     RETURN avg;
    END|
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT WEIGHTED_AVERAGE(70,65,65,60)G
*************************** 1. row ***************************
WEIGHTED_AVERAGE(70,65,65,60): 63
1 row in set (0.00 sec)

Như đã đề cập trong hướng dẫn thủ tục lưu trữ đầu tiên, chúng tôi tuyên bố “. ” biểu tượng như một dấu phân cách, để cơ quan chức năng của chúng tôi có thể sử dụng “;” thông thường . Hàm này trả về giá trị trung bình có trọng số, vì có thể được sử dụng để xác định kết quả chung cho một chủ đề. Điểm kiểm tra thứ ba được tính trọng số gấp đôi so với điểm thứ nhất và thứ hai, trong khi điểm thứ tư được tính gấp bốn lần. Chúng tôi cũng sử dụng các câu lệnh DECLARE (khai báo một biến) và DETERMINISTIC (báo cho MySQL biết rằng, với cùng một đầu vào, hàm sẽ luôn trả về cùng một kết quả), như đã thảo luận trong các hướng dẫn trước đó

Truy cập các bảng trong các chức năng được lưu trữ

Các chức năng được lưu trữ trong các phiên bản đầu tiên của MySQL 5. 0 (< 5. 0. 10) không thể tham khảo các bảng ngoại trừ khả năng rất hạn chế. Điều đó hạn chế tính hữu dụng của chúng ở một mức độ lớn. Các phiên bản mới hơn hiện có thể làm như vậy, nhưng vẫn không thể sử dụng các câu lệnh trả về tập kết quả. Vì vậy, không có truy vấn CHỌN nào trả về các tập kết quả từ một bảng. Tuy nhiên, bạn có thể giải quyết vấn đề này bằng cách sử dụng CHỌN VÀO. Đối với ví dụ tiếp theo, chúng tôi tạo một bảng cho phép chúng tôi lưu trữ 4 điểm và tên. Sau đó, chúng tôi sẽ xác định hàm WEIGHTED_AVERAGE mới để sử dụng dữ liệu động từ bảng

mysql> CREATE TABLE sfdata(mark1 INT,mark2 INT,mark3 INT,mark4 INT,name VARCHAR(50))
mysql> INSERT INTO sfdata VALUES(70,65,65,60,'Mark')|
mysql> INSERT INTO sfdata VALUES(95,94,75,50,'Pavlov')|
mysql>
 CREATE FUNCTION WEIGHTED_AVERAGE2 (v1 VARCHAR(50))
  RETURNS INT
  DETERMINISTIC
   BEGIN
    DECLARE i1,i2,i3,i4,avg INT;
    SELECT mark1,mark2,mark3,mark4 INTO i1,i2,i3,i4 FROM sfdata WHERE name=v1;
    SET avg = (i1+i2+i3*2+i4*4)/8; 
    RETURN avg;
   END|
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT WEIGHTED_AVERAGE2('Pavlov') AS Pavlov, WEIGHTED_AVERAGE2('Mark') AS MarkG
*************************** 1. row ***************************
Pavlov: 67
  Mark: 63
1 row in set (0.00 sec)

Bằng cách CHỌN nội dung của các hàng mark1 đến mark4 VÀO các biến mà chúng ta vừa khai báo, không cần trả về tập kết quả và chúng ta có thể vui vẻ sử dụng các kết quả bên trong hàm

Tất cả các hành vi và điều kiện thông thường được áp dụng bên trong hàm. Đây là điều sẽ xảy ra nếu một trong các bản ghi bị thiếu một trường

mysql> INSERT INTO sfdata VALUES(90,NULL,70,60,'Isabelle')|
Query OK, 1 row affected (0.18 sec)
mysql> SELECT WEIGHTED_AVERAGE2('Isabelle') AS IsabelleG
*************************** 1. row ***************************
Isabelle: NULL
1 row in set (0.16 sec)

Đúng như dự đoán, NULL (và NULL luôn là một ý tưởng tồi để sử dụng) làm ô nhiễm toàn bộ kết quả và MySQL, không biết phải làm gì khác, không thể làm gì khác ngoài việc trả về NULL

Đây là cú pháp đầy đủ cho các chức năng được lưu trữ

CREATE FUNCTION sf_name ([parameter1 [...]])
    RETURNS type
    [
     LANGUAGE SQL
     | [NOT] DETERMINISTIC
     | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
     | SQL SECURITY { DEFINER | INVOKER }
     | COMMENT 'string'
    ] 
    SQL statements

Thao tác với bảng

Với những hạn chế ban đầu về việc truy cập các bảng bên trong một hàm đã được dỡ bỏ, bạn cũng có thể sử dụng một hàm để thực hiện các thay đổi đối với bảng. Hai ví dụ tiếp theo không phải là cách sử dụng hàm lý tưởng (ở định dạng hiện tại của chúng, lý tưởng hơn là các thủ tục được lưu trữ), vì chúng tôi không quan tâm đến kết quả được trả về và chỉ muốn thao tác dữ liệu, nhưng chúng cho bạn thấy một số . Một chức năng được sử dụng tốt nhất khi bạn muốn trả về một kết quả. Dựa trên các ví dụ này, bạn có thể tạo của riêng mình nơi thực hiện các CHÈN, CHỌN và CẬP NHẬT phức tạp, với một kết quả duy nhất được trả về ở cuối tất cả. Đầu tiên, chúng tôi CHÈN một bản ghi vào bảng sfdata

Tại sao bạn sẽ sử dụng các chức năng được lưu trữ?

Nói chung, bạn nên cân nhắc sử dụng hàm được lưu trữ thay vì thủ tục được lưu trữ khi bạn có chương trình với mục đích duy nhất là tính toán và trả về một giá trị hoặc khi bạn muốn tạo . .

Việc sử dụng chức năng được lưu trữ trong SQL là gì?

Hàm được lưu trữ là một tập hợp các câu lệnh SQL thực hiện một số thao tác và trả về một giá trị duy nhất . Giống như chức năng dựng sẵn của Mysql, nó có thể được gọi từ bên trong câu lệnh Mysql. Theo mặc định, chức năng được lưu trữ được liên kết với cơ sở dữ liệu mặc định.

Tại sao bạn lại sử dụng các chức năng được lưu trữ trong MySQL MCQ?

Chúng có thể được sử dụng để thực hiện các phép tính hoặc tạo ra các tập kết quả được trả lại cho khách hàng .

Tại sao chúng ta sử dụng thủ tục lưu trữ thay vì chức năng?

Các hàm không thể sửa đổi bất kỳ thứ gì và phải có ít nhất một tham số. Họ cũng phải trả lại một kết quả. Các thủ tục được lưu trữ không cần tham số, có thể sửa đổi các đối tượng cơ sở dữ liệu và không phải trả về kết quả. Các thủ tục lưu trữ được sử dụng để kết nối các truy vấn SQL trong một giao dịch và để giao tiếp với thế giới bên ngoài .