mysql詳解

mysql命令

  • mysql登陸參數:
-D, --database          指定數據庫

--delimiter             指定分隔符

-h, --host              指定服務器地址

-p, --password          指定密碼

-P, --port              指定端口

--prompt                設置提示符

-u, --user              指定用戶名

-V, --version          輸出版本信息並退出

  • 修改命令提示符:

經過參數指定提示符,html

mysql -uroot -p123456 --prompt 提示符

經過命令指定提示符,mysql

mysql> prompt 提示符;

提示符:web

\D      完整的日期

\d      當前數據庫

\h      服務器名稱

\u      當前數據庫

  • 經常使用命令:
SELECT VERSION();       顯示當前服務器版本

SELECT NOW();           顯示當前日期時間

SELECT USER();          顯示當前用戶

  • mysql語句規範:
1. 關鍵字與函數名稱所有大寫

2. 數據庫名稱、表名稱、字段名稱所有小寫

3. SQL語句必須以分號結尾


操做數據庫

CREATE DATABASE         建立數據庫

ALTER DATABASE          修改數據庫

DROP DATABASE           刪除數據庫

  • 建立數據庫:

{}爲必選項;|表示或;[]爲可選項。下同算法

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;

  • 查看數據庫:
SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr];

  • 修改數據庫:
ALTER {DATABASE | SCHEMA} db_name [DEFAULT] CHARACTER SET [=] charset_name;

  • 刪除數據庫:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;


操做數據表

數據表是組成數據庫最重要的部分之一,是其它對象的基礎。sql

  • 數據類型:

數據類型是指列、存儲過程參數、表達式和局部變量的數據特徵,它決定了數據的存儲格式,表明了不一樣的信息類型。數據庫

整型:安全

數據類型 存儲範圍 字節
TINYINT 有符號值:-2^7 ~ 2^7-1;無符號值:0 ~ 2^8-1 1
SMALLINT 有符號值:-2^15 ~ 2^15-1;無符號值:0 ~ 2^16-1 2
MEDIUMINT 有符號值:-2^23 ~ 2^23-1;無符號值:0 ~ 2^24-1 3
INT 有符號值:-2^31 ~ 2^31-1;無符號值:0 ~ 2^32-1 4
BIGINT 有符號值:-2^63 ~ 2^63-1;無符號值:0 ~ 2^64-1 8

浮點型:服務器

數據類型 存儲範圍 說明
FLOAT[(M,D)] -3.402823466E+38 ~ -1.175494351E-3八、0、1.175494351E-38 ~ 3.402823466E+38 M是數字總位數,D是小數點後面的位數
DOUBLE[(M,D]] -1.7976931348623157E+308 ~ -2.2250738585072014E-30八、0、2.2250738585072014E-308 ~ 1.7976931348623157E+308 M是數字總位數,D是小數點後面的位數

日期時間型:網絡

列類型 存儲需求
YEAR 1
TIME 3
DATE 3
DATETIME 8
TIMESTAMP 4

字符型:併發

列類型 存儲需求
CHAR(M) M個字節,0 <= M <= 255
VARCHAR(M) L+1個字節,其中L <= M且0 <= M <= 65535
TINYTEXT L+1個字節,其中L < 2^8
TEXT L+2個字節,其中L < 2^16
MEDIUMTEXT L+3個字節,其中L < 2^24
LONGTEXT L+4個字節,其中L < 2^32
ENUM(‘value1’,‘value2’,…) 1或2個字節,取決於枚舉值的個數(最多65535個)
SET(‘value1’,‘value2’,…) 一、二、三、4或8個字節,取決於set成員的個數(最多64個)
  • 建立數據表:
CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type,...);

示例:

CREATE TABLE tb1(username VARCHAR(20),age TINYINT UNSIGNED,salary FLOAT(8,2) UNSIGNED);

  • 查看數據表:
SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr];

  • 查看數據表結構:
SHOW COLUMNS FROM table_name;

  • 插入記錄:

記錄(行)與列組成數據表。

INSERT [INTO] table_name[(column_name,...)] VALUES(value,...);

示例:

INSERT tb1 VALUES('Tom',25,8000.00);

  • 查找記錄:
SELECT expr,... FROM table_name;

  • 空值與非空:
NULL        字段值能夠爲空

NOT NULL    字段值禁止爲空

  • 約束:
1. 約束保證數據的完整性與一致性

