數據庫高級對象

1.函數

函數能夠傳參,也能夠有返回值。可是函數只能有一個返回值
函數能夠包含0-多個參數

聲明不帶參數的函數(如下都以MySql數據庫爲例)
 CREATE FUNCTION 函數名() RETURNS 返回值類型
RETURN 返回結果;
若是函數體中有多行語句,須要使用begin end 包裹sql

CREATE FUNCTION f1() RETURNS VARCHAR(255)
BEGIN
DELETE  FROM tb1 WHERE id=1;
RETURN "hahahahah"; 
END
SELECT f1(); -- 調用函數
DROP FUNCTION f1;-- 銷燬函數
-- 建立帶參數的函數
CREATE FUNCTION f2(username VARCHAR(255),age INT,sex enum("男","女")) RETURNS VARCHAR(255)
BEGIN
INSERT INTO tb VALUES(NULL,username,age,sex);
RETURN "hahahahah"; 
END
SELECT f2("真實姓名",55,"男");

 

2.存儲過程

存儲過程
是一組預先存儲好的SQL語句和控制語句的預編譯集合。用一個名字來存儲一組代碼,做爲一個完整的單元進行操做
優勢:數據庫

①加強的sql語句的功能和靈活性;網絡

②執行速度更快 存儲過程當中的SQL語句都是在聲明過程時預先編譯好的,只會在聲明時編譯一次後續執行無需再編譯函數

③減小網絡請求/流量  後臺只需向數據庫提交存儲過程名便可,無需提交大段SQL語句
建立無參存儲過程spa

CREATE PROCEDURE p1()
SELECT * FROM tb;
-- 刪除存儲過程
DROP PROCEDURE p1;
-- 使用call 調用存儲過程,若是沒有參數,則小括號能夠省
CALL p1;

存儲過程的參數與返回值
 在存儲過程當中,參數分爲三種狀況
1. in:相似於函數中的參數,須要在調用存儲過程時傳入
2. out:相似函數中的返回值,存儲過程返回值不用return 而是將結果賦給out類型的參數
3. INOUT:調用存儲過程時能夠傳入參數,同時又容許存儲過程執行時修改其值,並返回code

DROP PROCEDURE p2;
CREATE PROCEDURE p2(in iusername VARCHAR(255),in iage int,in isex enum("男","女"),OUT lastId INT,out total INT)
BEGIN
INSERT INTO tb VALUES (NULL,iusername,iage,isex);
SELECT LAST_INSERT_ID() INTO lastId;-- 使用into將查詢出的最後id賦給lastId
SELECT COUNT(*) FROM tb INTO total;
END
SET @age=22;
CALL p2("xiaowu",@age,"男",@lastId,@total);-- 調用存儲過程out類型的參數,必須傳入一個變量接收
-- in類型的參數可使變量也能夠是字面量
SELECT @lastId;-- 調用完成後,返回的結果被存儲在@lastId變量中,直接select輸出便可

3.事務

事務的四大屬性(ACID屬性)
 一、原子性 Atomicity
 事務是不可再拆分的最小單元。 事務中的全部操做,要麼都執行、要麼都不執行;
 eg:轉帳功能, A減小1000元,B必須增長1000元。而不能出現A減小,B不增長的狀況;
 二、一致性 Consistency
 事務在開始前和結束後的數據必需要保持一致。
 eg:轉帳功能,AB的總金額在轉帳前和轉帳後必須相同。其中短暫的不一樣只能出如今事務未結束時。
 三、隔離性 Isolation
 當事務開始執行後,會隔離其餘事務對數據進行讀寫與修改。
 eg: 轉帳功能,A給B轉帳的過程當中,若是C也給B轉帳,就會致使A給B轉帳的這個事務,
     在結束時的總金額與開始前不一致,也就是說沒法知足事物的一致性。
 四、持久性 Durability
 事務執行完成後,數據的修改是永久的。
blog

 

4.遊標

遊標 用於處理從數據庫中返回的多行記錄,能夠逐行遍歷數據。排序

DROP PROCEDURE youbiao;
CREATE PROCEDURE youbiao(OUT params VARCHAR(255))
BEGIN
    DECLARE cs CURSOR FOR SELECT username FROM tb;-- 爲一個結果集聲明遊標
    OPEN cs;-- 打開遊標
    FETCH cs INTO params;-- 取出遊標放到變量中
    INSERT INTO tb2 VALUES(null,params);
    CLOSE cs;-- 關閉遊標
END;
CALL youbiao(@params);
SELECT @params;

5.視圖

視圖的特色
 是一個數據庫中虛擬的表
 通過查詢操做造成的結果
 具備普通表的結構
 不能實現數據的存儲.數據依然存在實際的數據表中
 對視圖的修改將會影響實際的數據表,可是在視圖新增數據時,必須保證原有數據表的視圖不可見不能爲非空索引

CREATE OR REPLACE VIEW username AS SELECT username,sex FROM tb;
SELECT * FROM username;
DELETE FROM username WHERE username="wuli";
INSERT username VALUES("wuli","男");
DROP VIEW username;

6.索引

索引特色:創建索引能大大提升查詢速度,但會影響下降插入、修改的速度
 適合創建索引的列:須要頻繁查詢的字段,須要常常排序的字段,常常出如今where子句裏的字段;
 不適合創建索引的列:不多使用查詢的字段,數據量不多的字段,修改插入操做遠大於查詢操做的字段
 避免限制索引的方式「(可以使用索引的操做)
 避免使用不等操做符(<> 、!=)
 避免使用is null or is not null
 避免在where子句中使用函數
 避免在比較時使用不匹配的數據類型。
 
 注:MySQL只對如下操做符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的like(不以通配符%或_開頭的情形)事務

CREATE INDEX index1 on tb(username);-- 建立索引

-- 修改表結構方式建立索引
ALTER TABLE tb ADD INDEX index1(username);
CREATE TABLE tt(
    -- 建立表時創建索引
    id INT PRIMARY KEY,
    username VARCHAR(255),
    INDEX index1(username)

);
CREATE UNIQUE INDEX index1 ON tb(username);-- 惟一索引 與普通索引基本相同,只是值必須惟一不能重複,能夠爲空,只能有一個空值
-- 全文索引
-- 只能建立在char\varchar \text等字符串字段上,用於索引大量內容,但生成全文索引很是消耗時間和磁盤空間
ALTER TABLE tb ADD FULLTEXT index1(username);

-- 刪除索引
DROP INDEX index1 ON tb;
相關文章
相關標籤/搜索