MySQL面经整理版

☆* o(≧▽≦)o *☆嗨~我是小奥🍹
📄📄📄个人博客:小奥的博客
📙📙📙Github:传送门
📅📅📅面经分享(牛客主页):传送门
🍹文章作者技术和水平有限,如果文中出现错误,希望大家多多指正!
📜 如果觉得内容还不错,欢迎点赞收藏关注哟! ❤️

MySQL面试题汇总

基础

数据库三大范式

第一范式:数据库的每一列都是不可分割的原子项。

第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。

第三范式:在第二范式的基础上,非主键只依赖于主键,不依赖于其他非主键,即不存在依赖传递。

char和varchar的区别

(1)存储方式:char类型的数据是定长的,当存储时,MySQL会将所有的字符都填充到定长,检索时会去掉空格,因此存储时占用的空间固定;而varchar类型的数据是变长的,它只会存储实际使用的字符,因此存储时占用的空间是可变的。

(2)**查找效率:**char的查找效率比varchar要高。

(3)**字符串长度:**char类型的数据长度是固定的,可以存储0到255个字符,而varchar类型的数据长度是可变的,可以存储0到65535个字符。

(4)**使用场景:**通常,char类型的数据适合存储长度固定的数据,例如国家代码、邮编等;而varchar类型的数据适合存储长度不固定的数据,例如用户名、地址等。

drop、truncate和delete的区别

(1)作用范围:drop会删除整张表和表结构,以及表的索引、约束和触发器;truncate只删除全部表数据,表的结构、索引、约束等会被保留;delete只删除表的全部或者部分数据,表结构、约束、索引等会被保留。

(2)作用方式:delete是DML(data maintain language)语句,执行删除操作的过程是每次从表中删除一行,并同时将该行的删除操作作为事务记录在日志中保存以便于进行回滚操作;truncate、drop是DLL(data define language)语句,删除行是不能恢复的,并且在删除过程中不会激活与表有关的触发器,执行速度比较块,原数据不放到rollback segment中,不能回滚。

(3)条件限制:truncate和drop不支持添加where条件,而delete支持where条件。

(4)执行速度:执行速度drop > truncate > delete,delete是逐行执行的,并且在执行时会把操作日志记录下来,以备日后回滚使用,所以delete的执行速度是比较慢的;而truncate的操作是先复制一个新的表结构,然后删除掉原来的表,所以它的执行速度居中,而drop的执行速度最快。

select from a,b和join的区别

(1)select from a,b使用的是SQL隐式连接(也被称为笛卡尔积),对于表a中的每一行,都会将表b中的所有行与之匹配,生成一个新的结果集。这种连接通常会导致结果集非常大,因为它将两个表中的所有数据都组合在一起,而且没有经过任何的筛选或者限制。

(2)join使用的SQL的显示连接,它使用on子句来指定连接条件,只有满足条件的数据行才会被返回,这种连接方式可以减少结果集的大小,同时还可以更加精细的筛选和限制。

left join 和 inner join的区别

  • left join会返回左表中的所有记录和右表中满足连接条件的记录;而inner join只会返回两个表中满足连接条件的记录。
  • left join右表关联不上的数据会用null表示;而inner join关联不上的数据直接舍弃。

left join和right join

外连接通过outer join来实现,它将返回两张表中满足连接条件的数据,同时返回不满足条件的数据。

外连接有两种形式:左连接和右连接。

  • 左外连接left join on:简称为左连接,它会返回左表中的所有记录和右表中满足连接条件的记录。

    • 两表关联,左表全部保留,右表关联不上用null表示。
    select 字段列表 from1 left [outer] join2 on 条件 ...;
    
  • 右外连接right join on:简称为右连接,它会返回右表中的所有记录和左表中满足连接条件的记录。

    • 两表关联,右表全部保留,左表关联不上用null表示。
    select 字段列表 from1 right [outer] join2 on 条件 ...;
    
  • 全连接union:两表的内容均保留,没有关联的字段用null表示。在mysql中使用union表示。

    select 字段列表 from 表A
    union [ALL]
    select 字段列表 from 表B
    

    对于联合查询的多张表的列表必须要保持一致,字段类型也要保持一致。

    union all 会将全部的数据直接合并在一起,union会对合并之后的数据去重。

group by的用法

group by一般用于分组统计,就是可以根据一个或者多个字段,对查询到的数据进行分组。

group by如果单独使用的话,会返回每组第一行的数据。

group by的常规用法就是配合聚合函数,利用分组信息进行统计,同时还可以配合having进行筛选过滤。

另一方面,having子句中不能使用除了分组字段和聚合函数之外的其他字段。

Limit分页的用法

limit子句可以用于强制select语句返回指定的记录数。

select 字段 from 表名 limit 参数1,参数2;
select 字段 from 表名 limit 参数2 offset 参数1;(为了与 PostgreSQL 兼容)
参数1:指定第一个返回记录行的偏移量,从0开始
参数2:指定返回记录行的最大数目
如果只给定一个参数,那么表示返回的最大记录行数目。
如果第二个参数为-1,表示第一个参数的偏移量之后的所有的数据

where和having的区别

(1)where是一个约束声明,在对查询结果返回之前将不符合where条件的数据给去掉,where是在结果返回之前起作用的,where中不能使用聚合函数,即使用where条件过滤出特定的行。

