全栈面试题】模块5-1】Oracle/MySQL 数据库基础

目录

[面试题5.1 Oracle和Mysql的区别?](#面试题5.1 Oracle和Mysql的区别?)

[面试题5.2 SQL语句有多少类型](#面试题5.2 SQL语句有多少类型)

[面试题5.3 mysql常用数据类型、oracle常用数据类型](#面试题5.3 mysql常用数据类型、oracle常用数据类型)

[面试题5.4 char、varchar2、varchar有什么区别?](#面试题5.4 char、varchar2、varchar有什么区别?)

[面试题5.5 什么是BLOB、CLOB?MySQL的Text类型了解过吗](#面试题5.5 什么是BLOB、CLOB?MySQL的Text类型了解过吗)

[面试题5.6 null的含义](#面试题5.6 null的含义)

[面试题5.7 数据库三范式是什么?](#面试题5.7 数据库三范式是什么?)

[面试题5.8 主键和外键的区别?](#面试题5.8 主键和外键的区别?)

[面试题5.9 如何设置主键自动增长?](#面试题5.9 如何设置主键自动增长?)

[面试题5.10 Oracle中序列的作用](#面试题5.10 Oracle中序列的作用)

[面试题5.11 update语句可以修改结果集中的数据吗?](#面试题5.11 update语句可以修改结果集中的数据吗?)

[面试题5.12 drop、truncate、 delete区别](#面试题5.12 drop、truncate、 delete区别)

[面试题5.13 MySQL、Oracle写出字符存储、字符串转时间](#面试题5.13 MySQL、Oracle写出字符存储、字符串转时间)

[面试题5.14 说说常用的函数,分别介绍](#面试题5.14 说说常用的函数,分别介绍)


面试题5.1 Oracle和Mysql的区别?

【技术难度: 出现频率: 】

第一层:

  1. Oracle用表空间 来管理表,Mysql用来管理表。

  2. mysql用limt做分页、支持主键自增长(`auto_increment`),oracle用rownum做分页、通过序列(sequence)达到自增效果。

    sql 复制代码
    create sequence ms start with 1 increment by 1; 
    -- 在插入数据时,可以直接在INSERT语句中使用序列的NEXTVAL来获取下一个值,并将其作为自增字段的值插入到表中。
    -- 例如:
    INSERT INTO table_name (id, name) VALUES (my_sequence.NEXTVAL, 'John Doe');
  3. 库函数不同、SQL语法、功能语句不同。

  4. Oracle的事务隔离级别默认是读已提交,MySQL是可重复读。

  5. Oracle的事务默认是不开启自动提交,MySQL默认是开启自动提交的。

  6. Oracle中没有if exists,if not exists的语法,MySQL有。

第二层:

第3点展开说是这样:

库函数不同,比如:滤空函数在Oracle中是NVL(列名,覆盖值),而MySQL中是IFNULL(列名,覆盖值)

SQL语法不同,比如:Oracle中没有if exists,if not exists的语法,MySQL有。

功能语句不同,比如:显示当前所有的表、用户、改变连接用户、显示当前连接用户、执行外部脚本等语句不同。

面试题5.2 SQL语句有多少类型

【技术难度: 出现频率: 】

第一层:

SQL语句分五类:DDL数据定义语言、DML数据操控语言、DQL数据查询语言、DCL数据库控制语言、TCL事务控制语言。

第二层:

它们分别包括以下内容:

  1. DDL(Data Definition Language)数据定义语言,用于操作表结构等,包括create创建、drop删除 、alter修改、truncate截断
  2. DML(Data Manipulation Language)数据操控语言,用于操作表中数据,包括insert插入、delete删除、update更新;
  3. DQL(Data Query Language)数据查询语言,用于查询,包括select查询;
  4. DCL(Data Control Language)数据库控制语言,用于设定用户权限,包括grant授权、revoke撤销;
  5. TCL(Transaction Control Language)事务控制语言,用于控制事务,包括commit提交、rollback回滚。

第三层:

再详细说每个语的句功能的话是这样:

DDL(Data Definition Language)数据定义语言:

  1. Create语句,可以创建数据库和数据库的一些对象;
  2. Drop语句,可以删除数据表、索引、触发程序、条件约束以及数据表的权限等;
  3. Alter语句,修改数据表定义及属性;
  4. Truncate语句,删除表中的所有记录,包括所有空间分配的记录被删除。

DML(Data Manipulation Language)数据操控语言:

  1. Insert语句,向数据表张插入一条记录;
  2. Delete语句,删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是它的操作对象仍是记录;
  3. Update语句,用于修改已存在表中的记录的内容。

DQL(Data Query Language)数据操控语言:

  1. Select语句,用于查询已存在表中的记录的内容。

DCL(Data Control Language)数据库控制语言:

  1. Grant语句,允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限;
  2. Revoke语句,可以废除某用户或某组或所有用户访问权限。

TCL(Transaction Control Language)事务控制语言:

  1. commit,提交事务;
  2. rollback,回滚事务。

面试题5.3 mysql常用数据类型、oracle常用数据类型

【技术难度: 出现频率: 】

第一层:

mysql常用数据类型

整数: tinyint极小整数,smallint小整数,mediumint中等整数,int整数,bigint大整数

浮点数: float单精浮点,double双精浮点,decimal定点数

字符: char定长字符串,varchar可变长字符串,set集合

时间: year年份,date年月日,time时分秒, datetime年月日时分秒,timestamp时间戳

Oracle常用数据类型

数字类型有:number数字

字符串类型有:char定长字符串、varchar2可变长字符串

日期类型有:date日期和时间、timestamp时间戳

第二层:

  1. MySQL中的decimal定点数类型常用于存储金额数据(对应Java的BigDecimal类);
  2. MySQL和Oracle的timestamp类型都默认精确到小数小数点后6位;
  3. 从MySQL5.6.4开始,MySQL的datetime类型也支持小数了,这比timestamp要好得多,因为MySQL的timestamp需要转换成UTC格式存储,使用、查询时再转换回来,而且只能存储UTC格式的2038年以前的数据。

面试题5.4 char、varchar2、varchar有什么区别?

【技术难度: 出现频率: 】

第一层:

1.char定长,varchar可变长,确定大小的使用char效率更高,不确定大小的字段使用varchar;

2.varchar是标准sql里面的,varchar2是oracle独有的,oracle中建议使用varchar2;

3.varchar对空字符串不处理,varchar2将空字符串当做null来处理。

第二层:

varchar类型需要额外的1到2字节存储内容的长度信息,因此在内容充实的情况下比char效率低。


面试题5.5 什么是BLOB、CLOB?MySQL的Text类型了解过吗

【技术难度: 出现频率: 】

第一层:

Oracle中的 BLOB(Binary Large Object二进制大对象)可以存4GB以内的二进制数据、CLOB(Character Large Object字符大对象)存4GB以内的字符数据。

MySQL 对应 Oracle 数据库 BLOB 的类型有几个,比如LONGBLOB、BLOB等,都用于存储二进制数据,而对应 Oracle 数据库 CLOB 也有几个类型,以TEXT后缀结尾,用于存储大量字符数据,MySQL的类型划分更加精细,划分了不同存储大小。

第二层:

对于需要高频度读取并展现的二进制数据或大量字符数据,可以放入数据库;否则不放入数据库,而是放入磁盘,数据库里只存放其文件路径,需要展现时依据路径读取并展现即可。但有个例外,对于内容可能很大,会对数据库造成重大性能瓶颈的字段,坚决放入磁盘,不要提供高频度读取展现的支持,避免因小失大。


面试题5.6 null的含义

【技术难度: 出现频率: 】

第一层:

在我们不知道具体有什么数据的时候,可以用NULL,我们称它为空。NULL等价于没有任何值、是未知数。

第二层:

Oracle、MySQL 允许任何一种数据类型的字段为空,除了以下两种情况:

  1. 主键字段(primary key);
  2. 定义时已经加了NOT NULL非空约束的字段。

第三层:

使用null时需要注意的细节是这样:

  1. null与0、空字符串、空格都不同、也不能比较大小,应使用关键字用"is null"和"is not null"进行判断,mysql还有个ISNULL()函数(速度比关键字低一点);
  2. 空值不能被索引,所以查询时有些符合条件的数据可能查不出来,比如count(*)中,oracle可以用nvl(列名,0)、mysql可以用ifnull(列名,0)滤空处理后再查;
  3. 对空值做加、减、乘、除等运算操作,结果仍为空,也可以像上一条将null过滤后再计算;
  4. 需要建立索引的列,最好设为not null或通过default设置一个默认值;
  5. ASC顺序排序时,Oracle中null在其他数据后面,MySQL中null在其他数据前,DESC逆序则反过来,这只是一种约定或者说设定。

面试题5.7 数据库三范式是什么?

【技术难度: 出现频率: 】

第一层:

1NF第一范式:确保每列的原子性,即表中每个列都不能再被拆分成若干列;

2NF第二范式:主键要保证每条数据的唯一性,并且表中的每列都和主键列直接相关;

3NF第三范式:确保表中不包含其它表的非主键列。

第二层:

三范式减少了数据冗余(避免在多张表中存储相同的非主键列以节省空间),提高了数据完整性(更精确、可靠)。

三范式不要求必须遵循,数据量体量特别大的地方不要求满足第三范式,以提高查询的效率。

第三层:

范式化的优点是数据库更新起来更快、可以只修改更少的数据等,缺点是查询容易产生较多关联查询,且不能建立复合索引,所以查询性能会大大降低。

所以在设计数据库时,不一定强制要求使用标准范式化设计,可以进行一定的调整。一般的设计是混用范式化和反范式化,适度进行数据冗余,以提高查询性能。


面试题5.8 主键和外键的区别?

【技术难度: 出现频率: 】

  1. 主键在本表中是唯一的、不可为空的,外键可以重复可以为空;

  2. 外键和另一张表的主键关联,不能创建对应表中不存在的外键。


面试题5.9 如何设置主键自动增长?

【技术难度: 出现频率: 】

  1. MySQL可以设置主键自增长(auto_increment),要求主键必须是数值类型,且一张表只能有一个自增主键列;
  2. Oracle需要通过序列实现自增效果,方案一是在插入语句中调用序列,方案二是创建一个insert 插入语句触发器,在执行插入语句时获取序列的值将其赋值给主键列;
sql 复制代码
create sequence ms start with 1 increment by 1; 
-- 在插入数据时,可以直接在INSERT语句中使用序列的NEXTVAL来获取下一个值,并将其作为自增字段的值插入到表中。
-- 例如:
INSERT INTO table_name (id, name) VALUES (my_sequence.NEXTVAL, 'John Doe');

面试题5.10 Oracle中序列的作用

【技术难度: 出现频率: 】

第一层:

Oracle使用序列来生成唯一编号,用来处理一个表中自增字段,访问一个序列的nextval下个值,该序列将按照设定的递增量递增并返回新值。

第二层:

第一次调用序列的nextval获取的是初始值。

调用序列的currval可以获取当前值(current当前),它不会引发递增,不过需要在第一次调用 nextval 初始化之后才能使用 currval,否则出错。

第三层:

  1. Oracle处理好了序列的线程安全问题;
  2. 大量语句申请序列时,为了提高性能,可以将序列提前生成 n 个序列值先存入内存,这样可直接到运行最快的内存中得到序列值。cache缓存个数可以自定义,最好不要设置过大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入n个,这种情况会导致序列号不连续。另外,事务回滚也会导致序列号不连续。

面试题5.11 update语句可以修改结果集中的数据吗?

【技术难度: 出现频率: 】

在Oracle中是可以的,在MySQL中不可以。

如下语句:
update (select * from table1 t1 left join table2 t2 on t1.字段 = t2.字段 ) set 字段名 = 值 where 条件字段 = 条件值


面试题5.12 drop、truncate、 delete区别

【技术难度: 出现频率: 】

  1. delete 删除内容不删表定义, 不释放空间 (在事务操作时,保留记录方便事务回滚);
  2. truncate 删除内容不删表定义,释放空间;
  3. drop 删除内容和定义,释放空间。

面试题5.13 MySQL、Oracle写出字符存储、字符串转时间

【技术难度: 出现频率: 】

MySQL使用str_to_date函数,Oracle使用to_date函数。

扩展(无需背诵):

Oracle:to_date('字符串时间','yyyy-MM-dd HH24:mi:ss')

MySQL:str_to_date('字符串时间','%Y-%c-%d %H:%i:%s');


面试题5.14 说说常用的函数,分别介绍

【技术难度: 出现频率: 】

Oracle中有这些函数:

  1. COUNT() 求指定列的记录个数,忽略null(当count(*)时不忽略null)
  2. AVG() 求指定列的平均值,忽略null
  3. SUM() 求指定列的总和,忽略null
  4. MAX() 求指定列的最大值,忽略null
  5. MIN() 求指定列的最小值,忽略null
  6. ROUND(目标值,保留小数位数) 四舍五入式取整或保留指定位数的小数
  7. MOD(除数,被除数) 求余,求除数除以被除数余下的数
  8. TRUNC(目标值,保留小数位数) 截断式取整或保留指定位数的小数
  9. SYSDATE() 返回当前系统时间(DATE类型)
  10. TO_DATE(字符串类型值,指定格式) 将字符串转换为日期

MySQL与上面Oracle前7个函数一致,另外3个有些许不同或扩展:

  1. TRUNCATE(目标值,保留小数位数) 截断式取整或保留指定位数的小数
  2. SYSDATE() 返回当前系统时间,另外还提供了NOW()获取语句开始执行时的时间
  3. STR_TO_DATE(字符串类型值,指定格式) 将字符串转换为日期,指定格式与Oracle不同

还有很多...


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

相关推荐
神仙别闹几秒前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE1 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码7 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶7 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺12 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
zwjapple18 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five19 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序19 分钟前
vue3 封装request请求
java·前端·typescript·vue
前端每日三省21 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
凡人的AI工具箱34 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang