第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

SQL 函數(shù)

1. 定義

慕課解釋?zhuān)?code>函數(shù)可以把經(jīng)常使用的代碼封裝起來(lái),以便需要的時(shí)候直接調(diào)用。

本小節(jié),我們將一起學(xué)習(xí) SQL 函數(shù)。

2. 前言

我們?cè)趯W(xué)習(xí)編程語(yǔ)言時(shí)候,也會(huì)遇到函數(shù),在 SQL 中也是如此,如果你熟悉 Python 或者其它語(yǔ)言,那么一定使用過(guò)print這個(gè)內(nèi)置函數(shù)。SQL 為了給開(kāi)發(fā)者提供便利,也提供了一系例的內(nèi)置函數(shù),它們大致可分為算術(shù)函數(shù)、字符串函數(shù)、日期函數(shù)轉(zhuǎn)換函數(shù)聚合函數(shù)五大類(lèi)。

SQL 除了提供好用的內(nèi)置函數(shù)外,還可以通過(guò) Create 指令來(lái)新建一個(gè)自定義函數(shù)。在這個(gè)小節(jié)中,我們會(huì)簡(jiǎn)單的介紹自定義函數(shù)的創(chuàng)建和使用,而內(nèi)置函數(shù)我們將在后面的幾個(gè)小節(jié)中詳細(xì)介紹。

本小節(jié)測(cè)試數(shù)據(jù)如下,請(qǐng)先在數(shù)據(jù)庫(kù)中執(zhí)行:

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. 語(yǔ)法

SQL 函數(shù)是一組 SQL 語(yǔ)句的封裝,因此它的創(chuàng)建是頗為復(fù)雜的,大致的步驟可概括為如下幾步:

  1. 通過(guò)CREATE FUNCTION [function_name]來(lái)聲明一個(gè)函數(shù)。如:CREATE FUNCTION getUsername;
  2. 在函數(shù)名中通過(guò)變量聲明函數(shù)參數(shù),如getUsername(uid int),并通過(guò)returns指定返回值類(lèi)型,如 returns varchar,表示函數(shù)返回字符串類(lèi)型;
  3. 通過(guò)BEGIN開(kāi)始函數(shù)體,并通過(guò)END來(lái)結(jié)束函數(shù)體;
  4. 若在函數(shù)體內(nèi)使用了變量,需通過(guò)DECLARE來(lái)聲明變量,如 DECLARE uname varchar(20);
  5. 在函數(shù)體內(nèi)使用 SQL 語(yǔ)句得到結(jié)果,并通過(guò)RETURN指定返回值。

我們通過(guò)上述步驟新建一個(gè) getUsername 函數(shù),該函數(shù)通過(guò)用戶(hù) id 獲取用戶(hù)名。

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 函數(shù)體中,若要給 uname 這樣的局部變量賦值,需要使用INTO關(guān)鍵字。函數(shù)創(chuàng)建完畢后,通過(guò) Select 來(lái)調(diào)用,如SELECT getUsername(1)。

結(jié)果如下:

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

4. 實(shí)踐

4.1 例1 獲得最大年齡

請(qǐng)書(shū)寫(xiě) SQL 語(yǔ)句,新建一個(gè)getOldestAge函數(shù),該函數(shù)獲得imooc_user中用戶(hù)的最大年齡。

分析:

按照上面步驟新建函數(shù) getOldestAge,且該函數(shù)無(wú)參,但返回類(lèi)型為 int ,最大年齡我們可以先使用 Order By 對(duì)其排序,然后通過(guò)Limit 取第一位用戶(hù),則可得到最大的年齡。

語(yǔ)句:

整理可得語(yǔ)句如下:

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

創(chuàng)建該函數(shù)后,使用 Select 來(lái)調(diào)用:

SELECT getOldestAge();

結(jié)果如下:

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

5. 小結(jié)

SQL 自定義函數(shù)是十分復(fù)雜的一環(huán),難學(xué)且使用少,我們不推薦你在自定義函數(shù)上死磕。在這個(gè)小節(jié)里,我們沒(méi)有介紹 PostgreSQL 自定義函數(shù)的使用,因?yàn)樵?PostgreSQL 中,自定義函數(shù)更加復(fù)雜。在市面上,我們很少看到書(shū)籍和資料會(huì)花大量篇幅在自定義函數(shù)上,但是如果你感興趣,我們可以給你推薦幾個(gè)鏈接。

  • 在查詢(xún)的時(shí)候,尤其是在 Where 的條件中慎用函數(shù),它會(huì)導(dǎo)致查詢(xún)不走索引,從而拉低查詢(xún)的速度。
  • 自定義函數(shù)用的非常少,因?yàn)樗囊浦残院懿睿〉玫男Ч膊幻黠@。