狂神聲明 : 文章均為自己的學習筆記 , 轉載一定註明出處 ; 編輯不易 , 防君子不防小人~共勉 ! mysql學習【第4篇】:MySQL函數 官方文檔 : 官方文檔 常用函數 分類: 數學函數 , 字元串函數 , 日期和時間函數 , 系統信息函數 聚合函數 mysql之自定義函數 什麼是函數: ...
狂神聲明 : 文章均為自己的學習筆記 , 轉載一定註明出處 ; 編輯不易 , 防君子不防小人~共勉 !
mysql學習【第4篇】:MySQL函數
官方文檔 : 官方文檔
常用函數
分類: 數學函數 , 字元串函數 , 日期和時間函數 , 系統信息函數
# 數學函數 (這裡只列出一些常用的) SELECT ABS(-8); /*絕對值*/ SELECT CEILING(9.4); /*向上取整*/ SELECT FLOOR(9.4); /*向下取整*/ SELECT RAND(); /*隨機數,返回一個0-1之間的隨機數*/ SELECT SIGN(0); /*符號函數: 負數返回-1,正數返回1,0返回0*/ #字元串函數 SELECT CHAR_LENGTH('狂神說堅持就能成功'); /*返回字元串包含的字元數*/ SELECT CONCAT('我','愛','程式'); /*合併字元串,參數可以有多個*/ SELECT INSERT('我愛編程helloworld',1,2,'超級熱愛'); /*替換字元串,從某個位置開始替換某個長度*/ SELECT LOWER('KuangShen'); /*小寫*/ SELECT UPPER('KuangShen'); /*大寫*/ SELECT LEFT('hello,world',5); /*從左邊截取*/ SELECT RIGHT('hello,world',5); /*從右邊截取*/ SELECT REPLACE('狂神說堅持就能成功','堅持','努力'); /*替換字元串*/ SELECT SUBSTR('狂神說堅持就能成功',4,6); /*截取字元串,開始和長度*/ SELECT REVERSE('狂神說堅持就能成功'); /*反轉*/ #日期和時間函數 SELECT CURRENT_DATE(); /*獲取當前日期*/ SELECT CURDATE(); /*獲取當前日期*/ SELECT NOW(); /*獲取當前日期和時間*/ SELECT LOCALTIME(); /*獲取當前日期和時間*/ SELECT SYSDATE(); /*獲取當前日期和時間*/ /*獲取年月日,時分秒*/ SELECT YEAR(NOW()); SELECT MONTH(NOW()); SELECT DAY(NOW()); SELECT HOUR(NOW()); SELECT MINUTE(NOW()); SELECT SECOND(NOW()); #系統信息函數 SELECT VERSION(); /*版本*/ SELECT USER(); /*用戶*/ # 查詢姓李的同學,改成立 SELECT REPLACE(studentname,'李','歷') AS 新名字 FROM student WHERE studentname LIKE '李%';
聚合函數
#聚合函數 /*COUNT:非空的*/ SELECT COUNT(studentname) FROM student; SELECT COUNT(*) FROM student; SELECT COUNT(1) FROM student; /*推薦*/ SELECT SUM(StudentResult) AS 總和 FROM result; SELECT AVG(StudentResult) AS 平均分 FROM result; SELECT MAX(StudentResult) AS 最高分 FROM result; SELECT MIN(StudentResult) AS 最低分 FROM result; # 查詢不同課程的平均分,最高分,最低分 # 前提:根據不同的課程進行分組 SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分 FROM result AS r INNER JOIN `subject` AS s ON r.subjectno = s.subjectno GROUP BY r.subjectno HAVING 平均分>80; /* where寫在group by前面. 要是放在分組後面的篩選 要使用HAVING.. */
mysql之自定義函數
什麼是函數:
函數存儲著一系列SQL語句,調用函數就是一次性執行這些語句。所以函數可以降低語句重覆。
但註意的是函數註重返回值,不註重執行過程,所以一些語句無法執行。所以函數並不是單純的SQL語句集合。
函數與存儲過程的區別:函數只會返回一個值,不允許返回一個結果集。函數強調返回值,所以函數不允許返回多個值的情況,即使是查詢語句。
函數的創建:
/*語法*/ create function 函數名([參數列表]) returns 數據類型 begin sql語句; return 值; end; /*參數列表的格式是: 變數名 數據類型*/ -- 最簡單的僅有一條sql的函數 create function myselect2() returns int return 666; select myselect2(); -- 調用函數 -- create function myselect3() returns int begin declare c int; select id from class where cname="python" into c; return c; end; select myselect3(); -- 帶傳參的函數 create function myselect5(name varchar(15)) returns int begin declare c int; select id from class where cname=name into c; return c; end; select myselect5("python");
補充:
還可以有一些特別的選項,特別的選項寫在RETURN 之後,BEGIN之前,如:
COMMENT:一個關於函數的描述
還有一些比如SQL SECURITY等選項,有興趣可以自行百度。這裡不講解,僅一提有此知識點。
SQL編程
/* SQL編程 */ ------------------ --// 局部變數 ---------- -- 變數聲明 declare var_name[,...] type [default value] 這個語句被用來聲明局部變數。要給變數提供一個預設值,請包含一個default子句。值可以被指定為一個表達式,不需要為一個常數。如果沒有default子句,初始值為null。 -- 賦值 使用 set 和 select into 語句為變數賦值。 - 註意:在函數內是可以使用全局變數(用戶自定義的變數) --// 全局變數 ---------- -- 定義、賦值 set 語句可以定義併為變數賦值。 set @var = value; 也可以使用select into語句為變數初始化並賦值。這樣要求select語句只能返回一行,但是可以是多個欄位,就意味著同時為多個變數進行賦值,變數的數量需要與查詢的列數一致。 還可以把賦值語句看作一個表達式,通過select執行完成。此時為了避免=被當作關係運算符看待,使用:=代替。(set語句可以使用= 和 :=)。 select @var:=20; select @v1:=id, @v2=name from t1 limit 1; select * from tbl_name where @var:=30; select into 可以將表中查詢獲得的數據賦給變數。 -| select max(height) into @max_height from tb; -- 自定義變數名 為了避免select語句中,用戶自定義的變數與系統標識符(通常是欄位名)衝突,用戶自定義變數在變數名前使用@作為開始符號。 @var=10; - 變數被定義後,在整個會話周期都有效(登錄到退出) --// 控制結構 ---------- -- if語句 if search_condition then statement_list [elseif search_condition then statement_list] ... [else statement_list] end if; -- case語句 CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END -- while迴圈 [begin_label:] while search_condition do statement_list end while [end_label]; - 如果需要在迴圈內提前終止 while迴圈,則需要使用標簽;標簽需要成對出現。 -- 退出迴圈 退出整個迴圈 leave 退出當前迴圈 iterate 通過退出的標簽決定退出哪個迴圈 --// 內置函數 ---------- -- 數值函數 abs(x) -- 絕對值 abs(-10.9) = 10 format(x, d) -- 格式化千分位數值 format(1234567.456, 2) = 1,234,567.46 ceil(x) -- 向上取整 ceil(10.1) = 11 floor(x) -- 向下取整 floor (10.1) = 10 round(x) -- 四捨五入去整 mod(m, n) -- m%n m mod n 求餘 10%3=1 pi() -- 獲得圓周率 pow(m, n) -- m^n sqrt(x) -- 算術平方根 rand() -- 隨機數 truncate(x, d) -- 截取d位小數 -- 時間日期函數 now(), current_timestamp(); -- 當前日期時間 current_date(); -- 當前日期 current_time(); -- 當前時間 date('yyyy-mm-dd hh:ii:ss'); -- 獲取日期部分 time('yyyy-mm-dd hh:ii:ss'); -- 獲取時間部分 date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化時間 unix_timestamp(); -- 獲得unix時間戳 from_unixtime(); -- 從時間戳獲得時間 -- 字元串函數 length(string) -- string長度,位元組 char_length(string) -- string的字元個數 substring(str, position [,length]) -- 從str的position開始,取length個字元 replace(str ,search_str ,replace_str) -- 在str中用replace_str替換search_str instr(string ,substring) -- 返回substring首次在string中出現的位置 concat(string [,...]) -- 連接字串 charset(str) -- 返回字串字元集 lcase(string) -- 轉換成小寫 left(string, length) -- 從string2中的左邊起取length個字元 load_file(file_name) -- 從文件讀取內容 locate(substring, string [,start_position]) -- 同instr,但可指定開始位置 lpad(string, length, pad) -- 重覆用pad加在string開頭,直到字串長度為length ltrim(string) -- 去除前端空格 repeat(string, count) -- 重覆count次 rpad(string, length, pad) --在str後用pad補充,直到長度為length rtrim(string) -- 去除後端空格 strcmp(string1 ,string2) -- 逐字元比較兩字串大小 -- 流程函數 case when [condition] then result [when [condition] then result ...] [else result] end 多分支 if(expr1,expr2,expr3) 雙分支。 -- 聚合函數 count() sum(); max(); min(); avg(); group_concat() -- 其他常用函數 md5(); default(); --// 存儲函數,自定義函數 ---------- -- 新建 CREATE FUNCTION function_name (參數列表) RETURNS 返回值類型 函數體 - 函數名,應該合法的標識符,並且不應該與已有的關鍵字衝突。 - 一個函數應該屬於某個資料庫,可以使用db_name.funciton_name的形式執行當前函數所屬資料庫,否則為當前資料庫。 - 參數部分,由"參數名"和"參數類型"組成。多個參數用逗號隔開。 - 函數體由多條可用的mysql語句,流程式控制制,變數聲明等語句構成。 - 多條語句應該使用 begin...end 語句塊包含。 - 一定要有 return 返回值語句。 -- 刪除 DROP FUNCTION [IF EXISTS] function_name; -- 查看 SHOW FUNCTION STATUS LIKE 'partten' SHOW CREATE FUNCTION function_name; -- 修改 ALTER FUNCTION function_name 函數選項 --// 存儲過程,自定義功能 ---------- -- 定義 存儲存儲過程 是一段代碼(過程),存儲在資料庫中的sql組成。 一個存儲過程通常用於完成一段業務邏輯,例如報名,交班費,訂單入庫等。 而一個函數通常專註與某個功能,視為其他程式服務的,需要在其他語句中調用函數才可以,而存儲過程不能被其他調用,是自己執行 通過call執行。 -- 創建 CREATE PROCEDURE sp_name (參數列表) 過程體 參數列表:不同於函數的參數列表,需要指明參數類型 IN,表示輸入型 OUT,表示輸出型 INOUT,表示混合型 註意,沒有返回值。 /* 存儲過程 */ ------------------ 存儲過程是一段可執行性代碼的集合。相比函數,更偏向於業務邏輯。 調用:CALL 過程名 -- 註意 - 沒有返回值。 - 只能單獨調用,不可夾雜在其他語句中 -- 參數 IN|OUT|INOUT 參數名 數據類型 IN 輸入:在調用過程中,將數據輸入到過程體內部的參數 OUT 輸出:在調用過程中,將過程體處理完的結果返回到客戶端 INOUT 輸入輸出:既可輸入,也可輸出 -- 語法 CREATE PROCEDURE 過程名 (參數列表) BEGIN 過程體 END