文章目錄
- TCL語言
- 事務
- 含義
- 特點:ACID(屬性)
- 事務的使用
- 并發事務
- 資料庫的隔離級別
- 視圖
- 含義
- 創建視圖
- 修改視圖
- 洗掉視圖
- 查看視圖
- 視圖的更新
- 變數
- 系統變數
- 全域變數
- 會話變數
- 自定義變數
- 用戶變數
- 區域變數
- 存盤程序與函式
- 存盤程序
- 創建存盤程序語法
- 呼叫存盤程序語法
- 查看存盤程序
- 洗掉存盤程序
- 函式
- 函式的創建
- 函式的呼叫
- 查看函式
- 洗掉函式
- 流程控制
- 順序結構
- 分支結構
- 回圈結構
TCL語言
事務
含義
事務:一潭訓多條sql陳述句組成一個執行單位,一組sql陳述句要么都執行要么都不執行
特點:ACID(屬性)
- 原子性:原子性是指事務是一個不可再分的作業單位,事務中的操作要么都發生,要么都不發生,
- 一致性:事務必須是資料庫從一個一致性狀態變換到另一個一致性狀態,
- 隔離性:事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部操作及使用的資料對并發的其他事務時隔離的,并發執行的各個事務之間不能互相干擾,
- 持久性:指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來的其他操作和資料庫故障不應該對其有任何影響,
事務的使用
-
事務的分類
- 隱式(自動)事務:沒有明顯的開啟和結束,本身就是一條事務可以自動提交,比如insert、update、delete
- 顯式事務:具有明顯的開啟和結束
-
顯式事務的使用
-
①開啟事務
set autocommit=0;
start transaction;#可以省略 -
②撰寫一組邏輯sql陳述句
注意:sql陳述句支持的是insert、update、delete設定回滾點:
savepoint 回滾點名; -
③結束事務
提交:commit;
回滾:rollback;
回滾到指定的地方:rollback to 回滾點名;
-
案例: 演示事務的使用步驟
#開啟事務
SET autocommit=0;
START TRANSACTION;
#撰寫一組事務的陳述句
UPDATE `accout` SET balance =500 WHERE username ='張無忌';
UPDATE `accout` SET balance =1500 WHERE username ='趙敏';
#結束事務
ROLLBACK
#commit;
當我們使用事務的時候,假如不同的人同時使用同一個資料不久出錯了嗎?,那我們怎們辦呢?
并發事務
- 1、事務的并發問題是如何發生的?
多個事務 同時 操作 同一個資料庫的相同資料時 - 2、并發問題都有哪些?
臟讀:一個事務讀取了其他事務還沒有提交的資料,讀到的是其他事務“更新”的資料
不可重復讀:一個事務多次讀取,結果不一樣
幻讀:一個事務讀取了其他事務還沒有提交的資料,只是讀到的是 其他事務“插入”的資料 - 3、如何解決并發問題
通過設定隔離級別來解決并發問題
資料庫的隔離級別
- 一個事務與其他事務隔離的程度成為隔離級別,資料庫規定看多種事務隔離級別,不同隔離級別對應不同的干擾程度,隔離級別越高,資料一致性就越好,但并發性越弱,
- 對于同時運行多個事務,當這些事務訪問資料庫中相同的資料時,如果沒有采取必要的隔離機制,就會導致各種并發問題:
- 臟讀:對于兩個事務T1,T2,T1讀取了已經被T2更新但還沒有被提交的欄位之后,若T2回滾,T1讀取的內容就是臨時無效的,
- 不可重復讀:對于兩個事務T1,T2,T1讀取了一個欄位和,然后T2更新了該欄位之后,T1再次讀取同一個欄位,值就不同了,
- 幻讀:對于兩個事務T1,T2,T1從一個中讀取了一個欄位,然后T2在該表中插入了一些新的行,之后,如果T1再次讀取同一個表,就會多出幾行,
- 資料事務的隔離性:資料庫系統必須具有隔離并發運行各種事務的能力,使他們不會相互影響,避免各種并發問題,
- 資料庫提供的四種事務隔離級別
| 隔離級別 | 描述 |
|---|---|
| READ UNCOMMITED(讀取為提交資料) | 允許事務讀取未被其他事務提交的變更、臟讀,不可重復和幻讀的問題都會出現 |
| REAS COMMITED(讀取已提交資料) | 只允許事務讀取已經被其他事務提交的變更,可以避免臟讀,但不可重復讀和幻讀的問題仍然可能出現 |
| REPEATABLE READ(可重復讀) | 確保事務可以從一個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個欄位進行更新,可以避免臟讀和不可重復讀,但幻讀的問題仍然存在 |
| SERIALIZABLE(串行化) | 確保事務可以從一個表中讀取相同的行,在這個事務的持續期間,靜止其他事務對該表執行插入,更新和洗掉操作,所有并發問題都可以避免,但性十分低下 |
Oracle支持的2中事務隔離級別:READ UNCOMMITED,SERIALIZABLE,默認的事務隔離級別READ UNCOMMITED,
Mysql支持4種事務隔離級別,Mysql默認的事務隔離級別為:REPEATABLE READ,
視圖
含義
mysql5.1版本出現的新特性,本身是一個虛擬表,它的資料來自于表,通過執行時動態生成,
好處:1、簡化sql陳述句
2、提高了sql的重用性
3、保護基表的資料,提高了安全性
創建視圖
create view 視圖名
as
查詢陳述句;
示例:
#①創建
CREATE VIEW myv1
AS
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON j.job_id = e.job_id;
#②使用
SELECT * FROM myv1 WHERE last_name LIKE '%a%';
修改視圖
方式一:
create or replace view 視圖名
as
查詢陳述句;
示例:
SELECT * FROM myv3
CREATE OR REPLACE VIEW myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
? 方式二:
? alter view 視圖名
? as
? 查詢陳述句
示例:
ALTER VIEW myv3
AS
SELECT * FROM employees;
洗掉視圖
drop view 視圖1,視圖2,…;
示例:
DROP VIEW emp_v1,emp_v2;
查看視圖
desc 視圖名;
show create view 視圖名;
示例:
DESC myv3;
SHOW CREATE VIEW myv3;
視圖的更新
-
使用
-
插入:insert
-
修改:update
UPDATE myv1 SET last_name = '張無忌' WHERE last_name='張飛'; -
洗掉:delete
DELETE FROM myv1 WHERE last_name = '張無忌'; -
查看:select
SELECT * FROM myv1;
-
-
注意:視圖一般用于查詢的,而不是更新的,所以具備以下特點的視圖都不允許更新
- ①包含分組函式、group by、distinct、having、union、
- ②join
- ③常量視圖
- ④where后的子查詢用到了from中的表
- ⑤用到了不可更新的視圖
-
視圖和表的對比
| 創建語法的關鍵字 | 是否實際占用物理空間 | 使用 | |
|---|---|---|---|
| 視圖 | create view | 只是保存了sql邏輯(幾乎沒有) | 增刪改查,一般不能增刪改 |
| 表 | create table | 保存了資料 | 增刪改查均可 |
-
delete和truncate在事務使用中的區別
delete陳述句支持回滾,truncate不支持回滾在rollback回滾
變數
變數主要式以下幾種
- 系統變數:
- 全域變數
- 會話變數
- 自定義變數:
- 用戶變數
- 區域變數
系統變數
說明:變數由系統提供,不是用戶定義,屬于服務器層面,
注:如果式全域級別,則需要加上global,如果是會話級別,則需要添加session,不加默認式session級別,
使用到的語法:
1、查看所有的系統變數
show [global全域變數]|【session會話變數】 verables;
2、查看滿足條件的部分系統變數
show global|[session] variables like ‘%char%’;
3、查看指定的某個系統變數的值
select @@global|[session].系統變數名;
4、為某個系統變數賦值
方式一:
? set global|[session] 系統變數值=值;
方式二
? set @@global|[session].系統變數名=值;
全域變數
作用域:服務器每次啟動將為所有的全域變數賦值初始值,針對所有會話(連接)有效,但不能跨重啟,
實體使用
#1、查看我們所有的全域變數
SHOW GLOBAL VARIABLES;
#2、查看部分全域變數
SHOW GLOBAL VARIABLES LIKE '%char%';
#3、查看指定全域變數的值
SELECT @@global.autocommit;
SELECT @@tx_isolation;
#4、為某個指定的全域變數變數賦值
SELECT @@global.autocommit=0;
會話變數
作用域:用戶定義的,使用@符號定義的變數,使用set關鍵字
在當前用戶當次連接有效,只要在本連接中,任何地方都可以使用(可以在結構內部,也可以跨庫)
實體使用
#1、查看我們所有的會話變數
SHOW SESSION VARIABLES;
SHOW VARIABLES;
#2、查看部分會話變數
SHOW SESSION VARIABLES LIKE '%char%';
SHOW VARIABLES LIKE '%char%';
# 3、查看指定全域變數的值
SELECT @@session.autocommit;
SELECT @@tx_isolation;
#4、為某個指定的全域變數變數賦值
SELECT @@session.tx_isolation='read-uncommitted';
SELECT @@tx_isolation='read-uncommitted';
#方式二:
SELECT SESSION tx_isolation='read-uncommitted';
自定義變數
說明:變數式用于自定義的,不是由系統的
?使用步驟
?宣告
?賦值
?使用(查看比較運算……)
用戶變數
作用域:針對于當前會話(連接)有效,同于會話變數的作用域,
語法
#宣告并初始化
賦值運算子 =或:=
SET @用戶變數名=值;或
SET @用戶變數名=:值;或
SELECT @用戶變數名=值;
#賦值
方式一:通過SET或者 SELECT
SET @用戶變數名=值;或
SET @用戶變數名=:值;或
SELECT @用戶變數名=值;
方式二:通過SELECT INTO
SELECT 欄位 INTO 變數名
FROM 表
#使用(查看用戶變數的值)
SELECT @用戶變數值
區域變數
作用域:
?僅僅在定義他的begin end 有效
?應用在begin end 中的第一句話
語法
#宣告
DECLARE 變數名 型別;
DECLARE 變數名 型別 DEFAULT 值;
#賦值
方式一:通過SET或者 SELECT
SET 區域變數名=值;或
SET 區域變數名=:值;或
SELECT @區域變數名=值;
方式二:通過SELECT INTO
SELECT 欄位 INTO @變數名
FROM 表
#使用
SELECT 區域變數名;
用戶變數與區域變數小PK
| 作用域 | 定義和使用的位置 | 語法 | |
|---|---|---|---|
| 用戶變數 | 當前會話 | 會話的任何地方 | 必須加@符號,不用限定型別 |
| 區域變數 | BEGIN END中 | 只能在BEGIN END中,且為第一句話 | 一般不用加@符號,需要限定型別 |
簡單實體:案例:宣告兩個變數并賦初始值,求和,列印
用戶變數
SET @m=1;
SET @n=2;
SET @sum = @m+@n;
SELECT @sum;
區域變數
由于區域變數需要放在begin end中這里不要演示,就自行領悟去叭,
存盤程序與函式
存盤程序
含義:一組預先編譯好的SQL陳述句的集合,理解成批處理陳述句(l類似于Java中的方法)
?1、提高代碼的重用性
?2、簡化操作
?3、減少了編譯次數并且減少了和資料庫服務器的連接次數,提高了效率
創建存盤程序語法
CREATE PROCEDURE 存盤程序名(引數串列)
BEGIN
存盤程序體(一組合法的SQL陳述句)
END
創建需要注意的點
1、引數串列包含三部分
?引數模式 引數名 引數型別
實體
in stuname varchar(20)引數模式:
in:該引數可以作為輸入,也就是該引數需要呼叫方傳入值
out:該引數可以作為輸出,也就是該引數可以作為回傳值
inout:該引數既可以作為輸入又可以作為輸出,也就是該引數既需要傳入值,又可以回傳值
2、如果存盤程序體僅僅只有一句話,begin end可以省略
?存盤程序體中的每條sql陳述句的結尾要求必須加分號,
?存盤程序的結尾可以使用 delimiter 重新設定
?語法:
??delimiter 結束標記
實體
delimiter $
呼叫存盤程序語法
call 存盤程序名(實參串列)
呼叫in模式的引數:call sp1(‘值’);
呼叫out模式的引數:set @name; call sp1(@name);select @name;
呼叫inout模式的引數:set @name=值; call sp1(@name); select @name;
in實體
# 2、創建帶in模式引數的存盤程序
# 案例1:創建存盤程序實作 根據女神名,查詢對應的男神名
DELIMITER ¥#定義結束符
CREATE PROCEDURE myp3(IN beautyName VARCHAR(20))
BEGIN
SELECT bo.*
FROM boys bo
RIGHT JOIN beauty b ON bo.id = b.`boyfriend_id`
WHERE b.name = beautyName;
END ¥
#呼叫
CALL myp3('小昭')¥
out實體
DELIMITER ^
CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
SELECT bo.boyName INTO boyName
FROM boys bo
INNER JOIN beauty b ON bo.id = b.boyfriend_id
WHERE b.name = beautyName;
END ^
#呼叫
CALL myp6('小昭',@bName)^
inout實體
DELIMITER ^
CREATE PROCEDURE myp8(INOUT a INT, INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END ^
SET @m=10^
SET @n=20^
CALL myp8(@m,@n)^
查看存盤程序
show create procedure 存盤程序名;
實體
SHOW CREATE PROCEDURE myp3;
注:這里不能直接DESC 存盤程序名,這個和表的查看不一樣,不要混淆!
洗掉存盤程序
drop procedure 存盤程序名;
實體
DROP PROCEDURE p1;
注:這個洗掉時一次最多只能洗掉一個,需要多刪,需要手動一個一個洗掉,
函式
含義:一組預先編譯好的SQL陳述句的集合,理解成批處理陳述句
?1、提高代碼的重用性
?2、簡化操作
?3、減少了編譯次數并且減少了和資料庫服務器的連接次數,提高了效率
細心的小伙伴發現了這個,咦怎么和存盤程序一樣呢?博主錯了叭!,不,我沒錯!!!
函式和存盤程序的區別
存盤程序:可以有0個回傳,也可以有多個回傳,適合做批量插入、批量更新
函式:有且僅有1 個回傳,適合做處理資料后回傳一個結果
函式的創建
語法
CREATE FUNCTION 函式名(引數串列) RETURNS 回傳型別
BEGIN
函式體
END
函式創建的注意點
1.引數串列 包含兩部分:引數名、引數型別
2.函式體:肯定會有return陳述句,如果沒有會報錯
如果return陳述句沒有放在函式體的最后也不報錯,但不建議return 值;
3.函式體中僅有一句話,則可以省略begin end
4.使用 delimiter陳述句設定結束標記
函式的呼叫
語法
SELECT 函式名(引數串列)
實體一:有參回傳
#案例1:根據員工名,回傳它的工資
DELIMITER $
CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
SET @sal=0;#定義用戶變數
SELECT salary INTO @sal #賦值
FROM employees
WHERE last_name = empName;
RETURN @sal;
END $
SELECT myf2('k_ing') $
實體二:無參回傳
#案例:回傳公司的員工個數
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;#定義區域變數
SELECT COUNT(*) INTO c#賦值
FROM employees;
RETURN c;
END $
SELECT myf1()$
注:若上面的陳述句在cmd里面執行無什么需要注意的,但假若需要在圖形化界面執行,在每次執行時,請順帶執行==DELIMITER $==陳述句,讓我們的程式執行時識別結束符,
查看函式
語法
show create function 函式名;
實體
SHOW CREATE FUNCTION myf3;
洗掉函式
語法
drop function 函式名;
實體
DROP FUNCTION myf3;
流程控制
流程控制結構主要分為以下三大類:
順序結構:程式從上往下依次執行
分支結構:程式從兩潭訓多條路徑中選擇一條去執行
回圈結構:程式在滿足一定條件的基礎上,重復執行一段代碼
順序結構
程式依次執行!!這個沒啥好敘述的了,,,
分支結構
分支結構我們在Java中最熟悉的就是if else 還有就是switch case結構了,mysql也又類似之處,一起看看叭,
-
1.if函式
語法:if(條件,值1,值2) 功能:實作雙分支 應用場景:任何地方 -
if……then結構
語法: if 條件1 then 陳述句1; elseif 條件2 then 陳述句2; .... else 陳述句n; end if; 功能:類似于多重if 應用場景:只能應用在begin end 中 -
case結構
語法: 情況1:類似于java中switch陳述句,一般用于等值判斷 case 變數或運算式 when 要判斷的值 then 回傳的值1或陳述句1; when 要判斷的值 then 回傳的值2或陳述句2; ... else 回傳的值n或陳述句n; end 情況2:類似于Java中的多重IF陳述句,一般用于實作區間判斷 case when 條件1 then 陳述句1; when 條件2 then 陳述句2; ... else 陳述句n; end 應用場景:任何地方
回圈結構
-
分類:
- while→Java中的while
- loop→Java中的for,但是沒有回圈題
- repeat→do while
-
回圈控制
- iterate 類似Java的continue 繼續,結束本次回圈,繼續下一次
- leave 類似于 Java的break 跳出,結束當前所在回圈
-
while回圈詳解
語法
【標簽:】while 回圈條件 do
回圈體;
end while【 標簽】;
Java聯想:
while(回圈條件){
回圈體;
}
實體
# 案例:批量插入,根據次數插入到admin表中的多條記錄
DELIMITER $
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
SET i=i+1;
END WHILE;
END $
DELIMITER $
- loop回圈
語法:
【標簽:】loop
回圈體;
end loop 【標簽】;
可以用來模擬簡單的死回圈
- repeat回圈
語法:
【標簽:】repeat
回圈體;
until 結束回圈的條件
end repeat 【標簽】;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/341961.html
標籤:其他
