09視圖,觸發器,事務,存儲過程,函數,流程控制,索引,隔離機制,鎖機制,三大范式

【一】視圖

(1)視圖須知概念
1.什么是視圖?
視圖就是通過查詢得到一張虛擬表,然后保存下來,下次可以直接使用
2.為什么要用視圖?
如果要頻繁操作一張虛擬表(拼表組成),就可以制作成視圖,后續直接操作
注意:視圖所獲得的虛擬表與原表數據無關
(2)視圖相關語法(和表的語法一致)
1.創建視圖
create view 視圖名(表名) as 虛擬表的查詢SQL語句
eg:
CREATE VIEW my_view AS SELECT column1, column2 FROM my_table WHERE condition;
2.查
SELECT * FROM my_view;
3.改
UPDATE my_view SET column1 = value1 WHERE condition;
4.刪
DROP VIEW my_view;

【二】觸發器

(1)觸發器概念
1.什么是觸發器
滿足對表數據進行增刪改的情況下,自動觸發的功能,稱為觸發器
2.觸發器的六種使用情況
● 增前
● 增后
● 刪前
● 刪后
● 改前
● 改后
(2)語法結構
1.
create trigger 觸發器的名字 
before/after insert/update/delete 
on 表名 for each row 
beginSQL語句
end
2.查看當前庫下所有的觸發器信息
show triggers\G;
3.刪除當前庫下指定的觸發器信息
drop trigger 觸發器名稱;
4.觸發器的名字一般情況下建議采用下列布局形式tri_after_insert_t1tri_before_update_t2tri_before_delete_t3
(3)使用實例
表:
CREATE TABLE cmd (id INT PRIMARY KEY auto_increment,USER CHAR (32),priv CHAR (10),cmd CHAR (64),sub_time datetime, #提交時間success enum ('yes', 'no') #0代表執行失敗
);
需求:cmd表插入數據的success如果值為no 則去errlog表中插入一條記錄
delimiter $$  # 將mysql默認的結束符由;換成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
beginif NEW.success = 'no' then  # 新記錄都會被MySQL封裝成NEW對象insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);end if;
end $$
delimiter ;  # 結束之后記得再改回來,不然后面結束符就都是$$了

【三】事務(掌握)

(1)事務概念
"""當讓多條SQL語句保持一致性的時候(要么同時成功,要么同事失敗),可以考慮使用事務"""
1.什么是事務
事務可以包含諸多SQL語句并且這些SQL語句要么同時執行成功 要么同時執行失敗 這是事務的原子性特點
事務的作用
2.四大特性(ACID)
ACIDA:原子性一個事務是一個不可分割的整體 里面的操作要么都成立要么都不成立C:一致性事務必須使數據庫從一個一致性狀態變到另外一個一致性狀態I:隔離性并發編程中 多個事務之間是相互隔離的 不會彼此干擾D:持久性事務一旦提交 產生的結果應該是永久的 不可逆的
(2)事務的使用
 1.創建表及錄入數據create table user(id int primary key auto_increment,name char(32),balance int);insert into user(name,balance)values('jason',1000),('kevin',1000),('tank',1000);2.事務操作開啟一個事務的操作start transaction;編寫SQL語句(同屬于一個事務)update user set balance=900 where name='jason';update user set balance=1010 where name='kevin'; update user set balance=1090 where name='tank';事務回滾(返回執行事務操作之前的數據庫狀態)rollback; ?# 執行完回滾之后 事務自動結束事務確認(執行完事務的主動操作之后 確認無誤之后 需要執行確認命令)commit; ?# 執行完確認提交之后 無法回滾 事務自動結束

【四】存儲過程

