dosbox 伪指令dd为什么会报错_什么是SQL函数?为什么使用SQL函数可能会带来问题?...
函數(shù)在計算機語言的使用中貫穿始終,在 SQL 中我們也可以使用函數(shù)對檢索出來的數(shù)據(jù)進行函數(shù)操作,比如求某列數(shù)據(jù)的平均值,或者求字符串的長度等。從函數(shù)定義的角度出發(fā),我們可以將函數(shù)分成內(nèi)置函數(shù)和自定義函數(shù)。在 SQL 語言中,同樣也包括了內(nèi)置函數(shù)和自定義函數(shù)。內(nèi)置函數(shù)是系統(tǒng)內(nèi)置的通用函數(shù),而自定義函數(shù)是我們根據(jù)自己的需要編寫的,下面講解的是 SQL 的內(nèi)置函數(shù)。
你需要從以下幾個方面掌握 SQL 函數(shù):
一、什么是SQL函數(shù)
當我們學(xué)習(xí)編程語言的時候,也會遇到函數(shù)。函數(shù)的作用是什么呢?它可以把我們經(jīng)常使用的代碼封裝起來,需要的時候直接調(diào)用即可。這樣既提高了代碼效率,又提高了可維護性。
SQL 中的函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,可以很方便地轉(zhuǎn)換和處理數(shù)據(jù)。一般來說,當我們從數(shù)據(jù)表中檢索出數(shù)據(jù)之后,就可以進一步對這些數(shù)據(jù)進行操作,得到更有意義的結(jié)果,比如返回指定條件的函數(shù),或者求某個字段的平均值等。
二、常用的SQL函數(shù)有哪些
SQL 提供了一些常用的內(nèi)置函數(shù),當然你也可以自己定義 SQL 函數(shù)。SQL 的內(nèi)置函數(shù)對于不同的數(shù)據(jù)庫軟件來說具有一定的通用性,我們可以把內(nèi)置函數(shù)分成四類:
這 4 類函數(shù)分別代表了算術(shù)處理、字符串處理、日期處理、數(shù)據(jù)類型轉(zhuǎn)換,它們是 SQL 函數(shù)常用的劃分形式,你可以思考下,為什么是這 4 個維度?
函數(shù)是對提取出來的數(shù)據(jù)進行操作,那么數(shù)據(jù)表中字段類型的定義有哪幾種呢?
我們經(jīng)常會保存一些數(shù)值,不論是整數(shù)類型,還是浮點類型,實際上對應(yīng)的就是數(shù)值類型。同樣我們也會保存一些文本內(nèi)容,可能是人名,也可能是某個說明,對應(yīng)的就是字符串類型。此外我們還需要保存時間,也就是日期類型。那么針對數(shù)值、字符串和日期類型的數(shù)據(jù),我們可以對它們分別進行算術(shù)函數(shù)、字符串函數(shù)以及日期函數(shù)的操作。如果想要完成不同類型數(shù)據(jù)之間的轉(zhuǎn)換,就可以使用轉(zhuǎn)換函數(shù)。
三、算術(shù)函數(shù)
算術(shù)函數(shù),顧名思義就是對數(shù)值類型的字段進行算術(shù)運算。常用的算術(shù)函數(shù)及含義如下表所示:
這里我舉一些簡單的例子,你來體會下:
SELECT ABS(-2),運行結(jié)果為 2。 SELECT MOD(101,3),運行結(jié)果 2。 SELECT ROUND(37.25,1),運行結(jié)果 37.3。四、字符串函數(shù)
常用的字符串函數(shù)操作包括了字符串拼接,大小寫轉(zhuǎn)換,求長度以及字符串替換和截取等。具體的函數(shù)名稱及含義如下表所示:
這里同樣有一些簡單的例子,你可以自己運行下:
SELECT CONCAT('abc', 123),運行結(jié)果為 abc123。 SELECT LENGTH('你好'),運行結(jié)果為 6。 SELECT CHAR_LENGTH('你好'),運行結(jié)果為 2。 SELECT LOWER('ABC'),運行結(jié)果為 abc。 SELECT UPPER('abc'),運行結(jié)果 ABC。 SELECT REPLACE('fabcd', 'abc', 123),運行結(jié)果為 f123d。 SELECT SUBSTRING('fabcd', 1,3),運行結(jié)果為 fab。五、日期函數(shù)
日期函數(shù)是對數(shù)據(jù)表中的日期進行處理,常用的函數(shù)包括:
下面是一些簡單的例子,你可自己運行下:
SELECT CURRENT_DATE(),運行結(jié)果為 2019-04-03。 SELECT CURRENT_TIME(),運行結(jié)果為 21:26:34。 SELECT CURRENT_TIMESTAMP(),運行結(jié)果為 2019-04-03 21:26:34。 SELECT EXTRACT(YEAR FROM '2019-04-03'),運行結(jié)果為 2019。 SELECT DATE('2019-04-01 12:00:05'),運行結(jié)果為 2019-04-01。這里需要注意的是,DATE 日期格式必須是 yyyy-mm-dd 的形式。如果要進行日期比較,就要使用 DATE 函數(shù),不要直接使用日期與字符串進行比較,我會在后面的例子中講具體的原因。
六、轉(zhuǎn)換函數(shù)
轉(zhuǎn)換函數(shù)可以轉(zhuǎn)換數(shù)據(jù)之間的類型,常用的函數(shù)如下表所示:
這兩個函數(shù)不像其他函數(shù),看一眼函數(shù)名就知道代表什么、如何使用。下面舉了這兩個函數(shù)的例子,你需要自己運行下:
SELECT CAST(123.123 AS INT),運行結(jié)果會報錯。 SELECT CAST(123.123 AS DECIMAL(8,2)),運行結(jié)果為 123.12。 SELECT COALESCE(null,1,2),運行結(jié)果為 1。CAST 函數(shù)在轉(zhuǎn)換數(shù)據(jù)類型的時候,不會四舍五入,如果原數(shù)值有小數(shù),那么轉(zhuǎn)換為整數(shù)類型的時候就會報錯。不過你可以指定轉(zhuǎn)化的小數(shù)類型,在 MySQL 和 SQL Server 中,你可以用DECIMAL(a,b)來指定,其中 a 代表整數(shù)部分和小數(shù)部分加起來最大的位數(shù),b 代表小數(shù)位數(shù),比如DECIMAL(8,2)代表的是精度為 8 位(整數(shù)加小數(shù)位數(shù)最多為 8 位),小數(shù)位數(shù)為 2 位的數(shù)據(jù)類型。所以SELECT CAST(123.123 AS DECIMAL(8,2))的轉(zhuǎn)換結(jié)果為 123.12。
七、用SQL函數(shù)對王者榮耀英雄數(shù)據(jù)做處理
我創(chuàng)建了一個王者榮耀英雄數(shù)據(jù)庫,一共有 69 個英雄,23 個屬性值。
我們現(xiàn)在把這個文件導(dǎo)入到 MySQL 中,你可以使用 Navicat 可視化數(shù)據(jù)庫管理工具將.sql文件導(dǎo)入到數(shù)據(jù)庫中。數(shù)據(jù)表為 heros,然后使用今天學(xué)習(xí)的 SQL 函數(shù),對這個英雄數(shù)據(jù)表進行處理。
首先顯示英雄以及他的物攻成長,對應(yīng)字段為attack_growth。我們讓這個字段精確到小數(shù)點后一位,需要使用的是算術(shù)函數(shù)里的 ROUND 函數(shù)。
SQL:SELECT name, ROUND(attack_growth,1) FROM heros代碼中,ROUND(attack_growth,1)中的attack_growth代表想要處理的數(shù)據(jù),“1”代表四舍五入的位數(shù),也就是我們這里需要精確到的位數(shù)。
運行結(jié)果為:
假設(shè)我們想顯示英雄最大生命值的最大值,就需要用到 MAX 函數(shù)。在數(shù)據(jù)中,“最大生命值”對應(yīng)的列數(shù)為hp_max,在代碼中的格式為MAX(hp_max)。
SQL:SELECT MAX(hp_max) FROM heros運行結(jié)果為 9328。
假如我們想要知道最大生命值最大的是哪個英雄,以及對應(yīng)的數(shù)值,就需要分成兩個步驟來處理:首先找到英雄的最大生命值的最大值,即SELECT MAX(hp_max) FROM heros,然后再篩選最大生命值等于這個最大值的英雄,如下所示。
SQL:SELECT name, hp_max FROM heros WHERE hp_max = (SELECT MAX(hp_max) FROM heros)運行結(jié)果:
假如我們想顯示英雄的名字,以及他們的名字字數(shù),需要用到CHAR_LENGTH函數(shù)。
SQL:SELECT CHAR_LENGTH(name), name FROM heros運行結(jié)果為:
假如想要提取英雄上線日期(對應(yīng)字段 birthdate)的年份,只顯示有上線日期的英雄即可(有些英雄沒有上線日期的數(shù)據(jù),不需要顯示),這里我們需要使用 EXTRACT 函數(shù),提取某一個時間元素。所以我們需要篩選上線日期不為空的英雄,即WHERE birthdate isnot null,然后再顯示他們的名字和上線日期的年份,即:
SQL:SELECT name, EXTRACT(YEAR FROM birthdate) AS birthdate FROM heros WHERE birthdate或者使用如下形式:
SQL: SELECT name, YEAR(birthdate) AS birthdate FROM heros WHERE birthdate is NOT NULL運行結(jié)果為:
假設(shè)我們需要找出在 2016 年 10 月 1 日之后上線的所有英雄。這里我們可以采用 DATE函數(shù)來判斷 birthdate 的日期是否大于 2016-10-01,即WHEREDATE(birthdate)>'2016-10-01',然后再顯示符合要求的全部字段信息,即:
SQL:SELECT * FROM heros WHERE DATE(birthdate)>'2016-10-01'需要注意的是下面這種寫法是不安全的:
SELECT * FROM heros WHERE birthdate>'2016-10-01'因為很多時候你無法確認 birthdate 的數(shù)據(jù)類型是字符串,還是 datetime 類型,如果你想對日期部分進行比較,那么使用DATE(birthdate)來進行比較是更安全的。
運行結(jié)果為:
假設(shè)我們需要知道在 2016 年 10 月 1 日之后上線英雄的平均最大生命值、平均最大法力和最高物攻最大值。同樣我們需要先篩選日期條件,即WHERE DATE(birthdate)>'2016-10-01',然后再選擇AVG(hp_max), AVG(mp_max), MAX(attack_max)字段進行顯示。
SQL:SELECT AVG(hp_max), AVG(mp_max), MAX(attack_max) FROM heros WHERE DATE(birthdate)>運行結(jié)果為:
八、為什么使用SQL函數(shù)會帶來問題
盡管 SQL 函數(shù)使用起來會很方便,但我們使用的時候還是要謹慎,因為你使用的函數(shù)很可能在運行環(huán)境中無法工作,這是為什么呢?
如果你學(xué)習(xí)過編程語言,就會知道語言是有不同版本的。我們在使用 SQL 語言的時候,不是直接和這門語言打交道,而是通過它使用不同的數(shù)據(jù)庫軟件,即 DBMS。DBMS之間的差異性很大,遠大于同一個語言不同版本之間的差異。實際上,只有很少的函數(shù)是被DBMS 同時支持的。比如,大多數(shù) DBMS 使用(||)或者(+)來做拼接符,而在 MySQL中的字符串拼接函數(shù)為Concat()。大部分 DBMS 會有自己特定的函數(shù),這就意味著采用SQL 函數(shù)的代碼可移植性是很差的,因此在使用函數(shù)的時候需要特別注意。
九、關(guān)于大小寫的規(guī)范
細心的人可能會發(fā)現(xiàn),我在寫 SELECT 語句的時候用的是大寫,而你在網(wǎng)上很多地方,包括你自己寫的時候可能用的是小寫。實際上在 SQL 中,關(guān)鍵字和函數(shù)名是不用區(qū)分字母大小寫的,比如 SELECT、WHERE、ORDER、GROUP BY 等關(guān)鍵字,以及 ABS、MOD、ROUND、MAX 等函數(shù)名。
不過在 SQL 中,你還是要確定大小寫的規(guī)范,因為在 Linux 和 Windows 環(huán)境下,你可能會遇到不同的大小寫問題。
比如 MySQL 在 Linux 的環(huán)境下,數(shù)據(jù)庫名、表名、變量名是嚴格區(qū)分大小寫的,而字段名是忽略大小寫的。
而 MySQL 在 Windows 的環(huán)境下全部不區(qū)分大小寫。
這就意味著如果你的變量名命名規(guī)范沒有統(tǒng)一,就可能產(chǎn)生錯誤。這里有一個有關(guān)命名規(guī)范的建議:
雖然關(guān)鍵字和函數(shù)名稱在 SQL 中不區(qū)分大小寫,也就是如果小寫的話同樣可以執(zhí)行,但是數(shù)據(jù)庫名、表名和字段名在 Linux MySQL 環(huán)境下是區(qū)分大小寫的,因此建議你統(tǒng)一這些字段的命名規(guī)則,比如全部采用小寫的方式。同時將關(guān)鍵詞和函數(shù)名稱全部大寫,以便于區(qū)分數(shù)據(jù)庫名、表名、字段名。
十、總結(jié)
函數(shù)對于一門語言的重要性毋庸置疑,我們在寫Java代碼的時候,會自己編寫函數(shù),也會使用Java內(nèi)置的函數(shù)。在 SQL 中,使用函數(shù)的時候需要格外留意。不過如果工程量不大,使用的是同一個 DBMS 的話,還是可以使用函數(shù)簡化操作的,這樣也能提高代碼效率。只是在系統(tǒng)集成,或者在多個 DBMS 同時存在的情況下,使用函數(shù)的時候就需要慎重一些。
比如CONCAT()是字符串拼接函數(shù),在 MySQL 和 Oracle 中都有這個函數(shù),但是在這兩個DBMS 中作用卻不一樣,CONCAT函數(shù)在 MySQL 中可以連接多個字符串,而在 Oracle 中CONCAT函數(shù)只能連接兩個字符串,如果要連接多個字符串就需要用(||)連字符來解決。
講完了 SQL 函數(shù)的使用,我們來做一道練習(xí)題。還是根據(jù)王者榮耀英雄數(shù)據(jù)表,請你使用SQL 函數(shù)作如下的練習(xí):計算英雄的最大生命平均值;顯示出所有在 2017 年之前上線的英雄,如果英雄沒有統(tǒng)計上線日期則不顯示。
總結(jié)
以上是生活随笔為你收集整理的dosbox 伪指令dd为什么会报错_什么是SQL函数?为什么使用SQL函数可能会带来问题?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫基地停车最新收费标准
- 下一篇: Redis基础