MySQL学习笔记

Mysql 学习笔记


表操作

  • 显示当前数据库下所有表:show tables
  • 显示表的描述信息:desc 表名
  • 显示创建表的SQL语句:show create table 表名
  • 修改表名:alter table 表名 rename to 新表名
  • 创建外键:alter table 表名 add foreign key () references ()
    注意:外键字段和关联字段要具有相同的类型和长度,都必须建立索引;
    表必须是InnoDB引擎,MyISAM引擎不支持外键也不支持
  • 复制表数据:insert into 表1 select * from 表2
  • 复制表结构:create table 表1 like 表2
  • 从另外一个数据库表复制数据:
    1 create table 表1 like 数据库名.表名2
    2 insert into 表1 select * from 数据库名.表2
  • 将表数据以文本形式导出:select * from 表名 into out outfile 文件名 fields terminated by ‘,’ lines terminated by ‘\r\n’
  • 插入数据:insert into 表名(字段,字段) values(值,值)
  • 更新数据:update 表名 set 字段名=值 where 条件
  • 删除数据:delete from 表名 [where] 如果不用where,将删除所有的记录

查询操作

  • 查询结果排序:select * from 表名 order by 字段名 desc 或者 asc
  • 查询结果分组:select * from 表名 group by 字段名 (可用count,sum,avg等函数)
  • 查询条件:where 字段名 like

    '%abc' 以abc结尾
    'abc%' 以abc开头
    '_bc' “-“是通配符
    '[abc]%' 以a或b或c开头
    '[!abc]' 不以a或b或c开头

  • 查询条件:where 字段名 in (‘abc’,’edf’)

  • 查询条件:where 字段名 between ‘首字母’ and母’ 顺序是 a到z
  • 内连接:select a.字段,b.字段 from 表名 a join 表名 b on a.字段=b.字段 where条件
  • 左连接:select a.字段,b.字段 from 表名 a letf join 表名 b on a.字段=b.字段 where条件
  • 右连接:select a.字段,b.字段 from 表名 a right join 表名 b on a.字段=b.字段 where条件
  • 显示结果时改变字段:select 字段名 as 名字
  • 合并两个或多个select结果集,两个表要具有相同的列并且具有类似的数据类型,结果显示的字段是表1的字段:select * from 表1 union(不显示重复的)或union all(显示所有) select * from 表2

索引

  • 创建普通索引:alter table 表名 add index (字段名)
  • 创建唯一索引:alter table 表名 add unique (字段名)
  • 添加主键:alter table 表名 add primary key (字段名)
  • 删除索引:drop index 索引名 on 表名
  • 设计索引的原则:1最适合创建索引的列是出现在where字句中的列或连接字句on语句后面的列2使用短索引:对于varchar和char列,只用它的一部分来创建索引可以节省空间,查询更快,例如:create index 索引名 on 表名 (字段(10)) 表示为前10个字符创建索引
  • on delete 四个参数:代表删除主记录时所做的约定
    restrict(限制):如果删除主表对应从表有相应的记录,则主表无法删除
    cascade(级联):主表删除,从表记录也删除
    set null:主表删除,从表外键设置为空
    no action:从表什么也不做

外键

  • Mysql自连接:
    create table category
    (
    id int not null auto-increment,
    name varchar(255),
    foreign key (parent_id) references category (id),
    on delete no action
    )
    注意:on delete 必须为no action,如果为restrict,则无法删除记录

Mysql 权限操作

  • Mysql创建用户:create user 用户名 identified by 密码
  • 给用户赋予权限1:gran

    all 代表所有权限
    sdfas
    select 查权限
    insert 改权限

  • 给用户赋予权限2on

    *.* 代表所有数据库的所有表
    数据库名.* 代表指定数据库的所有表

  • 给用户赋予权限3to

    用户名@localhost 代表只能本地连接
    用户名@% 代表任意IP地址连接

  • 给用户赋予权限4

    identified by 密码

  • 取消权限:revoke 用法和 grant 一样

其他操作


  • 连接到SQL数据库:mysql -u 用户名 -p
  • 创建数据库:create 数据库名
  • 显示所有数据库:show databases
  • 切换到数据库:use 数据库名
  • 显示当前数据库:select database()
  • MySQL视图:视图是可视化的表,创建视图相当于创建一张虚拟的表,不会对数据库中的表及结构带来任何影响,其实就是查询结果的可视化表,方便用来做常用的查询的。
  • 创建视图:create view 视图名 as select * from 表名
  • 删除视图:drop view 视图名
  • 用where时注意,当出现where sum(字段名)>100 不可用,因为sum(字段名)是不存在的,此时where 换成having 有用
  • Mysql处理重复数据3种方法:

1 create table temp select * from 表名 group by 字段名
drop table 表名
alter table temp rename to table
2 alter ignore table 表名 add unique (字段名)
3 alter ignore table 表名 add primary key (字段名)

