1. 程式人生 > >Mysql高階

Mysql高階

分組 warn group 隔離級別 單個字符 理解 刪除數據 主鍵 transacti

Mysql 連接的使用

可以在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。

JOIN 按照功能大致分為如下三類:

  • INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關系的記錄。
  • LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
  • RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。

技術分享圖片 技術分享圖片 技術分享圖片

MySQL NULL 值處理

MySQL提供了三大運算符:

  • IS NULL: 當列的值是 NULL,此運算符返回 true。
  • IS NOT NULL: 當列的值不為 NULL, 運算符返回 true。
  • <=>: 比較操作符(不同於=運算符),當比較的的兩個值為 NULL 時返回 true。

select student_name from student_info where student_id is null;    註釋:返回學生id為空的學生姓名


MySQL 正則表達式

MySQL可以通過 LIKE ...% 來進行模糊匹配。MySQL 同樣也支持其他正則表達式的匹配, MySQL中使用 REGEXP 操作符來進行正則表達式匹配。

下表中的正則模式可應用於 REGEXP 操作符中。

模式描述
^ 匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 ‘\n‘ 或 ‘\r‘ 之後的位置。
$ 匹配輸入字符串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 ‘\n‘ 或 ‘\r‘ 之前的位置。
. 匹配除 "\n" 之外的任何單個字符。要匹配包括 ‘\n‘ 在內的任何字符,請使用象 ‘[.\n]‘ 的模式。
[...] 字符集合。匹配所包含的任意一個字符。例如, ‘[abc]‘ 可以匹配 "plain" 中的 ‘a‘。
[^...] 負值字符集合。匹配未包含的任意字符。例如, ‘[^abc]‘ 可以匹配 "plain" 中的‘p‘。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,‘z|food‘ 能匹配 "z" 或 "food"。‘(z|f)ood‘ 則匹配 "zood" 或 "food"。
* 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
+ 匹配前面的子表達式一次或多次。例如,‘zo+‘ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
{n} n 是一個非負整數。匹配確定的 n 次。例如,‘o{2}‘ 不能匹配 "Bob" 中的 ‘o‘,但是能匹配 "food" 中的兩個 o。
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。

實例

了解以上的正則需求後,我們就可以根據自己的需求來編寫帶有正則表達式的SQL語句。以下我們將列出幾個小實例(表名:person_tbl )來加深我們的理解:

查找name字段中以‘st‘為開頭的所有數據:

mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^st‘;

查找name字段中以‘ok‘為結尾的所有數據:

mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘ok$‘;

查找name字段中包含‘mar‘字符串的所有數據:

mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘mar‘;

查找name字段中以元音字符開頭或以‘ok‘字符串結尾的所有數據:

mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^[aeiou]|ok$‘;


MySQL 事務

MySQL 事務主要用於處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!

  • 在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。
  • 事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麽全部執行,要麽全部不執行。
  • 事務用來管理 insert,update,delete 語句

一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

  • 原子性:一個事務(transaction)中的所有操作,要麽全部完成,要麽全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  • 一致性:在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續數據庫可以自發性地完成預定的工作。

  • 隔離性:數據庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。

  • 持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務

在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務
務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。

事務控制語句:

  • BEGIN或START TRANSACTION;顯式地開啟一個事務;

  • COMMIT;也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對數據庫進行的所有修改稱為永久性的;

  • ROLLBACK;有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束用戶的事務,並撤銷正在進行的所有未提交的修改;

  • SAVEPOINT identifier;SAVEPOINT允許在事務中創建一個保存點,一個事務中可以有多個SAVEPOINT;

  • RELEASE SAVEPOINT identifier;刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;

  • ROLLBACK TO identifier;把事務回滾到標記點;

  • SET TRANSACTION;用來設置事務的隔離級別。InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

MYSQL 事務處理主要有兩種方法:

1、用 BEGIN, ROLLBACK, COMMIT來實現

  • BEGIN 開始一個事務
  • ROLLBACK 事務回滾
  • COMMIT 事務確認

2、直接用 SET 來改變 MySQL 的自動提交模式:

  • SET AUTOCOMMIT=0 禁止自動提交
  • SET AUTOCOMMIT=1 開啟自動提交

begin;#開始事務
insert into student_info (student_id,student_name) values(2,"lisi");
rollback; #回滾,取消上次的操作
commit;#提交事務


MySQL ALTER命令

用於修改數據表名或數據表字段

刪除,添加或修改表字段

alter table student_info drop student_sex;#刪除student_sex字段

如果數據表中只剩余一個字段則無法使用DROP來刪除字段。

alter table student_info add student_sex varchar first|after student_name #添加student_sex字段,添加到第
一列還是student_name後面

修改字段類型及名稱

modify 和 change

alter table student_info change student_name student_fname char(100);#修改字段名和類型

alter table student_info modify student_id int(100)  #修改student_id字段的類型

 

ALTER TABLE 對 Null 值和默認值的影響

alter table student_info modify student_sex  char not null default "男"; #設置字段student_sex不為空,且
默認值為男

修改,刪除字段默認值

alter table student_info alter student_sex set default “女”; #修改字段student_sex的默認值
alter table student_info alter student_sex drop default;#刪除其默認值

修改表名

alter table student_info rename to students_i;

修改表的存儲引擎  

alter table student_info engine=myisam;


MySQL 索引

索引分單列索引和組合索引:

單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。

實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。

普通索引:這是最基本的索引,它沒有任何限制。

創建索引方式:

1.CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB和TEXT類型,必須指定 length。

2.修改表結構(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)

3.創建表的時候直接指定

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

4.刪除索引的語法

DROP INDEX [indexName] ON mytable;


唯一索引:

索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。

創建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length))

修改表結構

