(保姆級教程)Mysql中索引、觸發器、存儲過程、存儲函數的概念、作用,以及如何使用索引、存儲過程,代碼操作演示

講解 MySQL 中索引、觸發器、存儲過程、存儲函數的使用

文章目錄

      • 1. 索引
        • 1.1 索引的分類
        • 1.2 索引的設計原則
        • 1.3 如何使用(create index)
      • 2. 觸發器
        • 2.1 觸發器的分類
        • 2.2 如何使用(create trigger)
      • 3. 存儲過程
        • 3.1 如何使用(create procedure)
          • 3.1.1 存儲過程主體
      • 4. 存儲函數
        • 4.1 與存儲過程的區別
        • 4.2 如何使用(create function)

1. 索引

  • 索引是一種特殊的數據結構。(就像書的目錄一樣)

  • 索引是提高數據庫性能的重要方式,所有字段都可以添加索引。

    給某個字段添加索引,就相當于給這個字段添加目錄,下次再通過這個字段查的時候,就會直接找到該位置,而不是從頭開始查。

  • 使用索引,可以快速查詢表中的記錄。但索引會占用內存空間

1.1 索引的分類

1、普通索引:不需要任何限制條件的索引,可在任意數據類型上創建

2、唯一索引:添加索引的字段,該字段的值必須唯一,比如:主鍵索引

3、全文索引:針對文本類型。只能創建在 char、varchar、text 數據類型的字段上

實際應用: 查詢數據量較大的字符串類型的字段時,使用全文索引可以提高速度。但 InnoDB (mysql默認的數據存儲引擎)不支持全文索引

4、單列索引:只對應一個字段的索引

5、多列索引:在一張表的多個字段上創建一個索引

注意: 多列索引,查詢時只需要使用第一個字段即可觸發索引。

6、空間索引:只能建立在空間數據類型上(比如:GIS(地理信息系統),因為地理信息的數據就是空間數據,描述的是空間位置,如經緯度)

注意: InnoDB 不支持空間索引

主鍵自帶索引,其它字段可以手動添加索引(但一般不會添加)

1.2 索引的設計原則

1、添加索引時,是出現在 where 語句中的字段,不是 select 后面要查詢的字段。

select name from user where id=1; -- 給id添加,而不是給name

2、添加索引的字段,這一列的值盡量唯一,效率更高(因為本身就是通過這個值查詢的,而現在有多個,還需要判斷是哪個)

3、不要添加過多的索引,因為索引占用內存空間,沒有用的索引也占用,所以維護成本高。

通常情況下,就用主鍵自帶的索引

1.3 如何使用(create index)
-- 1. 添加索引:索引名可自定義,一般為:idx_添加索引的字段名
-- 方式一:
alter table 表名 add index 索引名(字段名);
-- 方式二(推薦):
create index 索引名 on 表名(字段名);-- 2. 刪除索引
-- 方式一:
alter table 表名 drop index 索引名;
-- 方式二(推薦):
drop index 索引名 on 表名;

2. 觸發器

1、觸發器中定義了一系列操作,在對指定的表進行 插入、更新或刪除 (沒有查詢)的同時自動執行這些操作。觸發器是不需要調用的

2、為什么有這個機制?

舉個例子:因為有些時候對一個表的操作,不僅僅是單表,還有跟它關聯的其它表,比如:刪除一個班級的時候,你在班級表中把對應的班級刪除了,但是學生你也應該進行相應的操作,因為班級都沒有了,這個學生對應的班級也就沒有了。所以觸發器中就可以定義這些操作。

3、觸發器的優點:

  • 開發更快。因為觸發器是存儲在數據庫中的,在應用程序中不用每次都編寫觸發器中的操作。

    比如:不需要每次刪一個班級,你就要編寫對學生操作的 SQL

  • 更容易維護。定義觸發器后,訪問目標表會自動調用觸發器。

    比如:假如關聯的不是學生了,是教師,怎么辦?那只需要修改觸發器中的內容即可

  • 業務的全局實現。如果修改業務代碼,只需要修改觸發器。

    就是不需要改 Java 程序中的代碼,只需要修改觸發器即可

