MySQL(一)——MySQL基础和部分面试题

MySQL基础:

  1. 数据库的创建与删除
CREATE DATABASE <数据库名>;//创建数据库
DROP DATABASE <数据库名>;//删除数据库
  1. 数据库表的创建与删除
CREATE TABLE <数据表名>(column_name column_type);//创建表
DROP TABLE <数据表名>;//删除表
  1. 增删改查
  • 查询语句
SELECT [DISTINCT|ALL]<目标列组>
FROM <基本表名>
[WHERE <行条件表达式>]
[GROUP BY <分组列名> [HAVING<组条件表达式>]]
[ORDER BY <排序列名> [ASC|DESC]]
//例:查询学生成绩表SC里平均成绩低于80分的学生学号Snum和平均成绩,并按平均成绩降序排列
SELECT Snum AS 学号,AVG(Score) AS 平均成绩
FROM SC
GROUP BY Snum
HAVING AVG(Score)<80 DESC;
  • 插入数据
INSERT INTO <表名>[(A1,A2,A3...)]
VALUES (v1,v2,v3...);
//例 :向表学生S中添加一位学生的数据
INSERT INTO S(Snum,Sname,Ssex,Sage,Sphone)
VALUES("0001","张三",18,"男","88888888");
  • 更新数据
UPDATE <表名>
SET <列名>=<表达式>
[WHERE <条件>]
//例:将张三的年龄改为20
UPDATE S
SET Sage=20
WHERE Sname="张三";
  • 删除数据
DELETE FROM <表名>
[WHERE <条件>]
//例:删除学生张三的信息
DELETE FROM S
WHERE Sname="张三";

MySQL基础面试题

  1. 说一下MySQL执行一条查询语句的内部执行过程?
    答:
    1)客户端先通过连接器连接到MySQL服务器
    2)连接器权限验证通过后,先查询是否有查询缓存,如果有缓存(之前执行过此语句)则直接返回缓存数据,如果没有则进入分析器
    3)分析器对查询语句进行语法分析和词法分析,判断SQL语法是否正确,如果查询语法错误会直接返回客户端错误信息,如果语法正确则进入优化器
    4)优化器对查询语句进行优化处理,例如一个表里有多个索引,优化器会判别哪个索引性能更好
    5)优化器执行完进入执行器,执行器对语句进行查询对比,查到满足条件的所有数据然后返回

  2. MySQL查询缓存功能有何优缺点?
    答:
    MySQL查询缓存功能是在连接器之后发生的,它的优点是效率高,如果已经有缓存则直接返回结果。缺点是失效太频繁导致缓存的命中率较低,任何更新表操作都会清空查询缓存,一次查询缓存非常容易失效

  3. 如何关闭MySQL的查询缓存功能?
    答:
    MySQL查询缓存功能是默认开启的,配置querycachetyoe参数为DEMAND(按需使用)关闭查询缓存,MySQL8.0之后没有查询缓存功能

  4. MySQL可以针对表级别设置数据库引擎吗?怎么设置?
    答:
    可以针对不同的表设置不同的引擎。在CREATE TABLE语句中使用ENGINE=引擎名(比如Memory)来设置表的存储引擎:

