启动和停止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的语句结束符更为“//”。可以自定义其他符号)。
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的零距离接触》课程笔记。感兴趣的同学可以观看老师的教学视频。