2.1 觸發器的分類
  • 前置觸發器:更新或插入 操作之前執行,關鍵字為:before
  • 后置觸發器:更新、插入或刪除 后執行,關鍵字為:after
  • before delete 觸發器:刪除之前 執行,關鍵字為:before delete
  • insted of 觸發器: 對復雜的視圖執行 插入、更新、刪除時執行,關鍵字為:insted of
2.2 如何使用(create trigger)

1、創建

create trigger 觸發器名(可自定義:一般為t_觸發器類型操作名稱_on_哪個表)
觸發時刻 什么操作 on 哪個表上制定觸發器 for each row 
觸發器需要執行的操作

觸發器需要執行的操作:如果要執行多個語句,可使用:begin 語句 end

提示:觸發器需要執行的操作,這一部分肯定包含多個語句,每個語句都是以分號結尾,這時服務器處理程序的時候遇到第一個分號就會認為程序結束,這肯定不行。所以使用 delimiter 結束符號(比如:$$) 命令講 MySQL 中的結束標志修改為其它符號。最后使用 opdelimiter ; 或者 delimiter ; 恢復即可。比如:

delimiter $$
create trigger t_afterInsert_on_tab1 
after insert on tab1 for each row
begininsert into tab2(name,age) values(new.name,new.age);
end$$
delimiter;

假如運行不報錯,結果也符合預期,一般不需要設置。

例1: 給 tab1 表添加一條數據后,然后 tab2 表自動添加這個數據:

create trigger t_afterInsert_on_tab1 
after insert on tab1 for each row
begininsert into tab2(name,age) values(new.name,new.age);
end;

這樣執行 insert into tab1(name,age) values('abc',23); 后,tab2 表中也有數據了。

注意:

new.字段名 用來引用新行的一列,old.字段名 用來引用更新或刪除它之前的已有行的一列。

② 對于 insert,只有 new 是合法的,對于 delete,只有 old 是合法的,對于 update,new、old

都合法。

例2: 刪除 tab1 表的后,然后 tab2 表也刪除:

create trigger t_afterDelete_on_tabl
after delete on tab1 for each row 
begindelete from tab2 where tab2.id = old.id;
end;

這樣執行 delete from tab1 where id=2; 后,tab2 表中對應 id=2 的數據也刪除了。

2、刪除觸發器:drop trigger 觸發器名;

3. 存儲過程

在實際開發中用的比較多的一種方式

1、存儲過程是一組為了完成特定功能的 SQL 的集合。經過編譯后存儲在數據庫中,用戶可以通過存儲過程的名稱調用(可傳參)。

跟觸發器有點像,但是觸發器需要有一張目標表。存儲過程跟 java 中的方法一樣,可以根據需要調用。

2、一次編寫,多次調用,避免重復編寫相同的SQL,存儲過程和函數(函數:跟存儲過程類似)都是在數據庫執行的,可以減少 java 程序和數據庫之間的數據傳輸,提高效率。

在這里插入圖片描述

3、存儲過程的優點:

  • 模塊化程序設計。把一些語句組裝在一起。
  • 執行速度更快。如果某個操作需要執行大量的 SQL,存儲過程比直接執行 SQL 效率更高(假如 SQL 重復,對于重復的 SQL,存儲過程優勢更為明顯)
  • 更好的安全機制。對于沒有權限存儲過程的用戶,可以通過授權的方式執行存儲過程。
3.1 如何使用(create procedure)

1、創建

create procedure 存儲過程名([參數,...])
存儲過程主體

參數: 不加參數時,存儲過程后面的括號不可省略。三部分組成:[in|out|inout] 參數名 參數類型

  • in 輸入參數。可以使數據傳遞給一個存儲過程

  • out 輸出參數。當需要返回一個答案或結果的時候,存儲過程使用輸出參數

