1.delete与Truncate区别?

1)Truncate 是DDL 语句,DELETE 是DML语句。
2)Truncate 的速度远快于DELETE;
原因是:当执行DELETE操作时所有表数据先被COPY到回滚表空间,数据量不同花费时间长短不一。而TRUNCATE 是直接删除数据不进回滚表空间。
3)delete 数据可以运行Rollback 进行数据回滚。而Truncate 则是永久删除不能回滚。
4) Truncate 操作不会触发表上的delete触发器,而delete 会正常触发。
5) Truncate 语句不能带where 条件意味着只能全部数据删除,而DELETE可带where 条件进行删除数据。
6)Truncate 操作会重置表的高水位线(High Water Mark),而delete 不会。
7)DELETE可以操作视图,TRUNCATE不能操作视图

2.集合操作符

Union操作符返回两个查询的结果集的并集,不包含重复值
Union ALL操作符返回两个查询的结果集的并集,包括所有重复⾏。
Minus是从第⼀个查询结果减去第二个查询结果,如果有相交部分就减去相交部分, 不包含重复值。
INTERSECT操作符只返回两个查询的公共行。是交集,不包含重复值。

3.数据库的三大范式是什么?

1)第一范式:原子性,要求每一列的值不能再拆分了。
2)第二范式:一张表只描述一个实体(若列中有冗余数据,则不满足)
3)第三范式:所有列与主键值直接相关。

4.什么是事务?事务的特性(ACID)是指什么?

在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。
原子性(Atomicity)
事务必须是原子工作单元,对其进行的数据修改,要么全都执行,要么全都不执行。
以网上银行转账为例,要在A账户上增加1000元,同时要在B账户上减少1000元。要么同时执行,要么都不执行更改,以确保整个事务是一个原子工作单元。
一致性(Consistency)
事务在完成时,必须使所有的数据都保持一致状态,即所有的数据都要发生更改,以保证数据的完整性。在银行转账时,A账户和B账户的数据都要发生更改,以保证数据的完整性。
隔离性(Isolation)
两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时、运行中间某一时刻的数据。比如银行转账操作时,如果有其他的会话也在进行转账,那么当前事务内不能看到其他事务在运行时或运行中间某一时刻的数据。
持久性(Durability)
一旦事务被提交之后,数据库的变化就会被永远保留下来,即使运行数据库软件的机器后来崩溃也是如此。银行转账一旦操作完成,数据就会被永久地保留下来了,即使数据库系统关闭也不会丢失数据。

5.Mysql数据库与Oracle 数据库有什么区别?

1,应用方面,Mysql是中小型应用的数据库。一般用于个人和中小型企业。Oracle 属于大型数据库,一般用于具有相当规模的企业应用。
2,自动增长的数据类型方面:MySQL有自动增长的数据类型。Oracle没有自动增长的数据类型。需要用触发器建立一个自增序列。
3,group by 用法:Mysql中group by 在SELECT语句中可以随意使用,但在ORACLE中如果查询语句中有组函数,那么其他列必须是组函数处理过的或者是group by子句中的列,否则会报错。
4,引导方面:MySQL中可以用单引号、双引号包起字符串,Oracle中只可以用单引号包起字符串。

6.Oracle跟SQL Server 2005的区别?

宏观上:
1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windows平台的稳定性和安全性影响了sql server的稳定性和安全性。
2). oracle使用的脚本语言为PL-SQL,而sql server使用的脚本为T-SQL
3).在SQL Server中,每一个DML语句都具有一个隐式的事务,语句执行结束时事务被自动提交到服务器端,而在Oracle中,当第一条SQL语句开始执行时,一个新的事务自动开始,除非显式地使用COMMIT进行提交,或者是使用ROLLBACK进行回滚,或者是退出某个Oracle工具时,这些事务才结束,否则SQL语句的操作仅在会话级别进行,并没有保存到数据库中。
(4)sql server 是中小型企业用的,oracle是中大型企业用的;oracle跨平台能在linux上运行,sqlserver只能在windows运行,而linux平台比windows平台稳定,所以安全性高;sqlserver操作简便,oracle比较复杂;oracle能把数据存在不同的硬盘上sqlserver不能;oracle能够回滚表空间查询sqlserver不能;oracle支持label security,sqlserver不能;oracle扩展性比较强。