2. 約束分爲表級約束和列級約束

3. 約束類型包括:
    NOT NULL(非空約束)
    PRIMARY KEY(主鍵約束)
    UNIQUE KEY(惟一約束)
    DEFAULT(默認約束)
    FOREIGN KEY(外鍵約束)

對一個數據列創建的約束稱爲列級約束;對多個數據列創建的約束稱爲表級約束。列級約束既能夠在列定義時聲明,也能夠在列定義後聲明,表級約束只能在列定義後聲明。

  • 主鍵約束(PRIMARY KEY):

自動編號(AUTO_INCREMENT)必須與主鍵組合使用,但主鍵能夠不和自動編號一塊兒使用。默認狀況下,起始值爲1,每次的增量爲1。

1. 每張數據表只能存在一個主鍵

2. 主鍵保證記錄的惟一性

3. 主鍵自動爲NOT NULL

  • 惟一約束(UNIQUE KEY):
1. 每張數據表能夠存在多個惟一約束

2. 惟一約束能夠保證記錄的惟一性

3. 惟一約束的字段能夠爲NULL

示例:

CREATE TABLE tb2(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) NOT NULL UNIQUE KEY,age TINYINT UNSIGNED);

  • 默認約束(DEFAULT):

當插入記錄時,若是沒有明確爲字段賦值,則自動賦予默認值。

示例:

CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) NOT NULL UNIQUE KEY,sex ENUM('1','2','3') DEFAULT '3');

  • 外鍵約束(FOREIGN KEY):

外鍵約束保證數據的一致性和完整性,實現數據表的一對1、一對多關係。

有外鍵的表稱爲子表,子表所參照的表稱爲父表。

外鍵約束的要求:

1. 父表和子表必須使用相同的存儲引擎,並且禁止使用臨時表。

2. 數據表的存儲引擎只能爲InnoDB。

3. 外鍵列和參照列必須具備類似的數據類型。其中數字的長度或是否具備符號位必須相同;而字符的長度則能夠不一樣。

4. 外鍵列和參照列必須建立索引。若是外鍵列不存在索引,mysql將自動建立索引。

外鍵約束的參照操做:

CASCADE:從父表刪除或更新且自動刪除或更新子表中匹配的行

SET NULL:從父表刪除或更新行,並設置子表中的外鍵列爲NULL。若是使用該項,必須保證子表列沒有設置NOT NULL

RESTRICT:拒絕對父表的刪除或更新操做

NO ACTION:標準sql的關鍵字,在mysql中與RESTRICT相同

  • 修改數據表:

添加單列:

ALTER TABLE table_name ADD [COLUMN] column_name column_definition [FIRST | AFTER column_name];

添加多列:

ALTER TABLE table_name ADD [COLUMN] (column_name column_definition,...);

刪除列:

ALTER TABLE table_name DROP [COLUMN] column_name;

添加主鍵約束:

ALTER TABLE table_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_column_name,...);

刪除主鍵約束:

ALTER TABLE table_name DROP PRIMARY KEY;

添加惟一約束:

ALTER TABLE table_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] [index_name] [index_type] (index_column_name,...);

刪除惟一約束:

ALTER TABLE table_name DROP {INDEX | KEY} index_name;

添加外鍵約束:

ALTER TABLE table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_column_name,...) reference_definition;

刪除外鍵約束:

ALTER TABLE table_name DROP FOREIGN KEY fk_symbol;

添加、刪除默認約束:

ALTER TABLE table_name ALTER [COLUMN] column_name {SET DEFAULT literal | DROP DEFAULT};

修改列定義:

ALTER TABLE table_name MODIFY [COLUMN] column_name column_definition [FIRST | AFTER column_name];

修改列名稱:

ALTER TABLE table_name CHANGE [COLUMN] old_column_name new_column_name column_definition [FIRST | AFTER column_name];

數據表改名:

ALTER TABLE table_name RENAME [TO | AS] new_table_name;或RENAME TABLE table_name TO new_table_name [,table_name2 TO new_table_name2];


記錄操做

  • 插入記錄:

方式一:

INSERT [INTO] table_name [(column_name,...)] {VALUES | VALUE}({expr | DEFAULT},...),(...),...;

示例:

CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20) NOT NULL, password VARCHAR(32) NOT NULL,age TINYINT UNSIGNED NOT NULL DEFAULT 10,sex BOOLEAN);INSERT users VALUES(DEFAULT,'Tom','123',25,1),(NULL,'Rose',md5('123'),DEFAULT,0);