3.1.1 存儲過程主體

存儲過程主體: 指在調用存儲過程的時候必須執行的語句。如果要執行多個語句,可使用:begin 語句 end

注意:存儲過程主體中也有可能包含多個 SQL 語句。同理:只要運行不報錯,結果也符合預期,一般不需要修改結束標志。

下面的內容只能使用在存儲過程體中:

聲明局部變量

在存儲過程中可以聲明局部變量,用來存儲臨時結果。語法:declare 變量名,... 變量類型 [default 默認值] ,比如:declare num int default 5; 或者 declare num int; 或者 declare str1,str2 varchar(10);

  1. 局部變量只能在 begin ... end語句中使用,而且必須在存儲過程的開頭。

  2. 給局部變量賦值:

    set 變量名=表達式;-- 多個
    set 變量名=表達式, 變量名=表達式,...;
    

② select into 語句

把選定的列值直接存儲到變量中。如:select 姓名,專業名 into name,project

例子: 總計數據總數后并返回

create procedure countNum(out num int)
begin select count(*) into num from tab1;
end;-- 問題1:怎么調?
call countNum(@num1);
-- 其中 @num1 就是定義一個變量來接收返回的結果,@用來定義用戶變量-- 問題2:怎么查看結果?
select @num1;

③ 流程控制語句

  1. if 語句

    if 條件 then 語句
    [elseif 條件 then 語句]
    ....
    [else 語句]
    end if;
    

    例子: 根據傳進來的值,選擇判斷后,存入表格

    create procedure addData(in target int)
    begin declare addName varchar(10);-- 賦值if target=1 then set addName="java";elseif target=2 then set addName="sql";else set addName="數據庫";end if;-- 插入insert into tab1(name) values(addName);
    end;
    

  2. case 語句。與之前的分支查詢稍微不同

    case 要判斷的值或表達式when 與判斷的值做比較的值 then 語句[when 與判斷的值做比較的值 then 語句][else 語句]
    end case;-- 或者(推薦)
    casewhen 條件 then 語句...[else 語句]
    end case;
    
  3. 循環語句。MySQL 支持 3 中循環:while、repeat、loop。循環開始標識 和 循環結束標識 要有都有,要沒有都沒有,且自定義的名字要一樣。

    [循環開始標識:]
    while 條件 do語句
    end while [循環結束標識];=============
    [循環開始標識:]
    repeat語句until 條件
    end repeat [循環結束標識];=============
    [循環開始標識:]
    loop語句
    end loop [循環結束標識];
    

    問題:怎么跳出循環?----> leave(類似 break)、iterate(類似 continue)比如:

    create procedure doloop()
    begin set @a=10;   -- @a就是用戶變量(前面有@標識)label:loopset @a=@a-1;if @a<0 then leave label; -- 滿足條件后跳出循環end if;end loop label; -- 要有都有
    end;
    

2、調用存儲過程:call 存儲過程名([參數]);

3、刪除存儲過程:drop procedure 存儲過程名;

4. 存儲函數

存儲函數與存儲過程非常相似

4.1 與存儲過程的區別
  • 存儲函數不能有輸出參數,參數只能為 in(可以省略,所以存儲函數的參數只有名稱和類型)。
  • 不能用 call 語句來調用存儲函數。而是 select 語句。
  • 存儲函數必須包含一條 return 語句(也就是函數必須有返回值),而存儲過程不允許包含
4.2 如何使用(create function)

1、創建

create function 存儲函數名([參數,...])returns type存儲函數主體

其中:returns type 聲明函數返回值的數據類型,比如:

-- 通過id查詢名字并返回
create function name_student(student_id int)
returns int
beginreturn(select name from tab1 where id=student_id);
end;

begin 里面的 return 就是需要返回的東西,所以將內容放到 () 里面。也可以直接 return ,比如:return true; 或者 return '123';

2、調用:select 存儲函數名([參數]);

