1登录MySQL
mysql -u root -p
然后输入密码,出现mysql>表示成功
2创建数据库
-- 创建数据库(名字自己改,比如 testdb)
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 查看所有数据库
SHOW DATABASES;
-- 使用这个数据库(必须先选库,才能建表)
USE testdb;
创建数据库的参数
(1)CHARACTER SET utf8mb4:指定字符集
(2)COLLATE utf8mb4_unicode_ci:按照国际通用Unicode规则排序
3创建数据表
-- 创建用户表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT, -- 自增ID(主键)
username VARCHAR(50) NOT NULL, -- 用户名
password VARCHAR(100) NOT NULL, -- 密码
email VARCHAR(100), -- 邮箱
create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
查看是否创建成功
-- 查看当前库的所有表
SHOW TABLES;
-- 查看表结构
DESC user;
4CRUD
(1)C-Create插入数据
INSERT INTO user (username, password, email)
VALUES ('zhangsan', '123456', 'zhangsan@qq.com');
(2)R-Read查询数据
查全部:
SELECT * FROM user;
查看某些字段:
SELECT id, username, email FROM user;
(3)U-Update
UPDATE user
SET password = '654321', email = 'zs_new@qq.com'
WHERE id = 1;
一定要加 WHERE,否则全表被删!
(4)D-Delete
DELETE FROM user
WHERE id = 1;
5主键
一张表只能有一个,用来唯一标识一行数据,不能为空,不能重复。
在建表时,对应字段如id
id INT PRIMARY KEY AUTO_INCREMENT
6唯一键
保证这个字段的值不重复,但可以允许 NULL(最多一个 NULL)。
同样在建表时
email VARCHAR(100) UNIQUE KEY
7普通索引
为了查询更快,不限制重复,不限制 NULL。
一张表可以建很多索引
不约束数据,只加速查询
字段可以重复、可以 NULL
INDEX idx_username (username)
建表示例
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键
username VARCHAR(50) NOT NULL,
phone VARCHAR(11) UNIQUE KEY, -- 唯一键
email VARCHAR(100),
INDEX idx_email (email) -- 普通索引
);
8事务
事务即是一组SQL语句,要么全部成功,要么全部失败,不会只执行一半
START TRANSACTION; -- 开启事务
SQL语句
COMMIT; -- 提交,真正生效
-- 出错了
ROLLBACK; -- 回滚,全部撤销
9ACID:
1. A --- Atomicity 原子性
要么全做,要么全不做
不会执行一半成功一半失败。
2. C --- Consistency 一致性
执行前后,数据整体是合法、完整的。
比如转账前后总金额不变。
3. I --- Isolation 隔离性
多个事务同时跑,互相看不见对方中间状态,互不干扰。
4. D --- Durability 持久性
一旦提交,数据就永久落盘,断电也不会丢。
如果事务并发:
多个事务同时改数据,会出问题:
-
脏读 :读到别人未提交的数据(别人回滚了就脏了)
-
不可重复读:同一事务内,两次查询结果不一样
-
幻读:查询时没有这条数据,插入时发现已存在
10锁
1. 共享锁 S Lock(读锁)
-
加了 S 锁:其他人可以继续读,但不能写
-
用法:
SELECT * FROM t LOCK IN SHARE MODE;
2. 排他锁 X Lock(写锁)
-
加了 X 锁:其他人既不能读也不能写
-
UPDATE/DELETE/INSERT 自动加 X 锁
-
手动:
SELECT * FROM t FOR UPDATE;
3. 表锁 vs 行锁
-
表锁:锁整张表,并发差,简单
-
行锁:只锁某一行,并发高,InnoDB 默认
4. 间隙锁 Gap Lock(防幻读)
锁定一个范围,防止别人在范围内插入数据。
5. 意向锁
表级锁,用来快速判断表里有没有行被锁,提升效率。