方式二:

INSERT [INTO] table_name SET column_name={expr | DEFAULT},...;

第二種方式可使用子查詢。

示例:

INSERT users SET username='Ben',password='456',sex=0;

方式三:

INSERT [INTO] table_name [(column_name,...)] SELECT ...;

第三種方式能夠將查詢結果插入到指定數據表。

  • 單表更新記錄:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET column_name1={expr1 | DEFAULT} [,column_name2={expr2 | DEFAULT}] ... [WHERE where_condition];

示例:

UPDTAE users SET age = age + 5;             #更新全部列UPDATE users SET age = age - id,sex = 0;UPDATE users SET age = age + 10 WHERE id % 2 = 0;               #當id爲偶數時age列的記錄加10

  • 單表刪除記錄:
DELETE FROM table_name [WHERE where_condition];

示例:

DELETE FROM users WHERE id = 6;             #刪除id爲6的記錄

  • 查找記錄:
SELECT select_expr [,select_expr ...] [
    FROM table_references    [WHERE where_condition]
    [GROUP BY {column_name | position} [ASC | DESC],...]
    [HAVING where_condition]
    [ORDER BY {column_name | expr | position} [ASC | DESC],...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]];

查詢表達式:

每個表達式表示想要的一列,至少要有一個。

多個列直接以 , 分隔。

* 表示全部列。table_name.* 表示命名錶的全部列。

查詢表達式可使用 [AS] alias_name 爲其賦予別名。

別名可用於GROUP BY,ORDER BY或HAVING子句。

條件表達式:

對記錄進行過濾,若是沒有指定的WHERE子句,則顯示全部記錄。

在WHERE表達式中,可使用mysql支持的函數或運算符。

查詢結果分組:

[GROUP BY {column_name | position} [ASC | DESC],...]

ASC表示升序,DESC表示降序。

示例:

SELECT sex FROM users GROUP BY sex;

分組條件:

[HAVING where_condition]

示例:

SELECT sex FROM users GROUP BY sex HAVING count(id) >= 2;

查詢結果排序:

[ORDER BY {column_name | expr | position} [ASC | DESC],...]

示例:

SELECT * FROM users ORDER BY id DESC;               #按id降序排列SELECT * FROM users ORDER BY age,id DESC;               #同時按age和id降序排列,age相同時比較id

限制查詢數量:

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

示例:

SELECT * FROM users LIMIT 2;                #返回兩條記錄SELECT * FROM users LIMIT 3,2;              #從第4條記錄開始,返回兩條記錄


子查詢與鏈接

記錄的INSERT、UPDATE、DELETE是寫操做,而SELECT是讀操做。

  • 子查詢:

子查詢是指嵌套在其餘sql語句內的SELECT子句。子查詢能夠返回標量、一行、一列或子查詢。

示例:

SELECT * FROM t1 WHERE column1 = (SELECT column2 FROM t2);

其中 SELECT * FROM t1 稱爲Outer Query/Outer Statement(外層查詢/外層聲明);SELECT column2 FROM t2 稱爲SubQuery(子查詢)。

子查詢嵌套在查詢內部,且必須出如今圓括號內。子查詢能夠包含多個關鍵字或條件,如DISTINCT、GROUP BY、ORDER BY、LIMIT、函數等。子查詢的外層查詢能夠是SELECT、INSERT、UPDATE、SET或DO。

  • 使用比較運算符的子查詢:

=、>、

示例:

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= (SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);

tdb_goods表中篩選出goods_price大於等於平均goods_price的商品goods_idgoods_namegoods_price

使用ANY、SOME、ALL關鍵字修飾比較運算符:

比較運算符 ANY SOME ALL
>、>= 最小值 最小值 最大值
<、<= 最大值 最大值 最小值
= 任意值 任意值
<>、!=

任意值