(1)存儲過程的概念
1.什么是存儲過程
存儲過程就類似于Python中的自定義函數
?
(2)如何使用存儲過程
1.定義
# 相當于定義函數
delimiter $$
create procedure 存儲過程的名字(形參1,形參2...)
beginsql 代碼
end $$
delimiter ;
2.相當于調用函數
call p1()
3.查看存儲過程具體信息
show create procedure pro1;
4.查看所有存儲過程
show procedure status;
5.刪除存儲過程
drop procedure pro1;
(3)使用實例
類似于有參函數delimiter $$create procedure p1(in m int,  # in表示這個參數必須只能是傳入不能被返回出去in n int,  out res int  # out表示這個參數可以被返回出去,還有一個inout表示即可以傳入也可以被返回出去)beginselect tname from userinfo where id > m and id < n;set res=0;  # 用來標志存儲過程是否執行end $$delimiter ;# 針對res需要先提前定義set @res=10;  定義select @res;  查看call p1(1,5,@res)  調用select @res  查看

【五】函數

(1)函數概念
1.什么是函數
跟存儲過程是有區別的,存儲過程是自定義函數,函數就類似于內置函數
(2)語法
# 1.移除指定字符
Trim、LTrim、RTrim# 2.大小寫轉換
Lower、Upper# 3.獲取左右起始指定個數字符
Left、Right# 4.返回讀音相似值(對英文效果)
Soundex
"""
eg:客戶表中有一個顧客登記的用戶名為J.Lee但如果這是輸入錯誤真名其實叫J.Lie,可以使用soundex匹配發音類似的where Soundex(name)=Soundex('J.Lie')
"""# 5.日期格式:date_format
'''在MySQL中表示時間格式盡量采用2022-11-11形式'''
CREATE TABLE blog (id INT PRIMARY KEY auto_increment,NAME CHAR (32),sub_time datetime
);
INSERT INTO blog (NAME, sub_time)
VALUES('第1篇','2015-03-01 11:31:21'),('第2篇','2015-03-11 16:31:21'),('第3篇','2016-07-01 10:21:31'),('第4篇','2016-07-22 09:23:21'),('第5篇','2016-07-23 10:11:11'),('第6篇','2016-07-25 11:21:31'),('第7篇','2017-03-01 15:33:21'),('第8篇','2017-03-01 17:32:21'),('第9篇','2017-03-01 18:31:21');
select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');

【六】流程控制

# python if判斷if 條件:子代碼elif 條件:子代碼else:子代碼
# js if判斷if(條件){子代碼}else if(條件){子代碼}else{子代碼}
# MySQL if判斷if 條件 then子代碼elseif 條件 then子代碼else子代碼end if;# MySQL while循環DECLARE num INT ;SET num = 0 ;WHILE num < 10 DOSELECT num ;SET num = num + 1 ;END WHILE ;

【七】索引

(1)索引概念
1.什么是索引
索引(在MySQL中也叫做“鍵(key)”)是存儲引擎用于快速找到記錄的一種數據結構,這也是索引
2.MySQL中索引的類型
創建主鍵約束(PRIMARY KEY)、唯一約束(UNIQUE)、外鍵約束(FOREIGN KEY)時,會自動創建 對應列的索引。
3.索引的本質
通過不斷的縮小想要的數據范圍篩選出最終的結果 
4.id	name	pwd		post_comment  addr  age 基于id查找數據很快 但是基于addr查找數據就很慢 解決的措施可以是給addr添加索引
'''索引雖然好用 但是不能無限制的創建!!!'''
5.**索引的影響:*** 在表中有大量數據的前提下,創建索引速度會很慢* 在索引創建完畢后,對表的查詢性能會大幅度提升,但是寫的性能會降低
6.索引的底層數據結構是b+樹b樹 紅黑樹 二叉樹 b*樹 b+樹上述結構都是為了更好的基于樹查找到相應的數據
(2)索引語法用法
1.查看索引
show index from 表名;
+---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY    |            1 | id          | A         |           8 |     NULL | NULL   |      | BTREE      |         |               |
| student |          0 | sn         |            1 | sn          | A         |           8 |     NULL | NULL   | YES  | BTREE      |         |               |
| student |          1 | classes_id |            1 | classes_id  | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.01 sec)
2.創建索引
對于非主鍵、非唯一約束、非外鍵的字段,可以創建普通索引
create index  索引名 on 表名(字段名);# 索引名的命名規則一般是:index_表名_列名
3.刪除索引
drop index 索引名 on 表名
(3)聚集索引(主鍵索引)
  【1】什么是聚集索引● 聚集索引(Clustered Index)是關系型數據庫中的一種索引類型,它決定了表中數據的物理存儲順序。##### ● 在一個表中,只能有一個聚集索引。● 聚集索引對表進行了重新組織,使得數據按照聚集索引的鍵值順序存儲在磁盤上。● 由于聚集索引決定了數據的物理存儲順序,因此通過聚集索引可以快速地找到特定范圍內的數據● MySQL的聚簇索引是基于B+樹的數據結構實現的,它會把數據存儲在索引的葉子節點上,葉子節點之間按順序鏈接,使得按主鍵進行搜索時速度最快。● 如果沒有主鍵,如果按主鍵搜索,速度是最快的。【2】聚集索引的特點● 數據的邏輯順序和物理順序是一致的,通過聚集索引可以直接訪問特定行,因此聚集索引的查詢速度很快。##### ● 聚集索引的鍵值必須是唯一的,不允許重復值存在。● 當表中的數據發生插入、刪除或更新操作時,聚集索引需要進行相應的調整以保持數據的有序性,這可能會對性能產生一定影響。#####  ● 如果表中沒有定義聚集索引,那么表的數據存儲順序將按照物理地址來存儲。● 表不建立主鍵,也會有個隱藏字段是主鍵,是主鍵索引● 主鍵索引對于按照主鍵進行查詢的性能非常高。
