MySQL基礎知識(全)

MySQL Tutorials

一、概述

目前屬於Oracle,分紅社區版和企業版關係型數據庫mysql

1.1 目錄結構

  1. bin:存儲可執行文件
  2. data:存儲數據文件
  3. doc:文檔
  4. include:存儲包含頭文件
  5. lib:存儲庫文件
  6. share:錯誤消息和字符集

配置文件:my.inigit

1.2 啓動和中止

在win cmd中使用net start/stop mysql來啓動和中止mysql服務github

1.3 登入和登出

1.3.1 登入

mysql -uuer_name -ppassword -Pport -hhost
複製代碼

能夠只使用mysql -uuser_name -ppasswrod來開啓,後面的可使用默認的值。-P是指端口號,默認3306。-h是指地址,默認127.0.0.1。正則表達式

1.3.2 登出

在MySQL命令窗口輸入:exit, quit\q之中任意一個便可。算法

1.4 修改輸入提示符

在登入時,經過-prompt來指定提示符,或者在處於命令行時使用prompt來指定。sql

在指定提示符的時候可使用\D, \d, \h\u來指示提示符顯示當前的日期、數據庫、服務器和用戶。數據庫

1.5 查詢數據庫信息

使用SELECT VERSION(), SELECT NOW(), SELECT USER(), SELECT DATABASE()能夠分別用來顯示當前的數據庫版本、時間、操做用戶和數據庫。設計模式

1.6 註釋

  1. 行註釋:--
  2. 多行註釋:/**/

1.7 約定

數據庫操做指令大寫;數據庫相關的名稱小寫,且單詞之間用下劃線分開。安全

1.8 關於字符編碼

查看mysql中當前編碼服務器

show variables like 'char%
複製代碼

查看數據表的編碼格式

mysql> show create table <表名>;
複製代碼

建立數據庫時指定數據庫的字符集

mysql>create database <數據庫名> character set utf8;
複製代碼

建立數據表時指定數據表的編碼格式

create table tb_books (
    name varchar(45) not null,
    price double not null,
    bookCount int not null,
    author varchar(45) not null ) default charset = utf8;
複製代碼

修改數據庫的編碼格式

mysql>alter database <數據庫名> character set utf8;
複製代碼

修改數據表格編碼格式

mysql>alter table <表名> character set utf8;
複製代碼

修改字段編碼格式

mysql>alter table <表名> change <字段名> <字段名> <類型> character set utf8;
複製代碼

window命令行中中文亂碼問題,鏈接以後使用

set names gbk;
複製代碼

二、數據庫操做

2.1 建立

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name 
[DEFAULT] CHARACTER SET [=] character_name
複製代碼
  1. DEFAULT用來講明使用默認編碼方式。默認編碼方式經過配置文件my.ini 中的default-character-set中指定。
  2. CHARACTER SET [=] character_name用來指定數據庫的字符編碼方式。
  3. 有了IF NOT EXISTS當指定數據庫已經存在的時候,就不會報錯了,不然會報錯,可是報的錯仍是能夠查找到的。

創建表的時候使用備註:

CREATE TABLE test_table (
    test_grade int DEFAULT 1 COMMENT '等級'
) COMMENT = '測試表';
複製代碼

2.2 顯示建立數據庫的SQL語句

SHOW CREATE DATABASE db_name;
複製代碼

相似的,還有顯示錶的建立的SQL語句:SHOW CREATE TABLE tbl_name;

2.3 修改

修改數據庫的字符編碼方式的語句:

ALTER {DATABASE|SCHEMA} [DEFAULT] CHARACTER SET [=] charset_name;
複製代碼

2.4 刪除

DROP {DATABASE|SCHEMA} [IF EXISTS] db_name
複製代碼

2.5 顯示當前全部數據庫

SHOW DATABASES;
複製代碼

相似的,有SHOW TABLES [FROM db_name]用於顯示當前數據庫(或指定數據庫)下面的全部表。

三、數據類型

3.1 整型

整數分爲有符號和無符號的,經過UNSIGNED指定。(取值範圍和C語言中的類型範圍同樣)

  1. TiNYINT:1字節
  2. SMALLINT:2字節
  3. MEDIUMINT:3字節
  4. INT:4字節
  5. BIGINT:8字節

3.2 浮點型

