MySQL數據庫微信h5棋牌搭建詳解論壇:aqiulian.com,更多有關MySQL數據庫的諮詢Q:212303635。今天向你們講解一下MySQL的的基本詳情。。mysql
數據類型
1> 整數類型正則表達式
(1)指定類型顯示寬度:數據類型(顯示寬度)
如:INT(4)
(2)ZEROFILL 屬性:用於數據不足的顯示空間由0來填補,能夠大量用於所謂「流水號」的生成上
如:CREATE TABLE t1(id INT(6) ZEROFILL AUTO_INCREMENT PRIMARY KEY,col2 VARCHAR(32));
(3)AUTO_INCREMENT 屬性:是字段成爲自增字段
(4)UNSIGNED 屬性:將整型轉換成無符號的
如:id int(4) unsigned zerofill NOT NULL
2> 浮點數類型和定點數類型
(1)指定浮點數和定點數的精度:數據類型(M,D) M參數的精度數,就是數據的長度 D參數的表弟,就是小數點後的長度
如:FLOAT(6,2)
3> 日期與時間類型
(1)YEAR以YYYY的形式顯示年份
注:使用2位字符串表示,如:00 或 "00" 會轉換成 2000
(2)TIME以D HH:MM:SS形式存儲,但能夠不按照嚴格方式存儲 如:HH:MM
(3)CURRENT_TIME 或 NOW() 表示當前系統時間
(4)DATE以YYYY-MM-DD 形式存儲,支持不嚴格語法如YYYY/MM/DD YYYY@MM@DD YYYY.MM.DD 會自動轉換成 YYYY-MM-DD 格式算法
(5)DATETIME以YYYY-MM-DD HH:MM:SS 形式存儲
注:DATETIME只能使用NOW()來傳遞當前系統時間
(6)TIMESTAMP也是以YYYY-MM-DD HH:MM:SS 形式存儲,可是其範圍比DATETIME要小
注:使用CURRENT_TIMESTAMP 或 NULL 或 無任何輸入,系統會輸入當前系統時間
4> 字符串類型
包括 CHAR、VARCHAR、BLOB、TEXT、ENUM、SET
注:<1> 存儲路勁「\」會被系統過濾掉,須要轉義成 「\\」或「/」
<2> MySQL存儲BOOLEAN或BOOL其最終會轉換成TINYINT(1)存儲
<3> MySQL通常不存儲圖片和音頻文件而是存儲路勁,要是要存儲就是用BLOB
(1)CHAR 和 VARCHAR
都是在建立表時指定最大長度,形式:字符串類型(M) M最大長度
VARCHAR是在範圍內長度可變用多少分配多少所以資源利用率高,而CHAR始終佔用指定長度的空間有點費空間可是查詢效率比VARCHAR快不少,所以CHAR適用於做主鍵 或 存儲固定長度字符串數據 或 頻繁修改數據
(2)TEXT
用於存儲大量的文字信息,佔用資源大,謹慎使用。各類TEXT類型僅僅在於存儲數據多少的差別
(3)ENUM
以列表的形式指定,形式爲 屬性名 ENUM('value1','value2',...) 只能取其中一個
注:若加上NOT NULL則默認取列表中第一個元素
(4)SET
以列表的形式指定,形式爲 屬性名 SET('value1','value2',...) 可取一個或多個,不一樣元素之間用逗號隔開,插入數據時系統會按照定義順序顯示,如:插入 ('C','B','D') 數據庫中以 B,C,D 形式保存
5> 二進制類型
6> BOOLEAN類型
BOOLEAN值時用1表明TRUE,0表明FALSE,boolean在MySQL裏的類型爲tinyint(1),四個常量:true,false,TRUE,FALSE,它們分別表明1,0,1,0
如:insert into test(isOk) values(true);
操做數據庫
1> 數據庫登陸
dos窗口鏈接數據庫 mysql -h localhost -u root -p 在輸入密碼
2> 數據庫建立、刪除、查詢操做
(1)建立數據庫 CREATE DATABASE 數據庫名;
(2)顯示系統中全部的數據庫 SHOW DATABASES;
(3)刪除數據庫 DROPDATABASE 數據庫名;
注:刪除數據庫指令將會刪除數據庫中全部的數據和表
(4)使用數據庫 USE 數據庫名稱;
3> 存儲引擎
(1)查詢系統中支持的存儲引擎 SHOW ENGINES;
注:<1> Engine屬性指存儲引擎名稱,Support屬性指是否支持該類型YES表示支持NO表示不支持DEFAULT表示默認,Comment屬性指對該引擎的評論,Transactions屬性指是否支持事務處理,XA屬性指是否分佈式處理XA規範,Savepoints屬性指是否支持保存點以便回滾到保存點
<2> 通常使用默認 InnoDB 就能夠
(2)經常使用的存儲引擎
4> 表的建立、修改、刪除
(1)建立表 CRETAE TABLE 表名(屬性名 數據類型 [完整性約束條件],...)
(2)完整性約束
<1> 單子段主鍵:屬性名 數據類型 PRIMARYKEY KEY 如:CREATE TABLE T1(id INTEGER PRIMARY KEY,name VARCHAR(20));
多字段主鍵:PRIMARY KEY(屬性名1,屬性名2,...) 如:CREATE TABLE T1(id INTEGER,name VARCHAR(20),PRIMARY KEY(id,name));
<2> 表的外鍵(必須依賴於父表的主鍵,期能夠爲空):CONSTRAINT 外鍵別名 FOREIGN KEY(屬性名1.1,屬性名1.2,...) REFERENCES 表名(屬性名2.1,屬性名2.2,...)
如:CREATE TABLE T1(id INTEGER PRIMARY KEY,name VARCHAR(20),CONSTRAINT c_fk FOREIGN KEY(id) REFERENCES T2(id));
<3> 非空約束:屬性名 數據類型 NOT NULL
<4> 惟一性約束:屬性名 數據類型 UNIQUE
<5> 自動增加(主要用於爲新紀錄生成惟一ID且一個表只有一個AUTO_INCREMENT約束並是主鍵的一部分其是任何整數類型):屬性名 數據類型 AUTO_INCREMENT
<6> 默認值:屬性名 數據類型 DEFAULT 默認值
(3)查看錶結構:
<1> 表基本結構:DESCRIBE 表名;
<2> 表詳細結構:SHOW CREATE TABLE 表名;sql
(4)修改表
<1> 修改表名:ALTER TABLE 舊錶名 RENAME [TO] 新表名;
<2> 修改數據類型:ALTER TABLE 表名 MODIFY 屬性名 數據類型;
<3> 修改字段名:ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新數據類型;
<4> 增長字段:ALTER TABLE 表名 ADD 屬性名1 數據類型 [完整性約束] [FIRST|AFTER 屬性名];
<5> 刪除字段:ALTER TABLE 表名 DROP 屬性名;
<6> 修改存儲引擎:ALTER TABLE 表名 ENGINE=存儲引擎名
(5)刪除表
<1> 沒有關聯的普通表:DROP TABLE 表名;
<2> 有關聯的父表:先刪除關聯表外鍵約束 ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名 再刪除表
5> 事務,事務是一個最小的、不可分割的工做單元,不論成功與否都做爲一個總體進行工做,其具備Atomic(原子性),Consistent(一致性),Isolated(隔離性),Durable(持久性)
START TRANSACTION;
// 提交事務
COMMIT;
// 回滾
ROLLBACK;
索引
用於快速查詢數據庫表中的數據
優勢:提升檢索數據的速度
缺點:索引須要佔用物理空間,所以在增長、刪除、修改數據時會形成維護速度下降
1> 索引的設計原則
(1)選擇惟一性索引,可更快經過索引肯定某條記錄
(2)爲常常須要排序ORDER BY、分組GROUP BY和聯合操做UNION的字段創建索引
(3)爲常做爲查詢條件的字段創建索引
(4)限制索引的數目,索引太多須要的磁盤空間就越大,修改表示對索引的重構和更新會很麻煩
(5)儘可能使用數據量少的索引,對CHAR(100)全文索引確定會比CHAR(10)耗時多
(6)儘可能使用前綴來索引
(7)刪除再也不使用或者不多使用的索引
2> 建立索引
建立表時建立索引,其最基本形式是 CREATE TABLE 表名(屬性名 數據類型 [完整性約束條件],屬性名 數據類型 [完整性約束條件]... 屬性名 數據類型 [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [別名] (屬性名1 [(長度)] [ASC|DESC])) FULLTEXT是可選參數表示全文索引,SPATIAL是可選參數表示空間索引,INDEX和KEY指定那些字段是索引二擇其一做用相同
(1)建立普通索引:如:CREATE TABLE T1(id INT,name VARCHAR(50),INDEX(id))
(2)建立惟一性索引:如:CREATE TABLE T1(id INT UNIQUE,name VARCHAR(50),INDEX(id ASC))
(3)建立全文索引:全文索引只創建在CHAR、VARCHAR或TEXT類型的字段上,且只有MyISAM存儲支持全文索引 如:CREATE TABLE T1(id INT,name VARCHAR(50),FULLTEXT INDEX(name ))
(4)建立單列索引:在單個字段上的一部分創建索引只查詢前面若干索引 如:CREATE TABLE T1(id INT,name VARCHAR(50),INDEX(name(10)))
(5)建立多列索引:在表的多個字段上建立一個索引 如:CREATE TABLE T1(id INT,name VARCHAR(50),INDEX(id,name))
注:只有在使用索引中的第一個字段時纔會觸發索引
(6)建立空間索引:
(7)在已存在的表上建立索引:CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 ON 表名 (屬性名 [(長度)] [ASC|DESC])
(8)用ALTER TABLE語句來建立索引:ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 ON 表名 (屬性名 [(長度)] [ASC|DESC])
如:ALTER TABLE Info_Pictures ADD INDEX pictures_index_userId(picturesUserId, picturesCreatetime ASC)
3> 刪除索引
基本形式是 DROP INDEX 索引名 ON 表名
視圖
視圖是一種虛擬的表由一個或多個表導出,其能夠從已存在的視圖基礎上定義,數據庫中只存放視圖的定義沒有存放視圖中的數據,數據依舊在原來的表中。使用視圖時會從原來的標中取出對應的數據,所以視圖中的數據依賴於原來的表中的數據,一旦表中的數據發生變化,顯示在視圖中的數據也會發生變化
1> 建立視圖
語法形式:CREATE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 視圖名 [(屬性清單)] AS SELECT 語句 [WITH [CASCADED|LOCAL] CHECK OPTION] ALGORITHM爲可選參數表示視圖選擇的算法其包括3個選項UNDEFINED(自動選所使用的算法)、MERGE(使用視圖語句與視圖定義結合起來使得視圖定義的某一部分取代語句對應部分)、TEMPTABLE(將視圖的結果存入臨時表再使用零時表執行語句),WITH CHECK OPTION是可選參數表示更新視圖時要保證在該視圖的權限範圍內
注:建立視圖時,最好加上WITH CHECK OPTION 和 CASCADED,這樣從視圖派生出來的新視圖後,更新新視圖須要考慮其父視圖的約束條件
(1)單表建立視圖:如:CREATE VIEW v1 AS SELECT * FROM t1;
(2)多表建立視圖:如:CREATE ALGORITHM=MERGE VIEW v1(name,age) AS SELECT name,age FROM t1,t2 WITH LOCLA CHECH OPTION;
2> 修改視圖
語法形式:CREATE OR REPLACE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 視圖名 [(屬性清單)] AS SELECT 語句 [WITH [CASCADED|LOCAL] CHECK OPTION]
或是使用ALERT語句 ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW 視圖名 [(屬性清單)] AS SELECT 語句 [WITH [CASCADED|LOCAL] CHECK OPTION]
注:只要有權限,更新視圖中的信息,對應的表中數據也將更新
沒法更新視圖的狀況
(1)視圖中包含SUN()、COUNT()、MAX()、MIN()等函數
(2)視圖中包含UNION、UNION ALL、DISTINCT、GROUP BY、HAVING
(3)常亮視圖
(4)視圖中包含SELECT子查詢
(5)由不可更新的試圖導出的視圖
(6)建立視圖時,ALGORITHM爲TEMPTABLE
3> 刪除視圖
語法形式:DROP VIEW [IF EXISTS] 視圖名 [RESTRICT|CASCADE]
觸發器
觸發器是由INSERT、UPDATE、DELETE語句觸發
1> 建立只有一個執行語句的觸發器,語法形式:CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件 ON 表名 FOR EACH ROW 執行語句; BEFORE指在觸發事件以前執行觸發語句,AFTER在觸發事件以後執行語句,觸發事件指觸發條件能夠是INSERT、UPDATE、DELETE,表名指觸發事件操做的表的名稱,FOR EACH ROW表示任何一條記錄上的操做知足觸發事件都會觸發該觸發器,執行語句指觸發器被觸發後執行的程序 如:CREATE TRIGGER trigger1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO time VALUES(NOW());
2> 建立多個執行語句的觸發器,語法形式:CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件 ON 表名 FOR EACH ROW BEGIN 全部執行語句 END
注:1> 通常系統以「;」做爲執行語句,在建立觸發器過程當中須要用到「;」,可使用DELIMITER語句防止多條執行語句結尾的「;」致使提早執行觸發器,如:
DELIMITER
&&
CREATE TRIGGER trigger1 AFTER DELETE ON t1 FOR EACH ROW
BEGIN
INSERT INTO t2(time) VALUES(NOW());
INSERT INTO t3(time) VALUES(NOW());
END
&&
DELIMITER;
2> 同一個表在相同觸發事件的相同觸發事件,只能建立一個觸發器,像是同一個表可建立INSERT事件的BEFORE和AFTER事件
3> 顯示觸發器,語法形式:SHOW TRIGGERS;
4> 觸發器的執行順序是BEFORE觸發器、表操做(INSERT、UPDATE和DELETE)和AFTER觸發器
5> 觸發器中不能包含START TRANSACTION、COMMIT、CLAA或ROLLBACK的關鍵詞,觸發器在執行過程當中任何步驟出錯都會組織程序向下執行,對於普通表已更新過的記錄不能回滾,更新後的數據將繼續保持在表中
6> 刪除觸發器,語法形式:DROP TRIGGER 觸發器名;
查詢數據
1> 基本查詢語句,語法形式:SELECT 屬性列表 FROM 表名和視圖列表 [WHERE 條件表達式1] [GROUP BY 屬性名1 [HAVING 條件表達式2]] [ORDER BY 屬性名2 [ASC|DESC]]
(1)語法規則:[NOT] IN(元素1,元素2,...)
(2)語法規則:[NOT] BETWEEN 取值1 AND 取值2 如:SELECT * FROM t1 WHERE age BETWEEN 15 AND 25;
(3)語法規則:[NOT] LIKE '字符串' 「%」表明任意長度的字符串,「_」表明單個字符串
(4)語法規則:IS [NOT] NULL 如:SELECT * FROM t1 WHERE column1 IS NULL;
(5)AND 同時知足多條查詢條件,OR 知足其中一條查詢條件
(6)查詢結果不重複,語法規則:SELECT DISTINCT 屬性名 如:SELECT DISTINCT column1 FROM t1;
(7)語法規則:ORDER BY 屬性名 [ASC|DESC]
(8)分組查詢,語法規則:GROUP BY 屬性名 [HAVING 條件表達式] [WITH ROLLUP] WITH ROLLUP關鍵字會在全部記錄的最後加上一條記錄,記錄全部記錄的總和,GROUP BY關鍵字一般與幾何函數一塊兒使用COUNT()統計記錄總數、SUM()計算字段的值的綜合、AVG()計算字段值的平均值、MAX()查詢字段的最大值、MIN()查詢字段的最小值、GROUP_CONCAT()將分組中指定字段值都顯示出來,如:SELECT GROUP_CONCAT(name) FROM t1 GROUP BY sex; 返回的數據是 name1,name2,name3
注:1> {1,2,3}就是升序,{3,2,1}就是降序,默認是ASC
2> *是全部字段
2> LIMIT限制查詢結果數量
(1)不指定初始化位置,從第一條記錄開始顯示指定條數記錄,語法規則:LIMIT 記錄數 如:SELECT * FROM t1 LIMIT 2;
(2)指定初始化位置,位置基於0,語法規則:LIMIT 初始位置,記錄數
如:SELECT * FROM t1 LIMIT 0,2;
SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15
SELECT * FROM table LIMIT 95,-1; // 爲了檢索從某一個偏移量到記錄集的結束全部的記錄行,能夠指定第二個參數爲 -1:檢索記錄行 96-last
SELECT * FROM table LIMIT 5; // 若是隻給定一個參數,它表示返回最大的記錄行數目,換句話說,LIMIT n 等價於 LIMIT 0,n:檢索前 5 個記錄行
3> 鏈接查詢
(1)內鏈接查詢,如:SELECT a.name,b.name FROM t1,t2 WHERE t1.id=t2.id;
(2)外連接查詢,語法規則:SELECT 屬性名列表 FROM 表名1 LEFT|RIGHT JOIN 表名2 ON 表名1.屬性=表名2.屬性;
4> 子查詢
(1)帶IN關鍵字的子查詢,如:SELECT * FROM t2 WHERE column1 IN(SELECT column1 FROM t2)
(2)帶比較運算符的子查詢,如:SELECT * FROM t2 WHERE column1>=(SELECT column1 FROM t2)
(3)帶EXISTS的子查詢,如:SELECT * FROM t2 WHERE EXISTS(SELECT column1 FROM t2)
(4)帶ANY關鍵字的子查詢,ANY關鍵字表示知足其中任一條件,如:SELECT * FROM t2 WHERE column1>=ANY(SELECT column1 FROM t2)
(5)帶ALL關鍵字的子查詢,ALL關鍵字表示知足全部條件,如:SELECT * FROM t2 WHERE column1>=ALL(SELECT column1 FROM t2)
5> 合併查詢結果
語法規則:SELECT 語句1 UNION|UNION ALL SELECT 語句2 UNION|UNION ALL... 如:SELECT id FROM t1 UNION SELECT id FROM t2
注:UNION關鍵字會將全部查詢出的結果合併到一塊兒,再去除全部相同記錄,而UNION ALL 則可能存在相同記錄
6> 位字段取別名
語法規則:屬性名 [AS] 別名
7> 正則表達式查詢,語法規則:屬性名 REGEXP '匹配方式'
插入、更新與刪除數據
1> 插入數據
(1)不指定具體字段名,語法規則:INSERT INTO 表名 VALUES(值1,值2...)
(2)指定具體字段名,語法規則:INSERT INTO 表名(屬性1,屬性2...) VALUES(值1,值2...)
(3)同時插入多條數據,語法規則:INSERT INTO 表名[(屬性列表)] VALUES(值列表1),(值列表2)...
(4)將查詢結果插入到表中,語法規則:INSERT INTO 表名1(屬性列表1) SELECT 屬性列表2 FROM 表名2 WHERE 條件表達式;
2> 更新數據
語法規則:UPDATE 表名 SET 屬性1=值1,... WHERE 條件表達式
3> 刪除數據
語法規則:DELETE FROM 表名 [WHERE 條件表達式]
運算符
1> 算術運算符
如:SELECT a,a+10,a-5 FROM t1
2> 比較運算符
3> 邏輯運算符
4> 位運算符
函數
1> 數學函數
2> 字符串函數
3> 日期時間函數
4> 條件判斷函數
(1)IF(expr,v1,v2)函數:若是表達式expr成立返回v1不然返回v2,如:SELECT id,IF(grade>=60,'PASS','FAIL') from t1;
(2)IFNULL(v1,v2)函數:v1不爲空則返回v1不然返回v2
(3)CASE函數
<1> CASE WHEN expr1 THEN v1 [WHEN e2 THEN v2...] [ELSE vn] END CASE表示開始,END表示函數結束,expr1成立返回v1,依次類推,最後ELESE時返回vn
如:SELECT id,grade,CASE WHEN grade>60 THEN 'GOOD' WHEN grade=60 THEN 'PASS' ELSE 'FAIL' END level FROM t6;
<2> CASE expr WHEN e1 THEN v1 [WHEN e2 THEN v2...] [ELSE vn] END 若是字段expr等於e1返回v1依次類推
如:SELECT id,grade,CASE grad WHEN grade>60 THEN 'GOOD' WHEN grade=60 THEN 'PASS' ELSE 'FAIL' END level FROM t6;
5> 系統信息函數
6> 加密函數
(1)PASSWORD(str):對字符串加密 如:SELECT PASSWORD('abcde')
(2)MD5(str):MD5對str加密數據庫
(3)ENCODE(str,pswd_str):使用字符串pswd_str來加密字符串str,加密結果是二進制數,必須使用BLOB類型保存
(4)DECODE(crypt_str,pswd_str):使用pswd_str來爲crypt_str解密
7> 其它函數
(1)FORMAT(x,n):數字x進行格式化,將x保留小數點後n位
存儲過程和函數
存儲過程和函數是在數據庫中定義一些SQL語句的集合,而後直接調用這些存儲過程和函數來執行已經定義好的SQL語句。存儲過程能夠避免開發人員重複的編寫相同的SQL語句。並且,存儲過程和函數是在MySQL服務器中存儲和執行的,能夠減小客戶端和服務器端的傳輸數據
1> 建立存儲過程:CREATE PROCEDURE sp_name([proc_parameter[,...]]) [characteristic...] routine_body
sp_name是存儲過程名稱
proc_parameter是存儲過程的參數列表每一個參數有3個部分組成分別是輸入輸出類型、參數名稱和參數類型心事如:[IN|OUT|INOUT] param_name type
characteristic是存儲過程的特性
注:系統默認指定CONTAINS SQL,表示使用SQL語句,若是沒有使用SQL,最好設置爲NO SQL
routine_body是代碼的內容,能夠用BEGIN...END來標誌SQL代碼的開始和結束
如:
DELIMITER
&&
CREATE PROCEDURE num_from_employee(IN emp_id INT,OUT count_num INT)
READS SQL DATA
BEGIN
SELECT COUNT(*) INTO count_num FROM employee WHERE d_id=emp_id;
END
&&
DELIMITER
2> 建立存儲函數:CREATE FUNCTION sp_name([func_parameter[,....]]) RETURANS type [characteristic...] routine_body
如:
DELIMITER
&&
CREATE FUNCTION name_from_employee(emp_id INT) RETURNS VARCHAR(20)
BEGIN
RETUEN (SELECT name FROM employee WHERE num=emp_id);
END
&&
DELIMITER
3> 變量使用
(1)定義變量,語法規則:DECLARE var_name[,...] type [DEFAULT value] DECLARE關鍵字用來聲明變量,var_name是變量名稱,type是變量類型,DEFAULT value是默認值沒有默認是NULL
如:DECLARE my_sql INT DEFAULT 10;
(2)變量賦值,語法規則:SET var_name=expr[,var_name=expr]... 如:SET my_sql=30;
SELECT col_name[,...] INTO var_name[,...] FROM table_name WHERE condition 如:SELECT d_id INTO my_sql FROM employee WHERE id=2
5> 流程控制使用
(1)IF語句,基本語法形式:IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]...
END IF
如:IF age>20 THEN SET @count=@count+1;
ELSEIF age=20 THEN @count2=@count2+1;
ELSE @count3=@count3+1;
END IF;
(2)CASE語句,能夠實現比IF語句更復雜的條件判斷,語法形式:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list]
END CASE
或是
CASE
WHEN search_value THEN statement_list
[WHEN search_value THEN statement_list]...
[ELSE statement_list]
END CASE
如:CASE age
WHEN 20 THEN SET @count1=@count1+1;
ELSE SET @count2=@count2+1;
END CASE;
或是
CASE
WHEN age=20 THEN SET @count1=@count1+1;
ELSE SET @count2=@count2+1;
END CASE;
(3)LOOP語句,循環執行,必須使用LEAVE中止循環,語法形式:
[begin_label:]LOOP
statement_list
END LOOP [end_label]
如:
add_num:LOOP
SET @count=@count+1;
IF @count=100 THEN LEAVE ad_num;
END LOOP add_num;
(4)ITERATE語句:跳出本次循環,進入下一次循環,語法格式:ITERATE label
如:
add_num:LOOP
SET @count=@count+1;
IF @count=100 THEN LEAVE add_num;
ELSE IF MOD(@count,3)=0 THEN ITERATE add_num;
SELECT * FROM employee;
END LOOP add_num;
(4)REPEADT語句,知足條件時跳出循環語句,語法格式:
[begin_label] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
如:
REPEAT
SET @count=@count+1;
UNTIL @count=100;
END REPEAT;
(5)WHILE語句,當知足條件執行循環內的語句,語法格式:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
如:
WHILE @count<100 DO
SET @count=@count+1;
END WHILE;
6> 調用存儲過程和函數
(1)調用存儲過程,系統執行存儲過程當中的語句,而後將結果返回,基本語法:
CALL sp_name([parameter[,...]])
如:
// 建立存儲過程
DELIMITER &&
CASER PROCEDURE num_from_employee(IN emp_id,OUT count_num INT)
READS SQL DATA
BEGIN
SELECT COUNT(*) INTO count_num FROM employee WHERE d_id=emp_id;
END &&
DELIMITER;
// 調用存儲過程
CALL num_from_employee(1002,@n);
// 查詢返回結果
SELECT @n;
(2)調用存儲過程,如:
// 建立存儲函數
DELIMITER &&
CREATE FUNCTION name_from_employee(emp_id INT)
RETURNS VARCHAR(20)
BEGIN
RETURN (SELECT name FROM employee WHERE num=emp_id);
END&&
DELIMITER;
// 調用存儲過程
SELECT name_from_employee(3);
7> 修改存儲過程和函數,語法格式:ALTER {PROCEDURE|FUNCTION} sp_name[characteristic...] characteristic:
{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY{DEFINER|INVOKER}
|COMMENT 'string'
如:ALTER FUNCTION name_from_employee READS SQL DATA COMMENT 'find name';
SELECT SPECIFIC_NAME,SQL_DATA_ACCESS,ROUTINE_COMMENT FROM information_schema.Routines WHERE ROUTINE_NAME='name_from_employee';
8> 刪除存儲過程和函數,語法格式:DROP {PROCEDURE|FUNCTION} sp_name
注:存儲過程的CALL方法能夠調用其它的存儲過程
用戶管理
MySQL包括普通用戶和root用戶,root用戶是超級管理員擁有全部權限
1> 新建用戶
(1)建立普通用戶,語法格式:CREATE USER user [IDENTIFIED BY [PASSWORD] 'password'] [,user [IDENTIFIED BY [PASSWORD] 'password']]...
如:CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
2> 刪除用戶
(1)刪除普通用戶,語法格式:DROP USER user [,user]...;
如:DROP USER 'test2'@'localhost';
3> root用戶修改本身的密碼,語法格式:mysqladmin -u username -p password "new_password";
注:其中的password爲關鍵字不是指舊密碼,並且新密碼必須用雙引號括起來使用單引號會出現錯誤,若是使用單引號,可能形成修改後密碼不是你想要修改的
如:mysqladmin -u root-p password "myroot1";
4> root用戶修改普通用戶密碼,語法格式:SET PASSWORD FOR 'username'@'hostname'=PASSWORD("new_password");
注:新密碼必須使用PASSWORD()函數加密
如:SET PASSWORD FOR 'test3'@'hostname'=PASSWORD("mytest1");
5> 普通用戶修改密碼,語法格式:SET PASSWORD=PASSWORD('new_password');
如:SET PASSWORD=PASSWORD("test")
6> 各類權限
(1)受權,語法格式:GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [,user [IDENTIFIED BY [PASSWORD] 'password']]... [WITH with_option [with_option]...] priv_type是權限類型,column_list是權限做用於哪些列上沒有該參數時做用於整個表上,user是由用戶名和主機構成,password是用戶新密碼
如:GRANT SELECT、UPDATE ON *.* TO 'test5'@'localhost' IDENTIFIED BY 'test5' WITH GRANT OPTION;
7> 回收權限,語法格式:REVOKE priv_type [(column_list)]... ON database.table FROM user [,user] ...
回收所有權限的語法格式:REVOKE ALL PRIVILEGES,GRANT OPTION FROM user [,user]...
如:REVOKE UPDATE ON *.* FROM 'test5'@'localhost';
REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'test5'@'localhost';
8> 查看權限,語法格式:SELECT * FROM mysql.user;
SHOW GRANTS FOR 'username'@'hostname';
如:SHOW GRANTS FOR 'root'@'localhost'
數據備份和還原
1> 數據庫備份,mysqldump命令的工做原理是先查出須要備份的表的結構,再在文本中生成一個CREATE語句,而後將表中的全部記錄轉換成一條INSERT語句
(1)備份一個數據庫,語法格式:mysqldump -h localhost -u username -p dbname table1 table2 ... > BackupName.sql dbname是數據庫的名稱,table1和table2是表的名稱沒有該參數時將備份這個數據庫,BackupName.sql表示備份文件的名稱能夠是絕對路徑
注:1> mysqldump命令備份的文件並不是必定是.sql也能夠是其餘格式如.txt,一般是.sql
2> 不登陸mysql,直接在MySQL中執行備份語句
如:mysqldump -h localhost -u root -p test student >D:\T\s.sql
(2)備份多個數據庫,語法格式:mysqldump -h localhost -u username -p --databases dbname1 dbname2 ... > BackupName.sql
(3)備份全部數據庫,語法格式:mysqldump -h localhost -u username -p --all-databases > BackupName.sql
(4)能夠關閉服務器,在將數據庫目錄複製出來,可是這不是最好的備份方法
2> 使用mysqlhotcopy工具快速備份,這種備份方式mysqldump命令快,工做原理是先將須要備份的數據庫加上一個讀操做鎖,而後用FLUSH TABLES將內存中的數據寫回到硬盤上的數據庫中,最後被備份的數據庫文件複製到目標目錄,命令格式以下:
注:1> mysqlhotcopy工具不是MySQL自帶的,須要安裝Perl的數據庫接口報
2> 因爲mysqlhotcopy工具的工做原理是將數據庫文件拷貝到目標目錄,所以其只能備份MyISAM類型的表,不能用來備份InnoDB類型的表
3> 數據還原,語法規則:mysql -u root -p [dbname] < backup.sql
日誌
啓動日誌功能會下降MySQL數據庫的執行速度,且會佔用大量磁盤空間和使用不少內存,通常不開啓MySQL數據庫的日誌功能
1> 二進制日誌:以二進制文件形式記錄數據庫中的操做,但不記錄查詢語句
2> 錯誤日誌:記錄 MySQL 服務器的啓動、關閉和運行錯誤等信息
3> 通用查詢日誌:記錄用戶登陸和記錄查詢的信息
4> 慢查詢日誌:記錄執行時間超過指定時間的操做
性能優化
查詢系統性能,語法格式:SHOW STATUS LIKE 'value'; value參數的幾個統計參數以下:
1> 分析查詢語句
EXPLAIN,DESCRIBE用於分析SELECT語句的執行狀況,語法規則:EXPLAIN SELECT 語句;
DESCRIBE SELECT 語句;
返回的查詢結果信息:
2> 索引查詢
(1)使用 LIKE 關鍵字查詢時,若匹配字符串的第一個字符爲「%」時,索引不會被詩音,若是不在第一個位置,索引就會被使用
(2)多列索引是在表的多個字段上建立一個索引,只有查詢條件中使用這些字段中第一個字段時,索引纔會被使用
(3)查詢語句只有 OR 關鍵字時,若OR先後兩個條件的列都是索引時查詢中將使用索引,若OR先後有一個條件的列不是索引,那麼查詢中將不會使用索引
3> 優化子查詢:子查詢時,系統內層查詢語句的查詢結果創建一個臨時表,而後外層查詢語句再在臨時表中查詢記錄,查詢完成後撤銷掉這些臨時表,所以使用鏈接查詢來代替子查詢來代替子查詢,這是因爲鏈接查詢不須要創建臨時表,其速度比子查詢要快
(1)將字段不少的表分解成多個表:有些表在設計了不少字段,其中有些字段使用頻率低,當該表數據量大時,查詢數據的速度就會被拖慢,所以將那些使用頻率很低的字段放置在另一個表中(兩外一個表能夠是 *_extra)
(2)增長中間表:在查詢兩個表中的幾個字段,常常連表查詢會下降數據庫查詢速度,可將這些字段創建一箇中間表並將原來那幾個表的數據茶如道中間表中,以後使用中間表來進行查詢和統計,以此提升查詢速度
(3)增長冗餘字段:表的規範化程度越高,表與表之間的關係就越多,若常常進行多表鏈接查詢會浪費不少時間,可增長冗餘字段的方式來提升查詢速度
4> 優化一行數據的查詢,若已知查詢結果只有一條,在查詢語句以後添加 LIMIT 1 能夠在數據庫引擎會在找到一條數據後中止搜索,而不是繼續日後查少下一條符合記錄的數據
5> 使用JOIN級聯查詢時,應該保證兩表中JOIN的字段已近創建過索引且類型相同,這樣MySQL內部會啓動爲你優化JOIN的SQL語句的機制,如:若是你要把 DECIMAL 字段和一個 INT 字段Join在一塊兒,MySQL就沒法使用它們的索引。對於那些STRING類型,還須要有相同的字符集才行
6> 避免 SELECT * 查詢數據,從數據庫裏讀出越多的數據,那麼查詢就會變得越慢而且,若是數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增長網絡傳輸的負載。因此,應該養成一個須要什麼就取什麼的好的習慣
7> 能使用 ENUM 而就不要使用 VARCHAR,ENUM 類型是很是快和緊湊的,實際上ENUM保存的是 TINYINT,但其外表上顯示爲字符串。這樣用這個字段來作一些選項列表變得至關的完美。若是你有一個字段,好比「性別」,「國家」,「民族」,「狀態」或「部門」,你知道這些字段的取值是有限並且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR性能優化
8> 從 PROCEDURE ANALYSE() 取得建議 :PROCEDURE ANALYSE() 會讓 MySQL 幫你去分析你的字段和其實際的數據,並會給你一些有用的建議。只有表中有實際的數據,這些建議纔會變得有用,由於要作一些大的決定是須要有數據做爲基礎
9> 儘量的使用 NOT NULL:NULL會佔用額外的空間且在進行比較的時候會是程序更復雜,其所表明的意義在不一樣的數據庫中會有所不一樣坑是字符串"Empty"、"NULL"或是NULL,所以儘可能使用NOT NULL
10> 把IP地址存成 INT UNSIGNED;若是你用整形來存放,只須要4個字節,而且你能夠有定長的字段。並且,這會爲你帶來查詢上的優點,尤爲是當你須要使用這樣的WHERE條件:IP between ip1 and ip2。
配合使用後面兩個函數來轉換ip信息:INET_ATON:將IP地址轉換成數字型
INET_NTOA:將數字型轉換成ip地址
11> 拆分大的 DELETE 或 INSERT 語句:因爲DELETE 和 INSERT操做時會鎖表的,表一鎖住別的操做都沒法進行,對於訪問量大的網站所積累的進程/線程的延遲會讓Web服務Crash,還會使這個服務器掛掉,所以限制一次對數據庫數據修改的次數,對DELETE採用LIMT,如:DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000
12> 越小的列會越快:若是一個表只會有幾列罷了(好比說字典表,配置表),那麼,咱們就沒有理由使用 INT 來作主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會更經濟一些。若是你不須要記錄時間,使用 DATE 要比 DATETIME 好得多
注:須要留夠足夠的擴展空間,不然往後修改表時會很困難
13> 對錶選擇正確的存儲引擎:
MyISAM:適合於一些須要大量查詢的應用,但其對於有大量寫操做並非很好,甚至你只是須要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都沒法操做直到讀操做完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的
InnoDB:是一個很是複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支持「行鎖」 ,因而在寫操做比較多的時候,會更優秀。而且,他還支持更多的高級應用,好比:事務
14> 優化插入記錄的速度
(1)禁用索引:插入記錄時索引會對插入的記錄進行排序,若插入大量數據時,這些排序會下降插入數據的速度,所以在插入大量數據時,先禁用索引,待插入數據完畢再開啓索引
禁用索引的語句:ALTER TABLE 表名 DISABLE KEYS;
從新開啓索引的語句:ALTER TABLE 表名 ENABLE KEYS;
(2)禁用惟一性檢查:插入記錄時系統會進行惟一性校驗,校驗會下降插入記錄的速度,能夠在插入記錄以前禁用惟一性檢查,待插入數據完畢再開啓
禁用惟一性檢查的語句:SET UNIQUE_CHECKS=0;
從新開啓惟一性檢查的語句:SET UNIQUE_CHECKS=1;
(3)優化INSERT語句:當插入多條數據時,經過一條插入語句比分多條插入語句執行效率速度快不少,這是因爲減小與數據庫之間的鏈接等操做,所以能使用LOAD DATA INFILE語句比INSERT語句速度快
(4)在事務中進行插入處理,進行一個INSERT操做時,MySQL內部會創建一個事務,在事務內才進行真正插入處理操做。經過使用事務能夠減小建立事務的消耗,全部插入都在執行後才進行提交操做,所以採用事務操做可提升插入數據得速度
(5)插入數據是有序的,這樣可減小索引的維護成本
注:合併數據+事務+有序數據的方式在數據量達到千萬級以上表現依舊是良好,在數據量較大時,有序數據索引定位較爲方便,不須要頻繁對磁盤進行讀寫操做,因此能夠維持較高的性能
15> 分析表、檢查表和優化表
(1)分析表,語法格式:ANALYZE TABLE 表名1[,表名2,...]; 返回的結果:
(2)檢查表,語法格式:CHECK TABLE 表名1[,表名2...][option]; option參數有5個參數分別是QUICK、FAST、CHANGED、MEDIUM和EXTENDED,這5個參數的執行效率依次下降
注:option選項只對MyISAM類型的表有效,對InnoDB類型的表無效,CHECK TABLE語句在執行過程當中會給表加上只讀鎖
(3)優化表,使用OPTIMIZE TABLE語句來優化表,該語句只對InnoDB和MyISAM類型的表有效,且該語句只能優化VARCHAR、BLOB或TEXT類型的字段,該語句能夠消除刪除和更新形成的磁盤碎片從而減小空間的浪費,語法格式:OPTIMIZE TABLE 表名1[,表名2...];
16> 優化MySQL服務器
17> 其餘技巧
(1)儘可能使用count(*)計算數量:列的偏移 量決定性能,列越靠後,訪問的開銷越大。因爲count(*)的算法與列偏移量無關,因此count(*)最快, count(最後列)最慢