CREATE TABLE student(
     id int PRIMARY KEY auto_increment,
     username varchar(120),
     age int
)ENGINE=Memory
  1. 常用的存储引擎InnoDB和MyISAM有什么区别?
    答:
    最大的区别是InnoDB支持事务,而MyISAM不支持事务。主要区别如下:
    1)InnoDB支持崩溃后安全恢复,MyISAM不支持崩溃后安全恢复
    2)InnoDB支持行级锁,MyISAM不支持行级锁,只支持到表锁
    3)InnoDB支持外键,MyISAM不支持外键
    4)MyISAM性能比InnoDB高
    5)MyISAM支持FULLTEXT类型的全文索引,InnoDB不支持FULLTEXT类型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好
    6)InnoDB主键查询性能高于MyISAM

  2. 什么是事务?特性?
    答:
    事务是一系列的数据库操作,是数据库的基本单位
    事务的四个特性:
    1)原子性。要么全部执行,要么全部不执行
    2)一致性。事务的执行使得数据库从一种正确状态转化为另一种正确状态
    3)隔离型。事务正确提交之前,不允许把该事务对数据的改变提供给其他事务
    4)持久性。事务提交后,结果永远保存于数据库中

  3. 一张自增表中有三条数据,删除了两条数据之后重启数据库,再新增一条数据,此时数据的ID是几?
    答:
    如果这张表的引擎是MyISAM,那么ID=4;如果是InnoDB,那么ID=2

  4. MySQL中什么情况会导致自增主键不能连续?
    答:
    1)唯一主键冲突会导致自增主键不连续
    2)事务回滚也会导致自增主键不连续

  5. 什么事独立表空间和共享表空间?它们的区别是?
    答:
    独立表空间:指的是数据库中所有的数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下
    独立表空间:每一个表都会生成以独立的文件方式来存储
    共享表空间和独立表空间的最大区别是如果把表放在共享表空间,即使表删除了空间也不会删除,所以表依然很大,而独立表空间如果删除表就会清楚空间

  6. 如何设置独立表空间?
    答:
    独立表空间是由参数innodb fileper_table控制的,把它设置成ON就是独立表空间了。在MySQL5.6.6版本之后,这个值默认为ON

  7. 如何进行表空间收缩?
    答:
    使用重建表的方式可以收缩表空间:
    1)alter table t engine=InnoDB
    2)optmize table t
    3)truncate table t

  8. 重建表的执行流程?
    答:
    1)建立一个临时文件,扫描表t主键的所有数据页
    2)用数据页中表t的记录生成B+树,存储到临时文件中
    3)生成临时文件的过程中,将所有对t的操作记录在一个日志文件(row log)中
    4)临时文件生成后,将日志文件中的操作应用到临时文件,得到一个逻辑数据上与表t相同的数据文件
    5)用临时文件替换表t的数据文件

  9. 表的结构信息存在哪里?
    答:
    MySQL8之前,表结构的定义信息存在以.frm为后缀的文件里;MySQL8之后,允许把表结构的定义信息存在系统数据表中

  10. 什么是覆盖索引?
    答:
    覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键上去取数据

  11. 如果把一个InnoDB表的主键删掉,是不是就没有主键,就没办法进行回表查询了?
    答:
    可以回表查询,如果把主键删掉了,那么InnoDB会自己生成一个长度为6字节的rowid作为主键

  12. 内存表和临时表有什么区别?
    答:
    内存表,指的是使用Memory引擎的表,。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在
    临时表,可以使用各种引擎类型。如果是使用InnoDB引擎或者MyISAM引擎的临时表,写数据的时候是写到磁盘上的

  13. 并发事务会带来哪些问题?
    答:
    修改丢失、脏读、不可重复读、幻读

  14. VARCHAR和CHAR的区别是什么?
    答:
    VARCHAR和CHAR最大的区别是,VARCHAR的长度是可变的,CHAR是固定长度。所以CHAR适合存储长度较短的字段和固定长度的字段比如身份证号、手机号等。反之则适合用VARCHAR

  15. MySQL 存储金额应该使用哪种数据类型?
    答:
    应该使用decimal,因为如果存储其他数据类型比如float,有导致小数点后数据丢失
    的风险

  16. 删除表的数据有几张方式?区别是?
    答:
    有两种方式:delete和truncate,区别如下:
    1)delete可以添加where条件删除部分数据,truncate不能添加where条件,只能删除整张表
    2)delete的删除信息会在MySQL的日志中记录,而truncate的删除信息不回被记录。因此delete的信息可以被找回,而truncate的信息无法被找回
    3)truncate因为不记录日志所以执行效率比delete快

delete from t where id=1;
truncate table t;
  1. MySQL支持几种模糊查询?它们的区别是?
    答:
    支持两种模糊查询:regexp和like
    like是对任意多字符匹配或任意单字符进行模糊匹配,而regexp则支持正则表达式的匹配方式

  2. count(column)和count()有什么区别?
    答:
    最大的区别是统计结果可能不一致,count(column)统计不会统计列值为null的数据,而count(*)则会统计所有信息

你可能感兴趣的:(MySQL(一)——MySQL基础和部分面试题)