ALTER table mytable ADD UNIQUE [indexName] (username(length))

創建表的時候直接指定

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
UNIQUE [indexName] (username(length))  
 
);

使用ALTER 命令添加和刪除索引

有四種方式來添加數據表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。

  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用於全文索引。

以下實例為在表中添加索引。

mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

你還可以在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試以下實例刪除索引:

mysql> ALTER TABLE testalter_tbl DROP INDEX c;

使用 ALTER 命令添加和刪除主鍵

主鍵只能作用於一個列上,添加主鍵索引時,你需要確保該主鍵默認不為空(NOT NULL)。實例如下:

mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

你也可以使用 ALTER 命令刪除主鍵:

mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

刪除主鍵時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。


顯示索引信息

你可以使用 SHOW INDEX 命令來列出表中的相關的索引信息。可以通過添加 \G 來格式化輸出信息。

嘗試以下實例:

mysql> SHOW INDEX FROM table_name; 

MySQL 臨時表

存儲臨時數據,臨時表只在當前連接可見,當關閉連接時,Mysql會自動刪除表並釋放所有空間。

create temporary table teacher_tbl(
teacher_name varchar(50),
teacher_age int(10),
teacher_sex varchar(20)
);

使用 SHOW TABLES命令顯示數據表列表時,無法看到 teacher_tbl表

手動刪除用drop table

MySQL 復制表

完整的復制MySQL數據表,步驟如下:

  • 使用 SHOW CREATE TABLE 命令獲取創建數據表(CREATE TABLE) 語句,該語句包含了原數據表的結構,索引等。
  • 復制以下命令顯示的SQL語句,修改數據表名,並執行SQL語句,通過以上命令 將完全的復制數據表結構。
  • 如果你想復制表的內容,你就可以使用 INSERT INTO ... SELECT 語句來實現。

步驟一:

獲取數據表的完整結構。

mysql> SHOW CREATE TABLE runoob_tbl \G;
*************************** 1. row ***************************
       Table: runoob_tbl
Create Table: CREATE TABLE `runoob_tbl` (
  `runoob_id` int(11) NOT NULL auto_increment,
  `runoob_title` varchar(100) NOT NULL default ‘‘,
  `runoob_author` varchar(40) NOT NULL default ‘‘,
  `submission_date` date default NULL,
  PRIMARY KEY  (`runoob_id`),
  UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB 
1 row in set (0.00 sec)

ERROR:
No query specified

步驟二:

修改SQL語句的數據表名,並執行SQL語句。

mysql> CREATE TABLE `clone_tbl` (
  -> `runoob_id` int(11) NOT NULL auto_increment,
  -> `runoob_title` varchar(100) NOT NULL default ‘‘,
  -> `runoob_author` varchar(40) NOT NULL default ‘‘,
  -> `submission_date` date default NULL,
  -> PRIMARY KEY  (`runoob_id`),
  -> UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (1.80 sec)

步驟三:

執行完第二步驟後,你將在數據庫中創建新的克隆表 clone_tbl。 如果你想拷貝數據表的數據你可以使用 INSERT INTO... SELECT 語句來實現。

mysql> INSERT INTO clone_tbl (runoob_id,
    ->                        runoob_title,
    ->                        runoob_author,
    ->                        submission_date)
    -> SELECT runoob_id,runoob_title,
    ->        runoob_author,submission_date
    -> FROM runoob_tbl;
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

MySQL 序列使用

MySQL序列是一組整數:1, 2, 3, ...,由於一張數據表只能有一個字段自增主鍵, 如果你想實現其他字段也實現自動增加,就可以使用MySQL序列來實現。

使用auto_increment:MySQL中最簡單使用序列的方法就是使用 MySQL AUTO_INCREMENT 來定義列。

create table insect(
id int not null auto_increment,#id 實現自增
primary key(id);

要重置序列就先刪除原有序列在重新定義

設置序列開始值

mysql> CREATE TABLE insect
    -> (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> PRIMARY KEY (id),
    -> name VARCHAR(30) NOT NULL, 
    -> date DATE NOT NULL,
    -> origin VARCHAR(30) NOT NULL
)engine=innodb auto_increment=100 charset=utf8;

  


MySQL 處理重復數據

防止表中出現重復數據:

可以在MySQL數據表中設置指定的字段為 PRIMARY KEY(主鍵) 或者 UNIQUE(唯一) 索引來保證數據的唯一性。

如果我們設置了唯一索引,那麽在插入重復數據時,SQL語句將無法執行成功,並拋出錯。

INSERT IGNORE INTO與INSERT INTO的區別就是INSERT IGNORE會忽略數據庫中已經存在的數據,如果數據庫沒有數據,就插入新的數據,如果有數據的話就跳過這條數據。這樣就可以保留數據庫中已經存在數據,達到在間隙中插入數據的目的。

註意:設置主鍵,值不能為空

過濾重復數據

如果你需要讀取不重復的數據可以在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重復數據。

mysql> SELECT DISTINCT last_name, first_name
    -> FROM person_tbl;

你也可以使用 GROUP BY 來讀取數據表中不重復的數據:

mysql> SELECT last_name, first_name
    -> FROM person_tbl
    -> GROUP BY (last_name, first_name);

刪除重復數據

如果你想刪除數據表中的重復數據,你可以使用以下的SQL語句:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;#即把舊表分組創建出一個新表,然後刪除舊表,把新表改成為舊表名

也可以在數據表中添加 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重復記錄。方法如下:

mysql> ALTER IGNORE TABLE person_tbl
    -> ADD PRIMARY KEY (last_name, first_name);

MySQL 導出數據

可以使用SELECT...INTO OUTFILE語句來簡單的導出數據到文本文件上。

select * from student_info into outfile “D:/dwx.txt”;

  

Mysql高階