关系型数据库MySQL_常见面试题总结、练习题

一、简答题

  1. MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别(至少5点)?
  • 事务安全:InnoDB支持事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全;MyISAM和MEMORY不支持事务安全
  • 外键:InnoDB支持外键;MyISAM和MEMORY不支持外键
  • 锁:InnoDB支持行锁;MyISAM支持表锁;MEMORY支持表锁
  • 存储限制:InnoDB存储限制64TB;MyISAM和MEMORY具有存储限制
  • 索引:InnoDB支持BTREE索引;MyISAM支持BTREE索引、全文索引;MEMORY支持BTREE索引、哈希索引
  • 空间使用率:InnoDB空间使用率高;MyISAM和MEMORY空间使用率较低
  • 应用场景:InnoDB适合频繁修改以及涉及到安全性较高的应用;MyISAM适合查询以及插入为主的应用;Memory表被存储在内存中对创建暂时表很实用,但是当server关闭之后全部存储在Memory表里的数据也会丢失。
  • 总结:
  • InnoDB:优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大。
  • MyISAM:优势在于占用空间小,处理速度快。缺点是不支持事务的完整性和并发性。
  • MEMORY:存储的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。
    注意:同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。
  1. 数据库事务的四个特性及含义
  • 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):事务前后数据的完整性必须保持一致,即几个并行执行的事务其执行结果必须与按某一顺序串行执行的结果相一致。
  • 隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发之间数据要相互隔离。
  • 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不会对其有任何影响
  1. 数据库三范式是什么?
    第一范式(1NF): 列不可拆分,即无重复的域
    第二范式(2NF): 唯一标识,即拥有实体的唯一标识(eg: 身份证、id号等)
    第三范式(3NF): 引用主键,即每列数据都与主键直接相关

  2. 数据库支持的SQL数据类型常用的有哪些?
    数字:int,decimal(5, 3) --> 5位数,小数位3位
    字符串:char(不可变),varchar(可变),text(大文本)
    日期:datetime,date
    布尔:bit

  3. SQL数据类型varchar和char的区别?
    varchar:可变长的字符串,需要在声明字段时指定能存储的最大字符数,真实占用的空间取决于存入的字符数,存入的越多占用空间越多。适合保存内容长度不定的字符类型数据。存储数据的大小,mysql5.0以前0~ 255字节,mysql5.0以后0~65535字节
    char:定长字符串,需要在声明字段时指定固定字符数。即使存入的字符数少于该长度,该字段也会占用该固定长度。适合存储长度不变的字符类型数据。存储数据的大小,0~255字节

  4. SQL 约束有哪几种并解释含义(eg:NOT NULL、UNIQUE等)?
    primary key:主键,不能重复的唯一标识,一个表中只可有一个
    not null:非空
    unique:唯一,一个表中可以有多个
    default:默认
    foreign key:外键

  5. 数据库内连表、左连表、右连表有什么区别?
    内连表:table_A inner join table_B,表 table_A 和 table_B 相匹配的行出现在结果集中
    左连表:table_A left join table_B,表 table_A 和 table_B 相匹配的行出现在结果集中,外加表 table_A 中独有的数据,为对应的数据用 null 填充
    右连表:table_A right join table_B,表 table_A 和 table_B 相匹配的行出现在结果集中,外加表 table_B 中独有的数据,为对应的数据用 null 填充

  6. SQL语句查询时如何实现分页?

select * from table_name limit start, count
  1. 什么是SQL注入?
    SQL注入:是现在普通使用的一种攻击手段,通过把非法的SQL命令插入到Web表单中或页面请求查询字符串中,最终达到欺骗服务器执行恶意的SQL语句的目的。SQL注入一旦成功,轻则直接绕开服务器验证,直接登录成功,重则将服务器端数据库中的内容一览无余,更有甚者,直接篡改数据库内容等。
    SQL注入的产生条件:1). 有参数传递;2). 参数值带入数据库查询并且执行
    为防止SQL注入,需要对用户的输入进行过滤,因为在Web攻防中,我们永远不要相信用户的输入。
    防止SQL注入包括
    使用预编译语句,绑定变量。
    使用安全的存储过程对抗SQL注入。
    检查数据类型。
    使用安全函数
  2. 数据库怎么优化查询效率?
    1). 储存引擎选择:如果数据表需要事务处理,应该考虑使用 InnoDB,因为它完全符合 ACID 特性。如果不需要事务处理,使用默认存储引擎 MyISAM 是比较明智的
    2). 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
    3). 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
    4). 应尽量避免在 where 子句中使用 != 或<> 操作符,否则将引擎放弃使用索引而进行全表扫描
    5). 应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
    6). Update 语句,如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志
    7). 对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差。

二、SQL语句查询操作。

  1. 创建数据库表employees, 包含的信息有:

在这里插入图片描述

MariaDB [StuProject]> create table
employees(  
-> emp_no int auto_increment primary key comment '员工编号',
-> birth_date date not null comment '出生日期',
 -> name varchar(20) not null comment '姓名', 
-> gender int not null default 1 comment '男1女2',
-> hire_date datetime not null comment '入职日期');
  1. 批量插入数据如下:
    在这里插入图片描述
MariaDB [StuProject]> insert into employees values   
-> (1,'1996-10-10','高崎','2','2019-10-10'),   
-> (2,'1995-10-10','刘欢',2,'2019-6-10'),   
-> (3,'1993-10-10','王佗',1,'2019-1-10'),   
-> (4,'1995-10-10','洪笙宁',1,'2018-10-10'),
-> (5,'1991-2-1','张三',1,'2017-10-10');
  1. 更新高崎的出生日期为1996-12-12.
update employees set birth_date='1996-12-12' where name='高崎';
  1. 统计员工总人数。
select count(*) as stu_conut  from employees;
  1. 统计入职时间超过2年的员工姓名.(拓展知识, 查阅资料)
set @dt=curdate();
select @dt;
select * from employees where datediff(@dt, hire_date)>730;
  1. 查找最晚入职员工的所有信息
select * from employees where hire_date=(select max(hire_date) from employees);
  1. 查询最早入职员工的所有信息
select * from employees where hire_date=(select min(hire_date) from employees);
  1. 查询成绩在85到90分之间的学生姓名、课程名和成绩。

| 陆君 | 95031 | 86.0 |

| 匡明 | 95031 | 88.0 |

select sname as '姓名',cname as '课程', degree as '成绩' from scores
    -> right join students on students.sno=scores.sno
    -> right join courses on scores.cno=courses.cno
    -> group by degree having degree between 85 and 90;
  1. 查询高等数学成绩最高的学生名和学生分数。

| 陆君 | 86.0 |

 select * from scores right join students on students.sno=scores.sno;
 select sname as '姓名',cname as '课程', degree as '成绩' from scores
    -> right join students on students.sno=scores.sno
    -> right join courses on scores.cno=courses.cno
    -> where degree=(select max(degree) from scores);
  1. 查询李军选修的课程名称。

| 计算机导论 |

| 数据电路 |

 select sname as '姓名',cname as '课程' from scores 
    -> right join students on students.sno=scores.sno
    -> right join courses on scores.cno=courses.cno
    -> where sname='李军';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值