MySQL手記

啟動和停止MySQL服務:

在管理員權限下:

$ net start mysql
$ net stop mysql

(我本人的是mysql57,啟動后可以在任務管理器的服務欄看到)

注意配置好環境變量

登錄數據庫

$  mysql -uroot -p

說明:
以上是直接在windows命令行登錄root用戶數據庫,輸入-p回車之后,會彈出需要輸出password的命令。

MySQL退出

$ mysql > exit;
$ mysql > quit;
$ mysql > \q;

修改MySQL提示符

  1. 連接客戶端時通過參數指定
$ shell>mysql -uroot -proot --prompt 提示符

(上面登錄的是root用戶,密碼也是root)。

  1. 連接上客戶端后,通過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'
    -> );
約束:
  1. 約束保證數據的完整性和一致性。
  2. 約束分為表級約束和列級約束。
  3. 約束類型包括:
  • NOT NULL (非空約束)
  • PRIMARY KEY (主鍵約束)
  • UNIQUE KEY (唯一約束)
  • DEFAULT (默認約束)
  • FOREIGN KEY (外鍵約束)
FOREIGN KEYp
  • 保持數據一致性,完整性。
  • 實現一對一或一對多關系。

外鍵約束的要求:

  1. 父表和字表必須使用相同的存儲引擎,而禁止使用臨時表。
  2. 數據表的存儲引擎只能為InnoDB.
  3. 外鍵列和參照列必須具有相似的數據類型。其中數字的長度或是否有符號位必須相同;而字符的長度則可以不同。
  4. 外鍵列和參照列必須創建索引。如果參照列不存在索引的話,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; 以網格的形式查看。
外鍵約束的參照操作
  1. CASCAED :從父表刪除或更新且自動刪除或更新子表中匹配的行。
  2. SET NULL :從父表刪除或更新行,并且設置子表中的外鍵列為NULL。如果使用該選項,必須保證子表列沒有指定NOT NULL。
  3. RESTRICT :拒絕對父表的刪除或更新操作。
  4. 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的零距離接觸》課程筆記。感興趣的同學可以觀看老師的教學視頻。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容