1. 程式人生 > >MySQL學習筆記(四)

MySQL學習筆記(四)

end elseif 不同的 位置 定義 begin ima span rmi

一、索引

索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可以提高數據庫中特定數據的查詢速度。

索引的分類:

1、普通索引,允許在定義索引的列中插入重復值和空值。

唯一索引,索引列的值必須是唯一,但允許有空值。

2、單列索引,一個索引只包含單個列,一個表可以有多個單列索引。

組合索引,指在表的多個字段組合上創建索引,只有在查詢條件中使用了這些字段的左邊字段時,索引才會被使用。使用組合索引時遵循最左前綴集合。

3、全文索引,在定義索引的列上支持值的全文查找,允許在這些索引列中插入重復值和空值。mysql中只有myisam存儲引擎支持全文索引。

4、空間索引,是對空間數據類型的字段建立的索引。創建空間索引的列,必須將其聲明為not null,空間索引只能在myisam存儲引擎的表中創建

索引設計原則:

1、索引會占用磁盤空間,所以索引並非越多越好

2、避免對經常更新的表進行過多的索引

3、數據量小的表最好不要使用索引

4、在不同值較多的列上建立索引,不要在不同值少的列上建立索引

5、當唯一性是某種數據本身的特征時,指定唯一索引

創建索引:

[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name[lenght]) [ASC|DESC]

UNIQUE、FULLTEXT、SPATIAL:可選參數,分別表示唯一索引、全文索引、空間索引

INDEX、KEY:意思相同,都是用來表示創建索引

index_name:可選參數,用來指定索引名稱

col_name:用於創建索引的數據列,該列必須從表中定義的多列中選擇

length:可選參數,表示索引的長度,只有字符串類型的字段才能指定長度

ASC、DESC:指定升序或降序的索引值存儲

創建表時創建索引:

/*創建普通索引*/
CREATE
TABLE sd ( id INT NOT NULL UNIQUE, NAME CHAR (30) NOT NULL, YEAR DATE, INDEX (ID) );
/*創建唯一值索引,索引名稱為un_id*/
CREATE TABLE sd1 (
    id INT NOT NULL UNIQUE,
    NAME 
CHAR (30) NOT NULL, YEAR DATE, UNIQUE INDEX UN_ID(ID) );
/*創建組合索引,索引名稱為inna*/
CREATE TABLE sd2 (
    id INT NOT NULL UNIQUE,
    name CHAR (30) NOT NULL,
    year DATE,
    UNIQUE INDEX inna(ID,name)
);

在已存在的表上創建索引:

ALTER TABLE sd ADD INDEX D(year);
/*查看索引*/
ALTER TABLE sd DROP INDEX id_2;

技術分享圖片

table:表名

Non_unique:1代表非唯一索引,0代表唯一索引

key_name:索引名稱

seq_in_index:該字段在索引中的位置,單列索引該值為1,組合索引為每個字段在索引定義中的順序

column_name:定義索引的列名稱

sub_part:索引的長度

null:該字段是否能為空

index_type:索引類型

/*用create index 創建索引*/
CREATE
INDEX na ON sd(name);

刪除索引:

/*刪除名為id的索引*/
ALTER TABLE sd drop id;
/*刪除名為na的索引*/
DROP INDEX na ON sd;

二、存儲過程和函數

1、創建存儲過程的語句主體:

CREATE PROCEDURE sp_name ([proc_parameter])
[characteristics...]routine_body

sp_name:存儲過程的名稱

proc_parameter:存儲過程的參數,語句為:[IN|OUT|INOUT] param_name type ,in表示輸入參數,out表示輸出參數,inout表示既可以是輸入也可以輸出。param_name為參數名稱,type為參數類型。

characteristics:指定存儲過程的特性。

可以取值:LANGUAGE SQL 說明routine_body部分由mysql語句組成。

[NOT] DETERMINISTIC 說明存儲過程執行的結果是否正確,DETERMINISTIC表示結果確定。每次執行存儲過程時,相同的輸入會得到相同的輸出。NOT DETERMINISTIC表示結果不確定,相同的輸入可能得到不同的 輸出。

{CONTAINS SQL| NO SQL | READS SQL DATA | MODIFIES SQL DATA} ,指明子程序使用SQL語句的限制。CONTAINS SQL 表明子程序包含sql語句,但不包含讀寫數據的語句,NO SQL表明子程序不包含sql語句,READS SQL DATA 表明子程序包含讀數據的語句,MODIFIES SQL DATA 表明子程序包含寫數據的語句,默認為CONTAINS SQL

SQL SECURITY{DEFINER | INVOKER} 指明誰有權限來執行。DEFINER 表示只有定義著才能執行,INVOKER表示擁有權限的調用者可以執行。默認為DEFINER

COMMENT‘string‘ 註釋信息,可以用來描述存儲過程或函數。

routine_body:是sql代碼的內容,可以用BEGIN.......END來表示sql代碼的開始和結束。

調用存儲過程的語句主體

CALL sp_name([parameter[...]])