<think>嗯……用户想要查找MySQL学习笔记,而且之前已经提供了三个引用片段作为参考。让我先理解一下用户的需求上下文。 从用户的问题历史来看,ta似乎正在系统性地学习MySQL,特别是索引、事务隔离级别这些进阶内容。三个引用片段分别涉及多列索引的使用限制(引用1)、索引优化的重要性(引用2)事务隔离级别的分类(引用3),这些都是MySQL的核心知识点。 用户明确说“我想查找MySQL学习笔记”,但没说具体方向。考虑到ta之前关注的索引隔离级别,笔记应该覆盖这些深度内容,同时包含基础语法以便复习。可能需要整理成系统化的知识框架。 引用1提到多列索引的字段顺序很重要——这个必须强调,因为跳过第一个字段会使索引失效。引用2指出数据清洗要在update前完成,还提到B-Tree索引的结构原理,这些都应该整合进笔记。引用3关于事务隔离级别的描述很专业,但“未提交读/提交读/可重复读/可串行化”的对比需要更清晰的表格呈现。 用户没有指定笔记形式,但学习笔记最好结构化。我打算分成七部分:基础架构、数据类型、索引(重点展开)、事务、锁机制、优化技巧、备份恢复。其中索引部分要突出引用1的字段顺序限制引用2的B-Tree原理;事务部分详解引用3的隔离级别。 需要警惕一个细节:引用3提到“可重复读使用MVCC+X锁实现”,但MySQL的InnoDB在可重复读级别下默认用MVCC避免幻读,实际只在写操作加锁。这点要修正说明,避免误导用户。 对了,用户可能还需要对比不同存储引擎(比如InnoDBMyISAM的事务支持差异),但引用内容没涉及。为免信息过载,先聚焦已有引用关联的知识点,结尾用开放性问题引导用户提出细化需求比较稳妥。 </think>以下是一份系统的MySQL学习笔记整理,涵盖核心概念与实践要点,结合了您提供的引用内容: --- ### **一、MySQL基础架构** 1. **逻辑架构** - 连接层:客户端连接管理、认证 - 服务层:查询解析、优化、缓存(8.0+移除查询缓存) - 存储引擎层:InnoDB(默认)、MyISAM等 --- ### **二、数据类型与表设计** 1. **常见数据类型** - 整型:`INT`、`BIGINT`(注意无符号范围) - 字符型:`VARCHAR`(变长)、`CHAR`(定长) - 时间型:`DATETIME`(精确到秒)、`TIMESTAMP`(时区敏感) 2. **设计原则** - 主键推荐自增整型(避免页分裂[^1]) - 避免`NULL`字段(增加索引复杂度) --- ### **三、索引机制(核心重点)** 1. **索引类型** - **B-Tree索引**(默认结构): - 数据有序存储,支持范围查询 - 适用场景:`=, >, <, BETWEEN, LIKE 'prefix%'`[^2] - 哈希索引:仅精确匹配(Memory引擎) - 全文索引:`FULLTEXT`(文本搜索) 2. **多列索引(联合索引)规则** - 最多支持16个字段 - **最左前缀原则**: ```sql /* 索引 (a,b,c) */ WHERE a=1 AND b=2 -- ✅ 使用索引 WHERE b=2 AND c=3 -- ❌ 无法使用索引(缺少a)[^1] ``` 3. **索引失效场景** - 对索引列进行运算(`WHERE id+1=10`) - 类型转换(字符串列用数字查询) - `LIKE '%suffix'`(前导通配符) --- ### **四、事务与隔离级别** | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现机制 | |------------------|------|------------|------|-----------------------------| | 读未提交 (RU) | ✅ | ✅ | ✅ | 无锁 | | 读已提交 (RC) | ❌ | ✅ | ✅ | MVCC(无X锁)[^3] | | 可重复读 (RR) | ❌ | ❌ | ⚠️ | **MVCC+间隙锁**(防幻读) | | 串行化 (Serializable) | ❌ | ❌ | ❌ | 全表锁 | > **说明**: > - InnoDB在RR级别通过**间隙锁**解决幻读问题[^3] > - MVCC通过事务IDUndo Log实现快照读 --- ### **五、锁机制** 1. **锁类型** - 行级锁:`Record Lock`(单行)、`Gap Lock`(间隙)、`Next-Key Lock`(行+间隙) - 表级锁:`ALTER TABLE`时自动加锁 2. **死锁处理** - 检测机制:等待图(wait-for graph) - 解决策略:回滚代价最小的事务 --- ### **六、性能优化** 1. **SQL优化原则** - 避免`SELECT *`,用覆盖索引 - 数据清洗在应用层完成(如`UPPER()`处理[^2]) - 批量操作代替循环单条处理 2. **Explain工具** - 关注`type`(访问类型):`const > ref > range > index > ALL` - `Extra`字段:`Using index`(覆盖索引)、`Using filesort`(需优化) --- ### **七、备份与恢复** - **逻辑备份**:`mysqldump --single-transaction`(不影响事务) - **物理备份**:Percona XtraBackup(热备份) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值