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

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

相关推荐
小二·6 小时前
RAG + 向量数据库实战:ChromaDB / Milvus / FAISS 选型与性能横评
数据库·milvus·faiss
矜持的左手7 小时前
电子小白的枕边书:电子学(The Art of Electronics)
数据库·restful
吴声子夜歌7 小时前
Redis 5.x——布隆过滤器
数据库·redis·缓存
蓝天下的守望者7 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
上海云盾-小余8 小时前
网站频繁遭遇 SQL 注入溯源与原生漏洞修复全流程总结
数据库·sql
数据库小学妹8 小时前
国家区域医疗中心国产化改造实战:数据库选型、跨院区数据互通与踩坑经验
数据库·国产数据库·数据库选型·医疗信息化·信创数据库·医疗信创
TPBoreas8 小时前
MySQL性能优化面试全攻略
mysql·面试·性能优化
xlq223229 小时前
11.表的内外连接,索引
mysql
AllData公司负责人9 小时前
数据库同步平台|AIIData数据中台实现OceanBase、达梦数据库、OpenGauss、人大金仓、Hive、TDengine 一键接入Doris
大数据·数据库·hive·mysql·oceanbase·tdengine