浮點數也分爲有符號的和無符號的。以下所示,前面的m指定了總的位數,後面的n指定了小數的位數,因此整數位數爲m-n. 和C語言中的float和double範圍同樣。

  1. FLOAT[(m,n)]:
  2. DOUBLE[(m,n)]:
  3. DECIMAL[(m,n)]:適用於高精度要求的場景

3.3 時間類型

  1. YEAR:1字節,格式YYYY,範圍1901-2155,零值0000
  2. TIME:3字節,格式HH:MM:SS,範圍-838:59:59-838:59:59,零值00:00:00
  3. DATE:4字節,格式YYYY-MM-DD,範圍1000-01-01-9999-12-31,零值0000-00-00
  4. DATETIME:8字節,格式YYYY-MM-DD HH:MM:SS,範圍1000-01-01 00:00:00-9999-12-31 23:59:59,零值0000-00-00 00:00:00
  5. TIMESTAMP:4字節,格式YYYY-MM-DD HH:MM:SS,範圍19700101080001-2038年的某個時刻,零值00000000000000

或者使用時間戳,用BIGINT保存指定時間的毫秒值。

3.4 字符型

  1. CHAR(m):m字節,0<=m<=255
  2. VARCHAR(m):L+1字節,L<=m<=65535
  3. TINYTEXT:L+1字節,L<28
  4. TEXT:L+2字節,L<216
  5. MEDIUMEXT:L+3字節,L<224
  6. LONGTEXT:L+4字節,L<232
  7. ENUM('val1', 'val2', ...):枚舉類型,取決於枚舉個數,最多65535
  8. SET('val1', 'val2', ...):主要用於對枚舉進行組合選擇

四、數據表的操做

4.1 建立數據表

CREATE TABLE [IF NOT EXISTS] table_name (
    column_name data_type, 
    ...
);
複製代碼

4.2 查看數據庫的表

查看指定數據庫的全部的表

SHOW TABLES [FROM db_name][LIKE 'pattern'|WHERE expr];
複製代碼

4.3 查看列定義

顯示指定表的各個列的定義:

SHOW COLUMNS FROM tbl_name;
複製代碼

4.4 約束

4.4.1 表的空和非空

在建立表的時候,在定義列的後面加上NOT NULL來指定指定的列不可爲空。這樣的列在插入記錄的時候必須對其進行賦值。

4.4.2 自增

自動編號,必須與主鍵組合使用。經過在建立表的時候在列定義後加入AUTO_INCREMENT來實現。此外,能夠經過ALTER TABLE users AUTO_INCREMENT = 10000;來指定自增的開始值。

4.4.3 主鍵

必須保證惟一性,一個表只能有一個,非NULL。建立表的時候使用PRIMARY KEY來指定列是主鍵。

4.4.4 惟一約束

必須保證惟一性,一個表能夠有多個,能夠是NULL的。建立表的時候使用UNIQUE KEY來指定列是惟一的。

4.4.5 默認約束

當指定的列沒有指定值的時候就使用默認的值,在建立表的時候,經過使用DEFAULT關鍵字來指定列的默認值。

4.4.6 外鍵約束

在實際開發過程當中更多地使用邏輯外鍵而不是物理外鍵,就是隻要保證表之間的關聯關係就好,而不爲表設置外鍵。由於外鍵要求建立表的時候,父表和子表都必須使用INNODB引擎。

4.5 修改表

4.5.1 添加單列

ALTER TABLE tbl_name ADD [COLUMN] col_name col_def [FIRST|AFTER col_name]
複製代碼

向指定的表中加入一列。經過FIRST指定新加入的列處於全部列的最前方,經過AFTER col_name指定新加入的列相對於某個列的位置。

4.5.2 添加多個列

ALTER TABLE tbl_name ADD [COLUMN] (col_name col_def[, col_name col_def, ...])
複製代碼

當向表中添加多個列的時候,只能將新加入列放在表的最後面的位置。

4.5.3 刪除列

ALTER TABLE tbl_name DROP [COLUMN] col_name[, col_name, ...]
複製代碼

能夠指定並刪除多個列。

4.5.4 添加約束

ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]] PRIMARY KEY [index_type](index_col_name)

ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]] UNIQUE [index_type](index_col_name)
複製代碼

