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

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

相关推荐
倔强的石头_2 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横2 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二2 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
小猿姐2 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
ClouGence3 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
云技纵横3 天前
Gap Lock 死锁实战:5 秒在本地复现 MySQL 间隙锁死锁
后端·mysql
无响应de神3 天前
三、用户与权限管理
数据库·mysql
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql