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