SQL面试题及答案(16道必考题解析)

SQL面试题及答案(16道必考题解析)-mikechen

什么是SQL?

SQL 代表结构化查询语言,是一种编程语言,用于与存储在关系数据库管理系统中的数据进行通信。

 

SQL和MySQL有什么区别?

SQL是一种特定于域的语言,用于管理,检索和操作结构化数据库, MySQL是一个关系数据库管理系统。

 

有哪些不同类型的联接,并分别说明它们?

SQL面试题及答案(16道必考题解析)-mikechen

有四种不同类型的联接:

  • 内部联接:返回两个表中具有匹配值的记录;
  • 左联接:返回左表中的所有记录以及右表中的匹配记录;
  • 右连接:从右表返回所有记录,并从左表返回匹配的记录;
  • 完全连接:当左表或右表中存在匹配项时,返回所有记录。

 

INNER JOIN 和 LEFT JOIN 有什么区别?

INNER JOIN用于包含两个表中符合ON条件的组合行,最终结果不包括与ON条件不匹配的行。

LEFT JOIN用于保留第一个表中的所有行,无论第二个表中是否存在与ON条件匹配的行。

SQL面试题及答案(16道必考题解析)-mikechen

 

什么是视图?

视图也是一个表-它是另一个表或多个表上查询的存储结果集,用户可以像其他任何表一样从中查询。

 

什么是子查询?

当一个查询结果是另一个查询的条件的时候,那么就称为子查询,子查询是在SQL语句内的另外一条SELECT语句。

在SELECT、INSERT、UPDATE或DELETE命令中只要是表达式的地方都可以包含子查询,子查询甚至可以包含在另外一个子查询中,以便完成更为复杂的查询。

 

在什么地方使用子查询?

主要分为如下3种:

1.在where子句中使用子查询

案例:查询哪些员工是领导,显示领导的编号,姓名

第一步:查询所有领导的编号

select distinct mgr from emp;

第二步:从员工表中将领导查询出来

select empno,ename from emp where empno in(select distinct mgr from emp);

 

2.在from子句中使用子查询

案例:查询各个部门的平均薪水的所属等级

第一步:

select deptno,avg(sal) from emp group by deptno;

第二步:

select
t.deptno,t.avgsal,s.grade
from
(select deptno,avg(sal) avgsal from emp group by deptno)t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;

 

3.在select 中使用子查询

用来作为临时表一起组合返回结果数据,解决复杂问题非常有效

使用all操作符:

select ename,sal, deptno from emp where sal > all(select sal from emp where deptno = 30)

 

什么是聚集索引和非聚集索引?

聚集索引:聚集索引是索引结构和数据一起存放的索引。类似于字典的正文,当我们根据拼音直接就能找到那个字。

非聚集索引:非聚集索引是索引结构和数据分开存放的索引。类似于根据偏旁部首找字,首先找到该字所在的地址,再根据地址找到这个字的信息。

 

聚集索引和非聚集索引的区别?

1).聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个;

2).聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续;

3).聚集索引:物理存储按照索引排序;聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序;

4).非聚集索引:物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。

5).索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

优势与缺点:

聚集索引插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快。

 

UNION和JOIN有什么区别?

两者都用于将来自一个或多个表的数据合并为一个结果,区别在于JOIN语句将不同表的列合并为一个结果,而UNION语句将不同表的行合并为一个结果。

 

DISTINCT 和 UNIQUE 有什么区别?

DISTINCT是我们想要在输出中返回唯一值时使用的关键字。它过滤掉指定列中的所有重复值。

UNIQUE是用于确保列的所有值都不同的约束。它类似于PRIMARY KEY,不同之处在于一个表可以有许多不同的UNIQUE列。

 

WHERE和HAVING子句有什么区别?

WHERE和HAVING都用于过滤表以满足您设置的条件。 当它们与GROUP BY子句一起使用时,将显示两者之间的差异。 WHERE子句用于在分组之前过滤行(在GROUP BY子句之前),而HAVING子句用于在分组之后过滤行。

 

聚合函数有什么用?有哪些常见的?

聚合函数用于对一个或多个值执行计算,并返回包含更有意义信息的单个值。

聚合函数的一些示例包括:

  • AVG()—计算值集合的平均值;
  • COUNT()—计算特定表或视图中的记录总数;
  • MIN()—计算一组值的最小值;
  • MAX()—计算一组值的最大值;
  • SUM()—计算值集合的总和;
  • FIRST()—获取值集合中的第一个元素;
  • LAST()—获取值集合中的最后一个元素。

 

事务的属性是什么?

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

  • 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做;
  • 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的;
  • 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰;
  • 持久性(durability):持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

 

什么是SQL注入?

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

 

预防 SQL 注入的方法有哪些?

  • 严格限制 Web 应用的数据库的操作权限,给连接数据库的用户提供满足需要的最低权限,最大限度的减少注入攻击对数据库的危害;
  • 校验参数的数据格式是否合法(可以使用正则或特殊字符的判断);
  • 对进入数据库的特殊字符进行转义处理,或编码转换;
  • 预编译 SQL(Java 中使用 PreparedStatement),参数化查询方式,避免 SQL 拼接;
  • 发布前,利用工具进行 SQL 注入检测;
  • 报错信息不要包含 SQL 信息输出到 Web 页面。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法