程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 基本開題的感覺是了-MySQL繼續繼續(自定義函數&存儲過程),開題-mysql

基本開題的感覺是了-MySQL繼續繼續(自定義函數&存儲過程),開題-mysql

編輯:關於PHP編程

基本開題的感覺是了-MySQL繼續繼續(自定義函數&存儲過程),開題-mysql


  hi

感覺論文開題基本確定了,凱森

1、MySQL

-----自定義函數-----

----基本

兩個必要條件:參數和返回值(兩者沒有必然聯系,參數不一定有,返回一定有)

函數體:合法的SQL語句;以及簡單的SELECT或INSERT語句;如果為復合結構則使用BEGIN...END語句

----不帶參數的自定義函數

把當前時刻轉換為中文顯示,效果如下

mysql> SET NAMES gbk;
Query OK, 0 rows affected (0.05 sec)

mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %h點:%I分:%s秒');
+--------------------------------------------------+
| DATE_FORMAT(NOW(),'%Y年%m月%d日 %h點:%I分:%s秒') |
+--------------------------------------------------+
| 2015年11月11日 07點:07分:39秒 |
+--------------------------------------------------+
1 row in set (0.00 sec)

把這個功能寫成函數f1()

mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30)
-> RETURN DATE_FORMAT(NOW(),'%y年%m月%d日 %h點:%I分:%s秒');
Query OK, 0 rows affected (0.05 sec)

調用

mysql> SELECT f1();

----帶有參數的函數

mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
-> RETURNS FLOAT(10,2) UNSIGNED
-> RETURN (num1+num2);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT f2(32,33);
+-----------+
| f2(32,33) |
+-----------+
| 65.00 |
+-----------+
1 row in set (0.03 sec)

我就不解釋了,都看的懂

----具有復合結構體的函數

復合結構的函數往往意味著有多條語句要實現。比如往以下數據庫中,創建函數實現插入參數作為新的username,返回最後插入字段的id

mysql> DESC test;
+----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+----------------+
| id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | YES | | NULL | |
+----------+---------------------+------+-----+---------+----------------+

mysql> SELECT * FROM test;
+----+----------+
| id | username |
+----+----------+
| 1 | 111 |
| 2 | JOHN |
+----+----------+

實現的時候會發現,如果直接寫,會有兩句話是要打分號的,不合適,改!

mysql> DELIMITER //

把結束符號改為//

實際函數就是

mysql> CREATE FUNCTION adduser(username VARCHAR(20))
-> RETURNS INT UNSIGNED
-> BEGIN
-> INSERT test(username) VALUES(username);
-> RETURN LAST_INSERT_ID();
-> END
-> //

調用檢查

mysql> SELECT adduser('Rose')//
+-----------------+
| adduser('Rose') |
+-----------------+
| 3 |
+-----------------+

當然這時候可以改回來定界符

mysql> DELIMITER ;
mysql> SELECT adduser('Rose2');
+------------------+
| adduser('Rose2') |
+------------------+
| 4 |
+------------------+

----最後一點說明

一般不會用到自定義函數,很少用,用好自帶函數就好

-----MySQL存儲過程-----

 ----簡介

一般的目的是提高MySQL的效率,去掉或者縮減其自身的存儲過程

存儲過程的定義是:它是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作為一個單元處理(實際理解就是說把一系列,當然也可以是某一個,操作合並/封裝為一個操作;又由於這是在MySQL中的,數據庫一般的操作成為存儲,所以稱為存儲過程)

采用存儲過程後,只有在第一次進行語法檢查和編譯,以後用戶再調用就省去這兩步,效率提高

---

優點:增強SQL語句的功能和靈活性;較快的執行速度(如上);減少網絡流量(即縮減命令的長度);

----結構解析/創建

類似創建自定義函數,參數處不太一樣

---參數

給參數可以賦值類型IN OUT INOUT

IN表示該參數的值必須在調用存儲過程時指定,且不能返回

OUT表示~~~可以被存儲過程改變,且可以返回