7.Oracle中的游标

游标是用来操作数据库中的一组查询结果集。
游标作用:
游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下(返回多行记录时),需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。(大体意思就是:游标(cursor)能够根据查询条件从数据表中提取一组记录,将其作为一个临时表置于数据缓冲区中,利用指针逐行对记录数据进行操作。)
为什么避免使用游标?
游标使用时会对行加锁,可能会影响其他业务的正常进行。而且,数据量大时其效率也较低效。另外,内存也是其中一个限制。因为游标其实是相当于把磁盘数据整体放入了内存中,如果游标数据量大则会造成内存不足。

8.Oracle中function和procedure的区别?

可以理解函数是存储过程的一种
存储过程:
(1)一般用于在数据库中完成特定的业务或任务
(2)可以定义返回类型,也可以不定义返回类型
(3)可返回多个参数
函数:
(1)一般用于特定的数据查询或数据转转换处理
(2)申请时必须要定义返回类型,且程序体中必须定义 return 语句
(3)最多返回一个值
(4)不能独立执行,必须作为表达式的一部分调用
注意:sql数据操纵语句中只能调用函数而不能调用存储过程

9.Oracle的导入导出有几种方式,有何区别?

1). 使用oracle工具 exp/imp
2). 使用plsql相关工具
方法:1.导入/导出的是二进制的数据
2.plsql导入/导出的是sql语句的文本文件

10.解释data block , extent 和 segment的区别?

data block 数据块,是oracle最小的逻辑单位,通常oracle从磁盘读写的就是块
extent 区,是由若干个相邻的block组成
segment段,是有一组区组成
tablespace表空间,数据库中数据逻辑存储的地方,一个tablespace可以包含多个数据文件

11.解释什么是锁、死锁,如何解决Oracle中的死锁?

锁是数据库用来控制共享资源并发访问的机制。
锁用于保护正在被修改的数据。
直到提交或回滚了事务之后,其他用户才可以更新数据。
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错,就形成了死锁。
解决办法:
1). 查找出被锁的表
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
2). 杀进程中的会话
alter system kill session "sid,serial#";

12.简述oracle中 dml、ddl、dcl、dtl的使用

DDL(Data Definition Language):数据定义语言,用来定义表、列等;
如:创建数据表...
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(如:添加数据,修改数据,删除数据)
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。 如:查询数据
DTL (Data Transaction Language):数据事务语言,用来操作事务。
如:开启事务,提交事务
DCL (Data Control Language):数据控制语言。用来操作用户和权限
如:创建用户,授权。

13.怎样创建一个一个索引,索引使用的原则,有什么优点和缺点

索引原理:在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值按照升序排列,然后构建索引条目(name和rowid)。
索引分类

  1. B树索引(默认索引,保存经过排序过的索引列和对应的rowid值)
    分类:
       UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)
    适合使用场景:
      列基数(列不重复值的个数)大时适合使用B数索引

  2. 位图索引
    适合场景:
    对于基数小的列适合建立位图索引(例如性别等)
    3.单列索引和复合索引(基于多个列创建)
    注意:
      即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列

  3. 函数索引

  •  索引使用原则:
    1.索引字段建议建立NOT NULL约束
    2.经常与其他表进行连接的表,在连接字段上应该建立索引;
    3.经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;
    4.如果有两个或者以上的索引,其中有一个唯一性索引,而其它是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引
    5.至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)
    6.小表不要建立索引
    7.对于基数大的列适合建立B树索引,对于基数小的列适合建立位图索引
    8.列中有很多空值,但经常查询该列上非空记录时应该建立索引
    9.经常进行连接查询的列应该创建索引
    10.限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)。
    索引的优缺点:

  •  优点:

  1. 创建唯一性索引,保证数据库表中每一行数据的唯一性

  2. 大大加快数据的检索速度,这也是创建索引的最主要的原因

  3. 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

  4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

  •  缺点:

  1. 索引创建在表上,不能创建在视图上

  2. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

  3. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大

  4. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度

