mysql storage_mySQL__storage课堂笔记和练习
#存儲過程和函數(shù)
/*
存儲過程和函數(shù)類似于Java中的方法
好處:
1、提高代碼重用性
2、簡化操作
*/
#存儲過程
/*
含義:一組編譯好的SQL語句的集合,理解成批處理語句
1、提高代碼的重用性
2、簡化操作
3、減少了編譯次數(shù)
4、減少了和數(shù)據(jù)庫服務器連接次數(shù),提高了效率
*/
#一、創(chuàng)建
CREATE PROCEDURE 存儲過程名(參數(shù)列表)
BEGIN
存儲過程體(一組合法的SQL語句)
END
注意:
1、參數(shù)列表包含3個部分
參數(shù)模式 參數(shù)名 參數(shù)類型
舉例:
IN stuname VARCHAR(20)
參數(shù)模式:
IN:修飾的參數(shù)可以作為入口,也就是說該參數(shù)需要調用方傳入值
OUT:修飾的參數(shù)可以作為出口,也就是說該參數(shù)可以作為返回值
INOUT:修飾的參數(shù)可以作為出口/入口,既可以傳入值又可以返回值
2、如果存儲過程體僅僅只有1句話,BEGIN END可以省略
3、存儲過程體中的每條SQL語句的結尾要求必須加分號,
存儲過程的結尾可以使用DELIMITER重新設置
語法:
DELIMITER 結束標記
案例:
DELIMITER $
#二、調用
CALL 存儲過程名(實參列表);
#1、空白列表
#案例:插入到admin表中5條記錄
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 $
#如果SQLyog中運行不了,就粘貼到cmd打開girls數(shù)據(jù)庫,再運行
#調用
CALL myp1()$#之后結束符號都不是;了,都換成$
SELECT * FROM admin$
#如果SQLyog中運行不了,就粘貼到cmd打開girls數(shù)據(jù)庫,再運行
#2、創(chuàng)建帶in模式參數(shù)的存儲過程
#案例1:創(chuàng)建存儲過程實現(xiàn),根據(jù)女神名查詢對應的男神信息
#IN 可以省略,但是不建議
#定義
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('宋茜')$
#如果出現(xiàn)報錯: Incorrect string value: '\xC1\xF8\xD1\xD2' for column 'beautyName' at row 8
#說明是字符集的問題,這時要重新設置一下字符集
SET NAMES gbk$
CALL myp2('宋茜')$#不報錯了
#案例2:創(chuàng)建存儲過程實現(xiàn),用戶登陸是否成功
#定義
CREATE PROCEDURE myp5(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 myp5('張飛','8888')$
#3、創(chuàng)建帶out模式的存儲過程
#案例1:根據(jù)女神名,返回對應的男神名
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 b.boyfriend_id=bo.id
WHERE b.name=beautyName;
END$
#調用
#第二個參數(shù)就是一個變量,不需要有值,用于接收返回值
SET @bName$#定義一個用戶變量,甚至可以不定義,直接用@bName
CALL myp6('宋茜',@bName)$
SELECT @bName$#這就是男神名
#案例2:根據(jù)女神名,返回對應的男神名和男神的魅力值
CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)
BEGIN
SELECT bo.boyName,bo.userCP INTO boyName,userCP
FROM boys bo
INNER JOIN beauty b ON b.boyfriend_id=bo.id
WHERE b.name=beautyName;
END$
#調用
CALL myp7('宋茜',@bName,@usercp)$
SELECT @bName,@usercp$
#4、創(chuàng)建帶有inout模式參數(shù)的存儲過程
#案例1:傳入a和b兩個值,最終a和b都翻倍并返回
CREATE PROCEDURE myp8(INOUT a INT, INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END$
#調用
#注意:不可以直接往存儲過程中傳常數(shù),如果傳常數(shù),返回的值將沒有位置放
#因此在調用之前,必須要先定義兩個有值的變量
SET @m=10$
SET @n=20$
CALL myp8(@m,@n)$
SELECT @m,@n$
#三、存儲過程的刪除
/*
語法:drop procedure 存儲過程名稱
說明:每次只能刪除一個【在SQLyog中就可以運行】
*/
DROP PROCEDURE test_prop3;
#四、查看存儲過程信息
SHOW CREATE PROCEDURE myp2;
#desc myp2是錯誤寫法
#【練習】
#練習1:創(chuàng)建存儲過程,實現(xiàn)傳入用戶名和密碼,插入到admin表中
CREATE PROCEDURE test_pro1(IN username VARCHAR(20),IN loginPwd VARCHAR(20))
BEGIN
INSERT admin(admin.username,PASSWORD)
VALUES(userName,loginPwd);
END;$#這里也可以加個分號
CALL test_pro1('admin','0000')$
SELECT * FROM admin$
#練習2:創(chuàng)建存儲過程實現(xiàn)傳入女神編號,返回女神名稱和女神電話
CREATE PROCEDURE test_pro2(IN id INT, OUT `name` VARCHAR(20) , OUT phone VARCHAR(20))
BEGIN
SELECT b.name,b.phone INTO `name`,phone
FROM beauty b
WHERE b.id=id;
END$
CALL test_pro2(7,@n,@p)$
SELECT @n,@p$
#練習3:創(chuàng)建存儲過程或函數(shù)實現(xiàn)傳入兩個女神生日,返回大小
CREATE PROCEDURE test_pro3(IN birth1 DATETIME, IN birth2 DATETIME,OUT result INT)
BEGIN
SELECT DATEDIFF(birth1,birth2) INTO result;
END$
CALL test_pro3('1998-1-1',NOW(),@result)$
SELECT @result$
#練習4:創(chuàng)建存儲過程或函數(shù)實現(xiàn)傳入一個日期,格式化成xx年xx月xx日并返回
CREATE PROCEDURE test_pro4(IN mydate DATETIME,OUT strDate VARCHAR(50))
BEGIN
SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;
#DATE_FORMAT將日期轉換為字符串并且返回一個字符串
END$
CALL test_pro4(NOW(),@str)$
SELECT @str$
#練習5:創(chuàng)建存儲過程或函數(shù)實現(xiàn)傳入女神名稱,返回:女神 and 男神 格式的字符串
CREATE PROCEDURE test_pro5(IN beautyName VARCHAR(20),OUT str VARCHAR(50))
BEGIN
SELECT CONCAT(beautyName,' and ',IFNULL(boyName,'null')) INTO str
FROM boys bo
RIGHT JOIN beauty b ON b.boyfriend_id=bo.id
WHERE b.name=beautyName;
END$
CALL test_pro5('宋茜',@str)$
SELECT @str$
#練習6:創(chuàng)建存儲過程函數(shù),根據(jù)傳入的條目數(shù)和起始索引,查詢beauty表的記錄
CREATE PROCEDURE test_pro6(IN startIndex INT, IN size INT)
BEGIN
SELECT * FROM beauty LIMIT startIndex,size;
END$
CALL test_pro6(1,2)$#索引和id無關
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的mysql storage_mySQL__storage课堂笔记和练习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ansible
- 下一篇: pdo mysql like_PHP P