3、刪除:drop function 存儲函數名;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot調用HTTP接口

1. RestTemplate 首先引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 編寫配置類 Configuration public class RestTemplateConfig {Beanpublic Re…

Git拉取遠程倉庫代碼覆蓋本地,也就是放棄本地修改

git撤銷本地 、強制拉取遠程代碼覆蓋本地-CSDN博客 說的最多的是用&#xff1a;git fetch --all 但是親測是無效的&#xff0c;并不能將本地不存在但遠程倉庫存在的文件取回來。就是git fetch 項目地址&#xff0c;也是沒用的&#xff01; 就算是重新pull整個項目&#xff0…

Django中間件

目錄 一.介紹 1.什么是Django中間件 2.作用&#xff1a; 3.示例 二.Django請求生命周期流程圖 三.Django中間件是Django的門戶 四.中間件方法 1.必須掌握的中間件方法 &#xff08;1&#xff09;process_request: 示例&#xff1a; 2.需要了解的中間件方法 &#x…

新生兒散光:原因、科普和注意事項

引言&#xff1a; 散光是一種常見的眼睛問題&#xff0c;雖然在新生兒時期相對較少見&#xff0c;但了解其原因、科普相關知識&#xff0c;并提供一些建議的注意事項&#xff0c;對于嬰兒的視力健康至關重要。本文將深入探討新生兒散光的原因、相關科普知識&#xff0c;并為父…

大廠前沿技術導航

百度Geek說 - 知乎 騰訊技術 - 知乎 美團技術團隊

YaRN方法:無需微調,高效擴展語言模型上下文窗口/螞蟻集團與浙大發布原生安全框架v1.0,引領企業網絡安全新時代 |魔法半周報

我有魔法?為你劈開信息大海? 高效獲取AIGC的熱門事件&#x1f525;&#xff0c;更新AIGC的最新動態&#xff0c;生成相應的魔法簡報&#xff0c;節省閱讀時間&#x1f47b; &#x1f525;資訊預覽 YaRN方法&#xff1a;無需微調&#xff0c;高效擴展語言模型上下文窗口 螞蟻…

2023 hnust 湖南科技大學 信息安全管理課程 期中考試 復習資料

前言 ※老師沒畫重點的補充內容★往年試卷中多次出現或老師提過的&#xff0c;很可能考該筆記是奔著及格線去的&#xff0c;不是奔著90由于沒有聽過課&#xff0c;部分知識點不一定全&#xff0c;答案不一定完全正確 題型 試卷有很多題是原題 判斷題&#xff08;PPT&#xff…

python-冒泡排序

冒泡排序 &#xff08;穩定&#xff09; O(n^2) (穩定&#xff1a;表示相等的數&#xff0c;相對位置會不會改變) 冒泡排序&#xff08;Bubble Sort&#xff09;是一種簡單的排序算法&#xff0c;它通過多次遍歷待排序的元素&#xff0c;比較相鄰兩個元素的大小并交換它們&…

Kafka 常用功能總結(不斷更新中....)

kafka 用途 業務中我們經常用來兩個方面 1.發送消息 2.發送日志記錄 kafka 結構組成 broker&#xff1a;可以理解成一個單獨的服務器&#xff0c;所有的東西都歸屬到broker中 partation&#xff1a;為了增加并發度而做的拆分&#xff0c;相當于把broker拆分成不同的小塊&…

黨建信息管理系統源碼 支持在線交黨費 附帶完整的搭建教程

傳統的黨建管理模式通常采用手工方式&#xff0c;不僅效率低下&#xff0c;而且容易出錯。隨著組織規模的擴大和黨員數量的增加&#xff0c;這種管理方式已經無法滿足現實需求。此外&#xff0c;傳統的黨建管理模式缺乏在線交黨費功能&#xff0c;給黨員帶來不便。因此&#xf…

Kubernetes 離線部署 Spinnaker

離線部署 Spinnaker 離線部署 spinnaker 需要提前準備以下依賴項 halyard 安裝工具&#xff1a;該hal命令的apt源地址https://us-apt.pkg.dev/projects/spinnaker-community位于國外halyard boms物料清單&#xff1a;Spinnaker 將其halyard boms配置存儲在公共谷歌云存儲 ( g…

Divisibility Trick

Dmitry最近學會了一個簡單的規則來檢查一個整數是否可以被3整除。如果一個整數的位數之和可以被3整除&#xff0c;那么它就可以被3所整除。 后來他還了解到&#xff0c;同樣的規則也可以用來檢查一個整數是否可以被9整除。如果一個整數的位數之和可以被9整除&#xff0c;那么它…

如何在 Web 應用程序中查找端點?

如何在 Web 應用程序中查找端點? 這篇文章主要講述了如何在網絡應用中找到端點。以下是文章的主要要點: 端點是網絡服務的訪問地址,通過引用這個URL,客戶可以訪問服務提供的操作。端點提供了尋址Web服務端點所需的信息。 HTTP消息是服務器和客戶端之間交換數據的方式,包…

Anaconda深度學習環境配置命令參考

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 Anaconda深度學習環境配置 Anaconda 管理1. 檢查 Anaconda 版本2. 獲取版本號3. 列出所有的虛擬環境4. 查看環境管理的全部命令幫助5. conda升級6. conda升級后釋放空間 Anac…

2024免費MacBook清理工具CleanMyMac X4.15

CleanMyMac X 是一款專業的Mac清理軟件&#xff0c;可智能清理mac磁盤垃圾和多余語言安裝包&#xff0c;快速釋放電腦內存&#xff0c;輕松管理和升級 Mac 上的應用。同時 CleanMyMac X 可以強力卸載惡意軟件&#xff0c;修復系統漏洞&#xff0c;一鍵掃描和優化 Mac 系統&…

競賽知識點12【樹狀數組】

文章目錄 1、思路引入2、求lowbit(n)3、對某個元素進行加法操作(單點更新)4、查詢前綴和5、統計A[x]~A[y] 的值1、思路引入 如果線段樹每個節點維護的是對應區間的和,比如說計算從 s s s 到 t t t 的和 ( a s + … + a t ) (a_s+…+a_t) (as?+…+at?),在基于線段樹的實…

【ChatGLM3-6B】Docker下部署及微調

【ChatGLM2-6B】小白入門及Docker下部署 注意&#xff1a;Docker基于鏡像中網盤上上傳的有已經做好的鏡像&#xff0c;想要便捷使用的可以直接從Docker基于鏡像安裝看Docker從0安裝前提下載啟動訪問 Docker基于鏡像安裝容器打包操作&#xff08;生成鏡像時使用的命令&#xff0…

Nginx常用負載均衡策略

Nginx常用負載均衡策略 輪詢&#xff08;默認&#xff09; 注意&#xff1a;這里的輪詢并不是每個請求輪流分配到不同的后端服務器&#xff0c;與ip_hash類似&#xff0c;但是按照訪問url的hash結果來分配請求&#xff0c;使得每個url定向到同一個后端服務器&#xff0c;主要…

什么手機30萬?VERTU唐卡手機頂配56.8萬

近日,一則新聞在社交媒體上引發了廣泛關注。一名男子遺失了一部價值30萬的VERTU唐卡定制款手機,而一位女士在撿到這部手機后,誤以為是一部普通的老年機,引發了種種誤會。30萬的手機是什么牌子?VERTU唐卡手機浮出水面 據了解,這部VERTU唐卡定制款手機是一款豪華的奢侈品定制手機…

2-Python與設計模式--前言

0-Python與設計模式–前言 一 什么是設計模式 設計模式是面對各種問題進行提煉和抽象而形成的解決方案。這些設計方案是前人不斷試驗&#xff0c; 考慮了封裝性、復用性、效率、可修改、可移植等各種因素的高度總結。它不限于一種特定的語言&#xff0c; 它是一種解決問題的思…