14.删除重复记录

DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);

15.存储过程

存储就是在数据库服务器中封装了一段或多段SQL语句,完成某一特定功能的PL/SQL代码块。
它可以被用户随时调用,这种方式极大的节省了用户的时间,也提高了程序的执行效率。另外存储过程还可以在编程语言中调用。
存储过程的优点
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译。
2.建立过程不会很耗系统资源,因为过程只是在调用才执行。
3.可重复使用。
4.可维护性高。
存储过程的缺点:
1.考虑移植性,存储过程的致命伤
2.大量的利用过程,会对服务器压力比较大
存储过程语法:
1.创建语句:create or replace procedure 存储过程名。
2.存储过程名定义:存储过程可以有参数,也可以没有参数。
3.变量声明块:紧跟着的is关键字,用于声明变量。变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。
4.过程语句块:从begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。
5.异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选 。
6.结束块:由end关键字结束。
存储过程的参数传递方式 :
IN 表示输入参数,按值传递方式。
OUT表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。
IN OUT即可作输入参数,也可作输出参数。
存储过程的优化
1利用一些sql语句来代替一些小循环,例如聚合函数
2不要按照算法描述,一直将一条长达100多个字段的记录分90次来更新,而是采用拼凑语句,将更新语句在循环中拼凑后,在统一更新
3中间结果存放临时表,加索引
4少用游标
5事务越短越好
6查找语句尽量不要放在循环内。

16.sql优化

(1)减少访问数据库的次数
(2)在执行SELECT子句时尽量避免使用 *,因为oracle在解析的过程中,会将*依次转换成列名, 这是通过查询数据字典完成的, 这将耗费更长的时间。
(3)可以好好利用DECODE函数,使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
(4)尽量用TRUNCATE语句替代DELETE语句。当执行TRUNCATE命令时, 回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。因此很少资源被调用,整个执行时间就会很短。
(5)在使用oracle时,尽量多使用COMMIT命令。 该命令可以明显释放运行资源,因此程序的性能得到明显提高。
(6)可以通过用索引提高效率。oracle使用了树形的数据结构。通过合理的索引,数据查询时明显快于全表扫描,因此可以显著提高检索数据的效率。
(7)SQL语句尽量用大写的
因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。
(8)WHERE子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
(9)根据需要用UNION ALL替换UNION,UNION ALL的执行效率更高
(10)用EXISTS替换DISTINCT:
当SQL包含一对多表查询时,避免在SELECT子句中使用DISTINCT,一般用EXISTS替换,EXISTS查询更为迅速
(11)避免使用HAVING子句,HAVING只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序,总计等操作。用Where子句替换HAVING子句
(12)用EXISTS替代IN、用NOT EXISTS替代 NOT IN:在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的(要对子查询中的表执行了一个全表遍历)。所以尽量将NOT IN改写成外连接(Outer Joins)或NOT EXISTS。
(13)避免在索引列上使用NOT: 
NOT会产生在和在索引列上使用函数相同的影响。当ORACLE遇到NOT,就避免在索引列上使用计算
(14)WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。会停止使用索引转而执行全表扫描。
(15)用UNION替换OR(适用于索引列):
用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。
(16)总是使用索引的第一个列:
如果索引是建立在多个列上,只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引。 当引用索引的第二个列时,优化器使用了全表扫描而忽略了索引。
(17)避免改变索引列的类型:
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换
(18)使用表的别名:当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来,就可以减少解析的时间并减少那些由列歧义引起的语法错误。
(19)避免在索引列上使用 IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 。
(20)尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
(21)在FROM 子句中包含多个表的情况下,选择记录条数最少的表作为
基础表。

17.左右连接、内连接、全连接的区别

left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。
full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。

18.什么是分区?

