系統變量
變量由系統提供,不是用戶定義,屬於服務器層面
查看所有的全局系統變量:
SHOW GLOBAL VARIABLES Variable_name Value --------------------------------------- ---------------------------------------------------------------- auto_increment_increment 1 auto_increment_offset 1 automatic_sp_privileges ON back_log 50 basedir D:\Program Files (x86)\mysql\ binlog_cache_size 32768 bulk_insert_buffer_size 8388608 character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem binary character_set_results utf8
查看指定的全局變量
例如查看隔離級別:
SELECT @@tx_isolation @@tx_isolation ----------------- REPEATABLE-READ
全局變量修改后,其他的連接的變量的值也會改變
作用域:服務器每次啟動將為所有的全局變量賦初始值,針對於所有的會話(連接)有效,但不能跨重啟(配置文件內的除外)
會話變量
作用域:僅僅針對於當前會話(連接)有效
查看會話變量
SHOW SESSION VARIABLES Variable_name Value --------------------------------------- ---------------------------------------------------------------- auto_increment_increment 1 auto_increment_offset 1 automatic_sp_privileges ON back_log 50 basedir D:\Program Files (x86)\mysql\ binlog_cache_size 32768 bulk_insert_buffer_size 8388608 character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem binary
自定義變量
用戶變量
作用域
針對於當前會話有效,與會話變量的作用域有效
聲明
聲明時必須初始化,格式是 :
set @變量名=值;或 set @變量名:=值;或 select @變量名:=值
賦值
方式一:
set @變量名=值;或 set @變量名:=值;或 select @變量名:=值
方式二:
select 字段 into 變量名 from 表名
SELECT COUNT(1) INTO @studentNumber FROM student
使用(查看用戶變量的值)
SELECT @studentNumber
局部變量
作用域
僅僅在定義它的begin end中有效,且只能放在begin end中的第一句話
聲明
declare 變量名 類型; declare 變量名 類型 default 值(聲明變量的同時進行賦值)
賦值
set 變量名=值;或 set 變量名:=值;或 select @變量名:=值 select 字段 into 變量名 from 表名
使用
select 局部變量名
案例
用戶變量
聲明兩個變量並賦初始值,求和
SET @a=1; SET @b=2; SET @sum= @a+@b; SELECT @sum;
結果
@sum -------- 3
存儲過程和函數
含義
一組預編譯好的SQL語句的集合
好處
提高代碼的可重用性
簡化操作
減少了編譯次數和數據庫服務器的連接次數,提高了效率
創建
創建語法
create procedure 存儲過程名(參數列表)
begin
存儲過程體
end
參數列表
參數模式 參數名 參數類型
參數模式
IN:該參數作為輸入,需要調用方傳入值1
OUT:該參數作為輸出,可以作為返回值
INOUT:該參數既可以作為輸入也可以作為輸出,既可以輸入值也可以返回值
調用語法
CALL 存儲過程名(實參列表)
注意事項
如果存儲過程體只有一句話,begin end可省略
存儲過程體中的每條SQL語句的結尾必須加分號
存儲過程的結尾可以使用 DELIMITER重新設置
案例
無參
進入docker容器mysql窗口並登錄,將書寫的存儲過程語句粘貼進去運行,運行成功后可以在可視化工具中看到存儲過程
delimiter $ create procedure myInsert() begin insert into student (birthday,classno,phone,sex,sname,score) values ('1998-11-11','202001','18739396145','nv','tom',501.0), ('1998-11-11','202001','18739490123','nan','jack',503.0); end $
調用存儲過程
call myInsert()$
執行查詢語句
| 2020043105 | 1998-11-11 | 202001 | 18739396145 | nv | tom | 501 | | 2020043106 | 1998-11-11 | 202001 | 18739490123 | na | jack | 503 | +------------+------------+---------+-------------+------+-----------+-------+
有輸入參數
案例一
delimiter $ create procedure snameIn(IN name varchar(8)) begin select sname,score.* from student left join score on student.studentno =score.studentno where student.sname=name; end $
調用存儲過程
call snameIn('王石')$
案例二
DELIMITER $ CREATE PROCEDURE login(IN username VARCHAR(12),IN passwd VARCHAR(6)) BEGIN DECLARE result INT DEFAULT 0; SELECT COUNT(*) INTO result FROM login WHERE login.account=username AND login.password=passwd; SELECT IF(result>0,'成功','失敗'); END $
有輸出參數
返回一個字段的值
DELIMITER $ CREATE PROCEDURE shuchu(IN NAME VARCHAR(8),OUT finall DOUBLE) BEGIN SELECT score.finall INTO finall FROM student LEFT JOIN score ON student.studentno=score.studentno WHERE student.sname=NAME; END $ CALL shuchu('zhai',@fin)$ SELECT @fin$
返回多個字段的值
需要注意一個問題:下面的書寫select並分別給兩個輸出參數賦值的寫法是不對的
DELIMITER $ CREATE PROCEDURE outputTwo(IN NAME VARCHAR(8),OUT finall DOUBLE,OUT usually DOUBLE) BEGIN SELECT score.finall INTO finall,score.usually INTO usually FROM student LEFT JOIN score ON student.studentno=score.studentno WHERE student.sname=NAME; END $
需要將兩個賦值語句合並為一次賦值
DELIMITER $ CREATE PROCEDURE outputTwo(IN NAME VARCHAR(8),OUT finall DOUBLE,OUT usually DOUBLE) BEGIN SELECT score.finall,score.usually INTO finall,usually FROM student LEFT JOIN score ON student.studentno=score.studentno WHERE student.sname=NAME; END $
先調用:
查看結果:
INOUT模式
CREATE PROCEDURE inouttest(INOUT a INT,INOUT b INT) BEGIN SET a=a*2; SET b=b*2; END $
刪除
存儲過程的刪除
drop procedure 存儲過程名$
查看
查看存儲過程信息
SHOW CREATE PROCEDURE 存儲過程名稱
總結:
DELIMITER:相當於定義一個結束符,在默認情況下遇到;后就會默認結束