上面的兩條語句分別用來向指定的表中的列加入主鍵和惟一性約束。示例ALTER TABLE temp ADD UNIQUE(name)(列名上要加括號)。加入了主鍵和惟一性約束的同時會爲指定的列加上索引,因此可使用index_type來指定索引的類型。要爲MySQL設置默認的索引,到my.ini中的default-storage-engine中進行設置便可。另外,可使用SHOW INDEXES FROM tbl_name查看指定表中存在的索引。

4.5.5 刪除約束

ALTER TABLE tbl_name DROP PRIMARY KEY;

ALTER TABLE DROP {INDEX|KEY} col_name;
複製代碼

4.5.6 修改表定義

ALTER TABLE tbl_name MODIFY [COLUMN] col_name col_def [FIRST|AFTER col_name]
複製代碼

上面這種方式能夠修改列的定義語句,它適用的範圍比較廣——能夠經過在col_def中指定約束和數據類型來對列進行更多的修改。

ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name col_def [FIRST|AFTER col_name]
複製代碼

上面的修改語句的適用範圍更廣,它能夠修改的範圍包括:列的數據類型、約束、位置和名稱。

4.5.7 修改表名

ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name 

RENAME TABLE tbl_anem TO new_tbl_name [, tbl_name TO new_tbl_name...]
複製代碼

4.5.8 增長索引

  1. 主鍵索引, 添加PRIMARY KEY:ALTER TABLE tbl_name ADD PRIMARY KEY (col_name)
  2. 惟一索引, 添加UNIQUE:ALTER TABLE tbl_name ADD UNIQUE (col_name)
  3. 普通索引, 添加INDEX: ALTER TABLE ADD key(col_name)以及ALTER TABLE tbl_name ADD INDEX index_name (col_name)
  4. 全文索引, 添加FULLTEXT: ALTER TABLE tbl_name ADD FULLTEXT (col_name)
  5. 多列索引: ALTER TABLE tbl_name ADD INDEX index_name (col_name1, col_name2, ..)

五、插入操做

向表中插入記錄

INSERT [INTO] tbl_name [(col_name, ...)] {VALUES|VALUE} ({expr|DEFAULT}, ...), (...), ...
複製代碼

以上用來向指定數據庫的指定列中插入數據,若是不指定了列的名稱,就必須對錶的全部的列進行賦值。能夠爲指定的列指定值,可使用表達式,也可使用默認值。

INSERT [INTO] tbl_name SET col_name = {expr|DEFAULT} [, col_name = {expr|DEFAULT}]

INSERT [INTO] tbl_name [(col_name, ...)] SELECT ...
複製代碼

將查詢結果插入到指定的表中。好比INSERT INTO temp (name) SELECT name FROM assignment

六、更新操做

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
SET col_name1 = {expr|DEFAULT} [, col_name2 = {expr|DEFAULT}] ... 
[WHERE where_condition]
複製代碼

沒有指定WHERE語句,就對整個表的所有記錄進行更新。

七、刪除操做

DELETE FROM tbl_name [WHERE where_condition]
複製代碼

八、查找

SELECT select_expr [, select_expr ...] 
[
	FROM table_references
	[WHERE where_condition]
	[GROUP BY {col_name|position} [ASC|DESC], ... ]
	[HAVING having_condition]
	[ORDER BY {col_name|expr|position} [ASC|DESC], ...]
	[LIMIT {[offset,] row_count | row_count OFFSET offset}]
]
複製代碼

8.1 查找不一樣值

DISTINCT關鍵字放在指定的列前面,用於檢索指定的列的不一樣的值。好比,select count(distinct cust_id) from orders;

DISTINCT做用於全部的列,而不是其後的那一列。好比,select count(distinct cust_id, order_num) from orders;將搜索出cust_id不一樣而且order_num不一樣的列。

8.2 限制結果集、分頁

select * from orders limit 2 offerset 2;  
select * from orders limit 2 , 2;
複製代碼

相似於上面這樣,前面的數字2表示查詢的數目條數,後面的2表示從哪一個位置開始。因此,上面的效果是查詢第2條和第3條數據。可是,要注意的是數據庫中條的編號的起始位置是0。若是不指定第二個2將查出全部數據中前兩個記錄。

8.3 排序結果集

使用ORDER BY語句。能夠指定多個列進行排序,能夠爲要排序的列指定排序的方向,使用ASC表示增序排列,使用DESC表示降序排列。默認,升序排列。除了使用列名來指定要排序的列,害可使用列的在查詢的全部列中的位置來指定排序的列。