/*創建存儲過程*/
DELIMITER //
CREATE PROCEDURE fa (in a int ,in b int)
BEGIN
SELECT a+b;
END//
DELIMITER;

/*調用存儲過程*/
CALL fa(3,4);

技術分享圖片

使用DELIMITER//語句的作用是將mysql的結束符設置為//,因為mysql默認‘’;‘’為結束符,為了避免與存儲過程中的sql語句結束符相沖突,需要改變存儲過程的結束符。

2、創建存儲函數的語句主體
CREATE FUNCTION func_name ([func_parameter])
RETURNS type
[characteristic...] routine_body

RETURNS type:表示函數返回數據的類型

調用存儲函數:方法與使用mysql的內部函數一樣。

/*創建存儲函數*/
DELIMITER//
CREATE FUNCTION fl (a VARCHAR(30)) 
RETURNS INT 
BEGIN
RETURN (SELECT userid FROM sales WHERE orderid = a);
END//
DELIMITER;

/*調用存儲函數*/
SELECT fl(4196439032);

3、查看存儲過程和存儲函數

/*獲取以f開頭的存儲過程的信息*/
SHOW PROCEDURE STATUS LIKEf%;
/*獲取以f開頭的存儲過程的信息*/
SHOW FUNCTION STATUS LIKEf%;
/*查看存儲過程和函數信息*/
SELECT * FROM information_schema.ROUTINES;       


/*查看名稱為fa的信息*/
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME=fa;

mysql中存儲過程和函數的信息都存儲在information_schema數據庫中的ROUTINES表中。

4、修改存儲過程和函數

使用alter語句用於修改存儲過程或函數的特性

ALTER {PROCEDURE|FUNCTION} sp_name [characteristic...]

  • sp_name:表示存儲過程或函數的名稱
  • characteristic:指定存儲函數的特性
  • 可取值: CONTAINS SQL 表示子程序包含sql語句,但不包含讀或寫數據的語句
  • NO SQL 表示子程序中不包含sql語句
  • READS SQL DATA 表示子程序中包含讀數據的語句
  • MODIFIES SQL DATA 表明子程序包含寫數據的語句
  • SQL SECURITY{DEFINER | INVOKER} 指明誰有權限來執行。DEFINER 表示只有定義著才能執行,INVOKER表示擁有權限的調用者可以執行
  • COMMENT‘string‘ 註釋信息,可以用來描述存儲過程或函數

5、刪除存儲過程和函數

DROP {procedure|FUNCTION}[if EXIT] sp_name

三、 流程控制語句

1、if語句

IF expr_condition THEN statement_list
        [ELSEIF expr_condition THEN statement_list]...
     [ELSE statement_list]
END IF

2、case語句

/*case語句的第一種寫法*/
CASE
case_expr WHEN when_value THEN statement_list [WHEN when_value THEN statement_list]... [ELSE statement_list] END CASE

case_expr參數表示條件判斷的表達式,決定了哪一個when子句會被執行,when_value參數表示表達式可能的值,如果某個when_value的值與case_expr的值相同,則被執行。

/*case語句的另一種寫法*/
CASE
WHEN expr_condition THEN statement_list [WHEN expr_condition THEN statement_list ] ... [ELSE statement_list ] END CASE

when語句逐個執行,直到某個expr_condition為真時執行對應的then語句。如果沒有條件匹配則執行else

3、loop語句、leave語句

loop語句用來重復執行某些語句,與if和case相比,loop只是創建一個循環操作的過程,並不進行條件判斷。loop內的語句一直重復執行直到循環被退出,跳出循環過程使用leave子句。

[loop_label:]LOOP
     statement_list
END LOOP [ loop_label]
loop_label:表示loop語句的標註名稱
statement_list:表示需要循環執行的語句
/*創建一個名為SA的存儲過程*/
DELIMITER//
CREATE PROCEDURE SA()
BEGIN
/*定義變量a,以 DECLARE 關鍵字聲明的變量,只能在存儲過程中使用,稱為存儲過程變量*/
DECLARE a int DEFAULT 0;  
add_loop: LOOP
    SET a=a+1;
    IF a>=20 THEN LEAVE add_loop;
    END IF;
  SELECTA >=20;  /*打印A>=20*/
END LOOP add_loop;
END//
DELIMITER;

/*調用存儲過程*/
CALL  SA();

4、iterate語句

iterate語句意為“再次循環”,將執行順序轉到語句段開頭處,只可以出現在loop、while、repeat語句內。

/*創建存儲過程,f=0,若f<10,重復執行f+1,當f>=10且小於20時,打印f*/
CREATE PROCEDURE SJ6()
BEGIN
DECLARE f INT DEFAULT 0;
my_loop:LOOP
set f=f+1;
IF f<10 THEN ITERATE my_loop;  /*一直循環到f=10,才跳出iterate,執行下面語句,然後再進入loop循環*/
ELSEIF f>20 THEN LEAVE my_loop;
END if;
SELECT f;
END LOOP my_loop;
END;

/*調用存儲過程*/
CALL SJ6();

結果為f:10,11,12,13,14,15,16,17,18,19

5、repeat語句