示例:

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price >= ALL (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超極本');

tdb_goods表中篩選出goods_price大於等於全部的超極本價格的商品goods_idgoods_namegoods_price

  • 使用 [NOT] IN 的子查詢:

= ANY 與 IN 等效;!= ALL 或 <> ALL 與 NOT IN 等效。

示例:

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price NOT IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超極本');

tdb_goods表中篩選出goods_price不等於全部的超極本價格的商品goods_idgoods_namegoods_price

  • 使用 [NOT] EXISTS 的子查詢:

若是子查詢返回任何行,EXISTS將返回TRUE;不然返回FALSE。NOT EXISTS 反之。

  • 使用 INSERT … SELECT 插入記錄:

將查詢結果寫入數據表。

INSERT [INTO] table_name[(column_name,...)] SELECT ...

示例:

CREATE TABLE IF NOT EXISTS tdb_goods_cates(cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cate_name VARCHAR(40) NOT NULL);INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

  • 多表更新:
UPDATE table_references SET column_name1={expr1 | DEFAULT} [,column_name2={expr2 | DEFAULT}] ... [WHERE where_condition]

數據錶鏈接類型:

INNER JOIN 內鏈接

    在mysql中,JOIN、CROSS JOIN和INNER JOIN是等價的
    
LEFT [OUTER] JOIN 左外鏈接

RIGHT [OUTER] JOIN 右外鏈接

示例:

UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET good_cate = cate_id;

  • CREATE … SELECT 多表一步更新:

建立數據表同時將查詢結果寫入數據表。

CREATE TABLE [IF NOT EXISTS] table_name [(create_definition,...)] select_statement;

示例:

CREATE TABLE tdb_goods_brands(brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,brand_name VARCHAR(40) NOT NULL) SELECT brand_name FROM tdb_goods GROUP BY brand_name;UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name SET g.brand_name = b.brand_id;

  • 鏈接:

mysql在SELECT語句、多表更新、多表刪除語句中支持JOIN操做。

鏈接條件:

使用 ON 關鍵字來設定鏈接條件,也可使用 WHERE 來代替。

一般使用 ON 關鍵字來設定鏈接條件,使用 WHERE 關鍵字進行結果集記錄的過濾。

內鏈接(INNER JOIN):僅顯示左表及右表符合鏈接條件的記錄。

左鏈接(LEFT [OUTER] JOIN):顯示左表的所有記錄及右表符合條件的記錄。

右鏈接(RIGHT [OUTER] JOIN):顯示右表的所有記錄及左表符合條件的記錄。

示例:

SELECT goods_id,goods_name,cate_name FROM tdb_goods INNER JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;SELECT goods_id,goods_name,cate_name FROM tdb_goods LEFT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;SELECT goods_id,goods_name,cate_name FROM tdb_goods RIGHT JOIN tdb_goods_cates ON tdb_goods.cate_id = tdb_goods_cates.cate_id;

  • 多表鏈接:

多張表進行鏈接。

示例:

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id;

  • 自身鏈接:

一個數據表對其自身進行鏈接。自身鏈接時必須給數據表起別名。

  • 多表刪除:
DELETE table_name[.*] [,table_name[.*]] ... FROM table_references [WHERE where_condition]

示例:

DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name, FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;

去除tdb_goods中的重複記錄,保留goods_id較小的記錄。


運算符與函數

mysql中的運算符與函數有:

字符函數

數值運算符與函數

比較運算符與函數

日期時間函數

信息函數

聚合函數

加密函數

  • 字符函數:
函數名稱 描述
CONCAT() 字符鏈接
CONCAT_WS() 使用指定的分隔符進行字符鏈接
FORMAT() 數字格式化
LOWER() 轉換成小寫字母
UPPER() 轉換成大寫字母
LEFT() 獲取左側字符
RIGHT() 獲取右側字符
LENGTH() 獲取字符串長度
LTRIM() 刪除前導空格
RTRIM() 刪除後續空格
TRIM() 刪除前導和後續空格
SUBSTRING() 字符串截取
[NOT] LIKE 模式匹配
REPLACE() 字符串替換

示例:

SELECT CONCAT('My','SQL');SELECT CONCAT_WS('|','123','456');              #鏈接符爲 |SELECT FORMAT(12345.6789,2);                #保留兩位小數,結果爲字符型SELECT LOWER('MySQL');SELECT UPPER('mysql');SELECT LEFT('MySQL',2);             #取左邊2個字符,結果是MySELECT RIGHT('MySQL',3);                #取右邊3個字符,結果是SQLSELECT LENGTH('MySQL');SELECT LTRIM('  MySQL');                #刪除字符串前面的空格SELECT RTRIM('MySQL    ');              #刪除字符串後面的空格SELECT TRIM('  MySQL    ');             #刪除字符串先後的空格SELECT TRIM(LEADING '?' FROM '??MySQL???');             #刪除字符串前面的指定字符 ?SELECT TRIM(TRAILING '?' FROM '??MySQL???');                #刪除字符串後面的指定字符 ?SELECT TRIM(BOTH '?' FROM '??MySQL???');                #刪除字符串先後的指定字符 ?SELECT SUBSTRING('MySQL',1,2);              #從第1位開始截取,截取2位。結果是MySELECT SUBSTRING('MySQL',3);                #結果是SQLSELECT 'MySQL' LIKE 'M%';               #返回布爾值 1SELECT * FROM test WHERE first_name LIKE '%My%';                #此處 % 表示任意個任意字符,還有 _ 表示1個任意字符SELECT * FROM test WHERE first_name LIKE '%1%%' ESCAPE '1';               #此時1後面的 % 不是通配符,而是真正的 %SELECT REPLACE('??MySQL???','?','');                #刪除字符串中全部的 ?

  • 數值運算符與函數:
函數或運算符名稱 描述
CEIL() 進一取整
DIV 整數除法
FLOOR() 舍一取整
MOD 取餘數(取模)
POWER() 冪運算
ROUND() 四捨五入
TRUNCATE() 數字截取

示例:

SELECT CEIL(3.01);              #進一取整,結果是4SELECT 3 DIV 4;             #整數除法,結果是0SELECT FLOOR(3.99);             #舍一取整,結果是3SELECT 5.3 MOD 3;             #取餘數,與 % 相同,結果是2.3SELECT POWER(3,3);              #冪運算,結果是27SELECT ROUND(3.652, 2);             #四捨五入,保留2位小數,結果是3.65SELECT ROUND(3.652, 1);             #四捨五入,保留1位小數,結果是3.7SELECT TRUNCATE(234.89,2);              #數字截取,保留2位小數,結果是234.89SELECT TRUNCATE(234.89,0);              #數字截取,保留整數部分,結果是234

  • 數值運算符與函數:
函數或運算符名稱 描述
[NOT] BETWEEN … AND … [不]在範圍以內
[NOT] IN() [不]在列出值範圍內
IS [NOT] NULL [不]爲空

示例:

SELECT 15 BETWEEN 1 AND 20;             #結果是布爾值 1SELECT 35 BETWEEN 1 AND 20;             #結果是布爾值 0SELECT 10 IN(5,10,15,20);               #結果是布爾值 1SELECT 13 IN(5,10,15,20);               #結果是布爾值 0SELECT '' IS NULL;              #結果是布爾值 0SELECT 0 IS NULL;              #結果是布爾值 0

  • 日期時間函數:
函數名稱 描述
NOW() 當前日期和時間
CURDATE() 當前日期
CURTIME() 當前時間
DATE_ADD() 日期變化
DATEDIFF() 日期差值
DATE_FORMAT() 日期格式化

示例:

SELECT NOW();               #返回當前日期和時間SELECT CURDATE();               #返回當前日期SELECT CURTIME();               #返回當前時間SELECT DATE_ADD('2014-3-12',INTERVAL 365 DAY);              #在2014-3-12基礎上增長365天SELECT DATE_ADD('2014-3-12',INTERVAL -365 DAY);              #在2014-3-12基礎上減小365天SELECT DATE_ADD('2014-3-12',INTERVAL 1 YEAR);              #在2014-3-12基礎上增長1年SELECT DATE_ADD('2014-3-12',INTERVAL 3 WEEK);              #在2014-3-12基礎上增長3星期SELECT DATEDIFF('2013-3-12','2014-3-12');               #比較兩個日期差值,結果是 -365SELECT DATE_FORMAT('2014-3-12','%m/%d/%Y');             #日期格式化,結果是 03/12/2014

  • 信息函數:
函數名稱 描述
CONNECTION_ID() 鏈接ID
DATABASE() 當前數據庫
LAST_INSERT_ID() 最後插入記錄的ID
USER() 當前用戶
VERSION() 版本信息

示例:

SELECT CONNECTION_ID();             #鏈接IDSELECT DATABASE();              #當前數據庫SELECT LAST_INSERT_ID();                #若是同時插入多條記錄時,只返回插入的第一個記錄的IDSELECT USER();              #當前用戶SELECT VERSION();               #數據庫版本信息

  • 聚合函數:
函數名稱 描述
AVG() 平均值
COUNT() 計數
MAX() 最大值
MIN() 最小值
SUM() 求和

示例:

SELECT AVG(goods_price) AS prices FROM tdb_goods;              #求tdb_goods表中goods_price的平均值SELECT COUNT(goods_id) AS counts FROM tdb_goods;               #查找tdb_goods表中的記錄數SELECT MAX(goods_price) AS prices FROM tdb_goods;               #求tdb_goods表中goods_price的最大值SELECT MIN(goods_price) AS prices FROM tdb_goods;               #求tdb_goods表中goods_price的最小值SELECT SUM(goods_price) AS prices FROM tdb_goods;               #求tdb_goods表中goods_price的和

  • 加密函數:
函數名稱 描述
MD5() 信息摘要算法
PASSWORD() 密碼算法

示例:

SELECT MD5('admin');                #對字符admin進行MD5加密SELECT PASSWORD('admin');               #對字符admin進行PASSWORD加密

通常狀況下,只有在修改mysql客戶端密碼時才使用PASSWORD()函數,若是密碼是爲了web頁面準備的建議使用MD5()加密。


自定義函數

用戶自定義函數(user-defined function,UDF)是一種對mysql擴展的途徑,其用法與內置函數相同。

自定義函數的兩個必要條件:

參數:能夠有任意個

返回值:只能有一個

函數能夠返回任意類型的值,一樣能夠接收這些類型的參數。

  • 建立自定義函數:
CREATE FUNCTION function_name RETURNS {STRING | INTEGER | REAL | DECIMAL} routine_body;

routine_body表示函數體,函數體包括:

1. 函數體由合法的SQL語句構成

2. 函數體能夠是簡單的SELECT或INSERT語句

3. 函數體若是爲複合結構,則使用BEGIN...END語句

4. 複合結構能夠包含聲明、循環、控制結構

  • 建立不帶參數的自定義函數:
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒');CREATE FUNCTION f1() RETURNS VARCHAR(30) RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒');SELECT f1();DROP FUNCTION f1();              #刪除自定義函數f1()

  • 建立帶參數的自定義函數:
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED) RETURNS FLOAT(10,2) UNSIGNED RETURN (num1+num2)/2;SELECT f2(10,15);               #求10和15的平均值,結果爲12.50

  • 建立具備複合結構函數體的自定義函數:
