1. 程式人生 > >MySQL視圖view/存儲過程和函數的使用

MySQL視圖view/存儲過程和函數的使用

variables mysq tab sql語句 用戶 前綴 機制 聚合 2.0

**************************************

MySql視圖view的使用:創建、修改、刪除

***************************************

1. MySql建視圖

創建視圖與創建表語法類似,不同的是創建視圖是從一條查詢語句創建的。視圖創建後,可以像一張表一樣使用,但只能用於數據查詢,如:可以在一個查詢中使用、可以在存儲過程中、可以在另一個視圖中使用。MySql創建視圖語法如下:

CREATE VIEW 視圖名 AS SELECT 查詢語句;

2. MySql視圖修改

已經創建的視圖,有時會需要修改其查詢字段或查詢條件,MySql視圖修改語法如下:

ALTER VIEW 視圖名 AS SELECT 查詢語句;

3. MySql視圖刪除

MySql視圖刪除語法與刪除表DROP TABLE類型,語法如下:

DROP VIEW 視圖名;

3. MySql視圖使用

創建好視圖之後,可以直接通過視圖名使用視圖,語法如下:

SELECT * FROM 視圖名

***************************************

CREATE VIEW語句簡介

***************************************

要在MySQL中創建新視圖,請使用CREATE VIEW語句。MySQL中創建視圖的語法如下:

讓我們更詳細地查看了解以上語法。

視圖處理算法

算法屬性允許您控制MySQL在創建視圖時使用的機制。MySQL提供三種算法:MERGE,TEMP TABLE和UNDEFINED

  • 使用MERGE算法,MySQL首先將輸入查詢與定義視圖的SELECT語句組合成單個查詢。 然後MySQL執行組合查詢以返回結果集。如果SELECT語句包含聚合函數,如:MIN, MAX, SUM, COUNT, AVG或DISTINCT, GROUP BY, HAVING, LIMIT, UNION, UNION ALL,子查詢 等等則不允許MERGE算法。如果SELECT語句沒有引用表,則也不允許MERGE算法。如果不允許MERGE算法,MySQL將算法更改為UNDEFINED。 註意,輸入查詢和視圖定義中的查詢到一個查詢的組合被稱為視圖決議。
  • 使用TEMP TABLE算法,MySQL首先根據定義視圖的SELECT語句創建一個臨時表,然後對該臨時表執行輸入查詢。因為MySQL必須創建一個臨時表來存儲結果集,並將數據從基表移動到臨時表,TEMP TABLE算法的效率低於MERGE算法。此外,使用TEMP TABLE算法的視圖不可更新
  • UNDEFINED是創建視圖時未指定顯式算法的默認算法。UNDEFINED算法讓MySQL做出選擇使用MERGE或TEMP TABLE算法。MySQL優先選擇MERGE算法再到TEMP TABLE算法,因為MERGE算法更有效率。

視圖名稱

在數據庫中,視圖和表共享相同命名空間,因此,視圖和表不能具有相同的名稱。 此外,視圖的名稱必須遵循表命名規則。

SELECT語句

SELECT語句中,可以從數據庫中存在的任何表或視圖查詢數據。SELECT語句必須遵循幾個規則:

  • SELECT語句可以在WHERE子句中包含子查詢,但不能在FROM子句中。
  • SELECT語句不能引用任何變量,包括局部變量,用戶變量和會話變量。
  • SELECT語句不能引用預處理語句的參數。

註意,SELECT語句不需要引用任何表。

**********************************************

Mysql中創建存儲過程和函數的語法

**********************************************

mysql中存儲過程和函數的語法非常接近所以就放在一起,主要區別就是函數必須有返回值,並且函數的參數只有IN類型而存儲過程有IN、OUT、INOUT這三種類型。

例子:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#創建數據庫

DROP DATABASE IF EXISTS Dpro;

CREATE DATABASE Dpro

CHARACTER SET utf8

;

USE Dpro;

#創建部門表

DROP TABLE IF EXISTS Employee;

CREATE TABLE Employee

(id INT NOT NULL PRIMARY KEY COMMENT ‘主鍵‘,

name VARCHAR(20) NOT NULL COMMENT ‘人名‘,

depid INT NOT NULL COMMENT ‘部門id‘

);

#插入測試數據

INSERT INTO Employee(id,name,depid) VALUES(1,‘陳‘,100),(2,‘王‘,101),(3,‘張‘,101),(4,‘李‘,102),(5,‘郭‘,103);

#創建存儲過程

#改變默認的分隔符(;)為“$$”來作為存儲過程結束的標識,隨後再恢復默認值。

DELIMITER $$

DROP PROCEDURE IF EXISTS Pro_Employee;

CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )

READS SQL DATA

SQL SECURITY INVOKER

BEGIN

SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid;

# 多條sql語句

END$$

# $$代表存儲過程的結束,再恢復默認的分隔符為(;)

DELIMITER ;

#執行存儲過程, 變量名前面加上@,