DESC只應用到直接位於其前面的列,若是要爲多個列進行降序,就應該每一個列後面加上DESC

8.4 過濾結果集

8.4.1 WEHER子句操做符

  1. 等於 =
  2. 不等於 <>!=
  3. 小於和小於等於 <<=
  4. 大於和大於等於 >>=
  5. 爲NULL值IS NULL
  6. 處於二者之間BETWEEN

BETWEEN實例:

SELECT * FROM orders WHERE order_num BETWEEN 20006 AND 30000;
複製代碼

8.4.2 AND和OR操做符

使用AND和OR操做符的時候要注意優先級是AND>OR。好比,

select * from orders 
where order_num = 20006 or order_num = 200005 and cust_id = 1000000001;
複製代碼

會被當成

select * from orders 
where order_num = 20006 or (order_num = 20005 and cust_id = 1000000001);
複製代碼

而若是咱們想要表達的意思是:

select * from orders 
where (order_num = 20006 or order_num = 200005) and cust_id = 1000000001;
複製代碼

所以就要在OR操做符上面增長圓括號。

8.4.3 IN操做符

select * from orders where order_num in (20006, 20005);  
複製代碼

IN操做符其實完成的操做和OR同樣。

8.4.4 NOT操做

select * from orders where not order_num = 20005;
複製代碼

如上所示將not操做加在where條件的前面能夠表示對條件的反。上面的效果就至關於where order_num != 20005

8.4.5 exists

select * from orders t 
where 1 = 1 
and exists(select * from customers where cust_id = t.cust_id);
複製代碼

8.4.6 like

select * from products where prod_name like '%doll';
複製代碼

上面的是查找全部prod_name以doll結尾的記錄。還能夠,好比Fish%用來匹配全部以Fish開頭的,F%y用來匹配以F開頭而且以y結尾的記錄。

通配符%能夠用來匹配除NULL意外的記錄,即WHERE prod_name like '%'不會找出prod_name爲NULL的記錄。

8.4.7 下劃線

下劃線用來匹配指定數量的字符。一個下劃線匹配一個字符。

8.5 建立計算字段

8.5.1 拼接字符串

select concat(cust_name,':',cust_city) from customers;
複製代碼

如上所示,使用concat函數能夠將查詢結果拼接起來。

8.5.2 使用別名

select concat(cust_name,':',cust_city) as cust_city from customers;
複製代碼

如上所示,使用AS操做符來將拼接的字符串命名爲cust_city.

8.5.3 使用正則表達式

下面的是使用正則表達式對數據進行過濾的例子,便可以將REGEXP像like同樣使用,並在REGEXP後面加上正則表達式便可。下面的表達式檢索出的結果是,customers中全部cust_name中包含'Fun'的記錄。

select * from customers where cust_name REGEXP 'Fun';
複製代碼

下面的SQL語句用來搜索出全部prod_name開頭字符包含在1,2,8以內,而且字符後面是' inch'的記錄:

select * from products where prod_name regexp '[812] inch'
複製代碼

8.6 分組數據

8.6.1 分組過濾GROUP BY

select order_num, count(order_num) from orderitems group by order_num;
複製代碼

使用GROUP BY能夠對數據進行分組,上面的效果是顯示出指定order_num的記錄的條數。

select t.*, sum(quantity*item_price) as total 
from orders as t, orderitems 
where t.order_num = orderitems.order_num 
group by order_num;
複製代碼

上面的語句的執行的結果是,獲得了orders表的所有數據,以及每條訂單對應的總價(根據orderitems表計算得出)。可是若是沒有加入Group BY語句就沒法獲得上面的結果。

可使用下面的兩個SQL語句的執行結果來理解GROUP BY語句的效果:

select sum(quantity*item_price) from orderitems;
select sum(quantity*item_price) from orderitems group by order_num;
複製代碼

若是沒加Group BY獲得的是兩個列的每條記錄的兩個字段相乘以後的總和,使用以後獲得的是針對每一個order_num的兩個字段相乘以後的總和。前面的只獲得了一條記錄,後面的獲得了針對每一個order_num的記錄。

下面的例子也使用了GROUP語句,可是這裏在分組的時候的依據不是order_num而是cust_id。這樣也是能夠的,它獲得的結果是:各個cust_id所應該支付的帳單總額。

select sum(i.quantity*i.item_price) as total
from orders as o, orderitems as i
where o.order_num = i.order_num
group by o.cust_id;
複製代碼

