MySQL
全部SQL源文件鏈接:https://pan.baidu.com/s/1wc51qkVetSRybFzcIYGBIg
提取碼:3wpt
其他
變量
變量的介紹
- 系統變量:
- 全局變量
- 會話變量
- 自定義變量:
- 用戶變量
- 局部變量
系統變量的介紹和語法
-
說明:變量由系統定義,不是用戶定義,屬於服務器層面
-
注意:全局變量需要添加global關鍵字,會話變量需要添加session關鍵字,如果不寫,默認會話級別
-
使用步驟:
-
1、查看所有系統變量
show global|【session】variables;
-
2、查看滿足條件的部分系統變量
show global|【session】 variables like '%char%';
-
3、查看指定的系統變量的值
select @@global|【session】系統變量名;
-
4、爲某個系統變量賦值
方式一: set global|【session】系統變量名=值; 方式二: set @@global|【session】系統變量名=值;
-
全局變量的演示
#1》全局變量
/*
作用域:針對於所有會話(連接)有效,但不能跨重啓
*/
#①查看所有全局變量
SHOW GLOBAL VARIABLES;
#②查看滿足條件的部分系統變量
SHOW GLOBAL VARIABLES LIKE '%char%';
#③查看指定的系統變量的值
SELECT @@global.autocommit;
#④爲某個系統變量賦值
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;
會話變量的演示
#2》會話變量
/*
作用域:針對於當前會話(連接)有效
*/
#①查看所有會話變量
SHOW SESSION VARIABLES;
#②查看滿足條件的部分會話變量
SHOW SESSION VARIABLES LIKE '%char%';
#③查看指定的會話變量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
#④爲某個會話變量賦值
SET @@session.tx_isolation='read-uncommitted';
SET SESSION tx_isolation='read-committed';
自定義變量—用戶變量
#二、自定義變量
/*
說明:變量由用戶自定義,而不是系統提供的
使用步驟:
1、聲明
2、賦值
3、使用(查看、比較、運算等)
*/
#1》用戶變量
/*
作用域:針對於當前會話(連接)有效,作用域同於會話變量
*/
#賦值操作符:=或:=
#①聲明並初始化
SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
#②賦值(更新變量的值)
#方式一:
SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
#方式二:
SELECT 字段 INTO @變量名
FROM 表;
#③使用(查看變量的值)
SELECT @變量名;
自定義變量—局部變量
#2》局部變量
/*
作用域:僅僅在定義它的begin end塊中有效
應用在 begin end中的第一句話
*/
#①聲明
DECLARE 變量名 類型;
DECLARE 變量名 類型 【DEFAULT 值】;
#②賦值(更新變量的值)
#方式一:
SET 局部變量名=值;
SET 局部變量名:=值;
SELECT 局部變量名:=值;
#方式二:
SELECT 字段 INTO 具備變量名
FROM 表;
#③使用(查看變量的值)
SELECT 局部變量名;
#案例:聲明兩個變量,求和並打印
#用戶變量
SET @m=1;
SET @n=1;
SET @sum=@m+@n;
SELECT @sum;
#局部變量
DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 1;
DECLARE SUM INT;
SET SUM=m+n;
SELECT SUM;
用戶變量和局部變量的對比
作用域 定義位置 語法
用戶變量 當前會話 會話的任何地方 加@符號,不用指定類型
局部變量 定義它的BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定類型
存儲過程和函數
- 說明:都類似於java中的方法,將一組完成特定功能的邏輯語句包裝起來,對外暴露名字
- 好處
- 1、提高代碼的重用性
- 2、簡化操作
- 3、減少了編譯次數並且減少了和數據庫服務器的連接次數,提高了效率
存儲過程
-
含義:一組預先編譯好的SQL語句的集合,理解成批處理語句
-
一、創建語法
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;
-
案例
#1.空參列表
#案例:插入到admin表中五條記錄
SELECT * FROM admin;
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(username,`password`)
VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
END $
#調用
CALL myp1()$
#2.創建帶in模式參數的存儲過程
#案例1:創建存儲過程實現 根據女神名,查詢對應的男神信息
CREATE PROCEDURE myp2(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 myp2('柳巖')$
#案例2 :創建存儲過程實現,用戶是否登錄成功
CREATE PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result VARBINARY(20) DEFAULT '';#聲明並初始化
SELECT COUNT(*) INTO result#賦值
FROM admin
WHERE admin.username = username
AND admin.password = PASSWORD;
SELECT result;#使用
END $
CALL myp3('張飛','8888')$
CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;#聲明並初始化
SELECT COUNT(*) INTO result#賦值
FROM admin
WHERE admin.username = username
AND admin.password = PASSWORD;
SELECT IF(result>0,'成功','失敗');#使用
END $
#調用
CALL myp4('張飛','8888')$
#3.創建out 模式參數的存儲過程
#案例1:根據輸入的女神名,返回對應的男神名
CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
SELECT bo.boyname INTO boyname
FROM boys bo
RIGHT JOIN
beauty b ON b.boyfriend_id = bo.id
WHERE b.name=beautyName ;
END $
#案例2:根據輸入的女神名,返回對應的男神名和魅力值
CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT)
BEGIN
SELECT boys.boyname ,boys.usercp INTO boyname,usercp
FROM boys
RIGHT JOIN
beauty b ON b.boyfriend_id = boys.id
WHERE b.name=beautyName ;
END $
#調用
CALL myp7('小昭',@name,@cp)$
SELECT @name,@cp$
#4.創建帶inout模式參數的存儲過程
#案例1:傳入a和b兩個值,最終a和b都翻倍並返回
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)$
SELECT @m,@n$
-
三、查看語法
show create procedure 存儲過程名; 案例 DESC myp2;× SHOW CREATE PROCEDURE myp2;
-
四、刪除語法
drop procedure 存儲過程名; 案例: DROP PROCEDURE p1; DROP PROCEDURE p2,p3;#×
函數
-
含義:一組預先編譯好的SQL語句的集合,理解成批處理語句
-
區別:
- 存儲過程:可以有0個返回,也可以有多個返回,適合做批量插入、批量更新;
- 函數:有且僅有1 個返回,適合做處理數據後返回一個結果。
-
一、創建語法
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型 BEGIN 函數體 END /* 注意: 1.參數列表 包含兩部分: 參數名 參數類型 2.函數體:肯定會有return語句,如果沒有會報錯 如果return語句沒有放在函數體的最後也不報錯,但不建議 return 值; 3.函數體中僅有一句話,則可以省略begin end 4.使用 delimiter語句設置結束標記 */ DELIMITER $
-
二、調用語法
- SELECT 函數名(參數列表);
- 案例
use employees $ #1.無參有返回 #案例:返回公司的員工個數 CREATE FUNCTION myf1() RETURNS INT BEGIN DECLARE c INT DEFAULT 0; SELECT COUNT(*) INTO c FROM employees; RETURN c; END $ SELECT myf1()$ #2.有參有返回 #案例1:根據員工名,返回它的工資 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('kochhor') $ #案例2:根據部門名,返回該部門的平均工資 CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE BEGIN DECLARE sal DOUBLE ; SELECT AVG(salary) INTO sal FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_name=deptName; RETURN sal; END $ SELECT myf3('IT')$
-
三、查看函數
show create function 函數名;
SHOW CREATE FUNCTION myf3 $
- 四、刪除函數
drop function 函數名;
DROP FUNCTION myf3 $
流程控制結構
- 順序結構:程序從上往下依次執行
- 分支結構:程序按條件進行選擇執行,從兩條或多條路徑中選擇一條執行
- 循環結構:程序滿足一定條件下,重複執行一組語句
一、分支結構
-
1.if函數
- 語法:if(條件,值1,值2);
- 功能:實現雙分支;
- 應用:可以作爲表達式放在任何位置
-
2.case結構
-
語法:
情況1:類似於switch,一般用於實現等值判斷。 語法: case 變量或表達式 when 值1 then 語句1; when 值2 then 語句2; ... else 語句n; end 情況2:類似於多重if語句,一般用於實現區間判斷。 語法: case when 條件1 then 語句1; when 條件2 then 語句2; ... else 語句n; end
-
特點
- ①可以作爲表達式,嵌套在其他語句中使用。
- ②可以放在任何地方,BEGIN END 中或BEGIN END 的外面可以作爲獨立的語句去使用,只能放在BEGIN END中如果wHEN中的值滿足或條件成立,則執行對應的THzN後面的語句,並且結束CASE如果都不滿足,則執行E1SE中的語句或值。
- ③ELSE可以省略,如果ELSE省略了,並且所有WHEN條件都不滿足,則返回NULL。
-
位置
- 可以放在任何位置,
- 如果放在begin end 外面,作爲表達式結合着其他語句使用
- 如果放在begin end 裏面,一般作爲獨立的語句使用
-
案例
#案例 #創建存儲過程,根據傳入的成績,來顯示等級,比如傳入的成績:90-100, 顯示A,80-90,顯示B,60-80,顯示c,否則,顯示D CREATE PROCEDURE test_case (IN score INT) BEGIN CASE WHEN score>=90 AND score<=100 THEN SELECT 'A'; WHEN score>=80 THEN SELECT 'B'; WHEN score>=60 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; END $ CALL test_case(95)$
-
-
3.if結構
-
語法:
if 條件1 then 語句1; elseif 條件2 then 語句2; .... else 語句n; end if;
-
功能:類似於多重if;只能應用在begin end 中
#案例1:創建函數,實現傳入成績,如果成績>90,返回A,如果成績>80,返回B,如果成績>60,返回C,否則返回D
CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGIN
DECLARE ch CHAR DEFAULT 'A';
CASE
WHEN score>90 THEN SET ch='A';
WHEN score>80 THEN SET ch='B';
WHEN score>60 THEN SET ch='C';
ELSE SET ch='D';
END CASE;
RETURN ch;
END $
SELECT test_case(56)$
二、循環結構
-
位置:只能放在begin end中
-
特點:都能實現循環結構
-
語法
1、while
語法:
【名稱:】while 循環條件 do
循環體
end while 【名稱】;
2、loop
語法:
【名稱:】loop
循環體
end loop 【名稱】;
3、repeat
語法:
【名稱:】repeat
循環體
until 結束條件
end repeat 【名稱】;
- 對比
①這三種循環都可以省略名稱,但如果循環中添加了循環控制語句(leave或iterate)則必須添加名稱
②
loop 一般用於實現簡單的死循環
while 先判斷後執行
repeat 先執行後判斷,無條件至少執行一次
- 案例
#1.沒有添加循環控制語句
#案例:批量插入,根據次數插入到admin表中多條記錄
USE girls$
DROP PROCEDURE pro_while1$
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 $
CALL pro_while1(158)$
select * from admin $
/*
int i=1;
while(i<=insertcount){
//插入
i++;
}
*/
#2.添加leave語句
#案例:批量插入,根據次數插入到admin表中多條記錄,如果次數>20則停止
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
CALL test_while1(100)$
select * from admin $
#3.添加iterate語句
#案例:批量插入,根據次數插入到admin表中多條記錄,只插入偶數次
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
END WHILE a;
END $
CALL test_while1(100)$
/*
int i=0;
while(i<=insertCount){
i++;
if(i%2==0){
continue;
}
插入
}
*/
select * from admin $
二、循環控制語句
- leave:類似於break,用於跳出所在的循環
- iterate:類似於continue,用於結束本次循環,繼續下一次