就是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
什么时候使用分区表?
1、表的大小超过2GB。
2、表中包含历史数据,新的数据被增加到新的分区中。
表分区有以下优点:
1.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2.增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3.维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4.均衡I/O:可 以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点:已经存在的表没有方法可以直接转化为分区表。
分区表的分类?
分区表:范围分区(range),列表分区(list),散列分区(hash),复合分区,交换分区
范围分区
将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。
--创建:
create table 表名
(列名 数据类型
...)
partition by range (字段)
(
partition 分区名1 values less than (值1或日期1),
partition 分区名2 values less than (值2或日期2),
partition 分区名3 values less than (值3或日期3),...
partition 分区名4 values less than (maxvalue)
);
列表分区
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
--创建:
create table 表名
(列名 数据类型
...)
partition by list (字段)
(
partition 分区名1 values (值),
partition 分区名2 values (值),
partition 分区名3 values (值),...
);
散列分区hash:
在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
--创建:
create table 表名
(列名 数据类型
...)
partition by hash (字段)
(
partition 分区名1,
partition 分区名2,
partition 分区名3,...
);

19.什么是临时表

临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象。
ORACLE临时表是会话或事务级别的,只对当前会话或事务可见。每个会话只能查看和修改自己的数据。
在oracle中,临时表分为会话级别(session)和事务级别(transaction)两种。
会话级的临时表在整个会话期间都存在,直到会话结束;
事务级别的临时表数据在transaction结束后消失,即commit/rollback或结束会话时,会清除临时表数据。
1、事务级临时表on commit delete rows;当COMMIT的时候删除数据(默认情况)。
2、会话级临时表on commit preserve rows;当COMMIT的时候保留数据,当会话结束删除数据。

20.什么是拉链表?

指的是记录数据在某一时间区间内的状态以及数据在某一时点上的变化的数据存储方式。
算法:
1.建立临时表VT_NEW用于存放转换、处理后的数据
2.建立临时表VT_INC用于存放比对出的增量数据
3.修改目标表,进行关链更新操作
4.修改目标表,进行开链插入操作
作用:
(1)节约存储空间(2)记录数据变化
缺点:
断链难以恢复

21.kettle组件有哪些

输入、输出、转换、应用、脚本、连接、数据仓库、统计、检验、作业、映射等。

22.什么是脏数据?

脏数据是指源系统中的数据不在给定的范围内或对于实际业务毫无意义,或是数据格式非法,以及在源系统中存在不规范的编码和含糊的业务逻辑。

23.什么是分析函数、开窗函数?

开窗函数是对行集组进行聚合计算,可以为每组返回多个值。聚合函数加over()就是开窗函数。

24.什么是视图?视图有什么作用?如何更改视图?

视图可以理解为数据库中一张虚拟的表。它是建立在已有表的基础上,创建视图所依据的表称为“基表”。通过一张或者多张基表进行关联查询后组成一个虚拟的逻辑表。
视图的作用?
(1)隐藏数据的逻辑复杂性并简化查询语句
(2) 可以提高数据访问的安全性,通过视图设定允许用户访问的列和数据行
(3)可以将复杂的查询保存为视图
视图上的DML语句有如下限制:
只能修改一个底层的基表
如果修改违反了基表的约束条件,则无法更新视图
如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图。
如果视图包含伪列或表达式,则将无法更新视图。
复杂视图中,可以更新键保留表的列,不可以更新非键保留表的列。

25 CHAR类型和VARCHAR类型有何区别?

char的长度是固定的,最长2000个字符,当输入的字符小于你定义的字符数目时,它会自动补空值,所以它占用空间较大但是效率高;varchar的长度是可变的,用它可以节省存储空间,但是效率没有char高。

26介绍下crontab?

crontab是用来定期执行程序的命令,在固定的间隔时间执行指定的系统指令。

27.什么是触发器?触发器类型?

什么是触发器?
触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用。
触发器类型
1.DML触发器:在对表或视图执行DML语句时执行,其中包含语句级触发器(表级触发器),行级触发器,INSTEAD OF触发器(替换触发器)
2.模式(DDL)触发器:在模式中执行 DDL 语句时执行
3.数据库级触发器:在发生打开、关闭、登录和退出数据库等系统事件时执行。

28.sql语句执行顺序

1、最先执行from 表名
2、where语句是对条件加以限定
3、分组语句【group by…… having】
4、聚合函数
5、select语句
6、order by排序语句。​

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