MYSQL----函數和編程

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