創建:ALTER TABLE table_name ADD PRIMARY KEY (column);
(4)輔助索引(普通索引)
查詢數據的時候不可能都是用id作為篩選條件,也可能會用name,password等字段信息,那么這個時候就無法利用到聚集索引的加速查詢效果。就需要給其他字段建立索引,這些索引就叫輔助索引
ALTER TABLE table_name ADD INDEX index_name (column);
(5)唯一索引(unique)
【1】什么是唯一索引
● 唯一索引是指該索引的所有值都是唯一的,不允許出現重復值。
【2】語法
● MySQL中可以通過以下語法創建唯一索引
ALTER TABLE table_name ADD UNIQUE KEY index_name (column);
【3】注意事項
● 與普通索引不同的是,如果嘗試向包含唯一索引的列中插入重復的值,則會引發錯誤。
● 唯一索引可以用于確保數據的一致性和完整性,并且可以幫助提高查詢性能。
(6)全文索引
【1】什么是全文索引
● 全文索引是一種特殊的索引,它可以用來存儲和檢索文本數據。
● 全文索引可以包含單詞、短語和其他類型的文本內容,并支持模糊匹配和近似匹配。
【2】語法
● MySQL中可以通過以下語法創建全文索引
CREATE FULLTEXT INDEX index_name ON table_name (column);
【3】注意事項
● 需要注意的是,只有MyISAM和InnoDB存儲引擎支持全文索引。
● 此外,創建全文索引可能會增加索引維護的成本,并且可能會降低其他類型的查詢性能。
● 因此,在創建全文索引時需要權衡其利弊。
(7)覆蓋索引
只在輔助索引的葉子節點中就已經找到了所有我們想要的數據select name from user where name='jason';
(8)非覆蓋索引
雖然查詢的時候命中了索引字段name,但是要查的是age字段,所以還需要利用主鍵才去查找select age from user where name='jason';

【八】隔離機制

