全栈面试题】模块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-------------------------

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

相关推荐
计算机徐师兄1 分钟前
Java基于SSM框架的无中介租房系统小程序【附源码、文档】
java·微信小程序·小程序·无中介租房系统小程序·java无中介租房系统小程序·无中介租房微信小程序
源码哥_博纳软云2 分钟前
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
沐泽Mu6 分钟前
嵌入式学习-QT-Day05
开发语言·c++·qt·学习
小板凳-BGM17 分钟前
C# 第二阶段 modbus
开发语言·ui·c#
问道飞鱼19 分钟前
【Python知识】Python进阶-什么是装饰器?
开发语言·python·装饰器
长安——归故李21 分钟前
【C语言】成绩等级制
c语言·开发语言
黄金小码农25 分钟前
c# 2024/12/25 周三
开发语言·c#
忒可君1 小时前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
GuYue.bing1 小时前
网络下载ts流媒体
开发语言·python
斌斌_____1 小时前
Spring Boot 配置文件的加载顺序
java·spring boot·后端