DELIMITER //                #修改命令定界符,由默認的 ; 改成 //CREATE FUNCTION adduser(username VARCHAR(20)) RETURNS INT UNSIGNED BEGIN INSERT test(username) VALUES(username); RETURN LAST_INSERT_ID(); END //DELIMITER ;SELECT adduser('Rose');             #添加用戶


mysql存儲過程

存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲並做爲一個單元處理。

存儲過程的優勢:

加強SQL語句的功能和靈活性

實現較快的執行速度

減小網絡流量

  • 建立存儲過程:
CREATE [DEFINER = {user | CURRENT_USER}] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body;

proc_parameter:[IN | OUT | INOUT] param_name type

IN,表示該參數的值必須在調用存儲過程時指定,而且不可返回

OUT,表示該參數的值能夠被存儲過程改變,而且能夠返回

INOUT,表示該參數的值在調用存儲過程時指定,而且能夠被改變和返回

characteristic表示特性,

COMMENT 'string' | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER}

COMMENT:註釋

CONTAINS SQL:包含SQL語句,但不包含讀或寫數據的語句

NO SQL:不包含SQL語句

READS SQL DATA:包含讀數據的語句

MODIFIES SQL DATA:包含寫數據的語句

SQL SECURITY {DEFINER | INVOKER}:指明誰有權限來執行

