MySQL拓展操作
MySQL除了基本的增刪該查功能,還有以下拓展功能:
create table t1(id int ....,num int,xx int,unique 唯一索引名稱 (列名,列名),constraint ....)索引不能重復 功能: 1.加速檢索 2.約束數據不重復 索引/聯合唯一索引unique 如果只寫一列,關聯另一張表的id,實際上就是建立一張一對一關系表。
如果寫了兩列,分別關聯兩張表的id字段,實際上就是給兩張表建立了多對多關系。
視圖:為某個查詢語句設置別名,方便以后使用創建:CREATE VIEW 視圖名稱 AS SQL語句 eg:CREATE VIEW tb1 AS SELECT * FROM tb WHERE ID > 10; 這是一個虛擬表,會從數據庫動態的添加修改:ALTER VIEW 視圖名稱 as SQL語句刪除:DROP VIEW 視圖名稱 觸發器:當對某個表進行增刪改時,希望觸發某個操作。相當于一個中間件,可以在增刪改時執行觸發器設定好的操作增: CREATE TRIGGER T1 BEFORE INSERT(或為AFTER) ON 表名 FOR EACH ROW(每增加一條數據都會執行) DELIMITER // (mysql默認分號結尾改為//) BEGINSQL語句,eg:INSERT INTO teacher (name,gender) VALUES('張','男');(觸發器的每次都會在teacher表插入新數據) END // DELIMITER ;(設定為分號結尾,防止對其他操作影響)刪: CREATE TRIGGER T2 BEFORE(或為AFTER) DELETE ON 表名 FOR EACH ROW BEGIN ... END改: CREATE TRIGGER T3 BEFORE(或為AFTER) UPDATE ON 表名 FOR EACH ROW BEGIN ... ENDNEW&OLD數據: 在BEGIN 和 END之間的SQL語句,可以用NEW,OLD變量,NEW表示新加入的數據,OLD可以表示刪除或修改后的數據: eg:INSERT INTO teacher(name) VALUES(NEW.name)可以將插入數據的字段加到teacher表新數據的name字段中刪除觸發器: DROP TRIGGER 觸發器名稱調用觸發器: 不能有用戶調用,是基于某張表的操作時自動調用 函數:MySQL有很多內置函數,可以參考官方文檔:https://dev.mysql.com/doc/refman/5.7/en/functions.html 比如字符串拼接:CONCAT('hello',‘world’),時間格式化:SELECT DATE_FORMAT(ctime,"%Y-%m"),COUNT(1) FROM tb GROUP BY DATE_FORMAT(ctime,"%Y-%m")設置自定義函數:(注意:與觸發器不同,函數中不能寫sql語句) delimiter \\ create function f1(i1 int,i2 int) returns int BEGINdeclare num int;set num = i1 + i2;return(num); END \\ delimiter ;函數調用: SELECT f1(nid,id),name FROM tb1刪除函數: DROP function f1 存儲過程:是一個SQL語句集合,當程序調用存儲過程的時候,會執行存儲過程中的SQL語句 delimiter // create procedure p1() BEGINselect * from t1; END// delimiter ;調用:call p1()存儲過程可以傳遞參數,參數有三種類型: in 僅可以作為傳入參數 out 盡可以作為存儲過程的傳出值 inout 可以作為傳入或傳出的參數===========創建一個帶參數的存儲過程:=========== delimiter \\ create procedure p1(in i1 int,in i2 int,inout i3 int,out r1 int ) BEGINDECLARE temp1 int;DECLARE temp2 int default 0; set temp1 = 1;set r1 = i1 + i2 + temp1 + temp2;set i3 = i3 + 100;end\\ delimiter ;==========執行存儲過程============= set @t1 =4; 注意out類型的值傳入要用變量傳入 set @t2 = 0; CALL p1 (1, 2 ,@t1, @t2); SELECT @t1,@t2;==========out值的意義======== 當我們執行存儲過程的時候會返回給我們 SQL語句的結果集,同時也會返回給我們out的數值,這有什么意義呢? 其實在存儲過程中如果有很多SQL語句,我們無法確定是否全部執行成功,如果在SQL語句的最后加上一個對out變量的操作,就可以檢查存儲過程是否執行成功了。 事物:讓SQL存儲過程支持事物操作 delimiter \\ create PROCEDURE p5(OUT p_return_code tinyint) BEGIN DECLARE exit handler for sqlexception (如果發生異常會執行DECLARE部分下的代碼) BEGIN -- ERROR set p_return_code = 1; rollback; END; START TRANSACTION; (正常執行代碼) DELETE from tb1; insert into tb2(name)values('seven'); COMMIT; -- SUCCESS set p_return_code = 2; END\\ delimiter ;存儲過程中用set設置變量,用call來調用存儲過程,select查看結果
?
游標:是SQL中的for循環語法,如果要對數據每一行進行計算處理可以使用,相當于自建一個方法對每一行的字段進行處理。
delimiter // create procedure p3() begin declare ssid int; -- 自定義變量1 declare ssname varchar(50); -- 自定義變量2 DECLARE done INT DEFAULT FALSE;DECLARE my_cursor CURSOR FOR select sid,sname from student;(游標處理哪些數據) DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;(游標停止條件)open my_cursor; xxoo: LOOPfetch my_cursor into ssid,ssname;if done then leave xxoo; END IF;(下面寫游標完成后執行的操作) insert into teacher(tname) values(ssname); end loop xxoo; close my_cursor; end // delimter ;?
動態執行SQL(防SQL注入)
delimiter \\ DROP PROCEDURE IF EXISTS proc_sql \\ CREATE PROCEDURE proc_sql () BEGINdeclare p1 int;set p1 = 11;set @p1 = p1;PREPARE prod FROM 'select * from tb2 where nid > ?'; (準備階段預檢測SQL語句的合法性)EXECUTE prod USING @p1;(格式化SQL語句,如拼接)DEALLOCATE prepare prod; (執行)END\\ delimiter ;?
轉載于:https://www.cnblogs.com/jimmyhe/p/10429610.html
總結
- 上一篇: 汇编语言:实验8分析一个奇怪的程序
- 下一篇: 两栈共享存储空间算法