(1)臟讀
1.臟讀是指當一個事務讀取了其他事務尚未提交的數據時發生的現象。
2.意思就是比如說你一個事務,沒有commit前,讀的就是臟數據,只要回滾就不存在了
(2)不可重復讀
1.不可重復讀指的是在一個事務內,最開始讀到的數據和事務結束前的任意時刻讀到的同一批數據出現不一致的情況
2.就是在每次讀同一個數據時,可能數據被修改讀出來就不一樣
(3)幻讀
1.幻讀的本質在于某一次select操作得到的結果無法支撐后續的業務操作。
2.就是你第一次讀的時候是這么多數據,但是當你插入數據,發現不能插入了,因為已經存在了
(4)解決辦法
[1]Read uncommitted(讀未提交)
最低的隔離級別,在這個級別下,一個事務可以讀取到另一個事務尚未提交的數據
可能導致臟讀(Dirty Read)問題,即讀取到未經驗證的數據。[2]Read committed(讀已提交)
在這個級別下,一個事務只能讀取到已經提交的數據,避免了臟讀問題。
但是可能會出現不可重復讀(Non-repeatable Read)問題
即同一事務中,兩次讀取相同的記錄可能得到不同的結果,因為其他事務修改了這些記錄。[3]Repeatable read(可重復讀取)
在這個級別下,事務開始讀取數據后,其他事務無法修改這些數據,保證了同一個事務內兩次讀取相同記錄的一致性。
但是可能會出現幻讀(Phantom Read)問題,
即同一查詢在同一事務中兩次執行可能返回不同的結果,因為其他事務插入或刪除了符合查詢條件的記錄。[4]Serializable(串行化)
最高級別的隔離級別,要求事務串行執行,事務之間完全隔離,避免了臟讀、不可重復讀和幻讀問題。
但是這會犧牲并發性能,因為并發事務被限制為順序執行。

【九】鎖機制

目的:提升數據安全性
分類:按粒度分細---》粗行級鎖表級鎖頁級鎖
(1)行級鎖1.?級鎖是Mysql中鎖定粒度最細的?種鎖○ 表示只針對當前操作的?進?加鎖。
2.?級鎖能??減少數據庫操作的沖突。○ 其加鎖粒度最?,但加鎖的開銷也最?。
3. ?級鎖分為共享鎖和排他鎖。
4.通俗的說就是在你寫的時候必須要加鎖,只能一個一個寫入,如果一起寫數據就會錯亂
5.行級鎖鎖的是索引命中索引以后才會鎖行如果沒有命中索引會把整張表都鎖起來。
6.流程:
命中主鍵索引就鎖定這條語句命中的主鍵索引命中輔助索引就會先鎖定這條輔助索引再鎖定相關的主鍵索引考慮到性能,innodb默認支持行級鎖但是只有在命中索引的情況下才鎖行,否則鎖住所有行本質還是行鎖但是此刻相當于鎖表了

【十】三大范式

三大范式是數據庫設計的基礎,用于確保數據的準確性、完整性和一致性,避免數據的冗余和不一致性。以下是三大范式的詳細解釋:

1.第一范式(1NF)
定義:數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值或重復的屬性。
特點:
強調列的原子性,即列不可再分。
每一列都是獨立的、不可分割的。
保證了數據的準確性,避免了數據的冗余和不一致性。
實際應用:
通常用于記錄簡單、固定的實體關系。

2.第二范式(2NF)
完全依賴”指的是非主屬性不能僅依賴于主鍵的一部分
定義:在滿足第一范式的基礎上,非主屬性必須完全依賴于整個主鍵,而不是主鍵的一部分。
特點:
表必須有一個主鍵。
沒有包含在主鍵中的列必須完全依賴于主鍵。
保證了數據的完整性,避免了數據的冗余和不一致性。
實際應用:
通常用于記錄復雜、動態的實體關系。
3.第三范式(3NF)
定義:在滿足第二范式的基礎上,任何非主屬性不依賴于其他非主屬性(即消除傳遞依賴)。
特點:
非主鍵列必須直接依賴于主鍵。
不能存在非主鍵列A依賴于非主鍵列B,非主鍵列B依賴于主鍵的情況(即傳遞依賴)。
進一步保證了數據的完整性,避免了數據的冗余和不一致性。
實際應用:
通常用于記錄復雜、動態的實體關系,尤其是當數據表中存在大量數據冗余時。
4.總結:
三大范式理論是數據庫設計的基礎,它們通過確保數據的原子性、完整性和一致性,避免了數據的冗余和不一致性。在實際應用中,根據數據的復雜性和需求,可以選擇不同的范式進行數據庫設計。隨著數據庫技術的發展,新的范式理論也在不斷涌現,為數據庫設計提供了更多的選擇。

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

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

