日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql-视图、事物等

發(fā)布時(shí)間:2023/11/30 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql-视图、事物等 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、視圖

視圖是一個(gè)虛擬表(非真實(shí)存在),其本質(zhì)是【根據(jù)SQL語(yǔ)句獲取動(dòng)態(tài)的數(shù)據(jù)集,并為其命名】,用戶(hù)使用時(shí)只需使用【名稱(chēng)】即可獲取結(jié)果集,可以將該結(jié)果集當(dāng)做表來(lái)使用。

使用視圖我們可以把查詢(xún)過(guò)程中的臨時(shí)表摘出來(lái),用視圖去實(shí)現(xiàn),這樣以后再想操作該臨時(shí)表的數(shù)據(jù)時(shí)就無(wú)需重寫(xiě)復(fù)雜的sql了,直接去視圖中查找即可,但視圖有明顯地效率問(wèn)題,并且視圖是存放在數(shù)據(jù)庫(kù)中的,如果我們程序中使用的sql過(guò)分依賴(lài)數(shù)據(jù)庫(kù)中的視圖,即強(qiáng)耦合,那就意味著擴(kuò)展sql極為不便,因此并不推薦使用

?

create view course2teacher as select * from course inner join teacher on course.teacher_id = teacher.tid; # 只有表結(jié)構(gòu),沒(méi)有表數(shù)據(jù),因?yàn)樗臄?shù)據(jù)是基于其他表的。不建議使用,因?yàn)橐院髷U(kuò)展sql語(yǔ)句的時(shí)候,視圖也需要跟著修改。# 修改視圖 alter view teacher_view as select * from course where cid>3;# 刪除視圖 drop view teacher_view-- 2.觸發(fā)器 (一般不用,這個(gè)在應(yīng)用程序級(jí)別能做,在應(yīng)用程序級(jí)別能干的活還是去自己干好,以后擴(kuò)展方便) #準(zhǔn)備表 CREATE TABLE cmd (id INT PRIMARY KEY auto_increment,USER CHAR (32),priv CHAR (10),cmd CHAR (64),sub_time datetime, #提交時(shí)間success enum ('yes', 'no') #0代表執(zhí)行失敗 );CREATE TABLE errlog (id INT PRIMARY KEY auto_increment,err_cmd CHAR (64),err_time datetime );#創(chuàng)建觸發(fā)器 delimiter // # 定義sql語(yǔ)句的結(jié)束語(yǔ) CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW BEGINIF NEW.success = 'no' THEN #等值判斷只有一個(gè)等號(hào)INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; #必須加分號(hào)END IF ; #必須加分號(hào) END // delimiter ; # 把結(jié)束符號(hào)還原回來(lái) #往表cmd中插入記錄,觸發(fā)觸發(fā)器,根據(jù)IF的條件決定是否插入錯(cuò)誤日志 INSERT cmd (USER,priv,cmd,sub_time,success ) VALUES('egon','0755','ls -l /etc',NOW(),'yes'),('egon','0755','cat /etc/passwd',NOW(),'no'),('egon','0755','useradd xxx',NOW(),'no'),('egon','0755','ps aux',NOW(),'yes');# 刪除觸發(fā)器 drop trigger tri_after_insert_cmd;-- 3 存儲(chǔ)過(guò)程# (1) 無(wú)參存儲(chǔ)過(guò)程delimiter //create procedure p1()BEGINselect * from db7.teacher;END //delimiter ;# MySQL中調(diào)用call p1();# Python中調(diào)用cursor.callproc('p1')# (2) 有參存儲(chǔ)過(guò)程。不但要指定是接收還是返回,還要指定類(lèi)型delimiter //create procedure p2(in n1 int,in n2 int,out res int)BEGINselect * from db7.teacher where tid > n1 and tid < n2;set res = 1;END //delimiter ;# inout 可進(jìn)可出 了解就行# MySQL中調(diào)用set @x=0call p2(2,4,@x);select @x; # 查看返回值結(jié)果# Python中調(diào)用 cursor.callproc('p2',(2,4,0)) # @_p2_0=2,@_p2_1=4,@_p2_2=0cursor.excute('select @_p3_2')cursor.fetchall()## 應(yīng)用程序和數(shù)據(jù)庫(kù)結(jié)合使用### 方式一:MySQL: 編寫(xiě)存儲(chǔ)過(guò)程python:調(diào)用存儲(chǔ)過(guò)程### 方式二:Python:編寫(xiě)純生SQLMySQL:什么都不用干### 方式三:Python:ORM --> 純生SQL MySQL:# 運(yùn)行效率方式二高,開(kāi)發(fā)效率方式三高(運(yùn)行效率比方式二慢不了多少),我們主要是用方式三,偶爾用方式二,很少會(huì)去用方式一,除非一個(gè)人應(yīng)用程序開(kāi)發(fā)和DBA開(kāi)發(fā)都很厲害。