若是咱們再關聯一張customers表,來獲得用戶的名稱,那麼咱們能夠寫成下面的樣子:

select c.cust_name as name, sum(i.quantity*i.item_price) as total
from orderitems as i, orders as o, customers as c
where i.order_num = o.order_num and c.cust_id = o.cust_id
group by c.cust_id;
複製代碼

8.6.2 過濾分組HAVING

select sum(quantity * item_price) as total 
from orderitems 
group by order_num 
having total > 1000;
複製代碼

如上所示,咱們使用HAVING語句來對分組以後的結果進行過濾。上面是找出總價值在1000以上的分組。

8.7 子查詢

下面的使用了子查詢的語句執行的結果與上面的同樣:指定名稱用戶的總額。

select c.cust_name, (select sum(i.quantity*i.item_price) 
                     from orderitems as i, orders as o
                     where i.order_num = o.order_num and c.cust_id = o.cust_id 
                     group by o.cust_id) as total 
from customers as c;
複製代碼

上面的這種方式是將子查詢用做計算字段。

子查詢的另外一種是用方式是將子查詢的結果放在一個IN中做爲取值範圍。

8.8 聯結表

所謂的聯結能夠理解成按照指定的方式將兩個或者多個表組合起來,造成一個相似於新的表。由於MySQL是關係型數據庫,因此常常會在多個表之間存在一對多或者多對多關係,而聯結的效果就是將這樣的表聯結起來。好比,若是兩個數據庫之間是一對多關係,那麼確定有些字段只存在於父表中,在查詢的時候咱們要將這些存在於父表中的字段與存在於子表中的字段組合起來,造成一個完整的「數據」,就應該使用聯結來實現。

假若有這樣的數據:

在表1中存儲着:A0B0, A0B1 在表2中存儲着:A0C0, A0C1, A0C2

這裏的A, B, C表示的是數據庫的列中存儲的記錄。A表示一個列中的數據,B也表示列中的數據,AB構成一個記錄。

那麼,若是咱們對錶1和表2在A上面使用聯結將獲得的記錄以下:

B0C0, B0C1, B0C2, B1C0, B1C1, B1C2

這就至關於咱們將B中的與A相關的字段補充了起來。

8.8.1 等值聯結

聯結表的最多見的形式是使用=將兩表的對應的字段鏈接起來,這叫作等值聯結。

8.8.2 內聯結

下面是使用內聯結的一個實現:

select vend_name, prod_name
from vendors as v inner join products as p
on v.vend_id = p.vend_id;
複製代碼

內聯結至關於對兩個表在指定的列上面取交集,即只有兩個表中都存在的字段纔會進行聯結。

8.8.3 自聯結

select *
from customers as c1, customers as c2
where c1.cust_name = c2.cust_name
and c2.cust_contact = 'Jim Jones';
複製代碼

上面的SQL語句的是自聯結的,須要爲兩個相同的表分別指定一個別名。

8.8.4 外聯結

所謂的外聯結,就是指左聯結和右聯結。它跟內聯結不一樣的地方只在於,以左聯結爲例,若是左表中被用來指定聯結的值在右表中不存在,那麼也同樣將左表中的記錄檢索出來,只是右表中指定的字段爲NULL。

select vend_name, prod_name
from vendors as v left join products as p
on v.vend_id = p.vend_id;
複製代碼

好比上面的SQL中,若是vendors中的vend_id在右表中不存在,那麼prod_name做爲NULL。同理,可得右聯結。

聯結的語法:

LEFT [OUTER] JOIN,左外鏈接。
RIGHT [OUTER] JOIN,右外鏈接。
複製代碼

這裏的OUTER是可選的,有沒有都行。

8.8.5 組合查詢UNION

select prod_name from products
union
select vend_name from vendors;
複製代碼

使用UNION能夠將兩個分別獨立的SQL查詢的結果合併起來。(可是要求兩個SQL檢索出的列的數目要相等,其實它的效果和OR差很少)

若是查詢出來的兩條記錄同樣,重複的行會被取消,可使用UNION ALL關鍵字來替代UNION,這樣重複的行就不會被取消。

使用UNION組合查詢的時候,只能有一條ORDER BY子句,且必須位於最後一條SELECT語句的後面。

九、視圖

視圖能夠用來簡化SQL操做,你能夠將一次的查詢結果做爲一個視圖,併爲其添加一個名稱,好比A。而後,咱們能夠像使用一個表同樣從A中檢索出數據。

