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

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

相关推荐
不剪发的Tony老师2 小时前
Noir:一款键盘驱动的现代化数据库管理工具
数据库·sql
.柒宇.3 小时前
MySQL双主同步
linux·数据库·mysql·docker
Trouvaille ~4 小时前
【MySQL篇】数据类型:存储数据的基础
android·数据库·mysql·adb·字符集·数据类型·基础入门
一 乐4 小时前
酒店预订|基于springboot + vue酒店预订系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·酒店预订系统
光泽雨5 小时前
UNION 和 UNION ALL 作用
数据库·sql
heimeiyingwang5 小时前
【架构实战】SQL调优实战:从执行计划到索引优化
数据库·sql·架构
恼书:-(空寄5 小时前
分库分表风险应对手册(生产实战版)
数据库·分库分表
XDHCOM5 小时前
ORA-06521: PL/SQL映射函数错误,权威解析Oracle报错故障修复与远程处理方案
数据库·sql·oracle
仲芒5 小时前
[24年单独笔记] MySQL 常用的 DDL 命令
笔记·mysql·oracle