MySQL進階sql語句②
阿新 • • 發佈:2022-12-05
一.MySQL檢視
1.1檢視概念
- 資料庫中的虛擬表,這張虛擬表中不包含真實資料,只是做了真實資料的對映
- 檢視可以理解為鏡花水月/倒影,動態儲存結果集(資料)
1.2檢視的功能
- 簡化查詢結果集、靈活查詢、可以針對不同使用者呈現不同結果集、相對有更高的安全性
- 本質而言檢視是一種 select (結果集的呈現)
- 查詢方便:檢視不儲存真實資料,檢視本質類似select,同時可以多表查詢更為迅速
- 安全性:檢視無法顯示完整的約束
1.3檢視和表的區別和聯絡
1.3.1區別
①檢視是已經編譯好的sql語句,而表不是。
②檢視沒有實際的物理記錄。而表有(show table status\G)。
③表只用物理空間而檢視不佔用物理空間,檢視只是邏輯概念的存在,表可以及時對它進行修改,但檢視只能有建立的語句來修改。
④檢視是檢視資料表的一種方法,可以查詢資料表中某些欄位構成的資料,只是一些SQL語句的集合。從安全的角度說,檢視可以不給使用者接觸資料表,從而不知道表結構。
⑤表屬於全域性模式中的表,是實表;檢視屬於區域性模式的表,是虛表。
⑥檢視的建立和刪除隻影響檢視本身,不影響對應的基本表。(但是更新檢視資料,是會影響到基本表的)
1.3.2聯絡
- 檢視(view)是在基本表之上建立的表,它的結構(即所定義的列)和內容(即所有資料行)都來自基本表,它依據基本表存在而存在。
- 一個檢視可以對應一個基本表,也可以對應多個基本表。檢視是基本表的抽象和在邏輯意義上建立的新關係。
1.4檢視的命令
1.4.1建立檢視(單表)
create view 檢視的名字 as select * from 表名;
1.4.2刪除檢視
drop view 檢視名字;
1.4.3建立檢視(多表)
create view 檢視名(欄位1,欄位2,欄位3,欄位4)as select 表1.欄位一,表1.欄位二,表2.欄位三 from 表1,表1 where 表1.欄位=表2.欄位;
建立一個表test1,然後建立一個檢視輸出id,name,address //欄位來自不同的表,表和欄位用.連在一起,避免不同表的欄位混亂/衝突
create view kk(id,name,address) as select test.id,test.name,test1.address from test,test1 where test.name=test1.name; //雙表
1.4.4修改資料
update 表名 set 欄位=欄位的值 where 條件(單欄位或者區間);
1.4.5檢視檢視
select * from 檢視名; //檢視檢視 desc 檢視名; //檢視檢視結構 desc 表名; //查看錶結構
二.NULL值
2.1null值概述
- 在 SQL 語句使用過程中,經常會碰到 NULL 這幾個字元。通常使用 NULL 來表示缺失 的值,也就是在表中該欄位是沒有值的。
- 如果在建立表時,限制某些欄位不為空,則可以使用 NOT NULL 關鍵字,不使用則預設可以為空。
- 在向表內插入記錄或者更新記錄時,如果該欄位沒有 NOT NULL 並且沒有值,這時候新記錄的該欄位將被儲存為 NULL。
- 需要注意 的是,NULL 值與數字 0 或者空白(spaces)的欄位是不同的,值為 NULL 的欄位是沒有值的。
- 在 SQL 語句中,使用 IS NULL 可以判斷表內的某個欄位是不是 NULL 值,相反的用 IS NOT NULL 可以判斷不是 NULL 值。
空值的欄位長度為0不佔空間,而null值長度為null,佔用空間
2.2null的值和空值的區別(空氣與真空)
- 空值長度為0,不佔空間,NULL值的長度為null,佔用空間
- is null無法判斷空值
- 空值使用"=“或者”<>"來處理(!=)
- count()計算時,NULL會忽略,空值會加入計算
2.3null值測試
①null不計入count統計
select * from 表名 where 欄位 is null; //null值
select * from 表名 where 欄位 is not null; //非null值
②查詢不為null
③查詢null值
三.連線查詢
3.1內查詢
- MySQL 中的內連線就是兩張或多張表中同時符合某種條件的資料記錄的組合。
- 通常在 FROM 子句中使用關鍵字 INNER JOIN 來連線多張表,並使用 ON 子句設定連線條件,內連線是系統預設的表連線,所以在 FROM 子句後可以省略 INNER 關鍵字,只使用 關鍵字 JOIN。
- 同時有多個表時,也可以連續使用 INNER JOIN 來實現多表的內連線,不過為了更好的效能,建議最好不要超過三個表
3.2左查詢
- 左連線也可以被稱為左外連線,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 關鍵字來表示。
- 左連線以左側表為基礎表,接收左表的所有行,並用這些行與右側參 考表中的記錄進行匹配,也就是說匹配左表中的所有行以及右表中符合條件的行。
3.3右查詢
- 右連線也被稱為右外連線,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關鍵字來表示。
- 右連線跟左連線正好相反,它是以右表為基礎表,用於接收右表中的所有行,並用這些記錄與左表中的行進行匹配
四.儲存過程
4.1儲存過程概述
前面學習的 MySQL 相關知識都是針對一個表或幾個表的單條 SQL 語句,使用這樣的SQL 語句雖然可以完成使用者的需求,但在實際的資料庫應用中,有些資料庫操作可能會非常複雜,可能會需要多條 SQL 語句一起去處理才能夠完成,這時候就可以使用儲存過程, 輕鬆而高效的去完成這個需求,有點類似shell腳本里的函式
4.2儲存過程簡介
- 儲存過程是一組為了完成特定功能的SQL語句集合。
- 儲存過程這個功能是從5.0版本才開始支援的,它可以加快資料庫的處理速度,增強資料庫在實際應用中的靈活性。
- 儲存過程在使用過程中是將常用或者複雜的工作預先使用SQL語句寫好並用一個指定的名稱儲存起來,這個過程經編譯和優化後儲存在資料庫伺服器中。
- 當需要使用該儲存過程時,只需要呼叫它即可。
- 操作資料庫的傳統 SQL 語句在執行時需要先編譯,然後再去執行,跟儲存過程一對比,明視訊記憶體儲過程在執行上速度更快,效率更高
4.3儲存過程的優點
①執行一次後,會將生成的二進位制程式碼駐留緩衝區,提高執行效率
②SQL語句加上控制語句的集合,靈活性高
③在伺服器端儲存,客戶端呼叫時,降低網路負載
④可多次重複被呼叫,可隨時修改,不影響客戶端呼叫
⑤可完成所有的資料庫操作,也可控制資料庫的資訊訪問許可權
4.4儲存過程語法
CREATE PROCEDURE <過程名> ( [過程引數[,…] ] ) <過程體> [過程引數[,…] ] 格式 <過程名>:儘量避免與內建的函式或欄位重名 <過程體>:語句 [ IN | OUT | INOUT ] <引數名><型別>
①建立儲存過程
DELIMITER $$ #將語句的結束符號從分號;臨時改為兩個$$(可以自定義) CREATE PROCEDURE Proc() #建立儲存過程,過程名為Proc,不帶引數 -> BEGIN #過程體以關鍵字 BEGIN 開始 -> create table test4
->(id int (10), name char(10),num int (10)); -> insert into test4 values (1, 'kk',99); -> select * from test4; #過程體語句 -> END $$ #過程體以關鍵字 END 結束 DELIMITER ; #將語句的結束符號恢復為分號
②呼叫儲存過程
CALL proc(); ①儲存過程的主體都分,被稱為過程體 ②以BEGIN開始,以END結束,若只有一條sQL語句,則可以省略BEGIN-END ③以DELIMITER開始和結束 mysgl>DELIMITER $$ $$是使用者自定義的結束符 省略儲存過程其他步驟 mysql>DELIMITER ; 分號前有空格
③檢視儲存過程
SHOW CREATE PROCEDURE [資料庫.]儲存過程名; //檢視某個儲存過程的具體資訊
SHOW PROCEDURE STATUS //檢視儲存過程
SHOW PROCEDURE STATUS like '%proc%'\G //檢視指定儲存過程資訊
④修改儲存過程
儲存過程內容的修改方法是通過刪除原有儲存過程,之後再以相同的名稱建立新的儲存過程。
ALTER PROCEDURE <過程名>[<特徵>... ]
ALTER PROCEDURE GetRole MODIFIES SQLDATA SQL SECURITY INVOKER;
MODIFIES SQLDATA:表明子程式包含寫資料的語句
SECURITY:安全等級
invoker:當定義為INVOKER時,只要執行者有執行許可權,就可以成功執行。
⑤刪除儲存過程
DROP PROCEDURE IF EXISTS Proc;
五.總結
1.MySQL的檢視
2.null值得概念
3.內連線、左連線、右連線得查詢
4.儲存過程