視圖的建立語句以下:

create view orderdetail as
select o.*, i.order_item, i.prod_id, i.quantity, i.item_price
from orders as o left join orderitems as i
on o.order_num = i.order_num;
複製代碼

即在一個標準的查詢語句上面增長一個create view orderdetail as語句來建立視圖。建立完畢視圖以後,咱們就能夠像使用表同樣從視圖中檢索數據。好比:

select * from orderdetail order by cust_id;
複製代碼

十、存儲過程

存儲過程和視圖類似,也是提供一種SQL複用的機制。由於自己視圖只能用來將指定的數據檢索出來做爲數據表同樣使用,它自己只能用於「查詢」操做,具備必定的侷限性。所以,這裏有存儲過程來將指定功能的SQL封裝起來,使其像一個函數同樣能夠被調用。

存儲過程的可移植性比較差,並且須要更高的技能和經驗,所以經過被限制建立。

10.1 建立存儲過程

10.1.1 建立無參存儲過程

在MySQL命令行中建立存儲過程的示例:

mysql> delimiter //
mysql> create procedure mypp()
    -> begin
    -> select * from orders;
    -> end//
複製代碼

在這裏delimiter //的做用是使用//而不是';'做爲語句分隔符。

10.1.2 爲存儲過程添加參數

MySQL支持IN(傳遞給存儲過程)、 OUT(從存儲過程傳出,如這裏所用)和INOUT(對存儲過程傳入和傳出)類型的參數。

mysql> create procedure avgprice(in num int, out price decimal(8,2))
    -> begin
    ->     select avg(item_price)
    ->     from orderitems
    ->     where order_num = num
    ->     into price;
    -> end//
複製代碼

上面的語句中建立了一個名爲avgprice的存儲過程。它接受兩個參數,num是傳入的參數;price是傳出的參數。在存儲過程內部,咱們爲orderitems的指定order_num爲num的全部記錄的平均item_price賦值非price.

建立完畢了存儲過程以後,咱們能夠像下面這樣調用以上存儲過程:

call avgprice(20009, @price);
複製代碼

而後,咱們可使用SELECT語句獲得price的計算結果:

select @price
複製代碼

10.2 使用存儲過程

沒有參數的存儲過程的使用示例:

call mypp();
複製代碼

10.3 刪除存儲過程

drop procedure mypp;
複製代碼

10.4 檢查存儲過程

show create procedure avgprice;
複製代碼

十一、遊標

MySQL遊標只能用於存儲過程(和函數)

mysql> create procedure copyprodname()
    -> begin
    ->     --定義局部變量,結束條件
    ->     declare done boolean default 0;
    ->     --定義局部變量,產品名稱
    ->     declare name varchar(255);
    ->
    ->     --定義遊標
    ->     declare names cursor
    ->     for
    ->     select prod_name from products;
    ->
    ->     --定義循環結束條件
    ->     declare continue handler for sqlstate '02000' set done = 1;
    ->
    ->     --建立表
    ->     create table if not exists prod_name(name varchar(255));
    ->
    ->     --打開遊標
    ->     open names;
    ->
    ->     --定義循環
    ->     repeat
    ->     --獲取遊標的數據,將其填充到name中
    ->     fetch names into name;
    ->     --將遊標中的數據插入到prod_name表中
    ->     insert into prod_name values(name);
    ->     --定義循環的結束條件
    ->     until done end repeat;
    ->
    ->     --結束遊標
    ->     close names;
    -> end//
複製代碼

在上面的代碼中,使用

declare done boolean default 0;
複製代碼

定義了循環的條件爲布爾類型,並將其默認值設置爲0. 而後,使用定義了循環結束的條件

declare continue handler for sqlstate '02000' set done = 1;
複製代碼

這裏的'02000'是一個未找到條件, 當REPEAT因爲沒有更多的行供循環而不能繼續時,出現這個條件。在使用遊標以前,須要先打開遊標。這經過SQL語句:

open names;
複製代碼

來完成。當咱們執行完業務邏輯以後,須要關閉遊標。這經過SQL語句:

close names;
複製代碼

來完成。在遊標的打開和關閉的做用域內,咱們經過

fetch names into name;
複製代碼

將從遊標中獲得的數據填充到name中。

十二、觸發器

