HTML和数据库
目录
一、HTML网页部分 3
1、 CSS样式表有哪几种? 3
2、 选择器分类 3
3、 默写出 input 标签的所有 type 3
4、 请描述超级链接的三种形式,并写出各种形式的语法? 3
5、 内联框架的语法 3
6、 输入文本框的细边框样式 4
7、 例举DIV元素的样式属性及控制 4
8、 块级元素,行级元素 4
9、 XHTML 1.0的基本规范 4
二、 数据库部分 5
1、 设计数据库的三大范式是什么? 5
2、 说出一些数据库优化方面的经验? 5
3、 你有优化SQL查询数据经验吗?如有能说一下你一般用那些什么方式进行优化? 6
4、 什么是事务,事务的四个特性是什么?有哪些隔离级别? 6
5、 怎样建索引及索引的分类,索引有什么好处,要注意一些什么问题,如会不会影响其他表? 6
6、 数据库中,数据类型char与varchar2有什么区别?性能方面各有什么优势? 7
7、 你怎么知道查询SQL的性能高还是低? 7
8、 在开发过程中遇到过数据库锁吗?怎样解锁? 7
9、 怎样处理并发数据? 8
10、 delete from table 与 truncate table的区别?drop table呢 8
11、 union和union all有什么不同? 8
12、 一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 9
13、 用JDBC如何调用存储过程 9
14、 JDBC访问数据库的步骤? 10
15、 写一个用jdbc连接并访问oracle数据的程序代码 10
16、 Class.forName的作用?为什么要用? 10
17、 大数据量下的分页解决方法。 11
18、 这段代码有什么不足之处? 11
19、 简述建立索引的作用和索引的分类 ? 12
20、 什么是存储过程,有什么优缺点 12
21、 存储过程与SQL的区别? 13
22、 什么是视图?它的作用? 13
23、 视图给用户和开发人员带来的好处 13
24、 如何创建视图? 13
25、 如何删除视图? 13
26、 Oracle数据库的主要特点如下: 13
27、 Oracle 基本概念 13
28、 数据库、数据库实例的含义及区别? 14
29、 Oracle使用PL/SQL Developer导出数据的三种方式及区别? 14
30、 游标(CURSOR)的概念 14
31、 表分区的特点及实现方式 15
32、 SYS和SYSTEM中,哪个用户权限更大? 15
33、 Oracle中用什么函数按字符串截取字段? 15
34、 Oracle有哪些常用的函数? 15
35、 Oracle数据库如何提高访问性能? 16
36、 能写出oracle中你常用到的sqlplus命令吗? 20
37、 Oracle存储过程的基本语法是什么? 20
一、HTML网页部分
CSS样式表有哪几种?
内联样式表:内联样式表是混合在HTML标签里使用的。
内部样式表:内部样式表是放置在<head>标签内的,并且以<style type=”text/css”></style>来定义的。
外部样式表:外部样式表是一个独立的文件,文件里定义了各种各样的样式规定,方便被多个HTML文件使用。导入外部样式表有两种方法:
1)在页面中使用<link rel=”stylesheet” href=”style.css” type=”text/css”>标签来链接到外部样式文件。
2)在页面中使用@import方法导入外部样式文件。
选择器分类
1.标签选择器
语法:标签名{属性名1:值1;属性名2:值2;}
2.类选择器
.类名{属性名1:值1;属性名2:值2;}
使用:<标记class=”类名”>
3.id选择器
#Id标识名{属性名1:值1;属性名2:值2;}
使用:<标记id=”Id标识名”>
默写出 input 标签的所有 type
类型有:text文本框,password密码框,radio单选按钮,checkbox复选框,button普通按钮,Submit提交按钮,reset重置按钮,image图片按钮,file文件域,hidden隐藏域
请描述超级链接的三种形式,并写出各种形式的语法?
A、页面级之间跳转: <a href=”url” target=”目标窗口”>文件或图片</a>
B、锚链接:a.<a name=”锚点名”>文件或图片</a> b.<a href=”#名”>文件或图片</a>
C、功能性链接:<a href=”mailto:电子邮件地址”>联系我们</a>
内联框架的语法
<iframe src =”引用页面地址” name=”框架名称” frameborder=”边框”
Scrolling=”是否出现滚动条”></iframe>
输入文本框的细边框样式
.class{
border-width:1px;
border-style:solid;
}
例举DIV元素的样式属性及控制
div{
padding:0px;margin:0px;
width:;height:;font:12px/20px 宋体;text-align:对齐方式;
line-height:20px;
background:url(图片路径) no-repeat;
float:left;
}
块级元素,行级元素
块级元素:1、标题标签h1~h6 2、段落标签 p
3、水平线标签 hr 4、有序列表ol li
5、 无序列表 ul li 6、定义列表 dl dt dd
7、表格 table tr td 8、表单 form
9、分区标签 div
行级元素:1.图像标签 img 2.范围标签 span
3.换行标签 br 4.超链接标签 a
5.输入标签 input 6.多行文本域 textarea
7.下拉列表 select 8.标签 label
XHTML 1.0的基本规范
- 标签名和属性名称必须小写
- HTML标签必须关闭
- 属性值必须用引号括起来
- 标签必须正确嵌套
- 必须添加文档类型声明
数据库部分
设计数据库的三大范式是什么?
- 第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)
- 数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。
- 第二范式(2NF):
. 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
- 要求数据库表中的每个实例或行必须可以被唯一地区分。通常需要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键。
- 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
- 第三范式的要求如下:
- 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
- 所以第三范式具有如下特征: 1,每一列只有一个值 2,每一行都能区分。 3,每一个表都不包含其他表已经包含的非主关键字信息。
- 例如,在一个帖子表中只能出现发帖人的id! 不能有了发帖人的i d字段,还同时有发帖人的姓名字段,否则,这就是数据冗余。
说出一些数据库优化方面的经验?
- 从JDBC编程的角度讲,用PreparedStatement 一般来说比Statement性能高,因为在使用时,SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用PreparedStatement对象多次高效地执行该语句。
- 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就可以去掉外键。(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)
- 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等,将姓名和密码单独从用户表中独立出来等,这些都是分析了业务的特点后,对数据库中表做了优化后的解决方案。也就是说在有些情况下,我们设计数据库可以适度的违反三个范式的设计原则,来获得更好的程序性能。
- sql语句全部大写,特别是列名和表名都大写。因为数据库中的语句执行机制是这样的:sql语句发给oracle服务器语法检查和编译成为内部指令缓存和执行指令。而数据库在对语句进行检查和编译时,会自动将sql语句转换成大写,并且根据SQL缓存的特点,不要拼凑条件,而是用?(占位符参数)和PreparedStatment来执行参数化的sql语句。
- 还有索引对查询性能的改进。当经常查询索引列中的数据时,需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的不足之处。但是,如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量
你有优化SQL查询数据经验吗?如有能说一下你一般用那些什么方式进行优化?
1) 用索引提高效率
2) 选择最有效率的表名顺序(ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理)
3) WHERE子句中的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
4) SELECT子句中避免使用 ‘ * ‘:需要写全查询的字段列名。
什么是事务,事务的四个特性是什么?有哪些隔离级别?
- 事务(Transaction):是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);
- 事务具有4个属性,通常称为ACID特性:
- 原子性(atomicity):事务是一个完整的操作。事务的各步操作是不可分的;要么都执行、要么都不执行。
- 一致性(consistency):当事务完成时,数据必须处于一致状态。
- 隔离性(isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
- 持久性(durability):事务完成后,它对数据库的修改被永久保存,事务日志能保持事务的永久性。
- 隔离级别分为:Read Uncommitted(读未提交)、Read Committed(读提交)、Repeatable Read(可以重复读)、Serializable(序列化)这4种级别
怎样建索引及索引的分类,索引有什么好处,要注意一些什么问题,如会不会影响其他表?
1) 建索引语法:create index dept_unique_idx on dept(dept_no) tablespace idx_1;
2) 索引的分类:
逻辑分类:单列索引、多列(复合)索引、唯一索引、非唯一索引、函数索引
物理分类:B-tree:B树索引、反向键索引、位图索引
3)创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
一般来说,应该在这些列上创建索引,例如:在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
数据库中,数据类型char与varchar2有什么区别?性能方面各有什么优势?
char表示的是固定长度,所占存储空间为你定义时的大小,数据量较大的时候以char字段为查询条件时查询得快一些。
Varchar2表示的是实际长度的数据类型,所占存储空间为实际大小,前提是不超过你定义时的长度,如果存储的字段不是定长的,用varchar2好一些。
你怎么知道查询SQL的性能高还是低?
1)简单的通过查看执行SQL的运行时间。
2)可以通过查看数据库提供的语句执行计划来分析相应的数据信息,例如查看执行计划中对应的COST(即成本耗费)值,反应了运行这段SQL的总体估计成本,通常COST低的执行计划要好一些
在开发过程中遇到过数据库锁吗?怎样解锁?
1)如果oracle中有事务未提交,又打开一个窗口去提交一个新的事务则可能会产生数据库锁。
2)解锁的方式:
a) 结束当前的session(会话,此处指和数据库的通讯)自动解锁
例如,退出当前数据库连接所用的工具或应用程序.
- 利用dba权限强行关闭掉了执行Lock操作的Session.
示例:通过以上查询知道了sid和 SERIAL#(流水号)就可以开杀(就是去关掉会话,俗称杀掉会话)了
--查询出对应会话操作的sid和serial
SELECT sid, serial#, username, osuser FROM v$session;
--根据指定的sid和serial来关闭对应的会话(杀会话的意思)
ALTER SYSTEM KILL SESSION \'sid,serial\';
怎样处理并发数据?
就数据库操作来说是通过加锁的概念来确保并发数据操作下事务的完整性和数据库的一致性
数据库主要有共享锁和排它锁.当你在修改数据的时候,别人也可以查看,但是他不能修改数据并提交,只能优先你的操作,等你向数据库提交了数据之后他才能执行增删改的操作,这就是排它锁.共享锁就是你和另外一个用户可以同时共享数据(查看),但是你和他都不能修改.
delete from table 与 truncate table的区别?drop table呢
- Truncate是数据定义语言(DDL)做的修改是不能回滚的,就是不可恢复的操作。用了这个命令后就收回了表空间。Delete是数据操作语言(DML)删除是要把数据写入系统回滚段(rollback segement)中以便恢复时使用。
- 两者都是删除表中的数据而不会影响到表的结构和定义.
- 使用drop 的话就会删除表的结构
union和union all有什么不同?
UNION在进行表连接后会筛选掉重复的记录,所以在表连接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。 而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,
一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?
alter table drop column score;
alter table add colunm score int;
可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,
这样的操作时无法回滚的,在我的印象中,只有inert update delete等DML语句才能回滚,
对于create table,drop table ,alter table等DDL语句是不能回滚。
解决方案一,update user set score=0;
解决方案二,假设上面的代码要执行好长时间,超出我们的容忍范围,那我就alter table user drop column score;alter table user add column score int。
下面代码实现每年的那个凌晨时刻进行清零,或者使用spring框架集成quartz来实现定时调度。
Runnable runnable =
new Runnable(){
public void run(){
clearDb();
schedule(this,new Date(new Date().getYear()+1,0,0));
}
};
schedule(runnable,
new Date(new Date().getYear()+1,0,1));
用JDBC如何调用存储过程
代码如下:
package com.huawei.interview.lym;
public class JdbcTest {
public static void main(String[] args) {
Connection con = null;
CallableStatement cstmt = null;
try {
con = ds.getConnection();
//调用的存储过程名字是insert_Student
cstmt = cn.prepareCall("{call insert_Student(?,?,?)}");
cstmt.registerOutParameter(3,Types.INTEGER);//输出参数
cstmt.setString(1, "wangwu");
cstmt.setInt(2, 25);
cstmt.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭资源
}
}
JDBC访问数据库的步骤?
- 加载JDBC驱动
- 与数据库建立连接
- 发送SQL语句,并得到返回结果
- 处理返回结果
- 关闭资源
写一个用jdbc连接并访问oracle数据的程序代码
Connection cn = null;
PreparedStatement pstmt =null;
Resultset rs = null;
try{
Class.forname(driveClassName);
cn = DriverManager.getConnection(url,username,password);
pstmt = cn.prepareStatement(“select * from user where username = ?”);
pstmt.setString(1,userName);
Resultset rs = pstmt.executeQuery();
while(rs.next()){
system.out.println(rs.getInt(“subject”) + “ |” + rs.getFloat(“score”) );
}
}catch(Exception e){e.printStackTrace();}
finally{
if(rs != null) try{ rs.close() }catch(exception e){}
if(pstmt != null) try{pstmt.close()}catch(exception e){}
if(cn != null) try{ cn.close() }catch(exception e){}
}
Class.forName的作用?为什么要用?
答:Class.forName(“类的全限定名”),按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了(反射机制)。
有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类.
JDBC中也使用Class.forName来动态加载对应数据库的驱动类,驱动类在加载的时候会自动执行对应驱动类中用于注册驱动的代码。
大数据量下的分页解决方法。
答:最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。在sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据。
不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页sql:
sql server:
String sql =
"select top " + pageSize + " * from students where id not in" +
"(select top " + pageSize * (pageNumber-1) + " id from students order by id)" +
"order by id";
mysql:
String sql =
"select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
oracle:
String sql = "select * from " +
(select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber + ") as t" + "where t>" + pageSize*(pageNumber-1);
这段代码有什么不足之处?
try { Connection conn = ...; Statement stmt = ...;
resultSet rs = stmt.executeQuery("select * from table1");
while(rs.next()) {
//封装记录
}
} catch(Exception ex) {
//异常处理
}
答:没有finally语句来关闭各个对象,另外,使用finally之后,要把变量的定义放在try语句块的外面,以便在try语句块之外的finally块中仍可以访问这些变量。
简述建立索引的作用和索引的分类 ?
索引的作用:通过使用索引,大大提高数据库的检索速度,改善数据库性能。
索引分类:
- 唯一索引:唯一索引不允许两行具有相同的索引值
- 主键索引:在数据库关系图中为表定义一个主键自动创建主键索引,主键索引是唯一索引的特殊类型
- 聚集索引:在聚集索引中表中各行的事物顺序与键值的逻辑(索引)顺序相同且唯一
- 非聚集索引:非聚集索引建立在索引页上,在查询数据时可以从索引中找到记录存放的位置
- 复合索引:在创建索引时,并不是只能对其中一列创建索引,与创建主键一样,可以将多个列组合作为索引,这种索引称为复合索引
- 全文索引:全文索引是一种特殊类型的基于标记的功能性索引,由SQL Server 中 全文引擎服务创建 和维护
什么是存储过程,有什么优缺点
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,是由流程控制和SQL语句书写的命名语句块,经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可,可以通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用。
使用存储过程有以下的优点:
- 具有良好的安全性:可保证数据的安全性和完整性。通过存储过程可以使没有权限直接访问相应数据库对象的用户受控制的间接地执行数据库相关操作,从而保证数据的安全。
- 执行速度快,效率高:在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。
- 减少网络流量:可以降低网络的通信量。
- 模块化程序设计:存储过程可以封装业务逻辑,并存入数据服务器中,当业务逻辑发生变化时,无需修改调用存储过程的应用程序,只需修改存储过程即可。
使用存储过程的缺点是:
- 相对而言,调试比较麻烦
- 移植问题,数据库端代码当然是与具体数据库相关的。
- 代码可读性差
存储过程与SQL的区别?
存储过程是一组预编译的SQL语句,经编译后存储在数据库中,可包含一个或多个SQL语句。能够完成一定功能的子程序,需要的时候用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程可以包含数据操作语言,逻辑和调用函数等;它又可分为系统存储过程和用户自定义的存储过程。
SQL指结构化查询语言,是一种ANSI的标准计算机语言。
什么是视图?它的作用?
视图是一个数据库中虚拟的表,经过查询操作形成的结果,具有普通表的结构,不能实现数据的存储,对视图的修改 将会影响实际的数据表
作用:
1:是出于安全考虑,用户不必看到整个数据结构,而隐藏部分数据
2:符合用户日常业务逻辑,使他们对数据更容易理解
视图给用户和开发人员带来的好处
i.对最终用户的好处:结果更容易理解,获得数据更容易
ii.对开发人员的好处:限制数据检索更容易,维护应用程序更方便
如何创建视图?
语法:create view 视图名 AS <select 语句>
如何删除视图?
drop view 视图名
Oracle数据库的主要特点如下:
- 支持多用户,大事务量的事务处理
- 在保持数据安全性和完整性方面性能优越
- 支持分布式数据处理,将分布在不同物理位置的数据用通信网络连接起来,在分布式数据库管理系统的控制下,组成一个逻辑上统一的数据库,完成数据处理任务。
- 具有可移植性。Oracle可以在Windows,Linux等多个操作系统平台上使用,可以在不同操作系统间移植数据库。而SQL Server只能在Windows 平台上运行
Oracle 基本概念
- 数据库: 这里的数据库不是通常情况下我们所说的数据库,而是Oracle的一个专业名词。
- 数据库实例:每个启动的数据库都对应一个数据库实例,然后由这个实例来访问和控制数据库
- 数据文件(扩展名是.DBF):是用于存储数据的文件,例如存储数据库表中的记录,索引,存储过程,视图,数据字典定义等。
- 控制文件(扩展名是.CTL):是一个二进制文件,控制文件中存储信息很多,其中包括数据文件和日志文件的名字和位置。
- 日志文件(扩展名是.LOG)它记录了对数据库的所有更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其他意外出现后重新恢复数据库
- 表空间:每个Oracle数据库都是由若干个表空间构成的,用户在数据库建立的所有内容都被存储表空间中,一个表空间可以有多个数据文件,但是一个数据文件只能属于一个表空间
数据库、数据库实例的含义及区别?
数据库是指磁盘上存储数据的集合,在物理上表现为数据文件,日志文件和控制文件等,在逻辑上以表空间形式存在。
数据库实例就是为了运行数据库,Oracle系统所运行的所有进程和分配内存结构的组合体。
Oracle使用PL/SQL Developer导出数据的三种方式及区别?
1、导出为.dmp的文件格式,.dmp文件是二进制的,可以跨平台,还能包含权限,效率也很不错,用得最广
2、导出为.sql文件的,可用文本编辑器查看,通用性比较好,但效率不如第一种,适合小数据量导入导出。尤其注意的是表中不能有大字段(blob,clob),如果有,会提示不能导出,可以用第一种和第三种方式导出。
3、导出为.pde格式的,.pde为Pl/sql developer自有的文件格式,只能用Pl/sql developer自己导入导出;不能用编辑器查看
游标(CURSOR)的概念
游标是用来处理使用查询语句从数据库中检索到记录的工具,借助游标可以对一组记录逐个进行处理。每次处理一行。在进行游标提取时,单条记录使用fetch语句提取,当返回多条记录时需要使用循环语句提取结果集。
游标的分类
1)显示游标
返回多条记录时,使用显示游标逐行读取
2)隐式游标
PL/SQL自动为DML语句创建隐式游标,包含一条返回记录
游标的使用分为哪几个步骤?
- 声明游标
- 打开游标
- 提取游标
- 关闭游标
表分区的特点及实现方式
1)分区是指将表拆成几个部分,其特点是:
增强数据库的可用性,减少维护工作量 ,均衡I/O,提高查询速度 ,分区对用户保持透明
2)分区的实现方式
范围分区 列表分区 散列分区 索引分区
SYS和SYSTEM中,哪个用户权限更大?
SYS权限更大
SYS用户主要用来维护系统信息和管理实例,SYSTEM用户管理Oracle数据库的用户,权限和存储等。
Oracle中用什么函数按字符串截取字段?
substr(string,a,b) 返回从a开始b个字符长度的字符串
如:substr(‘Hello,Oracle’,1,5) 输出:Hello
注意:oracle数据库中索引从1开始
Oracle有哪些常用的函数?
- 字符函数
- lower(char):将字符串转化为小写的格式。
- upper(char):将字符串转化为大写的格式。
- length(char):返回字符串的长度。
- substr(char, m, n):截取字符串的子串,n代表取n个字符的意思,不是代表取到第n个
2) 数学函数
- round(n,[m]) 该函数用于执行四舍五入。如果省掉m,则四舍五入到整数。如果m是正数,则四舍五入到小数点的m位后。如果m是负数,则四舍五入到小数点的m位前。
- .trunc(n,[m]) 该函数用于截取数字。如果省掉m,就截去小数部分,如果m是正数就截取到小数点的m位后,如果m是负数,则截取到小数点的前m位。
- mod(m,n)取余函数。
- floor(n) 返回小于或是等于n的最大整数
- ceil(n) 返回大于或是等于n的最小整数
- abs(n) 返回数字n的绝对值
3) 日期函数
- sysdate 返回系统时间
- add_months函数可以得到某一时间之前 或之后n个月的间
- last_day(d):返回指定日期所在月份的最后一天
4) 转换函数
- to_char()函数:
转换字符TO_CHAR(c):将nchar,nvarchar2,clob,nclo类型转换为char类型;
转换时间TO_CHAR(d[,fmt]):将指定的时间(data,timestamp,timestamp withtime zone)按照指定格式转换为varchar2类型;
转换数值TO_CHAR(n[,fmt]):将指定数值n按照指定格式fmt转换为varchar2类型并返回;
to_date()函数:用于将字符串转换成date类型的数据。
Oracle数据库如何提高访问性能?
- a. 避免在索引列上使用IS NULL和IS NOT NULL 操作 避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中. 举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.
- b. 用UNION替换OR (适用于索引列) 通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.
- c. 分离表和索引 总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上(通过指定表空间的方式可以实现这个要求).
- d. 共享SQL语句
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用. 当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句. 这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等).
e. WHERE子句中的连接顺序. ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 例如:
示例1.(低效,执行时间156.3秒) SELECT * FROM EMP E WHERE SAL > 50000 AND JOB = ‘MANAGER\' AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO); 示例2(高效,执行时间10.6秒) SELECT … FROM EMP E WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL > 50000 AND JOB = ‘MANAGER\';
f. SELECT子句中避免使用 ‘ * ‘ 当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*\' 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将\'*\' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.
- g. 使用DECODE函数来减少处理时间 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.例如: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAME LIKE ‘SMITH%\';
SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE ‘SMITH%\'; 你可以用DECODE函数高效地得到相同结果 SELECT COUNT(DECODE(DEPT_NO,0020,\'X\',NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,\'X\',NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL FROM EMP WHERE ENAME LIKE ‘SMITH%\'; 类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.
h. 用TRUNCATE替代DELETE 当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (注意: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
i. 尽量多使用COMMIT 只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: COMMIT所释放的资源: a. 回滚段上用于恢复数据的信息. b. 被程序语句获得的锁 c. redo log buffer 中的空间 d. ORACLE为管理上述3种资源中的内部花费 (注意: 在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼)
j. 用Where子句替换HAVING子句 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. 例如: 低效: SELECT REGION,AVG(LOG_SIZE) FROM LOCATION GROUP BY REGION HAVING REGION REGION != ‘SYDNEY\' AND REGION != ‘PERTH\' 高效 SELECT REGION,AVG(LOG_SIZE) FROM LOCATION WHERE REGION REGION != ‘SYDNEY\' AND REGION != ‘PERTH\' GROUP BY REGION (注意: HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中)
k. 用EXISTS替代IN 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.低效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB\') 高效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X\' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB\')
l. 用NOT EXISTS替代NOT IN 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. 例如: SELECT … FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=\'A\'); 为了提高效率.改写为: (方法一: 高效,左外连接) SELECT …. FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+) AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+) = ‘A\' (方法二: 最高效) SELECT …. FROM EMP E WHERE NOT EXISTS (SELECT ‘X\' FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = ‘A\');
能写出oracle中你常用到的sqlplus命令吗?
- 首先查看当前使用的数据库实例
select name from V$database;
- 切换两个数据库实例
connect username/password@sid
- 执行一个SQL脚本文件
SQL>start file_name
SQL>@ file_name
- 重新运行上一次运行的sql语句
SQL>/
- 显示一个表的结构
SQL> desc table_name
- 执行一个存储过程
EXECUTE procedure_name
- 显示当前的用户名
show user
Oracle存储过程的基本语法是什么?
CREATE OR REPLACE PROCEDURE 存储过程名 //1
IS //2
BEGIN //3
NULL; //4
END; //5
行1:
CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;
行2:
IS关键词表明后面将跟随一个PL/SQL体。
行3:
BEGIN关键词表明PL/SQL体的开始。
行4:
NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
行5:
END关键词表明PL/SQL体的结束