(2)having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在having中可以使用聚合函数。另一方面,having子句中不能使用除了分组字段和聚合函数之外的其他字段。

从性能的角度来说,HAVING子句中如果使用了分组字段作为过滤条件,应该替换成WHERE子句。因为WHERE可以在执行分组操作和计算聚合函数之前过滤掉不需要的数据,性能会更好。

一般情况下:

  • where用于过滤数据行,而having用于过滤分组
  • where查询条件中不可以使用聚合函数,而having查询条件中<
<think>好的,用户想了解SQL相关的试经验,特别是常见问题和答案。首先,我需要整理SQL试中经常被问到的问题。根据用户提供的引用内容,引用[2]提到了SQL和MySQL的区别,引用[3]提到了乐观锁和悲观锁以及on、where、having的区别,这些可以作为基础知识点。 首先,我应该从基本概念开始,比如SQL和数据库管理系统的区别,表格和字段的定义,这些都是试常见问题。然后,用户提到的引用[3]中的锁机制和查询条件的区别也需要详细解释,比如乐观锁和悲观锁的应用场景,以及on、where、having在查询中的不同作用。 接下来,可能需要涵盖SQL语句的关键字,如SELECT、JOIN、GROUP BY等,以及聚合函数的使用。此外,索引相关的问题也很重要,比如索引的类型、优缺点,如何优化查询性能。事务的ACID属性也是常问点,需要结合实例说明。 还要考虑用户提到的引用[1]中的内容,虽然主要关于Java和其他技术,但可以推测用户可能对数据库连接的问题也感兴趣,比如JOIN的类型、子查询与连接的区别等。此外,存储过程、触发器的优缺点,以及数据库规范化与反规范化的权衡也是常见的试问题。 需要注意将每个问题答案结构化,分点说明,并适当引用提供的资料。例如,在解释on和where的区别时,引用[3]中的描述,说明on在生成临时表前过滤,而where在之后筛选。同时,要确保使用正确的LaTeX格式,如$...$和$$...$$,符合用户的要求。 最后,生成相关问题时要覆盖SQL的不同方,包括基础概念、查询优化、事务处理、锁机制等,帮助用户全准备试。需要检查是否有遗漏的重要主题,如视图、索引优化、事务隔离级别等,确保内容全且符合常见试问题趋势。</think>### SQL 试常见问题及答案整理 #### 一、基础概念类 1. **SQL 和 MySQL 的区别是什么?** - SQL 是结构化查询语言,用于操作和查询数据库的标准语法。 - MySQL 是基于 SQL 的关系型数据库管理系统(RDBMS),用于存储和管理数据[^2]。 2. **什么是表和字段?** - 表是数据的二维结构,由行(记录)和列(字段)组成。 - 字段是表的列,表示数据的属性(如`id`、`name`)。 3. **主键和外键的作用?** - 主键唯一标识表中的每条记录(如`id`),不能重复且非空。 - 外键用于关联其他表的主键,保证数据一致性(如`user_id`关联用户表)。 --- #### 二、查询与语法类 4. **SELECT 语句的执行顺序?** - 执行顺序为:`FROM` → `WHERE` → `GROUP BY` → `HAVING` → `SELECT` → `ORDER BY` → `LIMIT`。 5. **JOIN 的类型及区别?** - `INNER JOIN`:返回两表匹配的记录。 - `LEFT JOIN`:返回左表所有记录+右表匹配记录(不匹配则为`NULL`)。 - 示例: ```sql SELECT a.name, b.order_id FROM users a LEFT JOIN orders b ON a.id = b.user_id; ``` 6. **ON、WHERE、HAVING 的区别?** - `ON`用于连接表时过滤(生成临时表前生效)。 - `WHERE`对临时表数据进行过滤(生成临时表后生效)。 - `HAVING`对分组后的数据进行过滤(需配合`GROUP BY`使用)[^3]。 --- #### 三、性能与优化类 7. **索引的作用及优缺点?** - 作用:加快查询速度(类似书籍目录)。 - 优点:提高`SELECT`效率。 - 缺点:增删改操作变慢(需维护索引)。 8. **如何优化慢查询?** - 添加索引(如`WHERE`或`JOIN`字段)。 - 避免`SELECT *`,减少数据传输量。 - 使用`EXPLAIN`分析执行计划。 --- #### 四、事务与锁机制 9. **事务的 ACID 特性是什么?** - 原子性(Atomicity):事务全部完成或全部回滚。 - 一致性(Consistency):数据状态符合约束。 - 隔离性(Isolation):事务间互不干扰。 - 持久性(Durability):提交后数据永久保存。 10. **乐观锁与悲观锁的应用场景?** - 乐观锁:通过本号控制,适用于读多写少场景(如电商库存)。 - 悲观锁:通过`SELECT ... FOR UPDATE`锁定数据,适用于写多场景。 --- #### 五、进阶问题 11. **什么是存储过程?优缺点?** - 定义:预编译的 SQL 代码集合,可重复调用。 - 优点:减少网络传输,提高性能。 - 缺点:调试复杂,移植性差。 12. **数据库范式化 vs 反范式化?** - 范式化:减少冗余(如拆分为多表),但需更多`JOIN`。 - 反范式化:允许冗余(如合并字段),提高查询速度。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值