通過Mysql存儲過程我們可以做很多事情
~~~
1、使用了存過程,很多相似性的刪除,更新,新增等操作就變得輕松了,并且以后也便于管理!
2、存儲過程因為SQL語句已經預編繹過了,因此運行的速度比較快。???
3、存儲過程可以接受參數、輸出參數、返回單個或多個結果集以及返回值。可以向程序返回錯誤原因。?????
4、存儲過程運行比較穩定,不會有太多的錯誤。只要一次成功,以后都會按這個程序運行。?????
5、存儲過程主要是在服務器上運行,減少對客戶機的壓力。???
6、存儲過程可以包含程序流、邏輯以及對數據庫的查詢。同時可以實體封裝和隱藏了數據邏輯。???
7、存儲過程可以在單個存儲過程中執行一系列SQL語句。???
8、存儲過程可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。
~~~
**來一個實例先吧,我用來做數據備份測試的存儲過程 之前一直都沒有機會用到存儲過程,現在總算可以好好深入一下了**
SQL
~~~
#創建測試表數據存儲過程
DROP PROCEDURE IF EXISTS insert_test; #如果存在這個存儲過程就刪除他
DELIMITER $$ #定義命令界定符
CREATE
PROCEDURE `insert_test`() #創建insert_test存儲過程
BEGIN #存儲過程開始
DECLARE i INT; #定義一個i整型變量
SET i = 1; #給i變量賦值
WHILE i < 1000001 DO #執行while循環
INSERT INTO `pyg_test`(`test1`,`test2`) VALUES(
'阿薩德發生飛灑地方撒旦法阿薩德飛灑地方撒旦法撒旦發給撒旦法士大夫士大夫撒旦法撒旦發生大幅十',
'阿薩德發生飛灑地方撒旦法阿薩德飛灑地方撒旦法撒旦發給撒旦法士大夫士大夫撒旦法撒旦發生大幅十'
); #while條件成立時執行insert into操作
SET i = i + 1; #執行完成insert into將變量i+1
END WHILE; #while循環結束
END$$ #執行存儲過程創建
DELIMITER ; #恢復命令界定符
CALL insert_test(); #調用存儲過程
~~~
**一.創建存儲過程**
**????1.基本語法:**
????????create procedure sp_name()
????????begin
????????.........
????????end
**????2.參數傳遞**
**二.調用存儲過程**
????**1.基本語法:call sp_name()**
????注意:存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數傳遞
**三.刪除存儲過程**
????**1.基本語法:**
????????drop procedure sp_name//
???**?2.注意事項**
????????(1)不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程
**四.區塊,條件,循環**
????**1.區塊定義,常用**
????????begin
????????......
????????end;
????????也可以給區塊起別名,如:
????????lable:begin
????????...........
????????end lable;
????????可以用leave lable;跳出區塊,執行區塊以后的代碼
????**2.條件語句**
????????if 條件 then
????????#mysql code
????????else
????????#mysql code
????????end if;
???**?3.循環語句**
????????**(1).while循環**
????????????[label:] WHILE expression DO
????????????#mysql code
????????????END WHILE [label] ;
???????**?(2).loop循環**
????????????[label:] LOOP
????????????#mysql code
????????????END LOOP [label];
????????**(3).repeat until循環**
????????????[label:] REPEAT
????????????變量 : 表達式;
????????????..................
????????????UNTIL 表達式
????????????END REPEAT [label] ;
**五.其他常用命令**
????1.show procedure status
????????顯示數據庫中所有存儲的存儲過程基本信息,包括所屬數據庫,存儲過程名稱,創建時間等
????2.show create procedure sp_name
????????顯示某一個存儲過程的詳細信息
## mysql存儲過程學習總結-操作符
### **算術運算符**
+???? 加?? SET var1=2+2;?????? 4
-???? 減?? SET var2=3-2;?????? 1
*?????乘?? SET var3=3*2;?????? 6
/???? 除?? SET var4=10/3;????? 3.3333
DIV?? 整除?SET var5=10 DIV 3;? 3
%???? 取模?SET var6=10%3 ;???? 1
### **比較運算符**
>??????????? 大于?1>2?False
<??????????? 小于?2<1?False
<=?????????? 小于等于?2<=2?True
>=?????????? 大于等于?3>=2?True
BETWEEN????? 在兩值之間?5 BETWEEN 1 AND 10?True
NOT BETWEEN? 不在兩值之間?5 NOT BETWEEN 1 AND 10?False
IN?????????? 在集合中?5 IN (1,2,3,4)?False
NOT IN?????? 不在集合中?5 NOT IN (1,2,3,4)?True
=????????????等于?2=3?False
3?False
????????? 嚴格比較兩個NULL值是否相等?NULLNULL?True
LIKE?????????簡單模式匹配?"Guy Harrison" LIKE "Guy%"?True
REGEXP?????? 正則式匹配?"Guy Harrison" REGEXP "[Gg]reg"?False
IS NULL????? 為空?0 IS NULL?False
IS NOT NULL? 不為空?0 IS NOT NULL?True
**位運算符**
|?? 位或
&?? 位與
<<? 左移位
>>? 右移位
~?? 位非(單目運算,按位取反)
## mysql存儲過程基本函數
**一.字符串類?**
CHARSET(str) //返回字串字符集
CONCAT (string2? [,... ]) //連接字串
INSTR (string ,substring ) //返回substring首次在string中出現的位置,不存在返回0
LCASE (string2 ) //轉換成小寫
LEFT (string2 ,length ) //從string2中的左邊起取length個字符
LENGTH (string ) //string長度
LOAD_FILE (file_name ) //從文件讀取內容
LOCATE (substring , string? [,start_position ] ) 同INSTR,但可指定開始位置
LPAD (string2 ,length ,pad ) //重復用pad加在string開頭,直到字串長度為length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重復count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替換search_str
RPAD (string2 ,length ,pad) //在str后用pad補充,直到長度為length
RTRIM (string2 ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比較兩字串大小,
SUBSTRING (str , position? [,length ]) //從str的position開始,取length個字符,
注:mysql中處理字符串時,默認第一個字符下標為1,即參數position必須大于等于1
mysql> select substring('abcd',0,2);
+-----------------------+
| substring('abcd',0,2) |
+-----------------------+
|?????????????????????? |
+-----------------------+
1 row in set (0.00 sec)
mysql> select substring('abcd',1,2);
+-----------------------+
| substring('abcd',1,2) |
+-----------------------+
| ab??????????????????? |
+-----------------------+
1 row in set (0.02 sec)
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
UCASE (string2 ) //轉換成大寫
RIGHT(string2,length) //取string2最后length個字符
SPACE(count) //生成count個空格?
**二.數學類**
ABS (number2 ) //絕對值
BIN (decimal_number ) //十進制轉二進制
CEILING (number2 ) //向上取整
CONV(number2,from_base,to_base) //進制轉換
FLOOR (number2 ) //向下取整
FORMAT (number,decimal_places ) //保留小數位數
HEX (DecimalNumber ) //轉十六進制
注:HEX()中可傳入字符串,則返回其ASC-11碼,如HEX('DEF')返回4142143
也可以傳入十進制整數,返回其十六進制編碼,如HEX(25)返回19
LEAST (number , number2? [,..]) //求最小值
MOD (numerator ,denominator ) //求余
POWER (number ,power ) //求指數
RAND([seed]) //隨機數
ROUND (number? [,decimals ]) //四舍五入,decimals為小數位數]
注:返回類型并非均為整數,如:
(1)默認變為整形值
mysql> select round(1.23);
+-------------+
| round(1.23) |
+-------------+
|?????????? 1 |
+-------------+
1 row in set (0.00 sec)
mysql> select round(1.56);
+-------------+
| round(1.56) |
+-------------+
|?????????? 2 |
+-------------+
1 row in set (0.00 sec)
(2)可以設定小數位數,返回浮點型數據
mysql> select round(1.567,2);
+----------------+
| round(1.567,2) |
+----------------+
|?????????? 1.57 |
+----------------+
1 row in set (0.00 sec)
SIGN (number2 ) //返回符號,正負或0
SQRT(number2) //開平方
**三.日期時間類**
ADDTIME (date2 ,time_interval ) //將time_interval加到date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //轉換時區
CURRENT_DATE (? ) //當前日期
CURRENT_TIME (? ) //當前時間
CURRENT_TIMESTAMP (? ) //當前時間戳
DATE (datetime ) //返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或時間
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式顯示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上減去一個時間
DATEDIFF (date1 ,date2 ) //兩個日期差
DAY (date ) //返回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1為星期天
DAYOFYEAR (date ) //一年中的第幾天
EXTRACT (interval_name? FROM date ) //從date中提取日期的指定部分
MAKEDATE (year ,day ) //給出年及年中的第幾天,生成日期串
MAKETIME (hour ,minute ,second ) //生成時間串
MONTHNAME (date ) //英文月份名
NOW (? ) //當前時間
SEC_TO_TIME (seconds ) //秒數轉成時間
STR_TO_DATE (string ,format ) //字串轉成時間,以format格式顯示
TIMEDIFF (datetime1 ,datetime2 ) //兩個時間差
TIME_TO_SEC (time ) //時間轉秒數]
WEEK (date_time [,start_of_week ]) //第幾周
YEAR (datetime ) //年份
DAYOFMONTH(datetime) //月的第幾天
HOUR(datetime) //小時
LAST_DAY(date) //date的月的最后日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //月
MINUTE(datetime) //分
**附:可用在INTERVAL中的類型**
DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEAR
- 前端
- 技巧匯總
- 構建 Node + Webpack + React 熱加載開發環境
- React
- Redux
- Webpack
- ES6
- HTML5+CSS3
- Javascript
- JS超簡潔拖動代碼
- jQuery
- 后端
- 技巧匯總
- 代碼中特殊的注釋技術——TODO、FIXME和XXX的用處
- PHP
- Xdebug不解之謎
- PHP時間獲取
- PHP遞歸優化 使用匿名函數進行遞歸
- PHP 發起POST請求
- PHP獲得數組的交集與差集
- PHP遞歸獲取下級數組,可指定ID,一維數組
- PHP 判斷是否為Get/Post/Ajax提交
- PHP實現分流隊列平均顯示信息
- PHP多維數組 指定列排序
- PHP 類Class詳解 筆記記錄
- PHP取整函數詳解
- Node
- Elasticsearch
- 數據庫
- 技巧匯總
- Mysql
- Mysql分區表實現
- Mysql union與union all 查詢
- Mysql 表中表查詢
- Mysql 分組查詢 與 分組條件查詢
- MySQL 添加列,修改列,刪除列
- Mysql優化之:構建海量表,定位慢查詢
- Mysql優化之:表的設計滿足3NF
- Mysql優化常見方法
- Mysql存儲過程詳解
- 運維
- 技巧匯總
- Linux
- Linux Centos系統下 設置代理服務器上網
- Centos7增加開機啟動腳本
- centos 掛載windows共享目錄
- CentOS設置SSH Key登錄
- Linux/CentOS單網卡綁定多個IP
- Windows
- Win10開機啟動項設置全解攻略
- PuTTY連接Linux服務器經常斷線解決方案
- Docker
- Docke啟動文件 docker-compose.yml
- Docker命令簡介(未完)
- Docker閑雜筆記
- Apache
- Nginx
- Nginx配置upstream實現負載均衡
- Nginx負載均衡學習
- IDE
- 技巧匯總
- WebStorm
- PHPStorm
- 協作
- 技巧匯總
- Git
- git 放棄本地修改 強制更新
- git編譯安裝與常用命令
- Svn