routine_body表示過程體,過程體包括:

1. 過程體由合法的SQL語句構成

2. 過程體能夠是「任意」SQL語句

3. 過程體若是爲複合結構,則使用BEGIN...END語句

4. 複合結構能夠包含聲明、循環、控制結構

調用存儲過程:

CALL sp_name([parameter[,...]]);                #帶參數調用CALL sp_name[()];               #不帶參數調用

  • 建立不帶參數的存儲過程:
CREATE PROCEDURE sp1() SELECT VERSION();                #建立存儲過程sp1(),查詢版本CALL sp1();

  • 建立帶IN類型參數的存儲過程:
DELIMITER //CREATE PROCEDURE removeUserById(IN id INT UNSIGNED) BEGIN DELETE FROM users WHERE id = id; END //                #前面的id表示users表中的id字段,後面的id爲存儲過程參數DELIMITER ;CALL removeUserById(3);

目的是刪除users表中id爲3的記錄,但其實users表中的記錄已經所有刪除了,這是由於mysql將兩個id都做爲字段處理。

而存儲過程的過程體沒法直接修改,因此須要先刪除存儲過程後再新建。

刪除存儲過程:

DROP PROCEDURE [IF EXISTS] sp_name;

從新在users表中插入記錄,

DROP PROCEDURE removeUserById;DELIMITER //CREATE PROCEDURE removeUserById(IN pid INT UNSIGNED) BEGIN DELETE FROM users WHERE id = pid; END //DELIMITER ;CALL removeUserById(3);

