目錄
視圖
視圖和表的區(qū)別
視圖和表的聯(lián)系
視圖命令
視圖特點
NULL 值
null、空值和零的區(qū)別
連接查詢
內(nèi)連接
左連接
右連接
存儲過程
概述
簡介
存儲過程的優(yōu)點
語法
調(diào)用存儲過程
存儲過程的參數(shù)
查看存儲過程
查看指定存儲過程信息
修改存儲過程
刪除存儲過程
視圖
數(shù)據(jù)庫中的虛擬表,這張?zhí)摂M表中不包含真實數(shù)據(jù),只是做了真實數(shù)據(jù)的映射
視圖可以理解為鏡花水月/倒影,動態(tài)保存結(jié)果集(數(shù)據(jù))
作用場景:針對不同的人(權限身份),提供不同結(jié)果集的“表”(以表格的形式展示)
作用范圍:
select * from info;? ? ? ? ? ? ? ? ? #展示的部分是info表
select * from view_name;? ? ?#展示的一張或多張表?
功能:
簡化查詢結(jié)果集、靈活查詢、可以針對不同用戶呈現(xiàn)不同結(jié)果集、相對有更高的安全性
本質(zhì)而言視圖是一種select(結(jié)果集的呈現(xiàn))
PS:視圖適合于多表連接瀏覽時使用!不適合增、刪、改
而存儲過程適合于使用較頻繁的SQL語句,這樣可以提高執(zhí)行效率!
視圖和表的區(qū)別
1.視圖是已經(jīng)編譯好的sql語句。而表不是
2.視圖沒有實際的物理記錄。而表有。
show table status\G
3.表只用物理空間而視圖不占用物理空間,視圖只是邏輯概念的存在,表可以及時對它進行修改,但視圖只能有創(chuàng)建的語句來修改
4.視圖是查看數(shù)據(jù)表的一種方法,可以查詢數(shù)據(jù)表中某些字段構(gòu)成的數(shù)據(jù),只是一些SQL語句的集合。從安全的角度說,視圖可以不給用戶接觸數(shù)據(jù)表,從而不知道表結(jié)構(gòu)。
5.表屬于全局模式中的表,是實表;視圖屬于局部模式的表,是虛表。
6.視圖的建立和刪除只影響視圖本身,不影響對應的基本表。(但是更新視圖數(shù)據(jù),是會影響到基本表的)
視圖和表的聯(lián)系
視圖(view)是在基本表之上建立的表,它的結(jié)構(gòu)(即所定義的列)和內(nèi)容(即所有數(shù)據(jù)行)都來自基本表,它依據(jù)基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。視圖是基本表的抽象和在邏輯意義上建立的新關系。
視圖命令
創(chuàng)建視圖(單表)
create view v_name as select?列名 from?表名
查看表狀態(tài)?
show table status\G
視圖特點
修改表不能修改以函數(shù)、復合函數(shù)方式計算出來的字段
查詢方便、安全性
查詢方便:索引速度快、同時可以多表查詢更為迅速(視圖不保存真實數(shù)據(jù),視圖本質(zhì)類似select)
安全性:我們實現(xiàn)登陸的賬戶是root 所擁有權限 ,視圖無法顯示完整的約束
NULL 值
在 SQL 語句使用過程中,經(jīng)常會碰到 NULL 這幾個字符。通常使用 NULL 來表示缺失 的值,也就是在表中該字段是沒有值的。如果在創(chuàng)建表時,限制某些字段不為空,則可以使用 NOT NULL 關鍵字,不使用則默認可以為空。在向表內(nèi)插入記錄或者更新記錄時,如果該字段沒有 NOT NULL 并且沒有值,這時候新記錄的該字段將被保存為 NULL。需要注意 的是,NULL 值與數(shù)字 0 或者空白(spaces)的字段是不同的,值為 NULL 的字段是沒有 值的。在 SQL 語句中,使用 IS NULL 可以判斷表內(nèi)的某個字段是不是 NULL 值,相反的用 IS NOT NULL 可以判斷不是 NULL 值。
null、空值和零的區(qū)別
1、對象的內(nèi)容不同
null表示對象的內(nèi)容為空,即對象的內(nèi)容是空白的。
空值表示對象的內(nèi)容無法確定。
零表示對象的內(nèi)容確定為零。
2、對象的值不同
null表示對象計算中具有保留的值,用于指示指針不引用有效對象。
空值表示值未知,空值一般表示數(shù)據(jù)未知、不適用或?qū)⒃谝院筇砑訑?shù)據(jù)。
零表示對象的值等于零。
連接查詢
MySQL 的連接查詢,通常都是將來自兩個或多個表的記錄行結(jié)合起來,基于這些表之間的 共同字段,進行數(shù)據(jù)的拼接。首先,要確定一個主表作為結(jié)果集,然后將其他表的行有選擇 性的連接到選定的主表結(jié)果集上。使用較多的連接查詢包括:內(nèi)連接、左連接和右連接
內(nèi)連接
MySQL 中的內(nèi)連接就是兩張或多張表中同時符合某種條件的數(shù)據(jù)記錄的組合。通常在 FROM 子句中使用關鍵字 INNER JOIN 來連接多張表,并使用 ON 子句設置連接條件,內(nèi)連接是系統(tǒng)默認的表連接,所以在 FROM 子句后可以省略 INNER 關鍵字,只使用 關鍵字 JOIN。同時有多個表時,也可以連續(xù)使用 INNER JOIN 來實現(xiàn)多表的內(nèi)連接,不過為了更好的性能,建議最好不要超過三個表
語法
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
內(nèi)連查詢:通過inner join 的方式將兩張表指定的相同字段的記錄行輸出出來
面試時,直接了當?shù)恼f 用inner join 就可以
左連接
左連接也可以被稱為左外連接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 關鍵字來表示。左連接以左側(cè)表為基礎表,接收左表的所有行,并用這些行與右側(cè)參 考表中的記錄進行匹配,也就是說匹配左表中的所有行以及右表中符合條件的行。
SELECT column_name(s)FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
左連接中左表的記錄將會全部表示出來,而右表只會顯示符合搜索條件的記錄,右表記錄不足的地方均為 NULL。?
右連接
右連接也被稱為右外連接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關鍵字來表示。右連接跟左連接正好相反,它是以右表為基礎表,用于接收右表中的所有行,并用這些記錄與左表中的行進行匹配
SELECT column_name(s)FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
在右連接的查詢結(jié)果集中,除了符合匹配規(guī)則的行外,還包括右表中有但是左表中不匹 配的行,這些記錄在左表中以 NULL 補足
存儲過程
概述
前面學習的 MySQL 相關知識都是針對一個表或幾個表的單條 SQL 語句,使用這樣的SQL 語句雖然可以完成用戶的需求,但在實際的數(shù)據(jù)庫應用中,有些數(shù)據(jù)庫操作可能會非常復雜,可能會需要多條 SQL 語句一起去處理才能夠完成,這時候就可以使用存儲過程, 輕松而高效的去完成這個需求,有點類似shell腳本里的函數(shù)
簡介
1、存儲過程是一組為了完成特定功能的SQL語句集合。 ?兩個點 第一 觸發(fā)器(定時任務) 第二個判斷?
2、存儲過程這個功能是從5.0版本才開始支持的,它可以加快數(shù)據(jù)庫的處理速度,增強數(shù)據(jù)庫在實際應用中的靈活性。存儲過程在使用過程中是將常用或者復雜的工作預先使用SQL語句寫好并用一個指定的名稱存儲起來,這個過程經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務器中。當需要使用該存儲過程時,只需要調(diào)用它即可。操作數(shù)據(jù)庫的傳統(tǒng) SQL 語句在執(zhí)行時需要先編譯,然后再去執(zhí)行,跟存儲過程一對比,明顯存儲過程在執(zhí)行上速度更快,效率更高
存儲過程在數(shù)據(jù)庫中L 創(chuàng)建并保存,它不僅僅是 SQL語句的集合,還可以加入一些特殊的控制結(jié)構(gòu),也可以控制數(shù)據(jù)的訪問方式。存儲過程的應用范圍很廣,例如封裝特定的功能、 在不同的應用程序或平臺上執(zhí)行相同的函數(shù)等等。
存儲過程的優(yōu)點
1.執(zhí)行一次后,會將生成的二進制代碼駐留緩沖區(qū),提高執(zhí)行效率
2.SQL語句加上控制語句的集合,靈活性高
3.在服務器端存儲,客戶端調(diào)用時,降低網(wǎng)絡負載
4.可多次重復被調(diào)用,可隨時修改,不影響客戶端調(diào)用
5.可完成所有的數(shù)據(jù)庫操作,也可控制數(shù)據(jù)庫的信息訪問權限
語法
CREATE PROCEDURE <過程名> ( [過程參數(shù)[,…] ] ) <過程體>
[過程參數(shù)[,…] ] 格式
<過程名>:盡量避免與內(nèi)置的函數(shù)或字段重名
<過程體>:語句
[ IN | OUT | INOUT ] <參數(shù)名><類型>
創(chuàng)建存儲過程
DELIMITER $$?? ??? ??? ??? ??? ??? ??? ?#將語句的結(jié)束符號從分號;臨時改為兩個$$(可以自定義)
CREATE PROCEDURE Proc()?? ??? ??? ??? ??? ?#創(chuàng)建存儲過程,過程名為Proc,不帶參數(shù)
-> BEGIN?? ??? ??? ??? ??? ??? ??? ??? ?#過程體以關鍵字 BEGIN 開始
-->過程體語句
--> END $$ #過程體以關鍵字 END 結(jié)束
DELIMITER ; #將語句的結(jié)束符號恢復為分號
調(diào)用存儲過程
CALL Proc();
1. 存儲過程的主體都分,被稱為過程體
2.以BEGIN開始,以END結(jié)束,若只有一條sQL語句,則可以省略BEGIN-END
3.以DELIMITER開始和結(jié)束 ?
DEL工M工TER $$ ? ? ?$$是用戶自定義的結(jié)束符?
省略存儲過程其他步驟
DELIMITER ; ?分號前有空格
存儲過程的參數(shù)
IN 輸入?yún)?shù):表示調(diào)用者向過程傳入值(傳入值可以是字面量或變量)
OUT 輸出參數(shù):表示過程向調(diào)用者傳出值(可以返回多個值)(傳出值只能是變量)
INOUT 輸入輸出參數(shù):既表示調(diào)用者向過程傳入值,又表示過程向調(diào)用者傳出值(值只能是變量)
即表示調(diào)用者向過程傳入值,又表示過程向調(diào)用者傳出值(只能是變量)
查看存儲過程
SHOW PROCEDURE STATUS
查看指定存儲過程信息
mysql> SHOW PROCEDURE STATUS like '%proc%'\G
修改存儲過程
ALTER PROCEDURE <過程名>[<特征>... ]
ALTER PROCEDURE GetRole MODIFIES SQL DATA SQL SECURITY INVOKER;
MODIFIES sQLDATA:表明子程序包含寫數(shù)據(jù)的語句
SECURITY:安全等級
invoker:當定義為INVOKER時,只要執(zhí)行者有執(zhí)行權限,就可以成功執(zhí)行。文章來源:http://www.zghlxwxcb.cn/news/detail-694044.html
刪除存儲過程
存儲過程內(nèi)容的修改方法是通過刪除原有存儲過程,之后再以相同的名稱創(chuàng)建新的存儲過程。文章來源地址http://www.zghlxwxcb.cn/news/detail-694044.html
DROP PROCEDURE IF EXISTS Proc;
到了這里,關于mysql高級語句之視圖、連接查詢與存儲過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!