## 7.1視圖:
- 從一個或幾個基本表(或視圖)導出的表。它與基本表不同,
是一個虛表。
- 數據庫只存放視圖的定義,而不存放視圖對應的數據,
這些數據仍存放在原來的基本表中。所以基本表中的數據發生變化,從視圖中查詢出的數據也就隨之改變了。
- mysql5.1版本出現的新特性,是通過表動態生成的數據
只是保存了sql邏輯,不占用物理空間,只是一般不能增刪改
**優點:**
可以暴露特定字段,做權限管理
1. 視圖能夠簡化用戶的操作
2. 視圖使用戶能以多鐘角度看待同一數據
3. 視圖對重構數據庫提供了一定程度的邏輯獨立性
4. 視圖能夠對機密數據提供安全保護
5. 適當的利用視圖可以更清晰的表達查詢
**缺點:**
1. 性能差:從數據庫視圖查詢數據可能會很慢,特別是如果視圖是基于其他視圖創建的。
2. 表依賴關系:將根據數據庫的基礎表創建一個視圖。每當更改與其相關聯的
表的結構時,都必須更改視圖。
>[info]視圖創建:
```
create view v1[id,name,salary]
as
select employee_id,last_name,salary from employees
```
<br>
## 7.2存儲過程
```
/*
含義:一組預先編譯好的SQL語句的集合,理解成批處理語句
1、提高代碼的重用性
2、簡化操作
3、減少了編譯次數并且減少了和數據庫服務器的連接次數,提高了效率
*/
```
>[danger]創建語法
```
CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN
存儲過程體(一組合法的SQL語句)
END
/*
1、參數列表包含三部分
參數模式 參數名 參數類型
舉例:
in stuname varchar(20)
參數模式:
in:該參數可以作為輸入,也就是該參數需要調用方傳入值
out:該參數可以作為輸出,也就是該參數可以作為返回值
inout:該參數既可以作為輸入又可以作為輸出,也就是該參數既需要傳入值,又可以返回值
2、如果存儲過程體僅僅只有一句話,begin end可以省略
存儲過程體中的每條sql語句的結尾要求必須加分號。
存儲過程的結尾可以使用 delimiter 重新設置,默認結尾為分號";"
語法:
delimiter 結束標記
案例:
delimiter $
*/
```
>[danger]調用語法
CALL 存儲過程名(實參列表);
>[danger]刪除存儲過程
#語法:drop procedure 存儲過程名
DROP PROCEDURE p1;
>[danger]查看存儲過程的信息
DESC myp2;×
SHOW CREATE PROCEDURE myp2;
## 7.3 函數
```
/*
含義:一組預先編譯好的SQL語句的集合,理解成批處理語句
1、提高代碼的重用性
2、簡化操作
3、減少了編譯次數并且減少了和數據庫服務器的連接次數,提高了效率
區別:
存儲過程:可以有0個返回,也可以有多個返回,適合做批量插入、批量更新
函數:有且僅有1 個返回,適合做處理數據后返回一個結果
*/
```
>[success]創建語法
```
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型
BEGIN
函數體
END
```
```
/*
注意:
1.參數列表 包含兩部分:
參數名 參數類型
2.函數體:肯定會有return語句,如果沒有會報錯
如果return語句沒有放在函數體的最后也不報錯,但不建議
return 值;
3.函數體中僅有一句話,則可以省略begin end
4.使用 delimiter語句設置結束標記
*/
```
- 調用語法
`SELECT 函數名(參數列表)
`
- 查看函數
`SHOW CREATE FUNCTION myf3;
`
- 刪除函數
`DROP FUNCTION myf3;
`
*案例:創建函數,實現傳入兩個float,返回二者之和
```
CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
DECLARE SUM FLOAT DEFAULT 0;
SET SUM=num1+num2;
RETURN SUM;
END
SELECT test_fun1(1,2);
```
## 7.4 循環控制
```
/*
分類:
while、loop、repeat
循環控制:
iterate類似于 continue,繼續,結束本次循環,繼續下一次
leave 類似于 break,跳出,結束當前所在的循環
*/
```
**1.while**
```
/*
語法:
【標簽:】while 循環條件 do
循環體;
end while【 標簽】;
*/
```
**2.loop**
```
/*
語法:
【標簽:】loop
循環體;
end loop 【標簽】;
可以用來模擬簡單的死循環
*/
```
**3.repeat**
```
/*
語法:
【標簽:】repeat
循環體;
until 結束循環的條件
end repeat 【標簽】;
*/
```