Mysql: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