1. 程式人生 > >MySQL基礎篇(03):系統和自定義函式總結,觸發器使用詳解

MySQL基礎篇(03):系統和自定義函式總結,觸發器使用詳解

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、系統封裝函式

MySQL 有很多內建的函式,可以快速解決開發中的一些業務需求,大概包括流程控制函式,數值型函式、字串型函式、日期時間函式、聚合函式等。以下列出了這些分類中常用的函式。

1、控制流程函式

  • case...when

根據值判斷返回值,類比程式設計中的IF-ELSE判斷。

-- DEMO 01
SELECT CASE DATE_FORMAT(NOW(),'%Y-%m-%d') 
    WHEN '2019-12-29' THEN 'today' 
    WHEN '2019-12-28' THEN 'yesterday' 
    WHEN '2019-12-30' THEN 'tommor' 
    ELSE 'Unknow' END;
-- DEMO 02
SELECT (CASE WHEN 1>0 THEN 'true' ELSE 'false' END) AS result;
  • if(expr1,expr2,expr3)

如果表示式 expr1 是TRUE,則 IF()的返回值為expr2; 否則返回值則為 expr3。

SELECT IF(1>2,'1>2','1<2') AS result ; 
SELECT IF(1<2,'yes ','no') AS result ;
SELECT IF(STRCMP('test','test'),'no','yes');
  • ifnull(expr1,expr2)

如果表示式 expr1不為NULL,則返回值為expr1;否則返回值為 expr2。

SELECT IFNULL(NULL,'cicada');
SELECT IFNULL(1/1,'no');

2、常用字串函式

  • CHAR_LENGTH()

返回值為字串的長度 。

SELECT CHAR_LENGTH(' c i c ') ;-- 包含空格
SELECT LENGTH(' S q l ') ;
  • CONCAT(str1...)

拼接串聯字串。

SELECT CONCAT('My', 'S', 'ql');
SELECT CONCAT('My', NULL, 'QL'); -- 包含Null 則返回Null
SELECT CONCAT("%", "Java", "%"); -- mybatis中拼接模糊查詢
  • ELT(N,str1,str2,...)

若N = 1,則返回值為 str1 ,若N = 2,則返回值為 str2 ,以此類推,可以用來轉換返回頁面的狀態。

SELECT ELT(1,'提交','稽核中','規則通過') ;
SELECT ELT(2,'提交','稽核中','規則通過') ;
  • FORMAT(X,D)

格式化數字型別。

SELECT FORMAT(3.1455,2) ; -- 四捨五入保留兩位
SELECT TRUNCATE(3.1455,2) ; -- 直接擷取兩位
  • TRIM(str)

清空字串空格。

SELECT LTRIM('  hel l o ') ;-- 清空左邊
SELECT RTRIM('  hel l o ') ;-- 清空右邊
SELECT TRIM('  hel l o ') ; -- 清空兩邊
SELECT REPLACE('M y S Q L',' ','') ; -- 替換掉全部空格

3、數值函式

  • FLOOR(X)

返回不大於X的最大整數值 。

SELECT FLOOR(1.23); -- 1
SELECT FLOOR(-1.23); -- -2
  • MOD(N,M)

模操作。返回N 被 M除後的餘數。

SELECT MOD(29,9); -- 2
SELECT 29 MOD 9; -- 2
  • RAND() RAND(N)

返回一個隨機浮點值,範圍在0到1之間。若已指定一個整數引數 N ,則它被用作種子值,用來產生重複序列。

SELECT RAND(); -- 0.923
SELECT RAND(20) = RAND(20) ; -- TRUE

4、時間日期函式

  • ADDDATE(date,INTERVAL expr type)

給指定日期,以指定型別進行運算。

SELECT DATE_ADD('2019-12-29', INTERVAL 3 DAY); -- 2020-01-01
  • CURDATE()

將當前日期按照'YYYY-MM-DD' 或YYYYMMDD 格式的值返回,具體格式根據函式用在字串或是數字語境中而定。

SELECT CURDATE(); -- '2019-12-29' 字串
SELECT CURDATE() + 0; -- 20180725 數字
  • DATE(expr)

提取日期或時間日期表示式expr中的日期部分。

SELECT DATE('2019-12-31 01:02:03'); -- '2019-12-31'
SELECT DATE('2019-12-31 01:02:03')+0; -- 20191231
  • DATE_FORMAT(date,format)

根據format 字串進行 date 值的格式化。

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2019-12-29
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- 2019年12月29日

5、聚合函式

AVG([distinct] expr)  求平均值
COUNT({*|[distinct] } expr)  統計行的數量
MAX([distinct] expr)  求最大值
MIN([distinct] expr)  求最小值
SUM([distinct] expr)  求累加和

二、自定義函式

1、概念簡介

函式儲存著一系列sql語句,呼叫函式就是一次性執行這些語句。所以函式可以降低語句重複。函式注重返回值,而觸發器注重執行過程,所以一些語句無法執行。所以函式並不是單純的sql語句集合。

2、使用方式

create function 函式名([引數列表]) returns 資料型別
begin
 sql語句;
 return 值;
