啟動和停止MySQL服務:
在管理員權限下:
$ net start mysql
$ net stop mysql
(我本人的是mysql57,啟動后可以在任務管理器的服務欄看到)
注意配置好環境變量
登錄數據庫
$ mysql -uroot -p
說明:
以上是直接在windows命令行登錄root用戶數據庫,輸入-p回車之后,會彈出需要輸出password的命令。
MySQL退出
$ mysql > exit;
$ mysql > quit;
$ mysql > \q;
修改MySQL提示符
- 連接客戶端時通過參數指定
$ shell>mysql -uroot -proot --prompt 提示符
(上面登錄的是root用戶,密碼也是root)。
- 連接上客戶端后,通過prompt命令修改
$ mysql>prompt 提示符
(Windows 命令行清屏命令 cls)
MySQL提示符
參數 | 描述 |
---|---|
\D | 完整的日期 |
\d | 當前數據庫 |
\h | 服務器名稱 |
\u | 當前用戶 |
MySQL常用命令
顯示當前服務器版本
$ SELECT VERSION();
顯示當前日期時間
$ SELECT NOW();
顯示當前用戶
$ SELECT USER();
MySQL語句規范
- 關鍵字與函數名稱全部大寫
- 數據庫名稱、表名稱。字段名稱全部小寫。
- SQL語句必須以分號結尾。
數據表操作
創建數據庫
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[DEFAULT] CHARACTER SET [=] charset_name
("{}"中內容表示必選,"|"表示二者選其一,"[]"表示非必選)。
eg:
CREATE DATABASE t1;
查看當前服務器下的數據庫列表
SHOW {DATABASES | SCHEMAS}
[LIKE 'pattern' | WHERE expr]
SHOW WARNINGS; 顯示警告信息。
SHOW CREATE DATABASE db_name; 顯示數據庫創建的信息。
修改數據庫
ALTER {DATABASE | SCHEMA} [db_name]
[DEFAULT] CHARACTER SET [=] charset_name
刪除數據庫
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
MySQL默認的端口號是多少? 3306;
MySQL中的超級用戶叫什么? root;
數據類型:
整形
數據類型 | 存儲范圍 | 字節 |
---|---|---|
TINYINT | 有符號值:-128到127(-27到27-1)無符號值:0到255 (0到2^8-1) | 1 |
SMALLINT | 有符號值:-32768到32767(-215到215-1)無符號值:0到65535 (0到2^8-1) | 2 |
MEDIUMINT | 有符號值:-8388608到8388607(-224到224-1)無符號值:0到16777215 (0到2^16-1) | 3 |
INT | 有符號值:-2147483648到2147483647(-231到231-1)無符號值:0到4294967295 (0到2^32-1) | 4 |
BIGINT | 有符號值:-923372036854775808到923372036854775807(-263到263-1)無符號值:0到18446744073709551615 (0到2^64-1) | 8 |
浮點型
數據類型 | 存儲范圍 |
---|---|
FLOAT[(M,D)] | -3.402823466E+38到-1.175494351E-38 , 0和1.175494351E-38到3.40223466E+38.M是數字總位數,D是小數d點后面的位數。如果M和D被省略,根據硬件允許的限制來保存值。單精度浮點數精確到大約7位小數。 |
DOUBLE[(M,D)] | -1.1976931348623157E+308到-2.2250738585072014E-308 ,0和2.2250738585072014E-308到1.79763148623157E+308. |
日期時間型
列類型 | 存儲需求 |
---|---|
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',...) | 1,2,3,4或者8個字節,取決于set成員的數目(最多64個成員) |
數據表的操作
數據表(或稱表)是數據庫最重要的組成部分之一,是其他對象的基礎。
USE
打開數據庫
USE 數據庫名稱;
創建數據表
CREATE TABLE [IF NOT EXISTS] table_name(
cloumn_name data_type,
...
)
eg:
mysql> CREATE TABLE tb1(
-> username VARCHAR(20),
-> age TINYINT UNSIGNED,
-> salary FLOAT(8,2) UNSIGNED
-> );
SHOW TABALES
查看數據表列
SHOW TABLES [FROM db_name]
[LINK 'pattern' | WHERE expr]
SHOW COLUMNS
查看數據表結構
SHOW COLUMNS FROM tbl_name
INSERT
插入記錄
INSERT [INTO] tbl_name[(col_name,...)] VALUES(val,...)
SELECT
記錄查找
SELECT expr,... FROM tbl_name
eg:
mysql> SELECT * FROM tb1; 查詢全部數據。
空值與非空值
- NULL,字段可以為空值
- NOT NULL,字值禁止為空
eg:
mysql> CREATE TABLE tb2(
-> username VARCHAR(20) NOT NULL,
-> age TINYINT UNSIGNED NULL
-> );
AUTO_INCREMENT
- 自動編號,且必須與主鍵組合使用
- 默認情況下,起始值為1,每次的增量為1
PRIMARY KEY
主鍵約束
- 每張數據表只能存在一個主鍵
- 主鍵保證記錄的唯一性
- 主鍵自動為NOT NULL
eg:
mysql> CREATE TABLE tb3(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(30)
-> );
UNIQUE KEY
唯一約束
- 唯一約束可以保證記錄的唯一性
- 唯一約束的字段可以為空值(NULL)
- 每張數據表可以存在多個唯一約束
eg:
mysql> CREATE TABLE tb5(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(20) NOT NULL UNIQUE KEY,
-> age TINYINT UNSIGNED
-> );
DEFAULT
默認值
當插入記錄時,如果沒有明確為字段賦值,則自動賦予默認值。
eg:
mysql> CREATE TABLE tb6(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(20) NOT NULL UNIQUE KEY,
-> sex ENUM('mail','female','secret') DEFAULT 'secret'
-> );
約束:
- 約束保證數據的完整性和一致性。
- 約束分為表級約束和列級約束。
- 約束類型包括:
- NOT NULL (非空約束)
- PRIMARY KEY (主鍵約束)
- UNIQUE KEY (唯一約束)
- DEFAULT (默認約束)
- FOREIGN KEY (外鍵約束)
FOREIGN KEYp
- 保持數據一致性,完整性。
- 實現一對一或一對多關系。
外鍵約束的要求:
- 父表和字表必須使用相同的存儲引擎,而禁止使用臨時表。
- 數據表的存儲引擎只能為InnoDB.
- 外鍵列和參照列必須具有相似的數據類型。其中數字的長度或是否有符號位必須相同;而字符的長度則可以不同。
- 外鍵列和參照列必須創建索引。如果參照列不存在索引的話,MySQL將自動創建索引。
父表與子表
父表:子表所參照的表。
子表:具有外鍵列的表。
編輯數據表的默認存儲引擎
MySQL配置文件(my.ini)
default-storage-engine=INNODB
查詢數據表的創建信息
SHOW CREATE TABLE tb_name
eg:創建兩張表
表一(父表):
mysql> CREATE TABLE provinces(
-> id SMALLINT PRIMARY KEY AUTO_INCREMENT,
-> pname VARCHAR(20) NOT NULL
-> );
表二(子表):
mysql> CREATE TABLE users(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(20) NOT NULL,
-> pid SMALLINT,
-> FOREIGN KEY(pid) REFERENCES provinces (id)
-> );
查看數據表索引
SHOW INDEXES FROM tb_name
eg:
mysql> SHOW INDEXES FROM provinces;
eg:
mysql> SHOW INDEXES FROM provinces\G; 以網格的形式查看。
外鍵約束的參照操作
- CASCAED :從父表刪除或更新且自動刪除或更新子表中匹配的行。
- SET NULL :從父表刪除或更新行,并且設置子表中的外鍵列為NULL。如果使用該選項,必須保證子表列沒有指定NOT NULL。
- RESTRICT :拒絕對父表的刪除或更新操作。
- NO ACTION :標準SQL的關機字,在MySQL中與RESTRICT相同。
eg:
mysql> CREATE TABLE users1(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(20) NOT NULL,
-> pid SMALLINT,
-> FOREIGN KEY(pid) REFERENCES provinces (id) ON DELETE CASCADE
-> );
必須先在父表中插入記錄,再在子表中插入記錄。
刪除數據表中的數據
DELETE FROM tb_name WHERE column_name = where_condition
eg:
mysql> DELETE FROM provinces WHERE id = 3;
表級約束與列級約束
- 對一個數據列建立的約束,稱為列級約束。
- 對多個數據列建立的約束,稱為表級約束。
- 列級約束既可以在列定義時聲明,也可以在列定義后聲明。
- 表級約束只能在列定義后聲明。
修改數據表
添加單列
ALTER TABLE tal_name ADD [COLUMN] col_name
column_definition [FIREST | AFTER col_name]
eg:
mysql> ALTER TABLE users1 ADD age TINYINT UNSIGNED DEFAULT 10;
添加多列
ALTER TABLE tbl_name ADD [COLUMN]
(col_name column_definition,...)
添加多列只能插在最后,不能指定位置。
刪除列
ALTER TABLE tbl_name DROP [COLUMN] col_name
eg:
mysql> ALTER TABLE users1 DROP password, DROP age;
添加主鍵約束
ALTER TABLE tb1_name ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type] (index_col_name,...)
eg:
mysql> ALTER TABLE users2 ADD CONSTRAINT PK_user2_id PRIMARY KEY (id);
添加唯一約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX | KEY] [index_name] [index_type] (index_col_name,...)
eg:
mysql> ALTER TABLE users2 ADD UNIQUE (username);
添加外鍵約束
ALTER TABLE tb1_name ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
eg:
mysql> ALTER TABLE users2 ADD FOREIGN KEY (pid) REFERENCES provinces (id);
添加/刪除默認約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name
{SET DEFAULT literal | DROP DEFAULT}
eg:
mysql> ALTER TABLE users2 ALTER age SET DEFAULT 15;
eg:
mysql> ALTER TABLE users2 ALTER age DROP DEFAULT;
刪除主鍵約束
ALTER TABLE tbl_name DROP PRIMARY KEY.
刪除唯一約束
ALTER TABLE tb1_name DROP {INDEX | KEY} index_name
eg:
mysql> ALETER TABLE users2 DROP INDEX username;
(查看索引用 SHOW INDEXES FROM tb1_name 命令)
刪除外鍵約束
ALETER TABLE tal_name DROP FOREIGN KEY fk_symbol
eg:
mysql> ALTER TABLE users2 DROP FOREIGN KEY users2_ibfk_1;
(查看外鍵用 SHOW CREATE TABLE tb1_name\G 命令)
修改列定義
ALTER TABLE tb1_name MODIFY [COLUMN] col_name
column_definition [FIRST | AFTER col_name]
(由大類型改成小類型,有可能造成數據的丟失)。
eg:
mysql> ALTER TABLE users2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;
修改列名稱
(同時可以用來修改列定義)
ALETER TABLE tal_name CHANGE [COLUMN] old_col_name
new_col_name column_definition [FIRST | AFTER col_name]
eg:
mysql> ALTER TABLE users2 CHANGE id p_id TINYINT UNSIGNED NOT NULL;
數據表更名
方法1
ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name
方法2
RENAME TABLE tb1_name TO new_tbl_name
[,tb1_name2 TO new_tbl_name2] ...
(盡量少的更該數據表的列名和數據表名,以免對其他表造成影響。)
INSERT
插入記錄
方法1:
INSERT [INTO] tal_name [col_name,...] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
(為默認的自動編號的值賦值,如果不想改變其值,可以為其賦值“NULL”或者“DEFAULT”).
方法2:
INSERT [INTO] tal_name SET col_name={expr | DEFAULT},...
說明:
與第一種方式的區別在于,此方法可以使用子查詢(SubQuery)。
方法3:
INSERT [INTO] tbl_name [(col_name,...)] SELECT ...
說明:此方法可以將查詢結果插入到指定的數據表。
UPDATE
更新記錄(單表更新)
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET
col_name1={expr | DEFAULT} [,col_name2={expr | DEFAULT}]...
[WHERE where_condition]
eg:
mysql> UPDATE users SET age = age-1, sex=0;
eg:
mysql> UPDATE users SET age=age+1 WHERE id % 2=0;
DELETE
刪除記錄(單表刪除)
DELETE FROM tbl_name [WHERE where_condition]
SELECT
查找記錄
SELECT select_expr [,select_expr ...]
[
FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | position} [ASC | DESC], ...]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC],...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
]
說明
select_expr(查詢表達式)
- 每一個表達式表示想要的一列,必須有至少一個。
- 多個列之間以英文逗號分隔。
- 星號(*)表示所有列。 tbl_name.* 可以表示命名的所有列。
- 查詢表達式可以使用[AS] alias_name 為其賦予別名。
- 別名可用于GROUP BY ,ORDER BY或HAVING子句。
WHERE(條件表達式)
- 對記錄進行過濾,如果沒有指定WHERE子句,則顯示所有記錄。
- 在WHERE表達式中,可以使用MySQL支持的函數或運算符。
GROUP BY(查詢結果分組)
[GROUP BY {col_name | position} [ASC | DESC],...]
HAVING(分組條件)
[HAVING where_condition]
ORDER BY(對查詢結果進行排序)
[ORDER BY {col_name | expr | position} [ASC | DESC],...]
LIMIT(限制查詢結果返回的數量)
[LIMIT{[offset,]row_count | row_count OFFSET offset}]
子查詢
子查詢(Subquery)是指出現在其他SQL語句內的SELECT子句。
子查詢:
- 子查詢指嵌套在查詢內部,且必須始終出現在圓括號內。
- 子查詢可以包含多個關鍵字或條件,如DISTINCT,GROUP BY,ORDER BY,LIMIT,函數等。
- 子查詢的外層查詢可以是:SELECT,INSERT,UPDATE,SET或DO。
子查詢返回值:子查詢可以返回標量、一行、一列或子查詢。
1.使用比價運算符的子查詢
使用比價運算符的子查詢 =、>、<、<=、>=、<>、!=、<=>
語法結構operand comparison_operator subquery
用ANY、SOME 或 ALL 修飾的比較運算符
operand comparison_operator ANY (subquery)
operand comparison_operator SOME (subquery)
operand comparison_operator ALL (subquery)
2.使用[NOT] IN 的子查詢
語法結構 operand comparison_operator [NOT] IN (subquery)
- =ANY 運算符與 IN 等效。
- !=ALL 或 <>ALL運算符與NOT IN等效。
3.使用[NOT] EXISTS的子查詢
如果子查詢返回任何行,EXISTS將返回TRUE;否則為FALSE。
INSERT...SELECT
將查詢結果寫入數據表
INSERT [INTO] tbl_name [(col_name,...)] SELECT...
多表更新
UPDATE table_references SET col_name1={expr | DEFAULT}
[,col_name2 ={expr | DEFAULT}]...
[WHERE where_condition]
CREATE...SELECT
創建數據表同時將查詢結果寫入到數據表
CREATE TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
select_statement
連接
MySQL在SELECT語句、多表更新、多表刪除語句中支持JOIN操作。
語法結構
table_reference
{[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr
數據表參照(table_reference)
tal_name [[AS] alias] | table_subquery [AS] alias
數據表可以使用tbl_name AS alias_name 或 tbl_name alias_name 賦予別名。
table_subquery可以作為子查詢使用在FROM子句中,這樣的子查詢必須為其賦予別名。
連接類型
- INNER JOIN,內連接
在MySQL中,JOIN,CROSS JOIN 和 INNER JOIN 是等價的。 - LEFT [OUTER] JOIN,左外連接
- RIGHT [OUTER] JOIN,右外連接
- 內連接:顯示左表及右表符合連接條件的記錄。
- 左外連接: 顯示左表的全部記錄及右表符合連接條件的記錄。
- 右外連接: 顯示右表的全部記錄及左表符合條件的記錄。
說明:
外連接
A LEFT JOIN B join_condition
- 數據表B的結果集依賴數據表A。
- 數據表A的結果集根據左連接條件依賴所有數據表(B表除外)。
- 左外連接條件決定如何檢索數據表B(在沒有指定WHERE條件的情況下)。
- 如果數據表A的某條記錄符合WHERE條件,但是在數據表B不存在符合連接條件的記錄,將生成一個所有列為空的額外的B行。
內連接
- 如果使用內連接查找的記錄在連接數據表中不存在,并且在WHERE子句中嘗試以下操作:
- col_name IS NULL時,如果col_name被定義為NOT NULL,
- MySQL將在找到符合連接條件的記錄后停止搜索更多的行。
連接條件
通常使用ON關鍵字來設定條件,使用WHERE關鍵字進行結果集記錄的過濾。
無限級分類表的設計
設計:
一般設置 type_id, type_name, parent_id 這三個字段。
自身連接
同一個數據表對其自身進行連接。(通過別名,將一張表看成左表和右表)。
多表刪除
DELETE tbl_name[.*][,tal_name[.*]]...
FROM table_references
[WHERE where_condition]
MySQL數據庫的函數
- 字符函數
- 數值運算符與函數
- 比較運算符與函數
- 日期時間函數
- 信息函數
- 聚合函數
- 加密函數
字符函數
函數名稱 | 描述 |
---|---|
CONCAT() | 字符連接 |
CONCAT_WS() | 使用指定的分隔符進行字符連接,第一個參數是分隔符。 |
FORMAT() | 數字格式化 |
LOWERE() | 裝換成小寫字母 |
UPPER() | 裝換成大寫字母 |
LEFT() | 獲取左側字符 |
RIGHT() | 獲取右側字符 |
LENGTH() | 獲取字符串長度 |
LTRIM() | 刪除簽到空格 |
RTRIM() | 刪除后續空格 |
TRIM() | 刪除簽到和后續空格 |
SUBSTRING() | 字符串截取 |
[NOT] LIKE | 模式匹配 |
REPLACE() | 字符串替換 |
補充:
- "%"(百分號)代表任意個字符
- "_" (下劃線)代表任意一個字符
數值運算符與函數
函數名稱 | 描述 |
---|---|
CEIL() | 進一取整 |
DIV | 整數除法 |
FLOOR() | 舍一取整 |
MOD | 取余函數(取模) |
POWER() | 冪運算 |
ROUND() | 四舍五入 |
TRUNCATE() | 數字截取 |
比較運算符與函數
函數名稱 | 描述 |
---|---|
[NOT] BETWEEN...AND... | [不]在范圍之內 |
[NOT] IN() | [不]在列出值范圍內 |
IS [NOT] NULL | [不]為空 |
日期時間函數
函數名稱 | 描述 |
---|---|
NOW() | 當前日期和時間 |
CURDATE() | 當前日期 |
CURTIME() | 當前時間 |
DATE_ADD() | 日期變化 |
DATEDIFF() | 日期差值 |
DATE_FORMAT() | 日期格式化 |
信息函數
函數名稱 | 描述 |
---|---|
CONNECTION_ID() | 連接ID |
DATEBASE() | 當前數據庫 |
LAST_INSERT_ID() | 最后插入記錄的ID號 |
USER() | 當前用戶 |
VERSION() | 版本信息 |
聚合函數
函數名稱 | 描述 |
---|---|
AVG() | 平均值 |
COUNT() | 計數 |
MAX() | 最大值 |
MIN() | 最小值 |
SUM() | 求和 |
加密函數
函數名稱 | 描述 |
---|---|
MD5() | 信息摘要算法 |
PASSWORD() | 密碼算法 |
自定義函數
自定義函數: 用戶自定義函數(use-defined function, UDF)是一種對MySQL擴展的途徑,其用法與內置函數相同。
在MySQL中函數參數的個數理論上不能超過1024個。
創建自定義函數
CREATE FUNCTION function_name
RETURNS
{STRING | INTEGER | REAL | DECIMAL}
routine_body
關于函數體:
- 函數體由合法的SQL語句構成;
- 函數體可以是簡單的SELECT或INSERT語句;
- 函數體如果為復合函數則使用BEGIN...END語句;
- 復合結構可以包含聲明、循環、控制結構;
eg: 封裝一個格式化當前時間的函數
mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30)
-> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒');
調用該函數
mysql> SELECT f1();
刪除該函數:
mysql> DROP FUNCTION f1;
("DELIMITER //" 將mysql的語句結束符更為“//”??梢宰远x其他符號)。
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: 注釋
- CONTAINS SQL: 包含SQL語句,但不包含讀或寫數據的語句
- NO SQL: 不包含SQL語句
- READS SQL DATA: 包含讀數據庫的語句
- MODIFIES SQL DATA: 包含寫數據庫的語句
- SQL SECURITY {DEFINER | INVOKER} 指明誰有權限來執行
過程體
- 過程體由合法的SQL語句構成;
- 過程體可以是任意SQL語句(CRUD);
- 過程體如果為復合結構則使用 BEGIN...END語句;
- 復合結構可以包含聲明、循環、控制結構;
調用存儲過程
CALL sp_name([parameter[,...]])
call sp_name[()]
修改存儲過程
ALTER PROCEDURE sp_name [characteristic ...]
COMMENT 'string'
|{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}
|SQL SECURITY {DEFINER | INVOKER}
(不能修改過程體,如果需要修改過程體,只能先刪除,然后重新創建)
刪除存儲過程
DROP PROCEDURE [IF EXISTS] sp_name
(帶有“@”符號的變量為用戶變量。)
存儲過程與自定義函數的區別
- 存儲過程實現的功能更復雜一些;而函數的針對性更強
- 存儲過程可以返回多個值;而函數只能有一個返回值
- 存儲過程一般獨立的來執行;而函數可以作為其他SQL語句的組成部分來出現。
注意事項:
- 創建存儲過程或者自定義函數時往往需要通過delimiter語句修改定界符。
- 如果函數體或過程體有多個語句,需要包含在BEGIN...END語句塊中。
- 存儲過程通過call來調用。
存儲引擎
MySQL可以將數據以不同的技術存儲在文件(內存)中,這種技術就稱為存儲引擎。
每一種存儲引擎使用不同的存儲機制、索引技巧、鎖定水平,最終提供廣泛且不同的功能。
MySQL支持的存儲引擎
- MyISAM
- InnoDB
- Memory
- CSV
- Archive
相關知識點
并發控制
當多個連接對記錄進行修改時保證數據的一致性和完整性。
通過“鎖”來實現,
- 共享鎖(讀鎖):在同一時間段內,多個用戶可以讀取同一個資源,讀取過程中數據不會發生任何變化。
- 排他鎖(寫鎖):在任何時候只能有一個用戶寫入資源,當進行寫鎖時會阻塞其他的讀鎖或者寫鎖操作。
鎖顆粒
- 表鎖,是一種開銷最小的鎖策略。
- 行鎖,是一種開銷最大的鎖策略。
事務
事務用于保證數據庫的完整性。
事務的特性
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔離性(Isolation)
- 持久性(Durability)
外鍵
是保證數據一致性的策略。
索引
是對數據表中一列或多列的值進行排序的一種結構。
各種存儲引擎的特點
特點 | MyISAM | InnoDB | Memory | Archive |
---|---|---|---|---|
存儲限制 | 256TB | 64TB | 有 | 無 |
事務安全 | - | 支持 | - | - |
支持索引 | 支持 | 支持 | 支持 | |
鎖顆粒 | 表鎖 | 行鎖 | 表鎖 | 行鎖 |
數據壓縮 | 支持 | - | - | 支持 |
支持外鍵 | - | 支持 | - | - |
修改存儲引擎的方法
通過修改MySQL配置文件實現
-default-storage-engine = engine
通過創建數據表命令實現
CREATE TABLE table_name(
...
...
) ENGINE = engine;
通過修改數據表命令實現
ALTER TABLE table_name ENGINE [=] engine_name;
MySQL數據庫圖形界面管理工具
- PHPMyAdmin
- Navicat
- MySQL Workbench
注: 本文為慕課網《與MySQL的零距離接觸》課程筆記。感興趣的同學可以觀看老師的教學視頻。