二、事物

create table user( id int primary key auto_increment, name char(32), balance int );insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000);#原子操作 start transaction; update user set balance=900 where name='wsb'; #買(mǎi)支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 update user set balance=1090 where name='ysb'; #賣(mài)家拿到90元 commit;#出現(xiàn)異常,回滾到初始狀態(tài) start transaction; update user set balance=900 where name='wsb'; #買(mǎi)支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 uppdate user set balance=1090 where name='ysb'; #賣(mài)家拿到90元,出現(xiàn)異常沒(méi)有拿到 rollback; commit;

三、函數(shù)和流程控制

#1 準(zhǔn)備表和記錄 CREATE TABLE blog (id INT PRIMARY KEY auto_increment,NAME CHAR (32),sub_time datetime );INSERT blog (NAME, sub_time) VALUES('第1篇','2015-03-01 11:31:21'),('第2篇','2015-03-11 16:31:21'),('第3篇','2016-07-01 10:21:31'),('第4篇','2016-07-22 09:23:21'),('第5篇','2016-07-23 10:11:11'),('第6篇','2016-07-25 11:21:31'),('第7篇','2017-03-01 15:33:21'),('第8篇','2017-03-01 17:32:21'),('第9篇','2017-03-01 18:31:21');#2. 提取sub_time字段的值,按照格式后的結(jié)果即"年月"來(lái)分組select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');

四、索引原理

#1. 準(zhǔn)備表 create table s1( id int, name varchar(20), gender char(6), email varchar(50) );#2. 創(chuàng)建存儲(chǔ)過(guò)程,實(shí)現(xiàn)批量插入記錄 delimiter $$ # create procedure auto_insert1() BEGINdeclare i int default 1;while (i<3000000) doinsert into s1 values(i,'egon','male',concat('egon',i,'@oldboy'));set i=i+1;end while; END$$ delimiter ; #3. 查看存儲(chǔ)過(guò)程 show create procedure auto_insert1\G #4. 調(diào)用存儲(chǔ)過(guò)程 call auto_insert1();#無(wú)索引:mysql根本就不知道到底是否存在id等于333333333的記錄,只能把數(shù)據(jù)表從頭到尾掃描一遍,此時(shí)有多少個(gè)磁盤(pán)塊就需要進(jìn)行多少I(mǎi)O操作,所以查詢(xún)速度很慢 mysql> select * from s1 where id=333333333; Empty set (0.33 sec)# 創(chuàng)立索引前 select count(id) from s1 where id = 1000 row in set (0.80 sec)# 創(chuàng)立索引 create index idx_id on s1(id) Query OK, 0 rows affected (2.63 sec) Records: 0 Duplicates: 0 Warnings: 0# 創(chuàng)立索引后 select count(id) from s1 where id = 1000; row in set (0.00 sec)

?

轉(zhuǎn)載于:https://www.cnblogs.com/hexiaorui123/p/10440378.html

總結(jié)

以上是生活随笔為你收集整理的mysql-视图、事物等的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。