end;

引數列表的格式是: 變數名 資料型別。

  • 無參案例
CREATE FUNCTION mysum1 () RETURNS INT RETURN (2+3)*2;
SELECT mysum1 () ;
  • 有參函式

表結構

CREATE TABLE t01_user (
    id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY  COMMENT '主鍵ID',
  user_name varchar(20) DEFAULT NULL COMMENT '使用者名稱稱'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '使用者表';

函式用法

create function get_name(p_id INT) returns VARCHAR(20)
begin 
    declare userName varchar(20);
    select user_name from t01_user where id=p_id into userName;
    return userName;
end;

SELECT get_name(1) ;

3、函式檢視

show create function get_name ;

4、刪除函式

drop function get_name ;

5、函式注意事項

函式是事先經過編譯,才能在伺服器環境呼叫,所以MySQL叢集環境需要同步編譯;MySQL是多執行緒環境,所以要保證函式也是執行緒安全 。

三、觸發器

1、觸發器簡介

觸發器是特殊的儲存過程,不同的是儲存過程要用CALL來呼叫,而觸發器不需要使用CALL。也不需要手工啟動,只要當一個預定義的事件發生的時候,就會被MYSQL自動觸發呼叫。

2、建立觸發器

觸發器語法

CREATE TRIGGER trigger_name trigger_time trigger_event 
ON tbl_name FOR EACH ROW trigger_stmt
  • trigger_name:觸發器命名 ;
  • trigger_time: 觸發動作的時間 ;
  • trigger_event: 啟用觸發器的語句型別 ;
  • tbl_name: 觸發器作用的表明,非臨時表 ;
  • trigger_stmt:觸發程式執行的語句 ;

表資料同步

當向用戶表 t01_user 寫入資料時,同時向 t02_back 表寫入一份備份資料。

-- 使用者備份表
CREATE TABLE t02_back (
    id int(11) NOT NULL PRIMARY KEY COMMENT '主鍵ID',
  user_name varchar(20) DEFAULT NULL COMMENT '使用者名稱稱'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '使用者備份';

-- 觸發器程式
DROP TRIGGER IF EXISTS user_back_trigger ;
CREATE TRIGGER user_back_trigger AFTER INSERT ON t01_user FOR EACH ROW
BEGIN
    INSERT INTO t02_back (id,user_name)
VALUES (new.id,new.user_name);
END ;

-- 測試案例
INSERT INTO t01_user (user_name) VALUES ('smile'),('mysql') ;
SELECT * FROM t02_back ;

3、檢視觸發器

檢視觸發器是指資料庫中已存在的觸發器的定義、狀態、語法資訊等。可以在TRIGGERS表中檢視觸發器資訊。

SELECT * FROM `information_schema`.`TRIGGERS` 
WHERE `TRIGGER_NAME`='user_back_trigger';

4、刪除觸發器

DROP TRIGGER語句可以刪除MYSQL中已經定義的觸發器,刪除觸發器的基本語法。

DROP TRIGGER [schema_name.]trigger_name

5、觸發器注意事項

  • 觸發事件

對於相同的表,相同的事件只能建立一個觸發器,比如對錶t01_user建立兩次AFTER INSERT觸發器,就會報錯。

  • 執行效率

觸發器可以減少應用端和資料庫的通訊次數和業務邏輯,但是基於行觸發的邏輯,如果資料集非常大,效率會降低。

  • 事務問題

觸發器執行和原表的執行語句是否在同一個事務中,取決於觸發表的儲存引擎是否支援事務。

四、原始碼地址

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

相關推薦

MySQL基礎(03)系統定義函式總結觸發器使用

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、系統封裝函式 MySQL 有很多內建的函式,可以快速解決開發中的一些業務需求,大概包括流程控制函式,數值型函式、字串型函式、日期時間函式、聚合函式等。以下列出了這些分類中常用的函式。 1、控制流程函式 case...when 根據值判斷返

MySQL基礎(07)使用者許可權管理日誌體系簡介

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、MySQL使用者 1、基礎描述 在資料庫的使用過程中,使用者作為訪問資料庫的鑑權因素,起到非常重要的作用,安裝MySQL時會自動生成一個root使用者,作為資料庫管理員,擁有所有許可權。在多使用者的應用場景下,可能需要給不同的使用者分配不同的許可

MySQL基礎(04)儲存過程檢視用法特性

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、儲存過程 1、概念簡介 儲存程式是被儲存在伺服器中的組合SQL語句,經編譯建立並儲存在資料庫中,使用者可通過儲存過程的名字呼叫執行。儲存過程核心思想就是資料庫SQL語言層面的封裝與重用性。使用儲存過程可以較少應用系統的業務複雜性,但是會增加資

MySQL基礎(05)邏輯架構圖解InnoDB儲存引擎

> 本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/mysql-data-base) || [GitEE·點這裡](https://github.com/cicadasmile/mysql-data-base) # 一、MySQL邏輯架構 ##

Android零基礎入門第39節ListActivity定義列表項

arraylist component save 高速 ram 如果 view設置 ren 屬性 相信通過前兩期的學習,以及會開發最簡單的一些列表界面了吧,那麽本期接著來學習更多方法技巧。 一、使用ListActivity 如果程序的窗口僅僅需要

MongoDB基礎1安裝服務配置

AD gap window server load 執行 顯示 mmu 配置環境 一、下載 請前往官網下載community版本MongoDB,我當前可見最新版本是3.6.4 https://www.mongodb.com/download-center#community

MySQL基礎(02)從五個維度出發審視表結構設計

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、資料場景 1、表結構簡介 任何工具類的東西都是為了解決某個場景下的問題,比如Redis快取系統熱點資料,ClickHouse解決海量資料的實時分析,MySQL關係型資料庫儲存結構化資料。資料的儲存則需要設計對應的表結構,清楚的表結構,有助於快

MySQL基礎(06)事務管理鎖機制案例

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/mysql-data-base) || [GitEE·點這裡](https://github.com/cicadasmile/mysql-data-base) # 一、鎖概念簡介 ## 1、基礎描述 鎖

MySQL儲存過程定義函式、Navicat for mysql、建立儲存過程函式、呼叫儲存過程函式的區別

與你相遇 好幸運  可我已失去為你淚流滿面的權利  但願在我看不到的天際  你張開了雙翼 1 MySQL儲存過程和函式 過程和函式,它們被編譯後儲存在資料庫中,稱為永續性儲存模組(Persistent Stored Module,PSM),可以反覆呼叫,執行速度快。 1.1 儲存過程 儲存過程是由

mysql基礎-資料庫連線、建立、刪除、選擇等基本操作(一)

一、通過cmd連結到資料庫 或者 彈出: 二、通過cmd建立與刪除database 2.1create database [databasename] ERROR 1007 (HY000): Can’t create database ‘mytest’; database exists 加上IF N

JavaWeb學習之----定義標籤 JSTL標籤庫

                今天來看一下自定義標籤的內容,自定義標籤是JavaWeb的一部分非常重要的核心功能,我們之前就說過,JSP規範說的很清楚,就是Jsp頁面中禁止編寫一行Java程式碼,就是最好不要有Java指令碼片段,下面就來看一下自定義標籤的簡介:自定義標籤主要用於移除Jsp頁面中的java程

儲存過程定義函式的優缺點

儲存過程和使用者定義函式都是“SQL語句組成的子程式,用以封裝程式碼以便重複使用”。但區別也是顯而易見的。簡單說,儲存過程功能強大,但呼叫不便,使用者函式正相反。 使用者定義函式的優點: 可以在SQL語句中呼叫,直接使用返值,從而形成複雜的SQL應用。 儲存過程則只能用ex

檢視內建函式定義函式的效率

<html><head><title>study</title><meta http-equiv="content-type" content="text/html;charset=gb2312" /><script type="text/ja

JavaWeb學習之----定義標籤&&JSTL標籤庫

今天來看一下自定義標籤的內容,自定義標籤是JavaWeb的一部分非常重要的核心功能,我們之前就說過,JSP規範說的很清楚,就是Jsp頁面中禁止編寫一行Java程式碼,就是最好不要有Java指令碼片段,下面就來看一下自定義標籤的簡介: 自定義標籤主要用於移除Jsp頁面中的ja

hive內建函式定義函式的使用

1.hive函式的分類 內建函式和自定義函式 1.1、內建函式 1、查詢有哪些內建函式: show functions;2、查詢某個內建函式怎麼使用desc function extended concat;1.2、自定義函式 分三大類:1、UDF : user defin

Oracle儲存過程定義函式

概述 PL/SQL中的過程和函式(通常稱為子程式)是PL/SQL塊的一種特殊的型別,這種型別的子程式可以以編譯的形式存放在資料庫中,併為後續的程式塊呼叫。 相同點: 完成特定功能的程式 不同點:是否用return語句返回值。 舉個例子: cre

SQL SERVER 儲存過程定義函式

一、功能描述。 需要把 participants 轉換成中文顯示,相關資訊的表如下: 二、自定義函式,作用是解釋用 ;分割的參與者編號,如下: USE [schedule] GO /****** Object:  UserDefinedFunction [dbo].

import定義函式python2 python3的不同

一種情況:假如你有一個指令碼函式a.py和b.py存放在file資料夾中。當你想呼叫a函式時。寫作:import file.a。但如果a.py需要呼叫b.py函式的話,在python2環境下a.py檔案中直接用impo

C#基礎(203)實例方法重載方法總結構造方法與實例方法總結this關鍵字

bubuko 順序 png res 重名 復雜度 方式 static code c#方法的重載:分為實例方法重載和靜態方法重載倆種 1.實例方法重載的調用特點   首先寫三個Add方法和三個Sub方法 public int Add(int a,int b)

安卓定義View進階-MotionEvent

Android MotionEvent 詳解,之前用了兩篇文章 事件分發機制原理 和 事件分發機制詳解 來講解事件分發,而作為事件分發主角之一的 MotionEvent 並沒有過多的說明,本文就帶大家瞭解 MotionEvent 的相關內容,簡要介紹觸控事件,主要包括 單點觸控、多點