-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(); 顯示當前用戶
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(外鍵約束)
對一個數據列創建的約束稱爲列級約束;對多個數據列創建的約束稱爲表級約束。列級約束既能夠在列定義時聲明,也能夠在列定義後聲明,表級約束只能在列定義後聲明。
自動編號(AUTO_INCREMENT)必須與主鍵組合使用,但主鍵能夠不和自動編號一塊兒使用。默認狀況下,起始值爲1,每次的增量爲1。
1. 每張數據表只能存在一個主鍵 2. 主鍵保證記錄的惟一性 3. 主鍵自動爲NOT NULL
1. 每張數據表能夠存在多個惟一約束 2. 惟一約束能夠保證記錄的惟一性 3. 惟一約束的字段能夠爲NULL
示例:
CREATE TABLE tb2(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) NOT NULL UNIQUE KEY,age TINYINT UNSIGNED);
當插入記錄時,若是沒有明確爲字段賦值,則自動賦予默認值。
示例:
CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) NOT NULL UNIQUE KEY,sex ENUM('1','2','3') DEFAULT '3');
外鍵約束保證數據的一致性和完整性,實現數據表的一對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_id
、goods_name
、goods_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_id
、goods_name
、goods_price
。
= 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_id
、goods_name
、goods_price
。
若是子查詢返回任何行,EXISTS將返回TRUE;不然返回FALSE。NOT EXISTS 反之。
將查詢結果寫入數據表。
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 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'); #添加用戶
存儲過程是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();
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);
此時能夠發現存儲過程刪除記錄正常。
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就是變量,經過變量接收存儲過程當中返回的結果。
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