觸發器用來在某事件發生時自動執行,有些相似於監聽器的做用。它只能爲delete, insert, update三種操做設置觸發器。觸發器能夠設置在指定的操做執行以前或者以後觸發。

只有表才支觸發器,視圖和臨時表都不支持。

每一個表最多設置6個觸發器,且同一觸發器不能與多個事件或多個表關聯。

12.1 建立觸發器

觸發器建立的基本語法格式:

CREATE TRIGGER <觸發器名稱>  --觸發器必須有名字,最多64個字符
{ BEFORE | AFTER }  --觸發器有執行的時間設置:能夠設置爲事件發生前或後。
{ INSERT | UPDATE | DELETE }  --觸發的事件:insert、update或delete的過程當中觸發。
ON <表名稱>  --觸發器是屬於某一個表的:當在這個表上執行插入、 更新或刪除操做的時候就觸發。
FOR EACH ROW  --觸發器的執行間隔:FOR EACH ROW子句通知觸發器 每隔一行執行一次動做,而不是對整個表執行一次。
<觸發器SQL語句>  --觸發器包含所要觸發的SQL語句:這裏的語句能夠是任何合法的語句, 包括複合語句,可是這裏的語句受的限制和函數的同樣。
複製代碼

觸發器的使用示例:

mysql> create trigger watcher after insert on prod_name
    -> for each row
    -> begin
    ->     insert into prod_name_copy values(new.name);
    -> end//
複製代碼

上面的觸發器監聽prod_name表的插入操做,每當向表prod_name中插入一條記錄的同時向prod_name_copy也插入一條記錄。

insert觸發器代碼內,能夠引用一個名爲new的虛擬表,訪問被插入的行。

delete觸發器代碼內,能夠引用一個名爲old的虛擬表,訪問被刪除的行。

update觸發器代碼內,可使用一個名爲old的虛擬表,訪問更新以前的數據,使用名爲new的虛擬表,訪問更新的值。

12.2 刪除觸發器

DROP TRIGGER 觸發器名稱:
複製代碼

1三、事務管理

事務保證了一系列操做的原子性,只有當執行過程當中沒有產生錯誤,而且提交了以後纔會將執行的結果反應到數據庫上。若是使用了回滾操做將回復到開始事務以前的狀態。

MySQL中的數據庫引擎分別支持不一樣類型的事務。

13.1 基本的事務操做

開始事務可使用下面的語句:

START TRANSACTION;
複製代碼

回滾事務使用:

ROLLBACK;
複製代碼

提交事務使用:

COMMIT;
複製代碼

13.2 建立保留點

可使用語句

SAVEPOINT 名稱;
複製代碼

來建立保留點。在準備回滾的時候,咱們可使用

ROLLBACK TO 名稱;
複製代碼

來回滾到指定的保留點。這樣指定保留點以前的操做不會回滾,而保留點以後的操做將所有被會滾。

一般,保留點越多越好。當提交或者回滾以後,保留點會被自動釋放。此外,也可使用RELEASE來主動釋放保留點。

13.3 修改默認提交行爲

使用

SET autocommit = 0;
複製代碼

來設置不自動提交。

1四、安全管理

在MySQL的數據庫中存在一個mysql庫,那裏面的user表用於存儲MySQL的用戶。

create user shouheng identified by 'psd';
複製代碼

上面的SQL用來MySQL中添加一個用戶。若是要對用戶進行重命名,可使用:

rename user little_boy to shouheng;
複製代碼

若是刪除用戶可使用:

drop user username;
複製代碼

查看授予用戶的權限:

show grants for shouheng;
複製代碼

授予權限:

grant select on sql_test_db.* to shouheng;
複製代碼

以上操做用來將sql_test_db的全部數據的只讀權限授予指定用戶。若是要回收指定用戶的權限,可使用

revoke select on sql_test_db.* from shouheng;
複製代碼

它表示回收指定用戶對sql_test_db的只讀權限。

除了上面示例的只讀權限之外,MySQL還容許爲新加入的用戶指定其餘權限。

爲指定的用戶修改密碼:

set password for shouheng = Password('psd');
複製代碼

更多內容

一、該項目整理了設計模式、Java語法、JVM、SQL、數據結構與算法等相關內容:https://github.com/Shouheng88/Java-Programming。

二、因爲時間倉促,難免於存在錯誤,歡迎批評指正。

相關文章
相關標籤/搜索