mysql學習【第4篇】:MySQL函數和編程

来源:https://www.cnblogs.com/hellokuangshen/archive/2019/01/15/10261657.html
-Advertisement-
Play Games

狂神聲明 : 文章均為自己的學習筆記 , 轉載一定註明出處 ; 編輯不易 , 防君子不防小人~共勉 ! 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。 

-- 賦值
    使用 setselect 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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 系統組成 版本XX.XX.XX XX主版本,XX副版本(奇數為測試版,偶數為穩定版),修訂版本號 , 表示修改的次數(debug) linux主流分支 硬碟分區 /dev/hda5 硬體設備所在分區 hd 表示IDE設備,sd表示SCSI設備 硬碟的順序號,以字母abcd...... 分區的順序號1 ...
  • 在tomcat下部署項目,第一次訪問成功。但是發現有一個頁面沒有成功載入,發現是部署時少了一些東西。也不想去找出具體少了什麼,直接把原來的項目移除,重新載入項目。重啟tomcat,這時驚喜來了。 重啟完tomcat,用瀏覽器訪問https://XXXXXXX:8443。結果是訪問請求被拒絕。 先看防 ...
  • 查看系統中shell的類型 cat /etc/shells 切換用戶使用的shell chsh s /bin/bash username sudo usermod s ...
  • 一、增加數據 普通的插入 查詢出來的數據可以作為數據添加到列表中 二、刪除數據 刪除部分數據 刪除表中全部的數據1,表的結構不變,但不刪除表的自增主鍵 刪除表中全部的數據2,表的結構不變。刪除表的自增主鍵 還有一種刪除表中全部內容的方法,它不像delete那樣還要逐條看看再刪,而是直接清空掉,可以聯 ...
  • SELECT a.tb_name 表空間名稱, c.contents 類型, c.extent_management 區管理, b.total / 1024 / 1024 表空間大小m, (b.total - a.free_sp) / 1024 / 1024 已使用m, a.free_sp / 10 ...
  • 如果你關註大數據科技動向,你對 NoSQL 一定不陌生,NoSQL 是一個分散式資料庫。在過去時間,數據存儲一直關係型資料庫天下,有著良好的控制併發操作、事務功能。雖然RDBMS很優秀,但是隨著時間的推移就出現了兩個關係資料庫解決不了的問題:快速增長的數據規模和日漸複雜的數據模型。結果,我們看到了 ...
  • SQL Server獲得排名或排序的函數有如下幾種: 1、Rank():在結果集中每一條記錄所在的排名位置,但排名可能不連續,例如:若同一組內有兩個第一名,則該組內下一個名次直接跳至第三名 select *,Rank() over (partition by modifieddate order b ...
  • 狂神聲明 : 文章均為自己的學習筆記 , 轉載一定註明出處 ; 編輯不易 , 防君子不防小人~共勉 ! mysql學習【第6篇】:許可權和資料庫設計 用戶和許可權管理 規範化資料庫設計 為什麼需要設計資料庫 ? 答:當資料庫比較複雜時我們需要設計資料庫 糟糕的資料庫設計 : 數據冗餘,存儲空間浪費 數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...