MySQL階段二——sql語句基礎(3)
Outfile
註意:
Insert詳解
delete和update相關
視圖
01.視圖創建
02.視圖相關定義
03.視圖創建詳解
04.刪除視圖
05.視圖查詢
06.更新視圖
07.視圖的執行過程
觸發器
01.定義觸發器
02.操作觸發器
03.註意
Outfile
將檢索到的數據,保存到服務器的文件內。
通過:select * from outfile “文件地址” from XXXX;
註意:
1.可以自動創建文件,但是對已有文件不能操作。
2.生產的文件格式:默認使用制表符區分字段,用換行符區分記錄,也會使用其他方式進行區分。
Insert詳解
1.可以不將所有的字段插入數據,
2.如果插入部分字段,可以使用set語句:insert into teacher set t_name=’...’,c_name=’...’;
3.可以一次性插入多條語句,使用括號區分,逗號分開;
4.有主鍵沖突的時候,插入不成功,可以繼續執行更新操作:insert into teacher(id,t_name,c_name) values(...) on duplicate key update t_name=””,c_name=””;
5.插入數據源可以是select語句查詢到的數據;insert into teacher(..) select * from XXX;
6.如果字段不寫,可以使用默認值;也可以強制使用default()函數或者default關鍵字使用默認值。
7.Replace:主鍵或唯一索引沖突,則替換;否則插入。
8.可以使用load data file導入數據:load data infile ‘文件路徑’ into table tb_name;
delete和update相關
1.允許使用條件(刪除符合條件的數據)
允許使用limit,限制刪除的記錄數,
常見的是limit 配合order by來使用,先將 結果排序,再刪除固定數量的記錄。
3.允許連接刪除:先提供表名,再提供連接條件。
4.Truncate:
a) 不會返回刪除的記錄數
b) 重新自動增長主鍵
Delete:逐行刪除
Truncate:刪除表,新建表
視圖
01.視圖創建
Create table info_teacher(
Id int primary key auto_increment,
T_name varchar(10),
Salary decimal(10,2)
);
Create view v_teacher as select i,t_name from info_teacher;
02.視圖相關定義
視圖就是一張虛擬表,是一個存在與數據庫中的虛擬表;視圖本身沒有數據,只是通過執行相關的select語句完成獲得相應的數據。
03.視圖創建詳解
01)建立視圖
Create view <視圖名> [(<列名>,[,<列名>])]
As <子查詢>
[with check option]
With check option表示對視圖進行update、insert、delete操作時要保證視圖的操作的行滿足視圖定義中謂詞條件(即子查詢中的條件表達式)。
組成視圖的屬性列名或者全部省略或者全部指定。在下面三種情況下必須指定視圖列名:01.某個目標列不是單純的屬性名,而是聚集函數或者列表達式;02.多表連接時選出了幾個同名列作為視圖的手段;03.需要在視圖為某個列啟用更合適的名字。
定義基本表時,為了減少數據庫的冗余數據,表中中存放基本數據,由基本數據經過各種計算派生出的數據一般是不存儲的。創建視圖也可以創建基本表中不存在的列,即創建派生列(比如avg(列名))。
視圖可以創建在單個表上,也可以建立在多個基本表上。視圖不僅可以建立在一個或者多個基本表上,也可以建立在一個或者多個已定義的視圖上,或者建立在基本表和視圖上。
04.刪除視圖
Drop view <視圖名>[cascade];
05.視圖查詢
視圖定義之後,用戶就可以像對基本表一樣對視圖進行查詢了。
視圖消解:關系型數據庫管理系統執行對視圖的查詢的時候,首先進行有效性檢查,檢查查詢中涉及的表、視圖是否存在。如果存在,則從數據字典中取出視圖的定義,吧定義中的子查詢和用戶的查詢結合起來,轉換成等價的對基本表的查詢,然後再執行修正了的查詢。
06.更新視圖
更新視圖就是對視圖進行crud操作,真正操作也會經歷視圖消解。為了防止通過視圖對數據進行更新的時候,有意無意對不屬於視圖的基本表進行操作,可以在視圖定義的時候加上With check option。
07.視圖的執行過程
視圖的執行算法:merge,temptable
指的是一個視圖是在什麽時候執行,依據哪些方式執行;
Merge:合並的執行方式,每當執行的時候,先將我們視圖的sql與語句與外部查詢視圖的sql語句,混合在一起,最終執行;
Temptable:臨時表模式,每當查詢的時候,將視圖所使用的select語句生成一個結果的臨時表。再在當前的臨時表內查詢。
每當用戶創建視圖的時候,mysql默認使用一種undefined的處理算法;就是會自動在合並和臨時表內進行選擇。
觸發器
01.定義觸發器
Create trigger <觸發器名稱>
{before|after} <觸發器名> on <表名>
Referencing new|old row as <變量> /*Referencing 指出引用的變量*/
For each {row|statement}
[when <觸發條件>] <觸發動作體>
02.操作觸發器
刪除:drop trigger<觸發器名> on <表名>;
查看:show create trigger name;
03.註意
如果一個觸發程序,由多條sql語句組成。
應該:1.語句組成語句塊(begin end標識);2.語句塊的語句需要獨立的語句結束符,分號。
命令行:由於觸發程序內使用分號作為語句結束符。那麽當命令行客戶端碰到分號時,就應該理解成觸發程序內子語句結束,而不是整個創建觸發器的語句結束。
應該通過修改命令行的語句結束符達到目的。
Delimiter語句可以完成設置語句結束符。
Delimiter $$
Create trigger ruxue after insert on student
For each row
Begin
Update class set stu_count=student_count+1;
Update class set cz_money=cz_money+20;
End
$$
Delimiter ;
Old:監聽事件所在表上的數據,在事件發生之前時的數據;
New:監聽表上,事件發生之後,新處理完畢的數據。
事件是insert時:不能使用old;事件為delete:不能使用new;
本文出自 “秦斌的博客” 博客,謝絕轉載!
MySQL階段二——sql語句基礎(3)