此時能夠發現存儲過程刪除記錄正常。

  • 建立帶IN和OUT類型參數的存儲過程:
DELIMITER //CREATE PROCEDURE removeUserAndReturnUserNums(IN pid INT UNSIGNED,OUT userNums INT UNSIGNED) BEGIN DELETE FROM users WHERE id = pid; SELECT COUNT(id) FROM users INTO userNums; END //DELIMITER ;CALL removeUserAndReturnUserNums(27,@nums);SELECT @nums;

@nums就是變量,經過變量接收存儲過程當中返回的結果。

  • 建立帶多個OUT類型參數的存儲過程:
DELIMITER //CREATE PROCEDURE removeUserByAgeAndReturnInfos(IN page SMALLINT UNSIGNED,OUT deleteUsers SMALLINT UNSIGNED,OUT userCounts SMALLINT UNSIGNED) BEGIN DELETE FROM users WHERE age = page; SELECT ROW_COUNT() INTO deleteUsers; SELECT COUNT(id) FROM users INTO userCounts; END //DELIMITER ;SELECT COUNT(id) FROM users WHERE age = 20;CALL removeUserByAgeAndReturnInfos(20,@a,@b);SELECT @a,@b;SELECT * FROM users;

  • 存儲過程與自定義函數的區別:
1. 存儲過程實現的功能要複雜一些;而函數的針對性更強

2. 存儲過程能夠返回多個值;而函數只能有一個返回值

3. 存儲過程通常獨立地來執行;而函數能夠做爲其餘SQL語句的組成部分


存儲引擎

mysql能夠將數據以不一樣的技術存儲在文件(內存)中,這種技術就稱爲存儲引擎。

每一種存儲引擎使用不一樣的存儲機制、索引技巧、鎖定水平,最終提供普遍且不一樣的功能。

mysql支持的存儲引擎:

MyISAM

InnoDB

Memory

CSV

Archive

  • 併發控制:

當多個鏈接對記錄進行修改時保證數據的一致性和完整性。

鎖:

共享鎖(讀鎖):在同一時間段內,多個用戶能夠讀取同一個資源,讀取過程當中數據不會發生任何變化。

排他鎖(寫鎖):在任什麼時候候只能有一個用戶寫入資源,當進行寫鎖時會阻塞其餘的讀鎖或寫鎖操做。

鎖顆粒:

表鎖,是一種開銷最小的鎖策略

行鎖,是一種開銷最大的鎖策略

  • 事務處理:

事務用於保證數據庫的完整性。

事務的特性:

原子性

一致性

隔離性

持久性

  • 外鍵:

外鍵是保證數據一致性的策略。

  • 索引:

索引是對數據表中一列或多列的值進行排序的一種結構。

普通索引

惟一索引

全文索引

btree索引

hash索引

  • 存儲引擎的特色:
特色 MyISAM InnoDB Memory Archive
存儲限制 256TB 64TB
事務安全 - 支持 - -
支持索引 支持 支持 支持
鎖顆粒 表鎖 行鎖 表鎖 行鎖
數據壓縮 支持 - - 支持
支持外鍵 - 支持 - -

MyISAM適用於事務處理很少的狀況;InnoDB適用於事務處理比較多、須要有外鍵支持的狀況。

  • 設置存儲引擎:
修改mysql配置文件來實現:
    default-storage-engine = engine_name

或

建立數據表命令實現:
    CREATE TABLE table_name(...) ENGINE = engine_name;
    
或

修改數據表命令實現:
    ALTER TABLE table_name ENGINE [=] engine_name
相關文章
相關標籤/搜索