repeat語句創建一個帶條件判斷的循環語句,每次語句執行完畢後,會對條件表達式進行判斷,如果表達式為真,則循環結束,否則重新執行循環中的語句。

語句格式為:

[repeat_label:]REPEAT
        statement_list
UNTIL expr_condition
END REPEAT [repeat_label]
CREATE PROCEDURE SJ7()
BEGIN
DECLARE d INT DEFAULT 0;
REPEAT 
SET d=d+1;
UNTIL d>=10
END REPEAT;
END;

6、while語句

while語句創建一個帶條件判斷的循環語句,與repeat不同,while在執行語句時,先對指定的表達式進行判斷,如果為真,則執行循環內的語句,否則退出循環。

[while_label]:WHILE expr_condition DO
        statement_list
END WHILE [while_label]
CREATE PROCEDURE SJ8()
BEGIN
DECLARE g INT DEFAULT 0;
WHILE g<0 DO
SET g=g+1;
END WHILE;
END

四、視圖

視圖是一個虛擬表,是從數據庫中一個或多個表中導出的表。視圖也可從已存在的視圖的基礎上定義。視圖一經定義便存儲在數據庫中,與其相對應的數據並沒有像表那樣在數據庫中再存儲一份,通過視圖看到的數據只是存放在基本表中的數據。對視圖的操作與對表的操作一樣,可以對其進行查詢、修改和刪除。當對通過視圖看到的數據進行修改時,相應的基本表的數據也要發生變化;若基本表的數據發生變化,則這種變化也自動反映到視圖中。

視圖的作用:1、簡單化:經常被使用的查詢可以被定義為視圖,從而使得用戶不必為以後的操作每次指定全部條件。

2、安全性:通過視圖用戶只能查詢和修改他們所能見到的數據。數據庫中的其他數據則既不能看見也取不到。

3、邏輯數據獨立性:視圖可幫助用戶屏蔽真實表結構變化帶來的影響。

1、創建視圖

CREATE [OR REPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
    VIEW view_name[(column_list)]
    AS SELECT_statement
  [WITH[CASCADED|LOCAL]CHECK OPTION]
  • CREATE:表示創建視圖
  • REPLACE:表示替換已經創建的視圖
  • ALGORITHM:表示視圖選擇的算法。取值UNDEFINED表示mysql將自動選擇算法;MERGE表示將使用的視圖語句與視圖定義合並起來,使得視圖定義的某一部分取代語句對應的部分;TEMPTABLE表示將視圖的結果存入臨時表,然後用臨時表來執行語句
  • view_name:為視圖名稱
  • column_list:為屬性列
  • SELECT_statement:表示select語句
  • [WITH[CASCADED|LOCAL]CHECK OPTION]:表示視圖在更新時保證在視圖的權限範圍之內。CASCADED為默認值,表示更新視圖時要滿足所有相關視圖和表的條件,LOCAL表示更新視圖時滿足該視圖本身定義的條件即可。
/*創建視圖,列名稱為id,date*/
CREATE VIEW view_s(id,date)AS SELECT userid, orderdate from sales;

/*從視圖中查詢數據*/
SELECT * from view_s;
/*在多個表上創建視圖*/
CREATE VIEW view_sc AS SELECT sales.orderdate,city.city FROM sales,city WHERE sales.userid=city.userid;

2、查看視圖

DESCRIBE view_sc;

技術分享圖片

SHOW TABLE STATUS LIKE view_sc

技術分享圖片

3、修改視圖

修改視圖的語句與創建視圖的語句完全一樣。當視圖已經存在時,修改語句對其進行修改,當視圖不存在時,創建視圖。

CREATE [OR REPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
    VIEW view_name[(column_list)]
    AS SELECT_statement
  [WITH[CASCADED|LOCAL]CHECK OPTION]

修改視圖的另一種語句,alter語句。

ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
    VIEW view_name[(column_list)]
    AS SELECT_statement
  [WITH[CASCADED|LOCAL]CHECK OPTION]

/*創建視圖*/
CREATE VIEW view_aa AS SELECT * FROM aa;
技術分享圖片
/*修改視圖*/
CREATE OR REPLACE VIEW view_aa(var) AS SELECT * FROM aa;
技術分享圖片

4、更新視圖

更新視圖是指通過視圖來插入、更新、刪除表中的數據,因為視圖是一個虛擬表,其中沒有數據,對視圖的更新實際上是對其基本表進行更新。

/*創建表aa的視圖*/
CREATE VIEW view_aa AS SELECT * FROM aa;
/*通過視圖插入數據*/
INSERT INTO view_aa VALUES(178);

結果:表aa,視圖view_aa都增加一條數據

/*通過視圖刪除數據*/
DELETE FROM view_aa where num=178;

結果:表aa,視圖view_aa都刪除一條數據


/*在表aa中更新數據*/
UPDATE aa SET num=54;

結果:表aa,視圖view_aa都更新了數據

5、刪除視圖

DROP VIEW[IF EXISTS]
        view_name[,view_name]...
        [RESTRICT|CASCADED]

MySQL學習筆記(四)