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