1. 程式人生 > SQL入門教學 >35 SQL 函式

35 SQL 函式

1. 定義

解釋:函式可以把經常使用的程式碼封裝起來,以便需要的時候直接呼叫。

本小節,我們將一起學習 SQL 函式。

2. 前言

我們在學習程式語言時候,也會遇到函式,在 SQL 中也是如此,如果你熟悉 Python 或者其它語言,那麼一定使用過print這個內建函式。SQL 為了給開發者提供便利,也提供了一系例的內建函式,它們大致可分為算術函式字串函式日期函式轉換函式聚合函式五大類。

SQL 除了提供好用的內建函式外,還可以通過 Create 指令來新建一個自定義函式。在這個小節中,我們會簡單的介紹自定義函式的建立和使用,而內建函式我們將在後面的幾個小節中詳細介紹。

本小節測試資料如下,請先在資料庫中執行:

DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
  id int PRIMARY KEY,
  username varchar(20),
  age int
);
INSERT INTO imooc_user(id,username,age)
VALUES (1,'peter',18),(2,'pedro',24),(3,'jerry',22),(4,'mike',18),(5,'tom',20);

3. 語法

SQL 函式是一組 SQL 語句的封裝,因此它的建立是頗為複雜的,大致的步驟可概括為如下幾步:

  1. 通過CREATE FUNCTION [function_name]
    來宣告一個函式。如:CREATE FUNCTION getUsername;
  2. 在函式名中通過變數宣告函式引數,如getUsername(uid int),並通過returns指定返回值型別,如 returns varchar,表示函式返回字串型別;
  3. 通過BEGIN開始函式體,並通過END來結束函式體;
  4. 若在函式體內使用了變數,需通過DECLARE來宣告變數,如 DECLARE uname varchar(20);
  5. 在函式體內使用 SQL 語句得到結果,並通過RETURN指定返回值。

我們通過上述步驟新建一個 getUsername 函式,該函式通過使用者 id 獲取使用者名稱。

CREATE FUNCTION
getUsername(uid int) RETURNS varchar(20) BEGIN DECLARE uname varchar(20); SELECT username FROM imooc_user WHERE id = uid INTO uname; RETURN uname; END;

在 getUsername 函式體中,若要給 uname 這樣的區域性變數賦值,需要使用INTO關鍵字。函式建立完畢後,通過 Select 來呼叫,如SELECT getUsername(1)

結果如下:

# SELECT getUsername(1);
+----------------+
| getUsername(1) |
+----------------+
| pedro          |
+----------------+

4. 實踐

4.1 例1 獲得最大年齡

請書寫 SQL 語句,新建一個getOldestAge函式,該函式獲得imooc_user中使用者的最大年齡。

分析:

按照上面步驟新建函式 getOldestAge,且該函式無參,但返回型別為 int ,最大年齡我們可以先使用 Order By 對其排序,然後通過Limit 取第一位使用者,則可得到最大的年齡。

語句:

整理可得語句如下:

CREATE FUNCTION getOldestAge() RETURNS int
BEGIN
	RETURN (SELECT age FROM imooc_user ORDER BY age DESC LIMIT 1);
END;

建立該函式後,使用 Select 來呼叫:

SELECT getOldestAge();

結果如下:

+----------------+
| getOldestAge() |
+----------------+
| 23             |
+----------------+

5. 小結

SQL 自定義函式是十分複雜的一環,難學且使用少,我們不推薦你在自定義函式上死磕。在這個小節裡,我們沒有介紹 PostgreSQL 自定義函式的使用,因為在 PostgreSQL 中,自定義函式更加複雜。在市面上,我們很少看到書籍和資料會花大量篇幅在自定義函式上,但是如果你感興趣,我們可以給你推薦幾個連結。

Postgresql之自定義函式

MySQL 自定函式

  • 在查詢的時候,尤其是在 Where 的條件中慎用函式,它會導致查詢不走索引,從而拉低查詢的速度。
  • 自定義函式用的非常少,因為它的移植性很差,取得的效果也不明顯。