相關文章

IDEA 創建springboot項目雜記-更新中

一、工具使用雜記 1、使用maven 創建新springboot項目時&#xff0c;因為https://start.spring.io/ 連接不上項目無法創建。直接把腳手架地址換為國內的 http://start.aliyun.com

田忌賽馬 貪心

本題是更難的那道,一場50 最低為o 第一行一個整數 &#x1d45b;n &#xff0c;表示他們各有幾匹馬&#xff08;兩人擁有的馬的數目相同&#xff09;。第二行 &#x1d45b;n 個整數&#xff0c;每個整數都代表田忌的某匹馬的速度值&#xff08;0≤0≤ 速度值 ≤100≤1…

Python】從文本字符串中提取數字、電話號碼、日期、網址的方法

關于從文本字符串中提取數字、電話號碼、日期和網址的方法&#xff1a; 提取數字&#xff1a; 在 Python 中&#xff0c;使用正則表達式 \d 來匹配數字。 \d 表示匹配一個數字字符&#xff08;0-9&#xff09;。如果要匹配連續的數字&#xff0c;可以使用 \d 。 import re def …

C++面向對象的常見面試題目(一)

1. 面向對象的三大特征 &#xff08;1&#xff09;封裝&#xff1a;隱藏對象的內部狀態&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定義一個簡單的類 Person class Person { private: // 私有成員&#xff0c;外部不可直接訪問std…

Mac OS ssh 連接提示 Permission denied (publickey)

這錯誤有點奇葩&#xff0c;MacBook的IDE(vscode和pycharm)遠程都連不上&#xff0c;terminal能連上&#xff0c;windows的pycharm能連上&#xff0c;見鬼了&#xff0c;所以肯定不是秘鑰的問題了&#xff0c;查了好久竟然發現是權限的問題。。 chmod 400 ~/.ssh/id_rsa http…

華為機試HJ37統計每個月兔子的總數

華為機試HJ37統計每個月兔子的總數 題目&#xff1a; 想法&#xff1a; 上述題目實際是一個斐波那契數列&#xff0c;利用斐波那契數列對問題進行求解 input_number int(input())def fib(n):if n < 2:return 1else:n_1 1n_2 1count 2while count < n:n_1, n_2 n_…

【Android】【多屏】多屏異顯異觸調試技巧總結

這里寫目錄標題 如何獲取多屏IDs獲取多屏的size/density如何啟動應用到指定DisplayId多屏截屏/錄屏screencapscreenrecord發送按鍵到指定DisplayId 如何獲取多屏IDs dumpsys display | grep mDisplayIdtrinket:/ # dumpsys display | grep mDisplayIdmDisplayId0mDisplayId2 t…

【AI資訊】可以媲美GPT-SoVITS的低顯存開源文本轉語音模型Fish Speech

Fish Speech是一款由fishaudio開發的全新文本轉語音工具&#xff0c;支持中英日三種語言&#xff0c;語音處理接近人類水平&#xff0c;使用Flash-Attn算法處理大規模數據&#xff0c;提供高效、準確、穩定的TTS體驗。 Fish Audio

區塊鏈技術的應用場景和優勢。

