目錄
1. MySQL數據類型
數據類型是數據的一種屬性,其可以決定數據的存儲格式、有效範圍和相應的限制
1.1 整數類型:
整數類型是數據庫中最基本的數據類型。標準SQL中支持INTEGER和SMALLINT這兩類整數類型。MySQL數據庫除了支持這兩種類型以外,還擴展支持了TINYINT、MEDIUMINT和BIGINT。
需要無符號時在定義時在類型盤加unsigned, 如 int unsigned,不加則認爲是有符號的。
1.2 浮點數類型和定點數類型:
MySQL中使用浮點數類型和定點數類型來表示小數。浮點數類型包括單精度浮點數( FLOAT型)和雙精度浮點數( DOUBLE型)。定點數類型就是DECIMAL型。
在MySQL中,定點數以字符串形式存儲,因此,其精度比浮點數要高,而且浮點數會出現誤差,這是浮點數一直存在的缺陷。如果要對數據的精度要求比較高,還是選擇定點數decimal比較安全
1.3 日期與時間類型:
日期與時間類型是爲了方便在數據庫中存儲日期和時間而設計的。 MySQL中有多種表示日期和時間的數據類型。其中, YEAR類型表示年份; DATE類型表示日期; TIME類型表示時間; DATETIME和TIMESTAMP表示日期和時間。
1.3.1 YEAR類型
•一個字節
•用4位字符串或者數字表示‘YYYY’或YYYY
•範圍1901——2155
•用兩位字符串表示 ‘00’-’69’, ’70’-’99’
•用兩位數字表示1-69和70-99,0和‘0’的不同 ,‘0’爲2000年,0爲0000年
1.3.2 TIME類型
•3個字節‘HH:MM:SS’ -‘838:59:59’----‘838:59:59’字符串
•‘D HH:MM:SS’ D天數0-34 D*24+HH 例如: 2 11:30:50
•可以不按格式,可以 ‘HH:MM:SS’ , ‘HH:MM’ , D HH , ‘D HH:MM, SS’ 等(用到:符號就需要用‘’的字符串類型)
•‘HHMMSS’字符串和HHMMSS數字 0和’0’相同
•使用CURRENT_TIME和Now()輸入系統當前時間
1.3.3 DATE類型
•4個字節YYYY-MM-DD 1000-01-01 9999-12-31
•‘YYYY-MM-DD’和’YYYYMMDD’的格式,任何標點都可以作爲標識符
•‘YY-MM-DD’和 ‘YYMMDD’的格式,其中YY格式與YEAR類型相似
•YYYYMMDD和YYMMDD數字格式
•CURRENT_DATE和NOW()當前日期
1.3.4 DATETIME類型
•8個字節表示日期時間 ‘YYYY-MM-DD HH:MM:SS’ ‘YYYYMMDDHHMMSS’字符串格式
•支持不嚴格的語法格式
•‘YY-MM-DD HH:MM:SS’ ‘YYMMDDHHMMSS’
•YYYYMMDDHHMMSS和 YYMMDDHHMMSS數字表示
•使用NOW()輸入當前的系統日期時間
1.3.5 TIMESTAMP類型
•4個字節‘YYYY-MM-DD HH:MM:SS’
•1970-01-01 08:00:01到2038-01-19 11:14:07
•TIMESTAMP和DATETIME不同之處:
•範圍較小
•使用CURRENT_TIMESTAMP
•輸入NULL時
•無任何輸入時
•根據時區顯示
1.4 字符串類型:
1.4.1 CHAR類型和VARCHAR類型
•創建表的時候就指定了最大長度 CHAR(4)
•CHAR是固定長度 0-255
•VARCHAR是可變長度 0-65535 VARCHAR(100) 根據需要分配長度 字符串實際長度加1
•VARCHAR有效節約系統空間
1.4.2 TEXT類型
•特殊的字符串類型,只能保存字符數據
•TINYTEXT, 0-255 +2
•TEXT, 0-65535 +2
•MEDIUMTEXT, 0-167772150 +3
•LONGTEXT 0-4294967295 +4
1.4.3 ENUM類型
•在創建表時,其取值範圍就以列表的形式指定了 65535個元素
•插入的是編號
1.4.4 SET類型
•形式與枚舉類型相似
•區別:枚舉類型的值只能取一個元素,SET類型的值可以取列表中一個或多個元素的組合(最多64個元素組合)
•插入記錄時,元素順序無關緊要,mysql自動按照定義的順序顯示
1.5 二進制類型:
1.5.1 BINARY和VARBINARY類型
•創建表的時候指定最大長度
•BINARY長度固定,不足長度用’\0’補全
•VARBINARY長度可變,0到最大長度之間 +1
1.5.2 BIT類型
•創建表的時候指定最大長度 最大64
•BIT(4) 最大能插入15 1111
•在查詢BIT類型字段時,要用函數BIN(字段名+0)將值轉爲二進制顯示
1.5.3 BLOB類型
•一種特殊的二進制類型,如存圖片
•類似TEXT類型,4種
1.6 BOOL和BOOLEAN
•是否類型,等價爲TINYINT(1),長度爲1
2. 操作數據庫
2.1 創建數據庫:
創建數據庫是指在數據庫系統中劃分一塊空間,用來存儲相應的數據。這是進行表操作的基礎,也是進行數據庫管理的基礎。MySQL中,創建數據庫是通過SQL語句CREATE DATABASE實現的。其語法形式如下:
•CREATE DATABASE 數據庫名 ;
2.2 刪除數據庫:
刪除數據庫是指在數據庫系統中刪除已經存在的數據庫。刪除數據庫之後,原來分配的空間將被收回。值得注意的是,刪除數據庫會刪除該數據庫中所有的表和所有數據。因此,應該特別小心。MySQL中,刪除數據庫是通過SQL語句DROP DATABASE實現的。其語法形式如下:
•DROP DATABASE 數據庫名 ;
2.3 數據庫的存儲引擎:
MySQL中提到了存儲引擎的概念。簡而言之,存儲引擎就是指表的類型。數據庫的存儲引擎決定了表在計算機中的存儲方式。存儲引擎的內容和分類,如何選擇合適的存儲引擎
存儲引擎的概念是MySQL的特點,而且是一種插入式的存儲引擎概念。這決定了MySQL數據庫中的表可以用不同的方式存儲。用戶可以根據自己的不同要求,選擇不同的存儲方式、是否進行事務處理等。
•查看MySQL數據庫支持的存儲引擎類型方法如下:
•SHOW ENGINES ;
•分佈式交易處理的XA規範
•修改默認存儲引擎的方法:
關閉mysql服務: net stop mysql
找到mysql安裝目錄下的my.ini文件:
找到default-storage-engine=INNODB 改爲default-storage-engine=MYISAM
啓動mysql服務:net start mysql
2.3.1 InnoDB存儲引擎:
優缺點:
•InnoDB存儲引擎中支持自動增長列AUTO_INCREMENT。自動增長列的值不能爲空,且值必須惟一。 MySQL中規定自增列必須爲主鍵。
•支持外鍵FOREIGN KEY
•表結構存儲在.frm中,數據放innodb_data_home_dir表空間,索引innodb_data_file_path
•良好的事務管理、崩潰修復能力和併發控制
•讀寫效率低,佔用的數據空間大
2.3.2 MyISAM存儲引擎:
MyISAM存儲引擎的表存儲成三個文件。文件的名字與表名相同。擴展名包括frm、 MYD 和MYI。其中, frm爲擴展名的文件存儲表的結構; MYD爲擴展名的文件存儲數據; MYI爲擴展名的文件存儲索引。
佔用空間小,處理速度快
不支持事物的完整性,併發性
2.3.3 MEMORY存儲引擎
MEMORY存儲引擎是MySQL中的一類特殊的存儲引擎。其使用存儲在內存中的內容來創建表,而且所有數據也放在內存中。這些特性都與InooDB存儲引擎、 MyISAM存儲引擎不同
每個基於MEMORY存儲引擎的表實際對應一個磁盤文件。該文件的文件名與表名相同,類型爲frm類型。該文件中只存儲表的結構。而其數據文件,都是存儲在內存中。
•可以快速處理
•大小有限制於兩個參數max_rows,max_heap_table_size
•容易丟失
2.4 如何選擇存儲引擎:
3. 數據表的操作
3.1 創建表的方法:
MySQL中,創建表是通過SQL語句CREATE TABLE實現的。其語法形式如下:
CREATE TABLE 表名 ( 字段名 數據類型 [完整性約束條件],字段名 數據類型 [完整性約束條件],......,字段名 數據類型[完整性約束條件]);
主鍵(PRIMARY KEY)
外鍵(FOREIGN KEY) CONSTRAINT 外鍵別名 FOREIGN KEY(屬性名 數據類型)REFERENCES 其他表(屬性名 數據類型)
不爲空(NOT NULL) 屬性名 數據類型 NOT NULL
唯一(UNIQUE) 屬性名 數據類型 UNIQUE
自增長(AUTO_INCREMENT) 屬性名 數據類型 AUTO_INCREMENT
默認值(DEFAULT) 屬性名 數據類型 DEFAULT 默認值
3.2 查看表結構的方法:
查看錶基本結構語句DESCRIBE:
•MySQL中, DESCRIBE語句可以查看錶的基本定義。其中包括,字段名、字段數據類型、是否爲主鍵和默認值等。 DESCRIBE語句的語法形式如下:
DESCRIBE 表名;
查看錶詳細結構語句:
•MySQL中, SHOW CREATE TABLE語句可以查看表的詳細定義。該語句可以查看錶的字段名、字段的數據類型、完整性約束條件等信息。除此之外,還可以查看錶默認的存儲引擎和字符編碼。 SHOW CREATE TABLE語句的語法形式如下:
SHOW CREATE TABLE 表名;
3.3 修改表的方法:
修改表名 ALTER TABLE 舊錶名 RENAME [TO] 新表名 ;
修改字段的數據類型 ALTER TABLE 表名 MODIFY 屬性名 數據類型;
修改字段名 ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新數據類型 ;
增加字段 ALTER TABLE 表名 ADD 屬性名1 數據類型 [完整性約束條件] [FIRST | AFTER 屬性名2] ;
刪除字段 ALTER TABLE 表名 DROP 屬性名 ;
修改字段的排列位置 ALTER TABLE 表名 MODIFY 屬性名1 數據類型 FIRST | AFTER 屬性名2;
更改表的存儲引擎 ALTER TABLE 表名 ENGINE=存儲引擎名 ;
刪除表的外鍵約束 ALTER TABLE 表名 DROP FOREIGN KEY 外鍵別名 ;
3.4 對數據表內數據進行處理:
插入數據insert:
insert into tableName ([字段名]) values(字段對應的值);
同時插入多條數據:
insert into 表名 values((...),(...),(...));
更新表中已有的數據:
update 表名 set 字段 1 = 新值 1,字段 2=新值 2,... where 條件表達式
(切記:where 條件不能輕易的丟掉!!!)
eg:update subject set name="XiaoMing",age=13 where id=10;
刪除數據:
語法:delete from 表名 [where 條件表達式]
(不加條件刪除則是全部刪除)
3.5 刪除表的方法:
DROP TABLE 表名;
4. 索引
索引是一種特殊的數據庫結構, 可以用來快速查詢數據庫表中的特定記錄。索引是提高數據庫性能的重要方式。MySQL中,所有的數據類型都可以被索引。 MySQL的索引包括普通索引、惟一性索引、全文索引、單列索引、多列索引和空間索引等
• 4.1 索引的含義和特點:
•索引是創建在表上的,是對數據庫表中一列或多列的值進行排序的一種結構。索引可以提高查詢的速度。索引有起明顯的優勢,也有其不可避免的缺點。
•索引的優點: 查詢速度 依賴關係聯合查詢 分組和排序子句
索引的缺點: 創建和維護時間 佔用物理空間 增加刪除數據要動態維護
• 4.2 索引的分類:
MySQL的索引包括普通索引、惟一性索引、全文索引、單列索引、多列索引和空間索引等。
1.普通索引 無任何限制
2.惟一性索引 索引的值必唯一 主鍵
3.全文索引 MyISAM CHAR VARCHAR TEXT
4.單列索引 單個字段
5.多列索引 多個字段 第一個字段必使用
6.空間索引 MyISAM GEOMETRY POINT
• 4.3 如何設計索引:
•爲了使索引的使用效率更高,在創建索引的時候必須考
慮在哪些字段上創建索引和創建什麼類型的索引。本小節將
向讀者介紹一些索引的設計原則。
1.選擇惟一性索引 如學生表的學號
2.爲經常需要排序、分組和聯合操作的字段建立索引 > 可以有效避免排序操作的時間
3.爲常作爲查詢條件的字段建立索引 > 該字段的查詢速度會影響整個表的查詢速度
4.限制索引的數目 > 重構和更新麻煩
5.儘量使用數據量少的索引 > 索引值越長越費時 char(100) char(10)
6.儘量使用前綴來索引 > 長文的前面幾個字符 TEXT BLOG à 前若干個字符
7.刪除不再使用或者很少使用的索引 > 消除索引對更新的影響
• 4.4 如何創建索引:
創建表的時候創建索引:
CREATE TABLE 表名 (字段名 數據類型 [完整性約束條件],字段名 數據類型 [完整性約束條件],INDEX 索引名(字段名));
在已經存在的表上創建索引:
CREATE [ UNIQUE | FULLTEXT | SPATIAL ]INDEX 索引名 ON 表名 (字段名 [ (長度) ] [ ASC | DESC] );
用ALTER TABLE語句來創建索引:
ALTER TABLE 表名 ADD [ UNIQUE | FULLTEXT| SPATIAL ] INDEX 索引名(字段名 [ (長度) ] [ ASC | DESC]);
• 4.5 如何刪除索引:
DROP INDEX 索引名 ON 表名 ;
•4.6 索引、主鍵和惟一性的區別:
•索引建立在一個或幾個字段上。建立索引後,表中的數據就按照索引的規則排列。這樣可以提高查詢速度。
•主鍵是表中記錄的唯一標識,不同的記錄的主鍵值不同;建立主鍵時,系統會自動建立一個唯一性索引。
•唯一性也是建立在表中一個或幾個字段上,其目的是爲了對於不同的記錄,具有唯一性的字段值是不同的。
5. 視圖
視圖是從一個或多個表中導出來的表,是一種虛擬存在的表。視圖就像一個窗口,通過這個窗口可以看到系統專門提供的數據。這樣,用戶可以不用看到整個數據庫表中的數據,而只關心對自己有用的數據。視圖可以使用戶的操作更方便,而且可以保障數據庫系統的安全性。
5.1 視圖的含義和作用:
含義:視圖是一種虛擬的表。視圖從數據庫中的一個或多個表導出來的表。視圖還可以從已經存在的視圖的基礎上定義。數據庫中只存放了視圖的定義,而並沒有存放視圖中的數據。這些數據存放在原來的表中。使用視圖查詢數據時,數據庫系統會從原來的表中取出對應的數據。因此,視圖中的數據是依賴於原來的表中的數據的。一旦表中的數據發生改變,顯示在視圖中的數據也會發生改變。沒有.MYD,.MYI這二個文件,一個是存放數據的,一個存放索引的。
作用:視圖是在原有的表或者視圖的基礎上重新定義的虛擬表,這可以從原有的表上選取對用戶有用的信息。那些對用戶沒有用,或者用戶沒有權限瞭解的信息,都可以直接屏蔽掉。這樣既可以使應用簡單化,也保證了系統的安全。視圖起着類似於篩選的作用。視圖的作用歸納爲如下幾點:
1.使操作簡單化
2.增加數據的安全性
3.提高表的邏輯獨立性
視圖和表的區別和聯繫:
•視圖是按照SQL語句生成的一個虛擬的表
•視圖不佔實際的物理空間,而表中的記錄佔用物理空間
•建立和刪除視圖隻影響視圖本身,不會影響實際的記錄;而建立和刪除表會影響實際的記錄
聯繫:
•視圖是在基本表之上建立的虛擬表,其字段和記錄都來自基本表,其依賴基本表而存在。
•一個視圖可以對應一個或多個基本表或視圖
•視圖是基本表的抽象,在邏輯意義上建立的新關係
5.2 如何創建視圖:
•CREATE [ALGORITHM = {UNDEFINED|MERGE| TEMPTABLE}] VIEW 視圖名 [(字段清單)]
AS SELECT語句 [WITH [CASCADED|LOCAL] CHECK OPTION];
with check option對於沒有where條件的視圖不起作用的
5.3 如何修改視圖:
CREATE OR REPLACE VIEW語句的語法形式如下:
CREATE OR REPLACE [ ALGORITHM = {
UNDEFINED | MERGE | TEMPTABLE } ]
VIEW 視圖名 [ ( 屬性清單 ) ]
AS SELECT語句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION];
ALTER語句修改視圖的語法格式如下:
ALTER [ ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE } ]
VIEW 視圖名 [ ( 屬性清單 ) ] AS SELECT語句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION];
5.4 如何查看視圖:
查看視圖的基本定義:DESCRIBE 視圖名;
SHOW TABLE STATUS LIKE ‘視圖名’;
查看視圖的詳細定義:SHOW CREATE VIEW 視圖名;
查看所有視圖的定義:SELECT * FROM information_schema.views;
5.5 如何刪除視圖:
DROP VIEW [IF EXISTS] 視圖名列表 [RESTRICT | CASCADE];
6. 觸發器
觸發器(TRIGGER)是由事件來觸發某個操作。這些事件包括INSERT語句、 UPDATE語句和DELETE語句。當數據庫系統執行這些事件時,就會激活觸發器執行相應的操作。MySQL從5.0.2版本開始支持觸發器。
6.1 觸發器的含義和作用:
觸發器是由INSERT、 UPDATE和DELETE等事件來觸發某種特定操作。滿足觸發器的觸發條件時,數據庫系統就會執行觸發器中定義的程序語句。這樣做可以保證某些操作之間的一致性。例如,當學生表中增加了一個學生的信息時,學生的總數就必須同時改變。可以在這裏創建一個觸發器,每次增加一個學生的記錄,就執行一次計算學生總數的操作。這樣就可以保證每次增加學生的記錄後,學生總數是與記錄數是一致的。觸發器觸發的執行語句可能只有一個,也可能有多個。
6.2 如何創建觸發器:
單表:CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件(INSERT、UPDATE 和DELETE) ON 表名 FOR EACH ROW 執行語句
多表:CREATE TRIGGER 觸發器名 BEFORE | AFTER
觸發事件(INSERT、UPDATE 和DELETE)
ON 表名 FOR EACH ROW
BEGIN
執行語句列表 (每個執行語句列表要以;結尾,所以需要DELIMITER 將終止符改爲其他的,之後再改回)
END
6.3 如何查看觸發器:
•SHOW TRIGGERS語句;
•查詢information_schema數據庫下的triggers表等。
6.4 如何刪除觸發器:
•DROP TRIGGER 觸發器名 ;
7.查找數據
7.1 查詢語句的基本語法
SELECT 屬性列表 FROM 表名和視圖列表
[ WHERE 條件表達式1 ]
[ GROUP BY 屬性名1 [ HAVING 條件表達式2 ] ]
[ ORDER BY 屬性名2 [ ASC | DESC ] ]
7.2 在單表上查詢數據
查詢所有字段:1.列出表的所有字段 2.使用 “ * ” 查詢所有字段
查詢指定字段
查詢指定記錄:WHERE 條件表達式
帶IN關鍵字的查詢:[ NOT ] IN ( 元素1, 元素2, …, 元素n )
帶BETWEEN AND的範圍查詢:[ NOT ] BETWEEN 取值1 AND 取值2
帶LIKE的字符匹配查詢:[ NOT ] LIKE ‘字符串’ 完全匹配時和=號一樣 兩個通配字符%,_,
查詢空值:IS [ NOT ] NULL
帶AND的多條件查詢:條件表達式1 AND 條件表達式2 [ … AND 條件表達式n ]
其中, AND可以連接兩個條件表達式。而且,可以同時使用多個AND關鍵字,這樣可以連接更多的條件表達式。
帶OR的多條件查詢:條件表達式1 OR 條件表達式2 [ …OR 條件表達式n ]
其中, OR可以用來連接兩個條件表達式。而且,可以同時使用多個OR關鍵字,這樣可以連接更多的條件表達式。
查詢結果不重複:DISTINCT
對查詢結果排序:ORDER BY 屬性名 [ ASC | DESC ] 默認升序
分組查詢:GROUP BY 屬性名 [ HAVING 條件表達式 ] [ WITH ROLLUP ]
1.單獨使用GROUP BY關鍵字來分組
2. GROUP BY關鍵字與GROUP_CONCAT()函數一起使用 (連接函數)
3. GROUP BY關鍵字與集合函數一起使用
4. GROUP BY關鍵與HAVING一起使用
5.按多個字段進行分組
6. GROUP BY關鍵與WITH ROLLUP一起使用
用LIMIT限制查詢結果的數量:1.不指定初始位置 LIMIT 3 2.指定初始位置 LIMIT 0,2
7.3 使用聚合函數查詢數據
COUNT()、 SUM()、 AVG()、 MAX()和MIN()
GROUP BY關鍵字通常需要與集合函數一起使用
7.4 多表上聯合查詢
內連接查詢:內連接查詢可以查詢兩個或兩個以上的表。當兩個表中存在表示相同意義的字段時,可以通過該字段來連接這兩個表。當該字段的值相等時,就查詢出該記錄。
外連接查詢:當該字段取值相等時,可以查詢出該記錄。而且,該字段取值不相等的記錄也可以查詢出來。SELECT 屬性名列表 FROM 表名1 LEFT | RIGHT JOIN 表名2 ON 表名1.屬性名1=表名2.屬性名2 ;
1.左連接查詢 2.右連接查詢
複合條件連接查詢:如:(SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee, department WHERE employee.d_id=department.d_id AND age>24;)
7.5 子查詢
帶IN關鍵字的子查詢:如(SELECT * FROM employee WHERE d_id NOT IN (SELECT d_id FROM department);)
帶比較運算符的子查詢
帶EXISTS關鍵字的子查詢:使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。而是返回一個真假值。如果內層查詢語句查詢到滿足條件的記錄,就返回一個真值(True)。否則,將返回一個假(False)。當返回的值是真值時,外層查詢語句將進行查詢。當返回值是假值時,外層查詢語句不進行查詢或者查詢不出任何記錄。
如: SELECT * FROM employee WHERE EXISTS (SELECT d_name FROM department WHERE d_id=1005);
帶ANY關鍵字的子查詢:ANY關鍵字表示滿足其中任一條件。
帶ALL關鍵字的子查詢:ALL關鍵字表示滿足所有條件。如:SELECT * FROM computer_stu WHERE score>=ALL(SELECT score FROM scholarship);
7.6 合併查詢結果
需要將幾個SELECT語句查詢出來的結果合併起來顯示,使用UNION關鍵字時,數據庫系統會將所有的查詢結果合併到一起,然後去除掉相同的記錄。而UNION ALL關鍵字則只是簡單的合併到一起。
SELECT語句1
UNION | UNION ALL
SELECT語句2
UNION | UNION ALL ….
SELECT語句
7.7 爲表和字段取別名
爲表取別名:表名 表的別名
爲字段取別名:屬性名 [AS] 別名
7.8 使用正則表達式查詢
正則表達式的查詢能力比通配字符的查詢能力更強大,而且更加的靈活。
正則表達式可以應用於非常複雜查詢。MySQL中,使用REGEXP關鍵字來匹配查詢正則表達式。其基本形式如下:
屬性名 REGEXP '匹配方式'
以特定字符或字符串開頭的記錄:如從info表name字段中查詢以字母“L”開頭的記錄。 SQL代碼如下:
SELECT * FROM info WHERE name REGEXP '^L';
以特定字符或字符串結尾的記錄:如從info表name字段中查詢以字母“c”結尾的記錄。 SQL代碼如下:
SELECT * FROM info WHERE name REGEXP 'c$';
替代字符串中的任意一個字符:可以用“.”來替代字符串中的任意一個字符,包括回車和換行。 如從info表name字段中查詢以字母“L”開頭,以字母“y”結尾,中間有兩個任意字符的記錄。 SQL代碼如下:
SELECT * FROM info WHERE name REGEXP '^L..y$';
匹配指定字符中的任意一個:使用方括號([])可以將需要查詢字符組成一個字符集。只要記錄中包含方括號中的任意字符,該記錄將會被查詢出來。例如,通過“[abc]”可以查詢包含a、 b、 c這三個字母中任何一個的記錄。
匹配指定字符以外的字符:使用“[^字符集合]”可以匹配指定字符以外的字符。
如從info表name字段中查詢包含a到w字母和數字以外的字符的記錄。 SQL代碼如下:
SELECT * FROM info WHERE name REGEXP '[^a-w0-9]';
匹配指定字符串:
正則表達式可以匹配字符串。當表中的記錄包含這個字符串時,就可以將該記錄查詢出來。如果指定多個字符串時,需要用符號“|”隔開。只要匹配這些字符串中的任意一個即可。
‘ac|bb|ca’
使用“*”和“+”來匹配多個字符:
正則表達式中,“*”和“+”都可以匹配多個該符號之前的字符。但是,“+”至少表示一個字符,而“*”可以表示零個字符。
‘a*c’ c前a可以出現0次
‘a+c’ c前a至少出現1次
使用{M}或者{M,N}來指定字符串連續出現的次數:
正則表達式中,“字符串{M}”表示字符串連續出現M次;“字符串{M,N}”表示字符串聯連續出現至少M次,最多N次。例如,“ab{2}”表示字符串“ab”必須連續出現兩次。
“ab{2,4}”表示字符串“ab”連續出現至少兩次,最多四次。
8.插入、更新與刪除數據
8.1 插入新紀錄:
爲表的所有字段插入數據:1. INSERT語句中不指定具體的字段名 2. INSERT語句中列出所有字段
爲表的指定字段插入數據:
INSERT INTO 表名(屬性1, 屬性2, … , 屬性m)
VALUES(值1,值2, …, 值m);
同時插入多條記錄:
INSERT INTO 表名 [ (屬性列表) ]
VALUES(取值列表1),(取值列表2)
… ,
(取值列表n) ;
將查詢結果插入到表中:
INSERT INTO 表名1 (屬性列表1)
SELECT 屬性列表2 FROM 表名2 WHERE 條件表達式;
8.2 更新數據:
UPDATE 表名
SET 屬性名1=取值1, 屬性名2=取值2,
…, 屬性名n=取值n
WHERE 條件表達式;
8.3 刪除記錄:
DELETE FROM 表名 [WHERE 條件表式] ;
9. 存儲過程和函數
9.1 創建存儲過程
CREATE PROCEDURE sp_name
([proc_parameter[,...]])
[characteristic ...] routine_body
[IN|OUT|INOUT] para TYPE
characteristic:
{CONTAINS SQL|NO SQL| READS SQL DATA |MODIFIES SQL DATA}
|SQL SECURITY { DEFINER | INVOKER } | COMMENT ‘string'
9.2 創建存儲函數
CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
9.3 變量的使用
存儲過程和函數中可以定義和使用變量。用戶可以使用DECLARE關鍵字來定義變量。然後可以爲變量賦值。這些變量的作用範圍是BEGIN…END程序段中。
1.定義變量
DECLARE my_x INT DEFAULT 12;
2.爲變量賦值
SET my_x=60;
SELECT d_id INTO my_x FROM employee WHERE num= 2;
9.4 流程控制的使用
存儲過程和存儲函數中可以使用流程控制來控制語句的執行。 MySQL中可以使用IF語句、 CASE語句、 LOOP語句、 LEAVE語句、 ITERATE語句、 REPEAT語句、 WHILE語句來進行流程控制。
1. IF…ELSE語句
2. CASE語句
3. LOOP語句
4. LEAVE語句
5. ITERATE語句
6. REPEAT語句
7. WHILE語句
9.5 調用存儲過程和函數
調用存儲過程:CALL sp_name([parameter[,…]]) ;
9.6 查看存儲過程和函數
SHOW STATUS語句:
SHOW { PROCEDURE | FUNCTION } STATUS [ LIKE ' pattern ' ] ;
其中,“PROCEDURE”參數表示查詢存儲過程;“FUNCTION”參數表示查詢存儲函數;“LIKE 'pattern'”參數用來匹配存儲過程或函數的名稱。
SHOW CREATE語句:
SHOW CREATE { PROCEDURE | FUNCTION } sp_name ;
其中,“PROCEDURE”參數表示查詢存儲過程;“FUNCTION”參數表示查詢存儲函數;“sp_name”參數表示存儲過程或函數的名稱。
從information_schema.Routines表中查看:
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=‘sp_name’;
其中, ROUTINE_NAME字段中存儲的是存儲過程和函數的名稱;“sp_name”參數表示存儲過程或函數的名稱。
9.7 修改存儲過程和函數
修改存儲過程和函數是指修改已經定義好的存儲過程和函數。 MySQL中通過ALTER PROCEDURE語句來修改存儲過程。通過ALTER FUNCTION語句來修改存儲函數。MySQL中修改存儲過程和函數的語句的語法形式如下
ALTER {PROCEDURE | FUNCTION} sp_name
[characteristic ...]
characteristic:
{CONTAINS SQL|NO SQL| READS SQL DATA |MODIFIES SQL DATA}
|SQL SECURITY { DEFINER | INVOKER } | COMMENT ’string'
9.8 刪除存儲過程和函數
DROP { PROCEDURE| FUNCTION } sp_name;