CALL Pro_Employee(101,@pcount);

# 變量的查詢也需要加上@

SELECT @pcount;

# 列出所有存儲過程

SHOW PROCEDURE STATUS;

# 查看一個已存在的存儲過程的信息

SHOW CREATE PROCEDURE <sp_name>;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DELIMITER $$

create procedure 存儲過程名字()

(

[in|out|inout] 參數 datatype

)

begin

MySQL 語句;

end$$

DELIMITER ;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

註意??

  • MySQL 存儲過程參數如果不顯式指定“in”、“out”、“inout”,則默認為“in”。習慣上,對於是“in” 的參數,我們都不會顯式指定。
  • MySQL 存儲過程名字後面的“()”是必須的,即使沒有一個參數,也需要“()”
  • MySQL 存儲過程參數,不能在參數名稱前加“@”,
  • MySQL 客戶端用戶變量要加個“@”
  • 提供了結構控制語句, 比如 IF, WHILE, CASE等等, 可以完成復雜的操作.另外, 定義存儲過程,usp_前綴是區別系統存儲過程和用戶自定義存儲過程的最佳實踐.SET 對已聲明的變量賦值或重新賦值,SELECT 顯示變量; SELECT var into out_var 將變量值寫入OUT參數。
    BEGIN
    DECLARE myvar INT;

SET myvar = (SELECT id FROM users LIMIT 1);

SELECT myvar into num;
END $$

  • MySQL 存儲過程的參數不能指定默認值
  • 如果 MySQL 存儲過程中包含多條 MySQL 語句,則需要 begin end 關鍵字。
  • MySQL 存儲過程中的註釋。/* … */多行註釋
  • 條件語句:declare c int; if a is null then set c = 0; end if
  • 調用 MySQL 存儲過程時候,需要在過程名字後面加“()”,即使沒有一個參數,也需要“()”
  • 因為 MySQL 存儲過程參數沒有默認值,所以在調用 MySQL 存儲過程時候,不能省略參數。可以用 null 來替代。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

語法解釋

創建存儲過程的時候一般都會用

DELIMITER $$…BEGIN…END$$ DELIMITER ;放在開頭和結束,目的就是避免mysql把存儲過程內部的";"解釋成結束符號,最後通過“DELIMITER ;”來告知存儲過程結束。

存儲過程的參數有三種類型:

  • IN: 輸入參數. 在調用存儲過程時指定, 默認未指定類型時則是此類型.
  • OUT: 輸出參數. 在存儲過程裏可以被改變, 並且可返回.
  • INOUT: 輸入輸出參數. IN 和 OUT 結合

characteristic部分:

LANGUAGE SQL:用來說明語句部分是SQL語句,未來可能會支持其它類型的語句。

[NOT] DETERMINISTIC:如果程序或線程總是對同樣的輸入參數產生同樣的結果,則被認為它是“確定的”,否則就是“非確定”的。如果既沒有給定DETERMINISTIC也沒有給定NOT DETERMINISTIC,默認的就是NOT DETERMINISTIC(非確定的)CONTAINS SQL:表示子程序不包含讀或寫數據的語句。

NO SQL:表示子程序不包含SQL語句

READS SQL DATA:表示子程序包含讀數據的語句,但不包含寫數據的語句。

MODIFIES SQL DATA:表示子程序包含寫數據的語句。

SQL SECURITY DEFINER:表示執行存儲過程中的程序是由創建該存儲過程的用戶的權限來執行。

SQL SECURITY INVOKER:表示執行存儲過程中的程序是由調用該存儲過程的用戶的權限來執行。(例如上面的存儲過程我寫的是由調用該存儲過程的用戶的權限來執行,當前存儲過程是用來查詢Employee表,如果我當前執行存儲過程的用戶沒有查詢Employee表的權限那麽就會返回權限不足的錯誤,如果換成DEFINER如果存儲過程是由ROOT用戶創建那麽任何一個用戶登入調用存儲過程都可以執行,因為執行存儲過程的權限變成了root)

COMMENT ‘string‘:備註,和創建表的字段備註一樣。

註意:在編寫存儲過程和函數時建議明確指定上面characteristic部分的狀態,特別是存在復制的環境中,如果創建函數不明確指定這些狀態會報錯,從一個非復制環境將帶函數的數據庫遷移到復制環境的機器上如果沒有明確指定DETERMINISTIC, NO SQL, or READS SQL DATA該三個狀態也會報錯。

**********************************************

Mysql中事務處理塊

**********************************************

http://gaunthan.leanote.com/post/MySQL-%E4%BA%8B%E5%8A%A1%E4%B8%8E%E4%BA%8B%E5%8A%A1%E5%A4%84%E7%90%86

https://github.com/MrLining/mysql/wiki/Mysql%E4%BA%8B%E5%8A%A1%E5%A4%84%E7%90%86#mysql%E4%BA%8B%E5%8A%A1%E5%A4%84%E7%90%86

MySQL視圖view/存儲過程和函數的使用