區塊鏈技術具有廣泛的應用場景和優勢。 區塊鏈技術的應用場景&#xff1a; 1. 金融服務&#xff1a;區塊鏈可用于支付、跨境匯款、借貸和結算等金融服務&#xff0c;提高交易效率、降低成本并增強安全性。 2. 物聯網&#xff08;IoT&#xff09;&#xff1a;區塊鏈可以用于物…

機器學習Day12:特征選擇與稀疏學習

1.子集搜索與評價 相關特征&#xff1a;對當前學習任務有用的特征 無關特征&#xff1a;對當前學習任務沒用的特征 特征選擇&#xff1a;從給定的特征集合中選擇出相關特征子集的過程 為什么要特征選擇&#xff1f; 1.任務中經常碰到維數災難 2.去除不相關的特征能降低學習的…

Git注釋規范

主打一個有用 代碼的提交規范參考如下&#xff1a; init:初始化項目feat:新功能&#xff08;feature&#xff09;fix:修補bugdocs:文檔&#xff08;documentation&#xff09;style:格式&#xff08;不影響代碼運行的變動&#xff09;refactor:重構&#xff08;即不是新增功能…

NodeJs獲取文件擴展名

path.extname 是 Node.js 路徑模塊 (path) 中的一個方法&#xff0c;用于獲取文件路徑的擴展名。擴展名是指文件名中最后一個 .&#xff08;點&#xff09;之后的部分&#xff0c;包括這個 .。 const path require(path);const filename example.txt; const ext path.extna…

計算機網絡之令牌環

1.令牌環工作原理 令牌環&#xff08;Token Ring&#xff09;是一種局域網&#xff08;LAN&#xff09;的通信協議&#xff0c;最初由IBM在1984年開發并標準化為IEEE 802.5標準。在令牌環網絡中&#xff0c;所有的計算機或工作站被連接成一個邏輯或物理的環形拓撲結構。網絡中…

排序(2)

我們在排序&#xff08;1&#xff09;中說到選擇排序的代碼&#xff1a; void SelectSort(int* a,int n) {int begin0,endn-1;int minibegin,maxbegin;for(int ibegin1;i<end;i){if(a[i]>a[max]){maxii;}if(a[i]<a[mini]){minii;}begin;--end;}Swap(&a[beign],&a…

SKF軸承故障頻率查詢

1&#xff0c;第一步&#xff1a;搜索軸承型號 skf官網 2&#xff0c;第二步&#xff1a;查詢故障頻率。 第三步&#xff1a;

尚品匯-(十四)

&#xff08;1&#xff09;提交git 商品后臺管理到此已經完成&#xff0c;我們可以把項目提交到公共的環境&#xff0c;原來使用svn&#xff0c;現在使用git 首先在本地創建ssh key&#xff1b; 命令&#xff1a;ssh-keygen -t rsa -C "your_emailyouremail.com" I…

完美解決ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)

已解決ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO) 下滑查看解決方法 文章目錄 報錯問題解決思路解決方法交流 報錯問題 ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO) 解決思路 對…

InfluxDB v2.x中的Flux基本概念

InfluxDB v2.x中的Flux查詢語言的核心概念主要包括以下幾個方面&#xff1a; 1. 表&#xff08;Tables&#xff09; Flux以表&#xff08;Tables&#xff09;的形式處理數據。每個表包含多行數據&#xff0c;每行數據都是一個record&#xff08;記錄&#xff09;&#xff0c;…

落日余暉映晚霞

落日余暉映晚霞&#xff0c;立于海濱&#xff0c;望夕陽余暉灑于波光粼粼之上&#xff0c;金光跳躍&#xff0c;若繁星閃爍&#xff0c;耀人心目。 海風輕拂&#xff0c;心境寧靜&#xff0c;凡塵俗務皆于此剎那消散&#xff0c;思緒萬干&#xff0c;或憶往昔點滴&#xff0c;或…

刷爆leetcode第十期

題目一 相同的樹 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 首先我們要來判斷下它們的根是否相等 根相等的話是否它們的左子樹相等 是否…