07丨什麼是SQL函數?爲什麼使用SQL函數可能會帶來問題?

更多詳情:https://blog.csdn.net/william_n/article/details/100175645

1.學習簡記

1,函數在計算機語言的使用中貫穿始終,在 SQL 中我們也可以使用函數對檢索出來的數據進行函數操作,比如求某列數據的平均值,或者求字符串的長度等。

 

2.從函數定義的角度出發,我們可以將函數分成內置函數和自定義函數。

在 SQL 語言中,同樣也包括了內置函數和自定義函數。內置函數是系統內置的通用函數,而自定義函數是我們根據自己的需要編寫的,下面講解的是 SQL 的內置函數。

 

3.你需要從以下幾個方面掌握 SQL 函數:

什麼是 SQL 函數?
內置的 SQL 函數都包括哪些?
如何使用 SQL 函數對一個數據表進行操作,比如針對一個王者榮耀的英雄數據庫,我們可以使用這些函數完成哪些操作?
什麼情況下使用 SQL 函數?爲什麼使用 SQL 函數有時候會帶來問題?
什麼是 SQL 函數

 

當我們學習編程語言的時候,也會遇到函數。函數的作用是什麼呢?它可以把我們經常使用的代碼封裝起來,需要的時候直接調用即可。這樣既提高了代碼效率,又提高了可維護性。

SQL 中的函數一般是在數據上執行的,可以很方便地轉換和處理數據。

一般來說,當我們從數據表中檢索出數據之後 //建議再次溫習執行一條sql的過程,就可以進一步對這些數據進行操作,得到更有意義的結果,比如返回指定條件的函數,或者求某個字段的平均值等。

 

4.常用的 SQL 函數有哪些

SQL 提供了一些常用的內置函數,當然你也可以自己定義 SQL 函數。SQL 的內置函數對於不同的數據庫軟件來說具有一定的通用性,//但是其實很少,   如果你說都基本分爲這四類.是的

我們可以把內置函數分成四類:

算術函數
字符串函數
日期函數
轉換函數
這 4 類函數分別代表了算術處理、字符串處理、日期處理、數據類型轉換,它們是 SQL 函數常用的劃分形式,你可以思考下,爲什麼是這 4 個維度?

答案: 函數是對提取出來的數據進行操作,數據表中字段類型剛好是這四種/,詳細見下面解釋

 

[具體解釋:

我們經常會保存一些數值,不論是整數類型,還是浮點類型,實際上對應的就是數值類型。同樣我們也會保存一些文本內容,可能是人名,也可能是某個說明,對應的就是字符串類型。此外我們還需要保存時間,也就是日期類型。那麼針對數值、字符串和日期類型的數據,我們可以對它們分別進行算術函數、字符串函數以及日期函數的操作。如果想要完成不同類型數據之間的轉換,就可以使用轉換函數]

 

5.算術函數

算術函數,顧名思義就是對數值類型的字段進行算術運算。

 

字符串函數

常用的字符串函數操作包括了字符串拼接,大小寫轉換,求長度以及字符串替換和截取等.

 

日期函數

日期函數是對數據表中的日期進行處理

 

轉換函數

轉換函數可以轉換數據之間的類型,常用的函數如下表所示:

[轉換函數個人用的很少,所以這裏特別記下]

 

這兩個函數不像其他函數,看一眼函數名就知道代表什麼、如何使用。下面舉了這兩個函數的例子,你需要自己運行下:

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。

 

 

6.SQL

6.1 假如我們想要知道最大生命值最大的是哪個英雄,以及對應的數值

SQL:SELECT name, hp_max FROM heros WHERE hp_max = (SELECT MAX(hp_max) FROM heros); -- 這裏使用子查詢,外查詢的條件字段的字段值不需要指定內查詢中年字段的字段名,應該是mysql做了這方面的處理

6.2 假設我們需要知道在 2016 年 10 月 1 日之後上線英雄的平均最大生命值、平均最大法力和最高物攻最大值。

SQL: SELECT AVG(hp_max), AVG(mp_max), MAX(attack_max) FROM heros WHERE DATE(birthdate)>'2016-10-01'; -- 這三個聚合函數的結果是沒有什麼關係的

 

7.爲什麼使用 SQL 函數會帶來問題

儘管 SQL 函數使用起來會很方便,但我們使用的時候還是要謹慎,因爲你使用的函數很可能在運行環境中無法工作,這是爲什麼呢?

 

如果你學習過編程語言,就會知道語言是有不同版本的,比如 Python 會有 2.7 版本和 3.x 版本,不過它們之間的函數差異不大,也就在 10% 左右。但我們在使用 SQL 語言的時候,不是直接和這門語言打交道,而是通過它使用不同的數據庫軟件,即 DBMS。DBMS 之間的差異性很大,遠大於同一個語言不同版本之間的差異。實際上,只有很少的函數是被 DBMS 同時支持的。比如,大多數 DBMS 使用(||)或者(+)來做拼接符,而在 MySQL 中的字符串拼接函數爲Concat()。大部分 DBMS 會有自己特定的函數,這就意味着採用 SQL 函數的代碼可移植性是很差的,因此在使用函數的時候需要特別注意。

 

8.關於大小寫的規範 //因爲在 Linux 和 Windows 環境下,你可能會遇到不同的大小寫問題

比如 MySQL 在 Linux 的環境下,數據庫名、表名、變量名是嚴格區分大小寫的,而字段名是忽略大小寫的  //這個真不知道

而 MySQL 在 Windows 的環境下全部不區分大小寫

 

命名規範的建議:

關鍵字和函數名稱全部大寫;
數據庫名、表名、字段名稱全部小寫;
//而且建議使用
反引號[``]繼進行標識
SQL 語句必須以分號結尾。

 

9.總結

函數對於一門語言的重要性毋庸置疑,我們在寫 Python 代碼的時候,會自己編寫函數,也會使用 Python 內置的函數。在 SQL 中,使用函數的時候需要格外留意。不過如果工程量不大,使用的是同一個 DBMS 的話,還是可以使用函數簡化操作的,這樣也能提高代碼效率。只是在系統集成,或者在多個 DBMS 同時存在的情況下,使用函數的時候就需要慎重一些。

 

 

 

2.網友評論

[leslie]

關於SQL函數問題:老師應當漏了一個關鍵點吧;它會導致查詢不走索引,直接全表遍歷,導致慢查詢-這纔是最重要的問題。現實工作中一般是禁止where條件出現函數:看到了就讓開發代碼重寫。
評論 4

Ryoma
不是函數會導致不走索引,要看函數的位置。一般來說,出現在比較運算符右邊的依然可以運用索引  //TBD

 

[大隱-於市]
2019-07-04
切換數據庫的概率很低吧,工作了十年一直被教育不是使用內部函數,因爲增加更換數據庫的成本,不過一直沒見過哪個公司更換數據庫。即使是阿里的去ioe那本身也會增加很多開發成本,所有的sql都檢查。

 

 

後續補充...

3.應用場景

TBD

4.問題

1.性能上,使用SQL內置函數與在邏輯代碼中處理,哪個更好? 

TBD 

 

2.使用內置函數,導致索引不生效的情況是哪些?

TBD

5.推薦書籍/文檔

TBD

6.學習體會

TBD

7.參考

https://time.geekbang.org/column/article/103349 //極客時間-SQL必知必會-第07講

後續補充...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章