目录
[面试题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的区别?
【技术难度: 出现频率: 】
第一层:
-
Oracle用表空间 来管理表,Mysql用库来管理表。
-
mysql用limt做分页、支持主键自增长(`auto_increment`),oracle用rownum做分页、通过序列(sequence)达到自增效果。
sqlcreate sequence ms start with 1 increment by 1; -- 在插入数据时,可以直接在INSERT语句中使用序列的NEXTVAL来获取下一个值,并将其作为自增字段的值插入到表中。 -- 例如: INSERT INTO table_name (id, name) VALUES (my_sequence.NEXTVAL, 'John Doe');
-
库函数不同、SQL语法、功能语句不同。
-
Oracle的事务隔离级别默认是读已提交,MySQL是可重复读。
-
Oracle的事务默认是不开启自动提交,MySQL默认是开启自动提交的。
-
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事务控制语言。
第二层:
它们分别包括以下内容:
- DDL(Data Definition Language)数据定义语言,用于操作表结构等,包括create创建、drop删除 、alter修改、truncate截断;
- DML(Data Manipulation Language)数据操控语言,用于操作表中数据,包括insert插入、delete删除、update更新;
- DQL(Data Query Language)数据查询语言,用于查询,包括select查询;
- DCL(Data Control Language)数据库控制语言,用于设定用户权限,包括grant授权、revoke撤销;
- TCL(Transaction Control Language)事务控制语言,用于控制事务,包括commit提交、rollback回滚。
第三层:
再详细说每个语的句功能的话是这样:
DDL(Data Definition Language)数据定义语言:
- Create语句,可以创建数据库和数据库的一些对象;
- Drop语句,可以删除数据表、索引、触发程序、条件约束以及数据表的权限等;
- Alter语句,修改数据表定义及属性;
- Truncate语句,删除表中的所有记录,包括所有空间分配的记录被删除。
DML(Data Manipulation Language)数据操控语言:
- Insert语句,向数据表张插入一条记录;
- Delete语句,删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是它的操作对象仍是记录;
- Update语句,用于修改已存在表中的记录的内容。
DQL(Data Query Language)数据操控语言:
- Select语句,用于查询已存在表中的记录的内容。
DCL(Data Control Language)数据库控制语言:
- Grant语句,允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限;
- Revoke语句,可以废除某用户或某组或所有用户访问权限。
TCL(Transaction Control Language)事务控制语言:
- commit,提交事务;
- 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时间戳
第二层:
- MySQL中的decimal定点数类型常用于存储金额数据(对应Java的BigDecimal类);
- MySQL和Oracle的timestamp类型都默认精确到小数小数点后6位;
- 从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 允许任何一种数据类型的字段为空,除了以下两种情况:
- 主键字段(primary key);
- 定义时已经加了NOT NULL非空约束的字段。
第三层:
使用null时需要注意的细节是这样:
- null与0、空字符串、空格都不同、也不能比较大小,应使用关键字用"is null"和"is not null"进行判断,mysql还有个ISNULL()函数(速度比关键字低一点);
- 空值不能被索引,所以查询时有些符合条件的数据可能查不出来,比如count(*)中,oracle可以用nvl(列名,0)、mysql可以用ifnull(列名,0)滤空处理后再查;
- 对空值做加、减、乘、除等运算操作,结果仍为空,也可以像上一条将null过滤后再计算;
- 需要建立索引的列,最好设为not null或通过default设置一个默认值;
- ASC顺序排序时,Oracle中null在其他数据后面,MySQL中null在其他数据前,DESC逆序则反过来,这只是一种约定或者说设定。
面试题5.7 数据库三范式是什么?
【技术难度: 出现频率: 】
第一层:
1NF第一范式:确保每列的原子性,即表中每个列都不能再被拆分成若干列;
2NF第二范式:主键要保证每条数据的唯一性,并且表中的每列都和主键列直接相关;
3NF第三范式:确保表中不包含其它表的非主键列。
第二层:
三范式减少了数据冗余(避免在多张表中存储相同的非主键列以节省空间),提高了数据完整性(更精确、可靠)。
三范式不要求必须遵循,数据量体量特别大的地方不要求满足第三范式,以提高查询的效率。
第三层:
范式化的优点是数据库更新起来更快、可以只修改更少的数据等,缺点是查询容易产生较多关联查询,且不能建立复合索引,所以查询性能会大大降低。
所以在设计数据库时,不一定强制要求使用标准范式化设计,可以进行一定的调整。一般的设计是混用范式化和反范式化,适度进行数据冗余,以提高查询性能。
面试题5.8 主键和外键的区别?
【技术难度: 出现频率: 】
-
主键在本表中是唯一的、不可为空的,外键可以重复可以为空;
-
外键和另一张表的主键关联,不能创建对应表中不存在的外键。
面试题5.9 如何设置主键自动增长?
【技术难度: 出现频率: 】
- MySQL可以设置主键自增长(auto_increment),要求主键必须是数值类型,且一张表只能有一个自增主键列;
- 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,否则出错。
第三层:
- Oracle处理好了序列的线程安全问题;
- 大量语句申请序列时,为了提高性能,可以将序列提前生成 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区别
【技术难度: 出现频率: 】
- delete 删除内容不删表定义, 不释放空间 (在事务操作时,保留记录方便事务回滚);
- truncate 删除内容不删表定义,释放空间;
- 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中有这些函数:
- COUNT() 求指定列的记录个数,忽略null(当count(*)时不忽略null)
- AVG() 求指定列的平均值,忽略null
- SUM() 求指定列的总和,忽略null
- MAX() 求指定列的最大值,忽略null
- MIN() 求指定列的最小值,忽略null
- ROUND(目标值,保留小数位数) 四舍五入式取整或保留指定位数的小数
- MOD(除数,被除数) 求余,求除数除以被除数余下的数
- TRUNC(目标值,保留小数位数) 截断式取整或保留指定位数的小数
- SYSDATE() 返回当前系统时间(DATE类型)
- TO_DATE(字符串类型值,指定格式) 将字符串转换为日期
MySQL与上面Oracle前7个函数一致,另外3个有些许不同或扩展:
- TRUNCATE(目标值,保留小数位数) 截断式取整或保留指定位数的小数
- SYSDATE() 返回当前系统时间,另外还提供了NOW()获取语句开始执行时的时间
- STR_TO_DATE(字符串类型值,指定格式) 将字符串转换为日期,指定格式与Oracle不同
还有很多...
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。