mysql 触发器 运算符_mysql三元运算,上下连表,视图,触发器,存储过程,事务等不常用方法...
1 MySql中的三元運(yùn)算符有兩種方法:
1、case when 條件 then (條件為true時(shí)執(zhí)行) else(條件為false時(shí)執(zhí)行) end;/*end不可少*/
2、select *,if(expr1,expr2,expr3) from 表名;
實(shí)例:SELECT if(isnull(sum(c.MONEY)),0,sum(c.MONEY)) AS m1 FROM Table
2 上下連表:
select 列名,列名 from 表名
union
select 列名,列名 from 表名;
這連表方法自動(dòng)去重,如果不想去重,則union改成 union all。 需要注意的是上下連表的 所連接的表的列數(shù)目需要相同。
3 視圖
MYSQL語(yǔ)句:
CREATE VIEW? 視圖名 AS SELECT 列名 FROM 表名 WHERE 條件;
ALTER VIEW? 視圖名 AS SELECT 列名 FROM 表名 WHERE 條件;
視圖是一張?zhí)摂M表,動(dòng)態(tài)的隨著原始表更新而更新;
4 觸發(fā)器
觸發(fā)器是與表有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,在滿足定義條件時(shí)觸發(fā),并執(zhí)行觸發(fā)器中定義的語(yǔ)句集合。觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫(kù)端確保數(shù)據(jù)的完整性。
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW?trigger_stmt
trigger_name:觸發(fā)器的名稱
tirgger_time:觸發(fā)時(shí)機(jī),
為BEFORE或者AFTER
trigger_event:觸發(fā)事件,為INSERT、DELETE或者UPDATE
tb_name:表示建立觸發(fā)器的表名,就是在哪張表上建立觸發(fā)器
trigger_stmt:觸發(fā)器的程序體,可以是一條SQL語(yǔ)句或者是用BEGIN和END包含的多條語(yǔ)句 所以可以說(shuō)MySQL創(chuàng)建以下六種觸發(fā)器: BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE AFTER INSERT,AFTER DELETE,AFTER UPDATE
mysql> DELIMITER //
mysql> CREATE TRIGGER demo BEFORE DELETE ON users FOR EACH ROW BEGIN INSERT INTO logs VALUES(NOW());
INSERT INTO logs VALUES(NOW()); END //
mysql> DELIMITER ;
DELIMITER 用于修改結(jié)束語(yǔ)句的符號(hào),上例就是將符號(hào)改為//,結(jié)尾又改回來(lái)了,目的是為了觸發(fā)器里面的觸發(fā)語(yǔ)句不引發(fā)錯(cuò)誤。
NEW.columnname:新增行的某列數(shù)據(jù)
OLD.columnname:刪除行的某列數(shù)據(jù)
5 函數(shù)
MySQL中提供了許多內(nèi)置函數(shù)
自定義函數(shù)
delimiter \\
create function f1(
i1 int,
i2 int)
returns int
BEGIN
declare num int;
set num = i1 + i2;
return(num);
END \\
delimiter ;
刪除函數(shù)
drop function func_name;
執(zhí)行函數(shù)
獲取返回值
declare @i VARCHAR(32);
select UPPER('alex') into @i;
SELECT @i;
在查詢中使用
select f1(11,nid) ,name from tb2;
6 執(zhí)行過(guò)程
存儲(chǔ)過(guò)程是一個(gè)SQL語(yǔ)句集合,當(dāng)主動(dòng)去調(diào)用存儲(chǔ)過(guò)程時(shí),其中內(nèi)部的SQL語(yǔ)句會(huì)按照邏輯執(zhí)行。
創(chuàng)建存儲(chǔ)過(guò)程
delimiter //
create procedure p1()
BEGIN
select * from t1;
END//
delimiter ;
執(zhí)行存儲(chǔ)過(guò)程
call p1()
創(chuàng)建有參數(shù)的存儲(chǔ)過(guò)程,
in ? ? ? ? ?僅用于傳入?yún)?shù)用
out ? ? ? ?僅用于返回值用
inout ? ? 既可以傳入又可以當(dāng)作返回值
delimiter \\
create procedure p1(
in i1 int,
in i2 int,
inout i3 int,
out r1 int
)
BEGIN
DECLARE temp1 int;
DECLARE temp2 int default 0;
set temp1 = 1;
set r1 = i1 + i2 + temp1 + temp2;
set i3 = i3 + 100;
end\\
delimiter ;
-- 執(zhí)行存儲(chǔ)過(guò)程
set @t1 =4;
set @t2 = 0;
CALL p1 (1, 2 ,@t1, @t2);
SELECT @t1,@t2;
解釋: set @ti =4,set 是賦值的key word,@代表這個(gè)關(guān)鍵字是定義域是session,t1是變量名字。
7 事務(wù)
1、原子性(Atomicity):事務(wù)開(kāi)始后所有操作,要么全部做完,要么全部不做,不可能停滯在中間環(huán)節(jié)。事務(wù)執(zhí)行過(guò)程中出錯(cuò),會(huì)回滾到事務(wù)開(kāi)始前的狀態(tài),所有的操作就像沒(méi)有發(fā)生一樣。也就是說(shuō)事務(wù)是一個(gè)不可分割的整體,就像化學(xué)中學(xué)過(guò)的原子,是物質(zhì)構(gòu)成的基本單位。
2、一致性(Consistency):事務(wù)開(kāi)始前和結(jié)束后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞 。比如A向B轉(zhuǎn)賬,不可能A扣了錢(qián),B卻沒(méi)收到。
3、隔離性(Isolation):同一時(shí)間,只允許一個(gè)事務(wù)請(qǐng)求同一數(shù)據(jù),不同的事務(wù)之間彼此沒(méi)有任何干擾。比如A正在從一張銀行卡中取錢(qián),在A取錢(qián)的過(guò)程結(jié)束前,B不能向這張卡轉(zhuǎn)賬。
4、持久性(Durability):事務(wù)完成后,事務(wù)對(duì)數(shù)據(jù)庫(kù)的所有更新將被保存到數(shù)據(jù)庫(kù),不能回滾。
delimiter \\
create PROCEDURE p1( -- procedure 關(guān)鍵字,字義 程序
OUT p_return_code tinyint -- 全session的變量 短整數(shù)類型。
)
BEGIN
DECLARE exit handler for sqlexception --mysql的異常處理,declare (聲明) exit(退出這個(gè)存儲(chǔ)過(guò)程)
handler for sqlexception --出現(xiàn)sqlception 時(shí)
BEGIN -- ERROR set p_return_code = 1; rollback;
END;
DECLARE exit handler for sqlwarning BEGIN -- WARNING set p_return_code = 2;
rollback; END; START TRANSACTION; ---START TRANSACTION 或 BEGIN 開(kāi)啟事務(wù)
DELETE from tb1;
insert into tb2(name)values('seven');
COMMIT; --提交事務(wù)(關(guān)閉事務(wù))
-- SUCCESS
set p_return_code = 0;
END\\
delimiter ;
mysql異常處理詳解
總結(jié)
以上是生活随笔為你收集整理的mysql 触发器 运算符_mysql三元运算,上下连表,视图,触发器,存储过程,事务等不常用方法...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html表格按钮相对位置不变,表格中如何
- 下一篇: 农历php,PHP农历公历转换