視圖_存儲過程_遊標的簡單使用

前言

1️⃣ :mysql環境準備

2️⃣ :簡單的表查詢

3️⃣ :通配符+正則表達式

4️⃣ :mysql函數與分組

5️⃣ :子查詢_聯結查詢_組合查詢

6️⃣ :mysql全文本搜索

7️⃣ :表的增刪改查

第一部分:我們準備環境:安裝數據庫+創建數據庫+創建用戶+授權。

第二部分:環境準備好後,進行簡單的單表查詢:導入表+表查詢。

第三部分:通配符和正則表達式,增強where的篩選功能。

第四部分:對列進行計算處理稱爲字段。複雜的字段用函數處理。按照不同組彙總,進行分組操作。

第五部分:在多表上進行查詢:子查詢+聯結查詢+組合查詢。

第六部分:mysql的全文本搜索。

第七部分:表的刪改查。

前七部分組成表的增刪改查。 之後都是一個一個小模塊的介紹。

現在是第八部分:參考《mysql必知必會》chapter 22~24,視圖+存儲過程+遊標


摘要與總結

視圖是虛擬的表;存儲過程是一條或多條MySQL語句的集合;對於填有數據的遊標,根據需要取出(檢索)各行;

視圖

推薦:深入解析MySQL視圖VIEW

Q-A,來自上面鏈接。

Q:什麼是視圖?視圖是幹什麼用的?

A:

  1. 視圖(view)是一種虛擬存在的表,是一個邏輯表,本身並不包含數據。作爲一個select語句保存在數據字典中的。

  2. 通過視圖,可以展現基表的部分數據;視圖數據來自定義視圖的查詢中使用的表,使用視圖動態生成。

基表:用來創建視圖的表叫做基表base table

Q:爲什麼要使用視圖?

A:因爲視圖的諸多優點,如下

  1. 簡單:使用視圖的用戶完全不需要關心後面對應的表的結構、關聯條件和篩選條件,對用戶來說已經是過濾好的複合條件的結果集。

  2. 安全:使用視圖的用戶只能訪問他們被允許查詢的結果集,對錶的權限管理並不能限制到某個行某個列,但是通過視圖就可以簡單的實現。

  3. 數據獨立:一旦視圖的結構確定了,可以屏蔽表結構變化對用戶的影響,源表增加列對視圖沒有影響;源表修改列名,則可以通過修改視圖來解決,不會造成對訪問者的影響。

總而言之,使用視圖的大部分情況是爲了保障數據安全性,提高查詢效率。

# 視圖的創建
CREATE VIEW productcustomers AS
SELECT cust_name,cust_contact,prod_id 
FROM customers,orders,orderitems
WHERE customers.cust_id=orders.cust_id AND orders.order_num=orderitems.order_num
with check option; -- 對視圖所做的DML操作的結果,不能違反視圖的WHERE條件的限制。這裏沒啥用

# 使用視圖和表類似
SELECT * FROM productcustomers
WHERE prod_id='TNT2';

需要注意的是:因爲視圖本身沒有數據,因此對視圖進行的dml操作最終都體現在基表中

對於視圖的修改,必須正確的確定被更新的基數據,才能通過視圖更新作用到基表上。

所以對於計算列之類,無法確定更新到基數據上的dml是無法(無法?)操作的。



存儲過程

推薦:MySQL存儲過程的創建及調用

參考:MySQL存儲過程與函數

Q:什麼是存儲過程?
存儲過程簡單來說,就是爲以後的使用而保存的一條或多條MySQL語句的集合。可將其視爲批文件,雖然它們的作用不僅限於批處理。

Q:存儲過程的作用

  1. 通過把處理封裝在容易使用的單元中,簡化複雜的操作
  2. 統一接口,確保數據的安全

Q:相關的操作(基本都是那一套,創建/查看/使用/修改/刪除)

創建存儲過程、查看當前所用於的存儲過程、執行存儲過程、刪除存儲過程

-- 存儲過程
-- name:ordertotal
-- parameters: ordernum=order_num
--             taxable = 0 or 1 
--             ototal = order total varibale
DELIMITER $$
drop procedure if exists ordertotal$$

create procedure ordertotal(
	in ordernum int,
    in taxable boolean,
    out ototal decimal(8,2)
)comment 'get total variable with tax'
begin
	-- declare varibale for total
    declare total decimal(8,2);
    -- declare tax precent
    declare tax_prec int default 6;
    
    -- get total variable without tax
	select sum(quantity*item_price)
    from orderitems
    where order_num=ordernum
    into total;
    
    -- is taxable
    if taxable then
		select total+(total/100*tax_prec) into total;
	end if;
	
    -- return total with tax
    select total into ototal;
end$$
DELIMITER ;

call ordertotal(20005,1,@total);
select @total;


遊標

推薦:MySQL遊標的簡單實踐
參考:mysql遊標最後一行重複的問題

Q:爲什麼需要遊標

MySQL檢索操作返回一組稱爲結果集的行。這組返回的行都是與SQL語句相匹配的行(零行或多行)。使用簡單的SELECT語句,例如,沒有辦法得到第一行、下一行或前10行,也不存在每次一行地處理所有行的簡單方法(相對於成批地處理它們)。有時,對於填有數據的遊標,根據需要取出(檢索)各行。。這就是使用遊標的原因。

我想了下,一行一行的檢索交給where來處理,檢索出來的操作可以給列來處理,相對而言就可以替代遊標的效果了。不知道是不是這樣。

Q:什麼是遊標

遊標( cursor) 是一個存儲在MySQL服務器上的數據庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集。 (這個恰好和視圖是相反的)

Q:遊標的操作

創建,打開,使用,關閉

-- 遊標
-- 將total with tax單獨放入一個表中
delimiter $$
drop procedure if exists prosessorders$$

create procedure prosessorders()
begin
	
    -- 聲明一個boolen變量,用於遊標終止循環
    declare done boolean default 0;
	-- 聲明一個變量存儲total
    declare total decimal(8,2);
    -- 聲明一個變量從遊標每次取值
    declare ordernum int;
    
	-- 聲明個遊標
    declare ordernums cursor
    for
    select order_num from orders;
    -- declare continue handler
    -- declare continue handler for sqlstate '02000' set done=1;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 
    
    -- 創建一個表,保存totals
    drop table if exists ordertotals;
    create table if not exists ordertotals
    (order_num int,total decimal(8,2));
    
    -- 打開遊標
    open ordernums;

    -- loop through all the row
    repeat
		fetch ordernums into ordernum;
        
        if !done then
			-- 根據order_num,從orderitems中獲取totals
			call ordertotal(ordernum,1,total);
			
			-- 把計算出來的結果,插入表中
			insert into ordertotals(order_num,total)
			values(ordernum,total);
		end if;
	until done end repeat;

    -- 關閉遊標
    close ordernums;
end$$
delimiter ;

call prosessorders();
select * from ordertotals;--  order by order_num;


參考文章

深入解析MySQL視圖VIEW

MySQL存儲過程的創建及調用

MySQL存儲過程與函數

MySQL遊標的簡單實踐

mysql遊標最後一行重複的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章