MySQL基础

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 持久性

一旦提交,数据就永久落盘,断电也不会丢。

如果事务并发:

多个事务同时改数据,会出问题:

  1. 脏读 :读到别人未提交的数据(别人回滚了就脏了)

  2. 不可重复读:同一事务内,两次查询结果不一样

  3. 幻读:查询时没有这条数据,插入时发现已存在

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. 意向锁

表级锁,用来快速判断表里有没有行被锁,提升效率。

相关推荐
科技小花16 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X566117 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全19 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_7717172119 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
绘梨衣54719 小时前
Docker+FastAPI+MySQL 项目部署报错汇总
mysql·docker·fastapi
小江的记录本19 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi19 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dFObBIMmai20 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw020 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
czlczl2002092520 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql