前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2019Java面试宝典 -- 数据库常见面试题

2019Java面试宝典 -- 数据库常见面试题

作者头像
浩Coding
发布2019-07-12 15:10:33
2.2K0
发布2019-07-12 15:10:33
举报
文章被收录于专栏:浩Coding浩Coding

1、union和union all的区别?

如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);union和union all的区别是,union会自动去重,而union all则将所有的结果全部显示出来,不管是不是重复。

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

代码语言:javascript
复制
select * from Table1  union  select * from Table2  
select * from Table1  union all  select * from Table2  

2、Oracle的连接详解(左连接和右连接的区别)?

外连接:

左连接(左外连接Left Join):以左表作为基准进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配则显示为 null。

右连接(右外连接 Right Join):以右表作为基准进行查询,右表数据会全部显示出来,左表如果和右表匹配的数据则显示相应字段的数据,如果不匹配则显示为 null。

全连接先以左表进行左外连接,再以右表进行右外连接

内连接( Inner Join): 显示表之间有连接匹配的所有行。

代码语言:javascript
复制
相关SQL及解释:
关于左连接和右连接总结性的一句话:左连接where只影响右表,右连接where只影响左表。
Left Join:
select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID
左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据。
简言之 Left Join影响到的是右边的表。

Right Join:
select * from tbl1 Right Join tbl2 where tbl1.ID = tbl2.ID
检索结果是tbl2的所有数据和tbl1中满足where 条件的数据。
简言之 Right Join影响到的是左边的表。

inner join:
select * FROM tbl1 INNER JOIN tbl2 ON tbl1.ID = tbl2.ID
功能和 select * from tbl1,tbl2 where tbl1.id=tbl2.id相同。

3、SQL 的 select 语句完整的执行顺序?

SQL Select 语句完整的执行顺序:

代码语言:javascript
复制
1、from 子句组装来自不同数据源的数据;
2、where 子句基于指定的条件对记录行进行筛选;
3、group by 子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用 having 子句筛选分组;
6、计算所有的表达式;
7、select  的字段;
8、使用 order by 对结果集进行排序。

SQL 语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在 SQL 语句中,第一个被处理的子句式 FROM,而不是第一出现的 SELECT。

SQL 查询处理的步骤序号:

代码语言:javascript
复制
(1) FROM <left_table> 
(2) <join_type> JOIN <right_table> 
(3) ON <join_condition> 
(4) WHERE <where_condition> 
(5) GROUP BY <group_by_list> 
(6) WITH {CUBE | ROLLUP} 
(7) HAVING <having_condition> 
(8) SELECT 
(9) DISTINCT 
(9) ORDER BY <order_by_list> 
(10) <TOP_specification> <select_list> 

以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

4、常用的SQL 聚合函数?

聚合函数是对一组值进行计算并返回单一的值的函数,它经常与 select 语句中的 group by 子句一同使用

代码语言:javascript
复制
a.   avg():返回的是指定组中的平均值,空值被忽略。
b.   count():返回的是指定组中的项目个数。
c.   max():返回指定数据中的最大值。
d.   min():返回指定数据中的最小值。
e.   sum():返回指定数据的和,只能用于数字列,空值忽略。
f.   group by():对数据进行分组,对执行完 group by 之后的组进行聚合函数的运算,计算每一组的值。

最后用having去掉不符合条件的组(WHERE 关键字无法与聚合函数一起使用,HAVING 子句可以让我们筛选分组后的各组数据。),having子句中的每一个元素必须出现在select列表中(只针对于mysql)。

5、简单谈下SQL注入?

通过在 Web 表单中输入(恶意)SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL 语句。举例:当执行的 sql 为 :

代码语言:javascript
复制
select * from user where username = ‘admin’ or ‘a’=‘a’

此时,sql 语句恒成立,参数 admin 毫无意义。

防止 sql 注入的方式:

1. 预编译语句:如,select * from user where username = ?,sql 语句语义不会发生改变,sql 语句中变量用?表示,即使传递参数时为“admin or ‘a’= ‘a’”,也会把这整体当做一个字符串去查询。

2. Mybatis 框架中的 mapper 方式中的 # 也能很大程度的防止 sql 注入($无法防止 sql 注入)。

6、 事务的四大特征是什么?

数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。

(1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

(2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

(3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

(4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

7、常见数据库的分页语句?

MySQL——相对来说最简单分页查询:

MySQL的分页查询要用到 limit关键字,方式就是 limit m,n ;

m表示第几条数据 n表示从m+1开始取多少条数据,比如:

代码语言:javascript
复制
select * from table limit m,n       
其中m是指记录开始的index,从0开始,表示第一条记录

Oracle :

Oracle分页要用到的关键字是 rownum (行号),我们直接看它的用法:

1)查询表中的前n条记录:

代码语言:javascript
复制
select * from Table where rownum <= n

2)查询第 n 到第 m 条记录:

代码语言:javascript
复制
select * from 
(select 表名.*, rownum rn from 表名 where rownum <=m) 
where rn > n;

对于这种形式的查询,oracle不像mysql那么方便,它必须使用子查询或者是集合操作来实现

SQL Server

在分页查询上,我感觉SQL Server比较费劲,没有一个专门的分页的语句,并且每个版本对应的查询方式不一样,下面例子是每页10条,取第31-40条数据:  

代码语言:javascript
复制
--方法一:Order by
Select Top (40-31+1)  * From a Where ID in (Select Top 40 ID From a Order by ID  ) Order by ID Desc

--方法二:not in/top
select top 10 * from a where id not in (select top 30 id from a order by id) order by id

--方法三:not exists 
select top 10 * from a where not exists (select 1 from (select top 30 id from a order by id)a1 where a1.id=a.id) order by id

--方法四:max/top
select top 10 * from a where id>(select max(id) from (select top 30 id from a order by id)a1) order by id

--方法五:row_number()
select top 10 * from (select row_number()over(order by id)rownumber,* from a)a1 where rownumber>30
select * from (select row_number()over(order by id)rownumber,* from a) a1 where rownumber>30 and rownumber<41
select * from (select row_number()over(order by id)rownumber,* from a)a1 where rownumber between 31 and 40

--方法六:row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号
select *
from (select row_number()over(order by id)rownumber,* from (select top 40 * from a where 1=1 order by id)a
)b where rownumber>30

本系列Java面试题很多代码来自网络,后加上作者的修改。如有侵权,联系作者(公众号后台留言即可)马上删除。

参考文章:

2019Java面试宝典数据库篇 -- MySQL

MySQL数据库远程连接、创建新用户、设置权限、更改用户密码

Oracle的连接详解(左连接、右连接、全连接...)?

https://www.cnblogs.com/guogl/articles/5929852.html

数据库中的左连接(left join)和右连接(right join)区别

https://www.cnblogs.com/boundless-sky/p/6594518.html

union和union all的区别?

https://www.cnblogs.com/xiangshu/articles/2054447.html

【知了堂学习笔记】JSP页面数据分页实现(一)——分页概念以及主流数据库的分页查询?

https://www.cnblogs.com/paopaolong/p/7471815.html

Java面试宝典 -- 黑马程序员

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩Coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Oracle的连接详解(左连接、右连接、全连接...)?
  • 数据库中的左连接(left join)和右连接(right join)区别
  • 【知了堂学习笔记】JSP页面数据分页实现(一)——分页概念以及主流数据库的分页查询?
  • https://www.cnblogs.com/paopaolong/p/7471815.html
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档