前言
? ? ? ? "<數據庫原理及應用>(MySQL版)".以下稱為"本書"中3.1.2節內容
引入
? ? ? ? 數據庫常用系統函數的分析.上一篇帖子分析了,數據庫函數需要看看能否被C語言函數替代
1.字符串函數
1)計算字符串字符數的函數和字符串長度的函數
語法:
? ? ? ? CHAR_LENGTH(str);? ? ? ? //計算字符個數
? ? ? ? LENGTH(str);? ? ? ? ? ? ? ? ? ? //返回字符串字節長度
代碼如下(相比起例3-10有一點修改)
SET @name='china';
SELECT CHAR_LENGTH(@name) 字符數,LENGTH(@name) 字符長度;
運行結果
實用性分析:C語言中有計算字符串長度的函數(沒有自己寫一個也行,問題不大)
2)合并字符串函數
語法:
? ? ? ? CONCAT(str1,str2....);? ? ? ? //返回連接參數產生的字符串,如果有NULL,返回NULL
代碼如下
SELECT CONCAT('MySQL版本:',@@version) 版本信息;
運行結果
實用性分析:C語言中有strcat函數處理字符串連接(兩個函數名都有cat).
3)字符串大小寫轉換函數
在C語言中也有大小寫轉換函數.
????????試想他的應用場景:如果數據庫中已確定所有該字段的符號是大寫或者小寫,那么可以在傳入的時候先行用C語言函數處理,這種情況下可以不看這個函數,因為在傳入之前可以先處理.同理如果返回值全部大寫或小寫,也可以用C語言處理.
4)刪除空格函數
=============================內容分割線↓===================================
以下代碼有問題待查
筆者嘗試給出幾個刪除空格函數的C語言定義
1.刪除前導空格
/*刪除前導空格*/
char* remove_leading_spaces(char* original){char *tmp=original;while(*tmp=" "){ tmp++;original++;}while(*tmp!='\0')*tmp++=*original++;*tmp='\0';return tmp;
}
2.刪除尾部空格
/*刪除尾部空格*/
char* remove_trailing_spaces(char* original){char *tmp=original;int length=0;while(*tmp!='\0'){length++;tmp++;}while(*tmp=' '){tmp--;length--;}for(int i=0;i<length;i++)*tmp++=*original++; return tmp;
}
不知道什么原因,編譯通過了顯示結果有問題,所以待查.
以此也說明學了的東西要經常看和使用,不然會生疏.
=============================內容分割線↑===================================
3.刪除前導和尾部空格
? ? ? ? 調用函數1和2即可.
說明:刪除空格的應用場景和上面一樣,基本上可以不用.
5)取子串函數
本書P76例3-14的改寫命令需注意
2.數學函數
包括取絕對值等函數在里面,按照原則來說,用外層宿主語言來處理更好,所以沒有什么必要看
3.日期和時間函數
????????在C語言標準庫里有個time.h的頭文件,里邊也有類似處理系統時間的函數,雖然用得不多(可能有的人都沒聽說過),但確實可以替代數據庫的日期和時間函數.
4.系統信息函數
? ? ? ? 這些函數由于和MySQL數據庫有關,所以在必要的情況下使用.
嵌套SQL的程序模型
? ? ? ? 在高級語言如C/C++中,使用的是"數據類型(數據結構)+函數定義"建立文件,主程序調用文件里的函數---這一整體思路來編寫程序.現在多了數據庫的操作.而操作數據庫的語言SQL有個特點:就一個執行語句.如何將高級語言的程序思路繼續放到引入數據的程序中呢?
? ? ? ? 外層函數傳入參數給語句,語句封裝SQL函數(或過程).數據返回到宿主語言的某個數據類型中.
? ? ? ? 如圖所示:
????????? ??????
? ? ? ? 從根本上講,SQL是要取得數據庫的數據,至于取得的數據由SQL語言處理,還是交給宿主語言處理,這是數據庫設計者決定的.筆者個人看法是所有的數據處理都由宿主語言處理.因為數據庫要考慮多人使用,盡可能占用最小的空間,最大可能提高交互的速度,筆者想到的原因很簡單:如果定義了數據庫函數,豈不是會讓數據庫的性能下降?---當然也僅屬于個人看法.
小結
? ? ? ? 數據庫常用系統函數的分析,嵌套SQL的程序模型分析