INOUT表示~~~在調用時指定,且可以被改變和返回

---結構體

類似函數體

可以是任意的SQL語句構成

復合結構也得用BEGIN...END

可以聲明,循環等

----不帶參數的存儲過程

mysql> CREATE PROCEDURE sp1() SELECT VERSION();
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT sp1();
ERROR 1305 (42000): FUNCTION test.sp1 does not exist
mysql> CALL sp1();
+-----------+
| VERSION() |
+-----------+
| 5.6.17 |
+-----------+

存儲過程的調用時CALL,且有兩種調用方法-帶或者不帶括號

----帶有IN類型參數的存儲過程

刪除記錄的存儲過程,通過id來刪除

mysql> DELIMITER //
mysql> CREATE PROCEDURE removeUserById(IN id INT UNSIGNED)
-> BEGIN
-> DELETE FROM test WHERE id=id;
-> END
-> //
Query OK, 0 rows affected (0.04 sec)

mysql> DELIMITER ;

注意這裡的id=id,前者是表中的id,後者是傳遞的參數,是可以這麼寫的(?)

還有要注意這裡的習慣,DELIMITER開頭結尾+BEGIN...END語句的寫法

調用

mysql> CALL removeUserById(3);

Query OK, 4 rows affected (0.05 sec)

注意,有參數的過程,不能省略小括號

這裡,數據中所有記錄都被刪除。所以一般過程的參數不要和數據表中字段名相同!

這裡的修改只能是刪除過程再重建個正確的。DROP PROCEDURE REMOVEUSERBYID;

----帶有IN和OUT參數

過程定義為:刪除某id的記錄,返回剩余記錄數量

和寫正則表達式等的流程差不多,先考慮需求:兩個操作,返回一個值,傳遞進一個值,所以兩個參數,一個IN,一個OUT

mysql> DELIMITER //
mysql> CREATE PROCEDURE REMOVEIDRETURNLENGTH(IN p_id INT UNSIGNED,OUT usernums INT UNSIGNED)
-> BEGIN
-> DELETE FROM test WHERE id=p_id;
-> SELECT count(id) FROM test INTO usernums;
-> END
-> //
Query OK, 0 rows affected (0.02 sec)

mysql> DELIMITER ;

調用

mysql> CALL REMOVEIDRETURNLENGTH(3,@NUMS);
Query OK, 1 row affected (0.03 sec)

mysql> SELECT @NUMS;
+-------+
| @NUMS |
+-------+
| 4 |
+-------+
1 row in set (0.00 sec)

這裡的@nums是變量

mysql> SET @QQ=2;
Query OK, 0 rows affected (0.00 sec)

這種變量稱為用戶變量,僅對當前用戶有效,帶有@符號

----帶有多個OUT參數的過程

比如一個擁有很多字段的數據表

實現過程:刪除某個id的字段,返回被刪除的用戶,以及返回剩余的用戶

DELIMITER //

CREATE PROCEDURE removereturn2(IN p_age SMALLINT UNSIGNED,OUT remove_user SMALLINT UNSIGNED,OUT usercount SMALLINT UNSIGNED)

BEGIN

DELETE FROM test WHERE age=p_age;

SELECT ROW_COUNT() INTO REMOVE_USER;

SELECT COUNT(ID) FROM test INTO USERCOUNT;

END

//

DELIMITER ;

其中,ROW_COUNT是個自帶函數

CALL REMOVERETURN2(20,@A,@B);

SELECT @A,@B;

需要注意的是,由於過程的創建後不能修改,第一次創建盡量不要錯,要不就不要怕麻煩

----存儲過程和自定義函數的區別

存儲過程功能復雜一些,常用於對表的操作;函數一般不用做對表的操作

~~~~可以返回多個值;函數一般返回一個值

~~~~一般獨立的來執行;函數可以作為其他SQL語句的組成部分來出現

~~~~常用,來封裝復雜過程;函數很少用

2、PHP與MySQL

明天開始學習PHP中常用的MySQL函數(?)

 

bye

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved