MySQL6天筆記——day06

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 ENDBEGIN 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 變量或表達式
      when1 then 語句1;
      when2 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中

  • 特點:都能實現循環結構

  • 語法

1while
語法:
【名稱:】while 循環條件 do
		循環體
end while 【名稱】;
2loop
語法:
【名稱:】loop
		循環體
end loop 【名稱】;

3repeat
語法:
【名稱:】repeat
		循環體
until 結束條件 
end repeat 【名稱】;
  • 對比
①這三種循環都可以省略名稱,但如果循環中添加了循環控制語句(leaveiterate)則必須添加名稱
②
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,用於結束本次循環,繼續下一次

歡迎斧正!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章