一:面向对象的特征有哪些方面
1. 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2. 继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3. 封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
二:int 和 Integer 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
break 和continue的区别:
break:跳出循环,不再执行剩余部分。
continue:停止当次循环,回到循环起始处,进入下一次循环操作。continue语句之后的语句将不在执行。
三:说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
四:HashMap和Hashtable的区别。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
五:Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型
六:abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体
在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
七:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型,这样子才可以正确的编译) short s1 = 1; s1 += 1;(可以正确编译)
八:Math.round(11.5)等於多少? Math.round(-11.5)等於多少? Math.round(11.5)==12 Math.round(-11.5)==-11 round方法返回与参数最接近的长整数,参数加1/2后求其floor.
九:String s = new String("xyz");创建了几个String Object?
两个一个是”xyz”,一个是s对”xyz”的引用
十:接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。
十一:数组有没有length()这个方法? String有没有length()这个方法?数组没有length()这个方法,有length的属性。String有length()这个方法
十二:请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
十三:你所知道的集合类都有哪些?主要方法?
最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。 Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。
十四:char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的
可能的解释为一个中文占16位,两个字节
十五:覆盖和重载
覆盖:覆盖一个方法并对其重写,以求达到不同的做用!覆盖要注意一下几点:
1) 覆盖的方法标识必须要和被覆盖的方法标志完全匹配!
2) 覆盖方法的返回值必须和被覆盖方法的返回值一致!
3) 覆盖方法所抛得异常必须和被覆盖方法所抛得异常一致或者是其子类!
4) 被覆盖的方法不能为private,否则其子类只是定义了一个方法,并没有对其覆盖!
重写:定义一些名称相同的方法,通过传入参数的不同来区分这些方法,再调用 时,会根据不同的参数样式来选择合适的方法执行!重载要注意一下几点:
1)在使用重载时只能通过不同的参数样式,如:不同参数类型、不同参数个数、不同参数顺序!
2)不能通过访问权限、返回类型、抛出异常来进行重载!
3)方法的异常类型和数目不会对重载构成影响!
4)对于继承来说,如果父类方法访问权限为private,那么就不能再子类对其重载,如果定义的话也只是定义一个新方法,而不会达到重载的效果
十六:java中的常用包
1) java.applet:包含一些用于创建Java小应用程序的类。
2) java.awt:包含一些用于编写与平台无关的图形界面(GUI)应用程序的类。
3) java.io:包含一些用作输入输出(I/O)处理的类。
4) java.lang:包含一些Java语言的基本类与核心类,如String、Math、Integer、System和Runtime,提供常用的功能,这个包中的所有类是被隐式导入的。
5) java.net:包含用于建立网络连接的类,与java.io同时使用完成与网络有关的读写。
6) java.util:包含一些实用工具类和数据结构类。
十七:String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
十八:运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
十九:说出Servlet的生命周期,并说出Servlet和CGI的区别。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
二十:EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。
EntityBean被用来代表应用系统中用到的数据。
对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
二十一:&和&&的区别。
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。
二十二:Collection 和 Collections的区别。
Collection是集合类的上级接口,继承他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
二十三:final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
二十四:sleep() 和 wait() 有什么区别?
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
二十五:error和exception有什么区别?
error 表示恢复不是不可能,但很困难的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
二十六:heap和stack有什么区别。
栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素
二十七:forward 和redirect的区别?
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
二十八:forward 和redirect的区别
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
二十九:EJB与JAVA BEAN的区别?
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。
三十:GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
三十一:Java有没有goto?
java中的保留字,现在没有在java中使用。
三十二:启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须有退出的标志来停止的一个线程。
三十三:应用服务器有那些?
BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat
三十五:接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。
三十六:说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。
当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
三十八:数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有length()这个方法
三十九:是否可以继承String类?
String类是final类故不可以继承。
四十:swtich是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 、byte。long,string 都不能作用于swtich
??四十一:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?会执行,在return前执行。
四十二:编程题: 用最有效率的方法算出2乘以8等於几? 2 << 3
在VC++中运行这个就可得到16,最好的方法
#include<stdio.h>
void main(){
printf("%d",2<<3);
}
2<<3移位,也可在JAVA正确的运行
四十三:两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。
如果两个值相等,那么equals()方法相等,表示两个方法的对像相等,这表示,引用的对像的地址相等,这样就有相同的hashcode
四十四:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
四十五:Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况 一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Throwable的子类。
四十六:垃圾回收的优点和原理。并考虑2种回收机制
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收
四十七:char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的
可能的解释为一个中文占16位,两个字节
四十八:多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 ,同步的实现方面有两种,分别是synchronized,wait与notify
四十九:线程的基本概念、线程的基本状态以及状态之间的关系:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态分别是:就绪,运行、挂起、结束。
五十:简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能。
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
五十一:EJB的角色和三个对象
一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼容性。这六个角色分别是EJB组件开发者(Enterprise Bean Provider) 、应用组合者(Application Assembler)、部署者(Deployer)、EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员(System Administrator)。
三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类
五十二:请对以下在J2EE中常用的名词进行解释(或简单描述)
web容器:
给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:
Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
五十三:JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,final分别代表什么意义?在try块中可以抛出异常吗?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口
在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,
调用这个对象的方法可以捕获到这个异常并进行处理。
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,
这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有“异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。
throw语句用来明确地抛出一个“异常”。throws用来标明一个成员函数可能抛出的各种“异常”
Finally为确保一段代码不管发生什么“异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,
在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,“异常”的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的try语句。
五十四:排序都有哪几种方法?请列举。用JAVA实现一个快速排序。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
快速排序的伪代码。/ /使用快速排序方法对a[ 0 :n- 1 ]排序,从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点,
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点,递归地使用快速排序方法对left 进行排序,递归地使用快速排序方法对right 进行排序,所得结果为l e f t + m i d d l e + r i g h t。
五十五:java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流继承于InputStream \ OutputStream,字符流继承于InputStreamReader \ OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
五十六:MVC的各个部分都有那些技术来实现?如何实现?
MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用
五十七:java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
五十八:什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,
implements Serializable只是为了标注该对象是可被序列化的,
然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,
接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
五十九:说出一些常用的类,包,接口,请各举5个
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer;
常用的包:java.lang java.awt java.io java.util java.sql;
常用的接口:Remote List Map Document NodeList
六十: 编写 java文件的注意事项?
在记事本中编写java文件,在保存时一定要把文件名和扩展名用双引号括起来,否则将默认保存为文本文件,如果要保存的java 文件名为Program1.java,则在保存时在文件名文本框中一定要输入”Program1.java”。
六十一:如何编译java程序?
单击开始|运行命令,在命令行上输入cmd,按回车键(在 window98中输入command,按回车键),即可打开一个命令窗口,将目录转换到编写java源程序所在的目录,输入javac filename.java
六十二:如何执行java程序?
同样在命令窗口中输入java filename,
六十三:什么是类与对象?
所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。
类是具备某些共同特征的实体的集合,它是一种抽象的概念,用程序设计的语言来说,类是一种抽象的数据类型,它是对所具有相同特征实体的抽象。
六十四:属性与方法?
不同对象具有相同特点,就可能抽象为一定的类,那么这些特点基本上可以分为两类,一类是描述对象静态状态的,就是对象的属性,在程序设计中,可以称之为变量;另一类是描述对象的动作,就是对象的方法,在程序设计中我们称之为函数。属性和方法是一个对象所具备的两大基本要素,也是我们后面编程工作的核心。
六十五:什么是封装?
只要有足够的方法,就没必要直接去操作对象属性,只要调用这些方法就可以实现要完成的任务,这种现象称为封装,它通过对象方法对其属性的操作把对象属性封装在一个对象内部,对象与外界打交道全部通过其自身的方法来实现,有效的把对象属性隐藏在对象内部。
Servlet的生命周期
Servlet的生命周期就是Servlet从创建出实例对象到其销毁的过程。
Servlet是一个容器,它负责创建实例来接受客户端的请求,并且以多线程的方式响应给客户。
Servlet生命周期之中一共经历了5各阶段:
1 类的加载
2 实例化(创建servlet实例对象)
3 初始化(调用init()方法)
4服务(调用service()方法,根据客户请求方式选择用doGet()或doPost()方法) 5 Servlet销毁(调用destroy()方法)
注意: Servlet在其整个生命周期中只创建了一个对象!!!
Servlet和JSP的区别:
JSP是 Servlet的扩展
由于JSP转译之后才变成Servlet,所以Servlet的速度比JSP快
(3)JSP的本质还是Servlet
HTTP协议:
1.HTTP协议(Hypertext Transfer Protocol)超级文本传输协议;
2.HTTP的请求格式:
总共分为三部分:
请求方法,URL,HTTP协议的版本
请求头(request Header)
请求正文(request Content)
3.HTTP的请求方式
1)get:
2)post:
一:JavaBean的标准动作
<jsp:usebean>创建JavaBean的对象
<jsp:setProperty>设置对象的属性
<jsp:getProperty>获得对象的属性的值
<jsp:include>把另一个jsp页面嵌入到本页面
<jsp:forward>把用户请求转发到其它页面
二:静态包含<%@ include>与动态包含<jsp:include>的区别
<%@ include file=”date.jsp” %>
include编译指令是在jsp程序的转换时候将file属性所指定的内容嵌入,然后再编译
只生成一个class文件
Include不能带参数
同一个request对象
<jsp:include page=”date.jsp” flush=”true”>
include指令在转换时候不会被编译,只有在客户端请求时才会被动态的编译载入
<jsp:include>可带参数
不同的request对象,可以取得包含它的页面的参数并添加了自己的参数
三:Sendredirect 和forward的区别
Sendredirect |
Forward |
是不同的request |
虽是不同对象,但是可取到上个页面的内容 |
Send后的语句可以执行,除非return |
Forward后的内容不会继续发送给客户端 |
需要到客户端的往返,可以转到任何页面 |
服务器内部转换 |
地址栏有变化 |
地址栏没有变化 |
可以传参数,直接跟在URL后面 |
不可传参 |
四:JavaBean的优点
可被多个页面重用
可以在多个应用程序中使用
可以跨平台
五:JavaBean的范围
JavaBean的scope属性,scope属性决定了JavaBean对象存在的范围
page:表示页面的范围;它是scope属性的默认值
request:表示请求范围:(服务器端响应一次客户请求的过程,从servlet容器接受一个客户请求开始,到返回响应结果结束)
session:表示会话范围(session的生命的周期及会话范围)
application:表示在web应用范围
六:web.xml顺序
<WEB-APP>:web应用的根元素
<display-name>:web应用的名字
<discription>:对web应用的描述
<filter>:定义过滤器
<filter-mapping>为过滤器指定URL映射
<servlet>定义servlet
<sevlet-mapping>为servlet指定URL映射
<session-config>配置http会话
<welcome-file-list>设置web应用的welcome文件清单
<taglib>声明引用标签
<resource-ref>声明引用的jndi资源
<security-constraint>配置安全约束
<login-config>配置安全验证登陆
<security-role>配置安全角色
七:EL表达式
1)EL表达式语言中隐含的对象
applicationScope:把web应用范围内的属性名和属性值进行映射
cookie:把客户请求中的cookie名和cookie对象进行映射
header:HTTP请求头部的项目名和项目值进行映射
headerValues:把HTTP请求头部的项目名和所有匹配的项目值的数组进行映射
initparam:把web应用的初始化参数名和参数值进行映射
pageContext:表示javax.servlet .jsp.PageContext对象
pageScope:把页面范围内的属性名和属性值进行映射
param:把客户请求中的请求参数名和参数值进行映射
paramValues:把客户请求中的请求参数名和所匹配的参数值数组进行映射
requestScope:把请求范围的属性名和属性值进行映射
sessionScope:把会话范围内的属性名和属性值进行映射
2)EL中的表示特定范围
pageScope,requestScope,sessionScope,applicationScope
3)表示HTTP请求中的特定数据
Header,headerValues,param,paramValues
表示pageContext对象
${pageContext.servletContext}
${pageContext.request}
${pagecontext.response}
${pagecontext.session}
表示web应用的初始化参数的集合
${initParam.driver}
在EL表达式里面无法直接访问jsp文件中的隐含对象必须例如${pageContext.request.requestURL}
八:自定义jsp标签
1.Servlet容器得到了Tag对象后会通过下面的步骤
Servlet容器调用Tag对象的setPageContext()和setParent()方法,把当前jsp页面的PageContext对象及父标签处理对象传给当前Tag。如果不存在父标签,把父标签处理对象设为null
Servlet容器调用Tag对象的一系列set方法,设置Tag对象的属性。如果标签没有属性,则不需要这个步骤
Servlet容器调用Tag对象的doStartTag()方法
如果doStartTag()方法返回Tag.skip_body就不执行标签主体内容,如果doStartTag()方法返回Tag.EVAL_BODY_INCLUDE,就执行标签主体内容
Servlet容器调用Tag对象的doEndTag()方法
如果doEndTag方法返回Tag.SKIP_PAGE,就不执行标签后面的jsp代码。如果doEndTag方法返回Tag.EVAL_PAGE
2.Servlet容器得到IterationTag对象后,会调用下面的方法
1)Servlet容器调用IterationTag对象的setPageContext()和setParent()方法,把当前的jsp页面的PageContext对象及父标签处理对象传给当前IterationTag对象,如果不存在父标签,则把父标签处理对象设为NULL
2)servlet容器调用IterationTag对象一系列的set方法,设置IterationTag对象的属性。如果没有标签,则没有这个步骤
3)Servlet容器调用IterationTag对象的doStartTag方法;
4)如果doStartTag()方法返回Tag.skip_body就不执行标签主体内容,如果doStartTag()方法返回Tag.EVAL_BODY_INCLUDE,就执行标签主体内
5)如果执行了标签主体的内容,那么就调用doAfterBody方法
6)如果doAfterBody放回Tag.SKIP_BODY,就不再执行标签的主体内容如果返回Tag.EVAL_BODY_AGAIN,就继续重复执行标签的主体的内容
7)Servlet容器调用IterationTag对象的doEndTag()方法
8) 如果doEndTag方法返回Tag.SKIP_PAGE,就不执行标签后面的jsp代码。如果doEndTag方法返回Tag.EVAL_PAGE
九:JSTL语言:
JSTL标签库包含五个不同的标签库
标签库名 |
前缀 |
URL |
描 述 |
Core |
c |
http://java.sun.com/jsp/jstl/core |
核心标签库,包括一般用途,条件,迭代和URL相关的标签 |
I18N |
fmt |
http://java.sun.com/jsp/jstl/fmt |
国际化web应用标签,以及日期,时间,数字格式化的标签 |
Sql |
sql |
http://java.sun.com/jsp/jstl/sql |
访问关系数据库 |
Xml |
x |
http://java.sun.com/jsp/jstl/xml |
包含对xml文档进行操作的标签 |
Function |
fn |
http://java.sun.com/jsp/jstl/function |
包含一组通用的el函数,el表达式中可以应用这些el函数 |
十:JSTL Core标签库
1.一般用途的标签
<c:out>:把一个表达式的结果打印到网页上
<c:set>:设置命名变量的值。如果命名变量为JavaBean,还可以设置JavaBean的属性的值;如果命名变量为map类型,还可以设置与其中的key对应的值
<c:remove>:删除一个命名变量
<c:catch>:用于捕获异常,并把异常对象放在指定的命名变量中
2.条件标签
<c:if>:相当于java中的if语句
<c:choose>,<c:when>和<c:otherwise>相当于java中的if-alse语句
<c:choose>
<c:when>IF
</c:when>
<c:when>ELSE IF
</c:when>
<c:otherwise>ALSE
</c:otherwise>
</c:choose>
3.迭代标签
<c:foreach>:用于遍历集合对象,并且能重复执行标签主体
<c:forTokens>:用于遍历字符串中用特定分隔符分割的子字符串,并且能重复执行标签主体
4.URL相关标签
<c:import>包含其他web资源相当于<jsp:include>指令的作用
<c:url>按照特定的重写规则重新构造url
<c:redirect>:负责重定向
5.JSTL 国际化标签
<fmt:setLocale>设置locale,把locale保存到特定的范围内
<fmt:setBundle>设置ResourceBundle,把ResourceBundle保存到特定范围内
<fmt:bundle>设置标签主体使用的ResourceBundle;
<fmt:message>根据属性key返回ResourceBundle中匹配的消息文本
<fmt:param>为消息文本中的消息参数设置值
<fmt:requestEncoding>:设置Http请求正文使用的字符编码
6.JSTL 格式化标签
<fmt:setTimeZone>:设置时区,把时区保存到特定的范围
<fmt:timeZone>:设置标签主体使用的时区
<fmt:formartNumber>:格式化数字
<fmt:parseNumber>解析被格式化的字符串类型的数字
<fmt:formartDate>格式化日期和时间
<fmt:parseDate>解析被格式化的字符串类型的日期和时间
7.SQL标签库
<sql:setDateSource>设置数据源
<sql:query>执行SQL select语句
<sql:param>为SQL语句中的?表示的参数赋值
<sql:dateparam>为SQL语句中的?表示的日期或时间类型参数赋值
<sql:update>执行SQL insert,update,delete语句,以及执行SQL DDL
<sql:transaction>:声名数据库事务
会话跟踪机制
十一:会话跟踪技术主要包括:Cooike、session、影藏表单域、重写url。
Cookie会话:
创建Cookie:
Cookie cookie = new Cookie(“name”,”Tom”);
将Cookie对象添加到HTTP响应中:
Response.addCookie(cookie);
读取客户端Cookie:
Cookie[] cookies = request.getCookie();
例子:
Cookie cookie = new Cookie("name","value");
response.addCookie(cookie);
Cookie cookie = null;
Cookie[] cookies = request.getCookies();
if (cookies != null)
{
out.println(“<h2>找到的每个 cookie 的名称和值</h2>");
for (int i = 0; i < cookies.length; i++)
{
cookie = cookies[i];
cookie.getName();
cookie.getValue();
}
}
Session会话:
获取session:
HttpSession session = request.getSession();
添加:
Session.setAttribute(“name”,”tom”);
RequestDispatcher rd= request.getRequestDispatcher(“/跳转的路径”);
rd.forword(request,response);
然后在跳转的页面上通过:
session.getAttribute(“name”);来获得值。
十二:隐藏表单域
将会话跟踪字段的隐藏表单域添加到 HTML 页面,但是不会
显示在客户端浏览器中。如:
<form action = “/firsthtml.jsp” method=”POST”>
<input type = “hidden” name=“userid” value=“zhangsan”>
</form>
十三:.URL重写
URL(统一资源定位) 重写技术将一个唯一的会话 ID 添加到
URL 结尾,以标识该会话。例如,重写以下 URL 传递会话 ID:10
原始 URL:http://server:post/servlet/Rewritten
用附加信息重写的 URL:
http://server:post/servlet/Rewritten/10
用添加的参数重写的 URL:
http://server:post/servlet/Rewritten?sessionid=10
用自定义修改重写的 URL:
http://server:post/servlet/Rewritten;$sessionid$10
十四:Jsp页面的构成元素
(1)静态模版:静态模版由HTML,CSS,JavaScript等静态网页元素组成;
(2)指令:指令主要用来提供整个Jsp网页相关的信息,并且用来设定Jsp页面的相关属性。如:<%@......%>中的内容就是Jsp指令。
在Jsp中两个最重要的指令是:page指令,include指令
page 指令用于设置 JSP 页面的属性,主要属性有:language(声明脚本语言的种类,目前只能为java);import(用于导入一个或多个包,同时导入多个java包时中间用“,”隔开);session(表示是否允许session会话,其值默认为true),buffer(设置缓冲区大小,默认是8kb);autoFlush(是否刷新缓冲区);isThreadSafe(设置Jsp文件是否能多线程使用);errorPage(指定接收Exception对象的Jsp页面的URL);isErrorPage(设置当前页面是否是一个error页面,是否接受一个Exception对象);contentType(设置页面类型和字符集,默认是”text/html;charset=ISO-8859-1”)。
include 指令用于在运行时将 HTML文件或 JSP页面嵌入到另一个 JSP页面, include 指令语法<%@ include file = ”文件名” %>
(3)表达式:表达式元素表示的事一个在脚本语言中被定义的表达式,在运行后被自动转化为字符串,然后插入到这个表达式在Jsp文件的位置显示。如<%=java表达式%>
(4)也叫Java Scriptlet,就是在Jsp中写在<%与%>之间的Java代码
(5)声明:在Jsp中声明函数或者方法。如<%!......%>
(6)动作: Jsp动作利用XML语法格式的标记来控制web服务器引擎的行为。利用Jsp动作可以动态地插入文件,重用JavaBean组件,把用户重定向到另外的页面,为java插件生成HTML代码。
(7)注释:就是Jsp页面中的注释
(a):由于Jsp页面中可以写入java代码,那么在java代码中的注释遵循java注释规范://表示单行注释;/*…*/表示多行注释
在Jsp的非JavaScript中,注释有分为两种
(b):在HTML中的注释为<!--注释-->
(c):Jsp 服务器端注释:<%--注释--%>
(二)请求转发和重定向
请求转发:request.getRequestDispatcher(“/xx.jsp”).forward(request,response); 其特点是:地址栏无变化,始终是一个请求,转发的对象可以使本工程内的任何页面。
重定向:就相当于客户端向服务器请求时,服务器响应给客户端一个新的URL浏览器就把请求传递个一个新的页面
特点是:地址发生了变化,重定向的范围没有限制。
十五:JDBC
1.JDBC编程涉及的三个部分
(1)应用程序: 开发人员编写的客户端程序。在应用程序中调用JDBC API,将SQL语句发送到数据库并检索结果。
(2)驱动程序管理器 :JDBC将驱动程序管理器负责使用正确的JDBC驱动程序和连接信息访问数据库,在Java应用程序和数据库系统之间建立连接。
(3)驱动程序:驱动程序由数据库厂商提供,实现数据库驱动接口,能够把SQL指令正确的发送的数据库服务器。
2.JDBC的使用步骤
注册:DriverManager.registerDriver(driver);一般不使用。
加载:Class.forName(driver); driver:有效JDBC驱动程序名称。
连接:Connection con = DriverManager.getConnection(URL,login_name, login_password);
url:连接路径,login_name:数据库登陆账户名,login_passwoer:登陆密码。
3.关于JDBC编程的重要类和接口
DriverManager类,Connection接口,Statement接口,PreparedStatement接口,ResultSet接口,SQLException类
一, DriverManager类 管理一组 JDBC 驱动程序的基本服务。
最常用的方法
getConnection(String url,String user,String password) 试图建立到给定数据库 URL 的连接。
二,Connection 接口
与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。
Connection 对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。
常用的方法
(1)createStatement()创建一个 Statement 对象来将 SQL 语句发送到数据库。
(2)prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
(3)close() 立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。
三,Statement接口定义了一组数据库操作的方法,可以通过这个接口的实现类对象执行指定的SQL命令,Connection.createStatement()方法可以得到Statement类型的对象。
Statement方法常用的方法有:
(1)executeUpdate(sql) 返回Int类型,执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句。
(2)executeQuery(sql) 返回单个 ResultSet 对象,执行给定的 SQL 语句,通常为静态 SQL SELECT 语句。
例如ResultSet rs =
DriverManager.getConnection(url,name,pwd).createStatemet.executeQuery(sql);
(3)execute();执行SQL语句,返回Boolean类型,可能返回多个结果。execute 方法执行 SQL 语句并指示第一个结果的形式。然后,必须使用方法 getResultSet 或 getUpdateCount 来获取结果,使用 getMoreResults 来移动后续结果。
(4)close() 立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。
四,PreparedStatement接口是Statement的子接口,扩展了Statement的功能,通过Connection.preparedStatament()方法获得PreparedStatement对象。
PreparedStatement接口使我们可以使用占位符(?)作为参数定义一条SQL语句,占位符是在SQL语句中出现的标记符,在SQL语句执行之前会被替换成实际的值。
常用方法:
(1) int executeUpdate(sql) 执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句。
(2) ResultSet executeQuery()并返回该查询生成的 ResultSet 对象
(3) boolean execute()在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。(4) setString(int parameterIndex, String x) 将指定参数设置为给定 Java String 值。
(5) setInt(int parameterIndex, int x)将指定参数设置为给定 Java int 值。
五, ResultSet接口 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet接口的常用方法:
(1) close()立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。
(2) next()将光标从当前位置向前移一行。
(3) first()将光标移动到此 ResultSet 对象的第一行。
(4)last()将光标移动到此 ResultSet 对象的最后一行。
(5)getMetaData()获取此 ResultSet 对象的列的编号、类型和属性。
(6)getMetaData().getColumnCount()得到元素个数
(7)getMetaData().getColumnName(i)得到元素名称
(8)getString(int columnIndex) 以Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值。
(9)getInt(int columnIndex) 以 Java 编程语言中 int 的形式获取此 ResultSet 对象的当前行中指定列的值。
……….等等。
六,SQLException类
如果发生数据库访问错误,或者是已经关闭的对象上使用一些方法就会产生异常,此时需要使用try/catch进行处理或者是将其thow掉。
4.DriverManager,Connection,Statement,PreparedStatement,ResultSet之间的关系???
DriverManeger类通过getConnection()方法获得Connection对象,
Connecton接口通过CreateStatement()方法获得Statement对象,
通过preparedStatement()方法获得PreparedStatement对象,
Statement和PreparedStatement接口通过executeQuery()方法获得ResultSet对象。
5,JDBC调用数据库的基本步骤
导入必要的类,装入JDBC驱动程序,识别数据源,分配一个Connection对象,分配一个Statement对象,使用Statement执行一个查询,从返回的ResultSet对象中检索数据,关闭ResultSet,关闭Statement对象,关闭Connection对象
十六:Servlet接口中的方法
(1)public void init(ServletConfig config) throws ServletException;
Servlet引擎会在Servlet实例化之后,置入服务之前精确地调用init方法。在调用service方法之前,init方法必须成功退出。
(2)public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;
Servlet引擎调用这个方法以允许Servlet响应请求。这个方法在Servlet未成功初始化之前无法调用。在Servlet被初始化之前,Servlet引擎能够封锁未决的请求。
(3)public void destroy();当一个Servlet被从服务中去除时,Servlet引擎调用这个方法。
(4)public ServletConfig getServletConfig()
返回一个ServletConfig对象,作为一个Servlet的开发者,你应该通过init方法存储ServletConfig对象以便这个方法能返回这个对象。为了你的便利,GenericServlet在执行这个接口时,已经这样做了。
(5)public String getServletInfo();
允许Servlet向主机的Servlet运行者提供有关它本身的信息。返回的字符串应该是纯文本格式而不应有任何标志(例如HTML,XML等)。
十七:Servlet与CGI的区别?
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。在功能上,Servlet与CGI、NSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。
Servlet具有平台无关性。
十八:Servlet与applets不同的地方是
它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。
十九:如何现实servlet的单线程模式 <%@ page isThreadSafe=”false”%>
二十:JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
二十一:servlet的init()方法和service()方法的区别
初始化时调用init()方法有请求到达时调用service()方法,service()根据请求的类型,调用doget()或depost()等方法。
二十二:什么情况下调用doGet()和doPost()?
Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。
二十三:servlet的配置
<web-app>
<servlet>
<description>This is the description of my J2EE component</description>//描述
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>Aa</servlet-name>
<servlet-class>Aa</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Aa</servlet-name>
<url-pattern>/servlet/Aa</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>//默认页
</welcome-file-list>
</web-app>
二十四:JSP中动态INCLUDE与静态INCLUDE的区别?
答:动态INCLUDE用jsp:include动作实现
<jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
<%@ include file="included.htm" %>
二十五:jsp指令有哪些?
答:jsp指令分为两大类型,page指令和动作指令
动作指令通常有:
useBean,setProperty,getProperty,forward,plugin,include。
二十六: &和&&的区别
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与。
二十七:描述JSP和Servlet的区别、共同点、各自应用的范围
尽管JSP在本质上就是SERVLET,但是两者的创建方式不一样.Servlet完全是JAVA程序代码构成擅长于流程控制和事务处理而通过Servlet来生成动态网页很不直观;JSP由HTML代码和JSP标签构成可以方便地编写动态网页因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层。
二十八:Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,
返回真值。
二十九:一个Bean由三部分组成:
实现java.io.serializable接口;
提供无参数的构造方法;
提供getter()和setter()方法访问它的属性。
三十:JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
三十一:在jsp中,page指令的import属性用来引入需要的包或类。
三十二: 如果jsp页面执行时遇到自定义标签,遇到结束标签时将调用doEndTag 方法以执行处理。
三十三:两种跳转方式分别是什么?有什么区别?
有两种,分别为:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。
三十四:如何执行一个线程安全的JSP?
只需增加如下指令
<%@ page isThreadSafe="false" %>
三十五:如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中?
把如下脚本加入到JSP文件的开始即可:
<%
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
%>
三十六:在JSP中如何设置COOKIE?
COOKIE是作为HTTP HEADER的一部分被发送的,如下方法即可设置:
<%
Cookie mycookie = new Cookie("aName","aValue");
response.addCookie(mycookie);
%>
三十七:在JSP中如何删除一个COOKIE?
<%
Cookie killMyCookie = new Cookie("mycookie", null);
killMyCookie.setMaxAge(0);
killMyCookie.setPath("/");
response.addCookie(killMyCookie);
%>
三十八:在一个JSP的请求处理中如何停止JSP的执行
如下例:
<%
if (request.getParameter("wen") != null) {
// do something
} else {
return;
}
%>
三十九:使用useBean标志初始化BEAN时如何接受初始化参数
使用如下两标签即可:
<jsp:getProperty name="wenBean" property="someProperty"/>
<jsp:setProperty name="wenBean" property="someProperty" value="someValue"/>
四十:使用JSP如何获得客户浏览器的信息?
使用request.getHeader(String)即可 。
四十一:在servlets和JSP之间能共享session对象吗?
当然可以,
HttpSession session = request.getSession(true);
session.putValue("variable","value");
四十二:如何获得当前的sessions数?
可以使用HttpSessionBindingListeners来跟踪 。
四十三:如何设置cookie在某一时间后过期?
用Cookie.setMaxAge(int)
四十四:Jsp页面构成元素
1. 静态模板 由HTML、css、JavaScript等元素构成
2. 指令 设定网页元素的属性,用于提供整个jsp网页的相关信息
<%@ 指令名称 属性1=”属性值” 属性2=”属性值” ...%>
语法1:<%@ page contentype=”text/html”;charset=”utf-8”language=”java” import=”com.text.*”%>中的内容就是JSP指令;
语法2:<%@ incluede file=”文件名” %> 用于在运行时将HTML文件或JSP页面嵌入到另一个JSP页面中,如:<%@ include file=”index.jsp”%>
3. 表达式在脚本语言中定义,运行后自动转化为字符串,运用于jsp页面,<% =Java 表达式%>中的内容就是JSP指令
4. Java脚本<%....%>中的内容就是Java的标本scriptlet,在脚本中可以声明变量、书写表达式、使用存在的对象,书写任何合法语句
5. 声明在JSP中可以声明函数或者方法,如:<%! String hello(){….}%>
6. 动作利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码,利用XML语法格式的标记来控制web服务器引擎的行为
7. 注释:JSP页面中的Java代码中遵循Java的注释规则:
如单行注释:// 多行注释:/*……..*/
在非script区域中,HTML注释:<!-- -- >
服务端注释:<%-- -- >
四十五:内置对象
1. JSP内置对象是web容器加载的一组类,是可以在JSP页面中直接使用的对象,JSP使用Java定义的内置对象来访问网页的动态内容
2. 内置对象的分类:
输入/出对象 request,response、out
作用域通信对象:request、session、application、pagecontext
Servlet对象:page、config
错误对象:exception
具体内容:
Request:表示客户端对网页的请求
Response:用于处理JSP 生成的响应,使用 HTTP 协议将响应发送给客户端
Session对象常用的方法:
l void setAttribute(String name,Object value)
以键/值的方式,将一个对象的值存放到session 中
l void getAttribute(String name)
根据名称去获取session中存放对象的值
Application对象常用的方法同session
Pagecontext对象常用的方法同上
内置对象的作用域:page、request、session 和 application
四十六:URL重写:
URL(统一资源定位) 重写技术将一个唯一的会话 ID 添加到
URL 结尾,以标识该会话。例如,重写以下 URL 传递会话 ID:10
原始 URL:http://server:post/servlet/Rewritten
用附加信息重写的 URL:
http://server:post/servlet/Rewritten/10
用添加的参数重写的 URL:
http://server:post/servlet/Rewritten?sessionid=10
用自定义修改重写的 URL:
http://server:post/servlet/Rewritten;$sessio
1、javaScript与java的区别?(从它们的解释,运行等方面说)
第一,javascript是基于对象的,而java是面向对象,即java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象。Javascript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象和事件驱动的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用。
第二,两种语言在其浏览器中所执行的方式不一样。Java的源代码在传递到客户端执行之前,必须经过编译,因而客户端上必须具有相应平台上的仿真器或解释器,它可以通过编译器或解释器实现独立于某个特定的平台编译代码的束缚。Javascript是一种解释性编程语言,由浏览器解释执行。
第三,两种语言所采取的变量时不一样的。Java采用强类型变量检查,即所有变量在编译之前必须作声明avaScript中变量声明,采用其弱类型。即变量在使用前不需作声明,而是解释器在运行时检查其数据类型。
第四,代码格式不一样。Java是一种与HTML无关的格式,必须通过像HTML中引用外媒体那么进行装载,其代码以字节代码的形式保存在独立的文档中。JavaScript的代码是一种文本字符格式,可以直接嵌入HTML文档中,并且可动态装载。编写HTML文档就像编辑文本文件一样方便。
第五,嵌入方式不一样。在HTML文档中,两种编程语言的标识不同,JavaScript使用 <script>...</script> 来标识,而Java使用<applet> ... </applet>来标识。
2、怎么使用javascript将一个页面的一个参数传递到另外一个页面?
可以将javaScript的数据以xxx.jsp?var1=aaa&var2=bbb的形式作为URL的参数传给JSP程序,此时在JSP中用
<%String strVar1=request.getParameter(“var1”);%>就可以获取到javaScript脚本传递过来的数据;
参考下面的脚本:
<script language="JavaScript">
<!--
/***************************************************************
* JavaScript脚本,放置在页面中的任何位置都可以
* insertclick()函数获取JSP传递到页面中的变量varMC,
* 然后就可以在JavaScript中修改这个变量的值,再通过
* post的方式提交给JSP程序来使用。
***************************************************************/
function insertclick(){
var1 = document.all.mc.value; //获取页面form中的变量值
var1 = var1 + "名称";
document.insertForm.submit();
}
//-->
</script>
<!-- html页面form表单,放置在html页面中的位置不限 -->
<form name="insertForm" method="post" action="yourJSP">
<!-- 下面这一句是获取JSP程序中传递过来的变量值 -->
<input type="hidden" name="mc" value="<%=varMC%>">
<input type="button" value="提交" onclick="insertclick()">
</form>
② 使用JavaScript通过在表单里加入隐藏域信息,然后用表单提交的方式把数据传递给JSP程序。
这个比较简单,直接在JavaScript脚本中用<%=strVar1%>就可以把jsp程序中的数据传递给JavaScript脚本使用了。
参考下面的脚本:
<!-- html页面form表单,放置在html页面中的位置不限 -->
<form name="insertForm" method="post" action="yourJSP">
<input type="hidden" name="mc" value="">
</form>
<script language="JavaScript">
<!--
/***************************************************************
* JavaScript脚本,放置在页面中form以后的任何位置都可以
* 使用JavaScirpt获取JSP传递到页面中的变量varMC,
* 然后就可以在JavaScript中使用这个变量的值,通过
* JavaScript脚本赋值给form中的隐藏域。
***************************************************************/
var1 = "<%=varMC%>"; //获取JSP中的变量值
document.all.mc.value = var1;
//-->
</script>
3、使用存储过程进行分页,页面使用javaScript分页
存储过程:
Create procedure proc_page
@pageSize int = 5,
@pageNum int = 1
as
select top(@pageSize)* from users where id not in (select top(@pageSize *(@pageNum-1))* from users)
4、请用JavaScript写出提交表单的语句表单为 frm1
frm1.submit();
5、在javascript中如何判断一个变量是否是数值型?
答:判断变量是不是数字,用javascript的内置函数 isNaN()就可以了,isNaN()函数检验参数是否是一个数字,要注意的是不是数字返回true,是的话返回false。
6、form表单中的控件都由那些?
答:form表单包含
单行文本输入框(text)
单选按钮(radio)
复选框(checkbox)
重置按钮(reset)
多行文本框(textarea)
密码框(password)
下拉列表(select)
提交按钮(submit)
注意:hidden属性可以设置控件是否隐藏。
7、表单提交的方式有哪些?
答:表单提交方式比较:
l get的特点是信息暴露、长度不能超过255字节,但是速度快。
l post的特点信息隐藏、长度不限,但是速度较慢。
8、插入flash代码:src后面加flash路径
答:<embed src="gczg.swf"quality="high"
pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="400" height="240"
menu="false"></embed>
9、如何将JavaScript嵌入网页?
a、使用 <script> 标签将语句嵌入文档
b、将 JavaScript 源文件链接到 HTML 文档中
10、JavaScript 对象有哪些?(比较重要)
答:浏览器窗口:window文档; document;url地址等
脚本对象: String字符串对象;Date日期对象;Math数学对象等
HTML 对象: 各种HTML标签:段落<P>;图片<IMG>;超链接<A>等
11、JavaScript 事件有哪些?
事件名 |
说明 |
onClick |
鼠标单击 |
onChange |
文本内容或下拉菜单中的选项发生改变 |
onFocus |
获得焦点,表示文本框等获得鼠标光标。 |
onBlur |
失去焦点,表示文本框等失去鼠标光标。 |
onMouseOver |
鼠标悬停,即鼠标停留在图片等的上方 |
onMouseOut |
鼠标移出,即离开图片等所在的区域 |
onMouseMove |
鼠标移动,表示在<DIV>层等上方移动 |
onLoad |
网页文档加载事件 |
onSubmit |
表单提交事件 |
onMouseDown |
鼠标按下 |
onMouseUp |
鼠标弹起 |
12、innerHTML是用来做什么的?(innerHTML和innerTEXT 的区别)
答:innerHTML可以获取或修改某个HTML标签内包含的内容(包括标签与文本)
<div id=“div1”><h2>innerHTML</h2></div>
<script>
document.getElementById(“div1”).innerHTML;
</script>
13、如何使用外部 JS 文件?
答:
a、外部 JavaScript 文件可以链接到 HTML 文档中
b、script 标签的 src(源文件)属性可用于包括此外部文件
<script language=“JavaScript” src= “文件名.js">
</script>
14、javascript有何作用?(详细说明)
答:提供用户交互;动态更改内容;数据验证
15、javascript种如何声明定义变量?
答:用弱引用数据类型,var定义声明。如:var a;
16、form中的input有哪些类型?各是做什么处理使用的?
答:text,radio,checkbox,file,button,image,submit,reset,hidden。Submit是button的一个特列,也是button的一种,它把提交这个动作自动集成了。
如果表单在点击提交按钮后需要用JS进行处理(包括输入验证)后再提交的话,通常都必须把submit改成button,即取消其自动提交的行为,否则,将会造成提交两次的效果,对于动态网页来说,也就是对数据库操作两次。
Button具有name、value属性,能触发onclick事件。
Submit继承了button。
Submit增加了触发表单onsubmit事件的功能、增加了执行表单的submit()方法的功能。
Input type=submit按回车提交表单
Button提交的是innerTEXT。
17、table标签中border,cellpadding td标签中colspan,rowspan分别起什么作用?
答:boder 边界;cellpadding 边距
Cellpadding,是补白,是指单元格内文字与边框的距离。
Cellpadding,两个单元格之间的距离
Colspan跨列数
Rowspan跨行数
18、form中的input可以设置readonly和disable,请问这两项属性有什么区别?
答:readonly不可编辑,但可以选择和复制
Disable不能编辑复制选择
19、JS中的三种弹出式消息提醒(警告窗口、确认窗口、信息输入窗口)的命令是什么?(区别也会问到)
答:alert,confirm,prompt
20、当点击按钮时,如何实现两个td的值互换?
答:用javascript实现此功能。
分析:
这个题主要是考变量传值。其次是考如何取元素的值。
代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script type="text/javascript">
function submitbtn() {
var tText1 = document.getElementById('txt1');
var SubmitBtn1 = document.getElementById('submitBtn1');
var tText2 = document.getElementById('txt2');
var SubmitBtn2 = document.getElementById('submitBtn2');
SubmitBtn1.onclick = function() {
var temp = tText1.value;
tText1.value = tText2.value;
tText2.value = temp;
};
SubmitBtn2.onclick = function() {
var temp = tText2.value;
tText2.value = tText1.value;
tText1.value = temp;
};
}
window.onload = function() {
submitbtn();
}
</script>
</head>
<body>
<input type="text" value="12345666" id="txt1" />
<input type="submit" id="submitBtn1" />
<input type="text" value="12345222" id="txt2" />
<input type="submit" id="submitBtn2" /></body>
</html>
21、如何给一个Javascript的对象属性赋值?如何取得属性值?
答:一个Javascript对象的属性可以用”.”操作符或者数组方式来设置和取得:代码如下:
obj.name = “IT公司面试手册”;
obj["name"] = “IT公司面试手册”;
取得 属性的值:
var myname = obj.name;
var myname = obj["name"];
两种方法的区别是如果属性的名字如果是保留字的话,用点操作符就会报错,代码如下:
obj.for = “IT公司面试手册”;因为for是保留字,所以会报错
obj["for"] = “IT公司面试手册” 就不会报错
22、判断文本框内容是不是英文、中文、非中文?
答:
Gb2312
JS代码检查是否是中文:
Function isChinese(s,msg){
Var reg = /[^\u4E00-\u9FA5]/g;
If(reg.test(s.value)){
s.focus();
s.select();
alert(msg?msg:’改栏只能输入中文,请改正!’);
return false;
}
Return true;
}
js代码检查是否是非中文 :
function isNoChinese(s,msg){
var reg = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/gi;
if (reg.test(s.value)){s.select()
alert((msg?msg:’该栏不能输入中文及全角符号﹐请改正!’));
return false;
}
return true;
}
js代码检查是否是英文字 :
function isEnglish(s,msg){
var reg=/^[a-z]*$/gi
if(reg.test(s.value))return true
else {
alert((msg?msg:’该栏目只能输入英文字符﹐请改正’));
s.focus();
s.select();
return false;
}
}
关于Ajax的常见面试题
23、Ajax和javascript的区别?
答:javascript是一种在浏览器端执行的脚本语言,Ajax是一种创建交互式网页应用的开发技术 ,它是利用了一系列相关的技术其中就包括javascript。
Javascript是由网景公司开发的一种脚本语言,它和sun公司的java语言是没有任何关系的,它们相似的名称只是一种行销策略。
在一般的web开发中,javascript是在浏览器端执行的,我们可以用javascript控制浏览器的行为和内容。
Javascript的特性:
1,控制文档的外观和内容
<Script>
document.write ("今天是快乐的");
</Script>
比如说新建一个htm文件,在里面写入上面的代码,用浏览器打开这个文件后,就会显示“今天是快乐的”
<Script>
function tcolor()
{
var a = document.all.myTable.getElementsByTagName("tr");
for (var i=0; i<a.length; i++)
{
a[i].className = trstyle;
}
}
</Script>
上面这段javascript代码的功能是将网页中所有的tr行的class样式都设为trstyle
2,与HTML表单的交互
其常见的用法就是用于表单的验证
<Script>
function check(){
var loginid = document.all.loginid.value;
if(loginid == ""){
alert("please input loginid ");
}
}
</Script>
<html>
<body>
<form>
<table border="0">
<tr>
<td>Login:</td><td><input type="text" name="loginid"/></td>
</tr>
<tr>
<td>Password:</td><td><input type="text" name=" password" /></td>
</tr>
<tr>
<td><input type="submit" onclick="check()"></td>
</tr>
</table>
</form></body>
</html>
3,与用户的交互
Javascrip的一个重要特性就是能够定义事件处理器,既在特定的事件发生时要执行的代码,这些事件都是由用户触发的,比如说把鼠标移到一个超文本连接,单击一个按钮,页面的加载事件。
<script>
function show(){
var str="建议浏览器的分辨率:800x600";
alert(str);
}
</script>
<body onload="show();">
show()函数将会在页面加载事件发生的时候执行
<Body>
<A HREF="http://www.hubert.idv.tw/" onMouseOver="status='最棒的学习网站';return true;" onMouseOut="status='完毕'">文哥网络技术学习网</A>
</Body>
当鼠标在“文哥网络技术学习网”上移动时,浏览器下方会出现“最棒的学习网站”或者“完毕”
24、在 Ajax应用中信息是如何在浏览器和服务器之间传递的?
答:通过XML数据或者字符串
25、在浏览器端如何得到服务器端响应的XML数据
答: XMLHttpRequest对象的responseXMl属性
26、 XMLHttpRequest对象在IE和Firefox中创建方式有没有不同?
答: 有,IE中通过new ActiveXObject()得到,Firefox中通过new XMLHttpRequest()得到
27、介绍一下XMLHttpRequest对象的常用方法和属性(回答的越多越好)
答: open(“method”,”URL”) 建立对服务器的调用,第一个参数是HTTP请求 方式可以为GET,POST或任何服务器所支持的您想调用的方式。
第二个参数是请求页面的URL。
send()方法,发送具体请求
abort()方法,停止当前请求
readyState属性 请求的状态 有5个可取值 0=未初始化 ,1=正在加载
2=以加载,3=交互中,4=完成
responseText 属性 服务器的响应,表示为一个串
reponseXML 属性 服务器的响应,表示为XML
status 服务器的HTTP状态码,200对应ok 400对应not found
28、Ajax的优点和缺点是什么?
答:使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
对应用Ajax最主要的缺点就是,它可能破坏浏览器后退按钮的正常行为
因为Ajax中采用了xml技术,所以在Ajax中也可能问到XML的问题
29、什么是XML?
答:XML是扩展标记语言,能够用一系列简单的标记描述数据
30、xml的解析方式
答:常用的用dom解析和sax解析。dom解析是一次性读取xml文件并将其构造为DOM对象供程序使用,优点是操作方便,但是比较耗内存。Sax是按事件驱动的方式解析的,占用内存少,但是编程复杂
31、你采用的是什么框架(架包)?
答:这题是必问的,一般也是最开始就会问到。
在java中比较流行的有 dojo, Prototype , JQuery, Dwr, extjs 等等
32、如果熟悉某种ajax框架,他可能会问到怎样在程序中使用这种框架
DWR框架介绍
n DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).
n DWR的实现原理是通过反射,将java翻译成javascript,然后利用回调机制,从而实现了javascript调用Java代码
一个dwr框架使用的例子
首先要将DWR.jar 的架包放到calsspath路径中
其程序大概开发过程如下:
1.编写业务代码,该代码是和dwr无关的。
2.确认业务代码中哪些类、哪些方法是要由javascript直接访问的。
3.编写dwr组件,对步骤2的方法进行封装
4.配置dwr组件到dwr.xml文件中,如果有必要,配置convert,进行jav
和javascript类型互转。
5.通过反射机制,dwr将步骤4的类转换成javascript代码,提供给前台页面调用。
6.编写网页,调用步骤5的javascript中的相关方法(间接调用服务器端的相关类的方法),执行业务逻辑,将执行结果利用回调函数返回。
7.在回调函数中,得到执行结果后,可以继续编写业务逻辑的相关javascript代码。
下面以用户注册的例子,来说明其使用。(注意,本次例子只是用于演示,说明DWR的使用,类设计并不是最优的)。
注 什么是回调函数 函数A调用函数B时,函数A将自己的函数地址作为一个参数传递到函数B中。函数B在运行时就可以调用函数A,那么称函数A为回调函数。
这个例子是演示的一个用户注册的例子。
该例子的实现的功能为,.用户在页面上输入相关注册信息,id、name、password、email点击“提交”按钮,如果用户输入的ID还没有被其他用户注册,弹出对话框:“注册成功。
如该ID已被注册,弹出对话框“登陆ID已经存在
其包括三个类, User实体类和其对应的 UserDao类(UserDAO没有操作数据库,是用一个HashTable代替数据库)
DWRUserAccess类(提供给javascript访问)
33、Dwr资料整理:
1.什么是dwr?
答:dwr(direct web remoting)框架是一个开源,免费的工具套件。
2.dwr的作用是什么?
答:dwr的作用是把java转化为js.
3.dwr的两个配置文件是什么?
答:web.xml和dwr.xml
4.使用dwr的准备工作是什么?
答:下载复制dwr.jar,添加到项目文件夹中
<web应用根目录>/WEB-INF/lib/dwr.jar
为DWR框架创建dwr.xml配置文件
<web应用根目录>/WEB-INF/dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="TitleLogic">
<param name="class" value="com.fit.dwrdemo.logic.TitleLogic"/>
<include method="findTitle" />
</create>
</allow>
</dwr>
5.配置web.xml
答:<servlet>
<servlet-name> dwr-invoke </servlet-name>
<servlet-class> uk.ltd.getahead.dwr.DWRServlet </servlet>
<init-param> //这个是调试用,如果正式发布请该为false,不过听说2.0就默认为true了
<param-name> debug </param-value>
<param-value> true </param-value>
</init-param>
<init-param> //这个是DWR2.0必须的,不然会报java.lang.IllegalArgumentException
<param-name> classes </param-value>
<param-value> java.lang.Object </param-value>
</servlet>
<servlet-mapping>
<servlet-name> dwr-invoke </servlet-name>
<url-pattern> /dwr/* </url-pattern>
</servlet-mapping>
6..在页面文件中使用dwr
答:首先在页面中引入DWR提供的必要javascript脚本文件,就可以直接调用在dwr.xml文件中配置的Java类和方法:
……
<script type='text/javascript‘ src='/DWRDemo/dwr/interface/TitleLogic.js'>
</script>
<script type='text/javascript' src='/DWRDemo/dwr/engine.js'></script>
<script type='text/javascript' src='/DWRDemo/dwr/util.js'></script>
……
function checkTitle(obj){
var tid = obj.value;
// 发送请求到服务器,判断用户名是否存在
TitleLogic.findTitle(uname, callBackProcess);
}
function callBackProcess(result) {
//回调函数处理
}
1、Oracle五种索引:
1)b*tree index:几乎所有的关系型数据库中都有b*tree类型索引,也是被最多使用的。其树结构与二叉树比较类似,根据rid快速定位所访问的行。 B-Tree索引是基于二叉树的,由分支块(branch block)和叶块(leaf block)组成。在树结构中,位于最底层底块被称为叶块,包含每个被索引列的值和行所对应的rowid。在叶节点的上面是分支块,用来导航结构,包含了索引列(关键字)范围和另一索引块的地址。
2)反向索引:反转了b*tree索引码中的字节,是索引条目分配更均匀,多用于并行服务器环境下,用于减少索引叶的竞争。反向索引又一个缺点就是不能在所有使用常规索引的地方使用。在范围搜索中其不能被使用。
3)降序索引:8i中新出现的索引类型,针对逆向排序的查询。
4)位图索引:使用位图来管理与数据行的对应关系,多用于OLAP系统。位图索引最好用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零),例如又一个“性别”列,列值有“Male”,“Female”,“Null”等3种,但一共有300万条记录,那么3/3000000约等于0,这种情况下最适合用位图索引。位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多。
5)函数索引:这种索引中保存了数据列基于function返回的值,在select * from table where function(column)=value这种类型的语句中起作用。基于函数的索引也是8i以来的新产物,它有索引计算列的能力,它易于使用并且提供计算好的值,在不修改应用程序的逻辑上提高了查询性能。使用基于函数的索引有几个先决条件:
(1)必须拥有QUERY REWRITE(本模式下)或GLOBAL QUERY REWRITE(其他模式下)权限。
(2)必须使用基于成本的优化器,基于规则的优化器将被忽略。
(3)必须设置以下两个系统参数:
QUERY_REWRITE_ENABLED=TRUE
QUERY_REWRITE_INTEGRITY=TRUSTED
可以通过alter system set,alter session set在系统级或线程级设置,也可以通过在init.ora添加实现。
五种索引的创建:
(1)*Tree索引。
Create index indexname on tablename(columnname[columnname...])
(2)反向索引。
Create index indexname on tablename(columnname[columnname...]) reverse
(3)降序索引。
Create index indexname on tablename(columnname DESC[columnname...])
(4)位图索引。
Create BITMAP index indexname on tablename(columnname[columnname...])
(5)函数索引。
Create index indexname on tablename(functionname(columnname))
注意:创建索引后分析要索引才能起作用。
五种索引的使用场所:
(1)B*Tree索引。
常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。
(2)反向索引。
B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。
(3)降序索引。
B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。
(4)位图索引。
位图方式管理的索引,适用于OLAP(在线分析)和DSS(决策处理)系统,应建立于低cardinality列,适合集中读取,不适合插入和修改,提供比B*Tree索引更节省的空间。
(5)函数索引。
B*Tree的衍生产物,应用于查询语句条件列上包含函数的情况,索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。
索引不管用的时候:
(1)RBO&CBO。
Oracle有两种执行优化器,一种是RBO(Rule Based Optimizer)基于规则的优化器,这种优化器是基于sql语句写法选择执行路径的;另一种是CBO(Cost Based Optimizer)基于规则的优化器,这种优化器是Oracle根据统计分析信息来选择执行路径,如果表和索引没有进行分析,Oracle将会使用RBO代替CBO;如果表和索引很久未分析,CBO也有可能选择错误执行路径,不过CBO是Oracle发展的方向,自8i版本来已经逐渐取代RBO.
(2)AUTOTRACE。
要看索引是否被使用我们要借助Oracle的一个叫做AUTOTRACE功能,它显示了sql语句的执行路径,我们能看到Oracle内部是怎么执行sql的,这是一个非常好的辅助工具,在sql调优里广泛被运用。我们来看一下怎么运用AUTOTRACE:
① 由于AUTOTRACE自动为用户指定了Execution Plan,因此该用户使用AUTOTRACE前必须已经建立了PLAN_TABLE。如果没有的话,请运行utlxplan.sql脚本(它在$ORACLE_HOME/rdbms/admin目录中)。
② AUTOTRACE可以通过运行plustrce.sql脚本(它在$ORACLE_HOME/sqlplus/admin目录中)来设置,用sys用户登陆然后运行plustrce.sql后会建立一个PLUSTRACE角色,然后给相关用户授予PLUSTRACE角色,然后这些用户就可以使用AUTOTRACE功能了。
③ AUTOTRACE的默认使用方法是set autotrace on,但是这方法不总是适合各种场合,特别当返回行数很多的时候。Set autotrace traceonly提供了只查看统计信息而不查询数据的功能。
2、死锁
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
例子:
运行事务 1的线程 T1具有学生基本信息表上的排它锁。运行事务2的线程 T2具有系部表上的排它锁,并且之后需要学生基本信息表上的锁。事务2无法获得这一锁,因为事务 1已拥有它。事务2被阻塞,等待事务 1。然后,事务1需要系部表的锁,但无法获得锁,因为事务 2将它锁定了。事务在提交或回滚之前不能释放持有的锁。因为事务需要对方控制的锁才能继续操作,所以它们不能提交或回滚。
3、BYTE[] buf = BYTE[1024];in.read(buf);
in是一个接收图像数据的网络IO流,请指出这段代码有什么问题,并请用java代码改进它。
答:流操作都可能会跑出IOException,应该对该异常进行捕获处理。且当buf没有被初始化的时候使用会抛出NullPointerException。
byte [] buf =new byte[1024];
try {
System.in.read(buf);
}catch (IOException e) {
e.printStackTrace();
}
4、设计模式:Facade
你正在分析一个子系统的接口,发现接口很多。然后你同事劝你用Fecade,问你用Fecade有什么好处?
Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。Facade模式正是这样一个“门面”:我们本来需要与后台的多个类或者接口打交道,而Facade模式是客户端和后台之间插入一个中间层——门面,这个门面跟后台的多个类或接口打交道,而客户端只需要跟门面打交道即可。使用Facade模式可以说是后台设计和编码人员的一个必备素质。我不止碰到过一个这样的后台开发人员,他们认为只要把后台功能完成了就万事大吉,而没有站在后台使用者的角度来看一看自己写出来的代码。其实,我们写出来的后台代码是要给别人使用的,所以我们提供给使用者的接口要越简单越好,这不单是对使用者好,同时对开发者也是好处多多的,至少你的接口简单了,你和使用者的交流就容易了。
区分Façade模式、Adapter模式、Bridge模式与Decorator模式。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能
在遇到以下情况使用Facade模式:
1)当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。 Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3)当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。
优缺点:
1)它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2)它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。
松耦合关系使得子系统的组件变化不会影响到它的客户。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要。在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用Facade可以降低编译依赖性,限制重要系统中较小的变化所需的重编译工作。Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。
5、冷备份与热备份
冷备份:
冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份Oracle信息而言,冷备份是最快和最安全的方法。
冷备份的优点是:
1.是非常快速的备份方法(只需拷贝文件)
2.容易归档(简单拷贝即可)
3.容易恢复到某个时间点上(只需将文件再拷贝回去)
4.能与归档方法相结合,作数据库“最新状态”的恢复。
5.低度维护,高度安全。
冷备份也有如下不足:
1.单独使用时,只能提供到“某一时间点上”的恢复。
2.在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
3.若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
4.不能按表或按用户恢复。
如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用户可以工作)并将所备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。
冷备份中必须拷贝的文件包括:
1.所有数据文件
2.所有控制文件
3.所有联机REDO LOG文件
4.Init.ora文件(可选)。
下面是做冷备份的完整例子:
(1) 关闭数据库$sqldba lmode=y
SQLDBA >connect internal;
SQLDBA >shutdown normal;
(2) 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件
SQLDBA >! cp < file > < backup directory >
(3) 重启Oracle数据库
$sqldba lmode=y
SQLDBA >connect internal;
SQLDBA >startup;
热备份
热备份是在数据库运行的情况下,采用archivelog mode方式备份数据的方法。所以,如果你有昨天夜里的一个冷备份而且又有今天的热备份文件,在发生问题时,就可以利用这些资料恢复更多的信息。
热备份的要求是:
1.热备份工作必需要求数据库在Archivelog方式下操作,在SQLDBA状态下用alter database archivelog|noarchivelog命令可改变备份的模式。
2.热备份只能在数据库不使用或使用率低的情况下进行。
3.热备份需要大量的档案空间。
一般情况,Oracle以循环的方式写入Online redo log文件,当填满第一个redo log文件后写第二个,直至最后一个,最后一个被填满后,后台进程LGWR就覆盖第一个,在Archivelog方式下,后台进程ARCH在每一个redo log文件被覆盖前,给它作一个拷贝,一般,这些文档的redo log文件被写入磁盘或磁带中。如果磁盘空间够用,建议使用磁盘,这样可大大减少完成备份所需的时间。
在作热备份之前,要将config.ora文件中的log_archive_start设为true将log_archive_dest一旦数据库运行在archivelog状态下,就可以做备份了。
热备份的命令文件由三部分组成:
1.数据文件一个表空间一个表空间地备份。
(1)设置表空间为备份状态
(2)备份表空间的数据文件
(3)恢复表空间为正常状态
2.备份归档log文件。
(1)临时停止归档进程
(2)log下那些在archive redo log目标目录中的文件
(3)重新启动archive进程
(4)备份归档的redo log文件
3.用alter database backup controlfile命令来备份拷贝文件
热备份的优点是:
1.可在表空间或数据文件级备份,备份时间短。
2.备份时数据库仍可使用。
3.可达到秒级恢复(恢复到某一时间点上)。
4.可对几乎所有数据库实体作恢复。
5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。
热备份的不足是:
1.不能出错,否则后果严重。
2.若热备份不成功,所得结果不可用于时间点的恢复。
3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”。
6、你必6用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?
重建控制文件,用带backup control file子句的recover命令恢复数据库。
recover dbname using backup controlfile;
7、如何转换init.ora到spfile?
create spfile from pfile='init.ora';
8、oracle体系结构:
Oracle物理结构
由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成
控制文件:包含维护和验证数据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件
数据文件:存储数据的文件
重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件
参数文件:定义Oracle例程的特性,例如它包含调整SGA中一些内存结构大小的参数
归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
密码文件:认证哪些用户有权限启动和关闭Oracle例程
oracle逻辑结构
表空间、段、区、块
表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。
段:是对象在数据库中占用的空间
区:是为数据一次性预留的一个较大的存储空间
块:ORACLE最基本的存储单位,在建立数据库的时候指定
oracle内存分配
SGA和PGA
SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反PGA是只被一个进程使用的区域,PGA在创建进程时分配在终止进程时回收
oracle后台进程
(数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程)
数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件
日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件
系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
进程监控:负责在一个Oracle进程失败时清理资源
检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
归档进程:在每次日志切换时把已满的日志组进行备份或归档
服务进程:用户进程服务。
用户进程:在客户端,负责将用户的SQL语句传递给服务进程,并从服务器段拿回查询数据。
Oracle Instance
Oracle例程由SGA内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。
SCN(System Change Number):系统改变号
一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。
实例和SID的关系是什么?
经常有人问SID是什么?在Oracle系统中SID是一个经常出现的变量,如环境变量ORACLE_SID, 初始化文件initSID.ora,那究竟什么是SID呢?其实SID就是Oracle实例的标识,不同的SID对应不同的内存缓冲(SGA)和不同的后台进程。这样一来我们就可以得当在一台物理的服务器上可以有多个SID的数据库实例
Oracle数据库和实例的关系是什么?
数据库是由物理文件和存取数据文件的实例组成,当存取数据文件的实例是一个的时候,数据库被称做单节点数据库。这是我们看到的最多的数据库形式。当然还有一种多节点数据库,就是一个以上的实例共同访问一个数据库(或者说共同访问一组数据文件), 更好的提供稳定性和并行处理能力。这在8i中被称为OPS(Oracle Parallel Server ),在Oracle9i中被称为RAC(real application cluster)。在这种数据库中。两个/多个实例分别在不同服务器上,所有Oracle数据文件在共享的磁盘阵列上,多个服务器上的实例可以同时工作,他们通过一个内部的网络进行通信。如果一台服务器不能提供服务的话,另一台会接管它的工作,特别是在关键的业务有很大的潜力。
在运行的数据库中数据文件中是不是可能存在没有被提交的数据?
这是可能存在的,因为用户数据文件的数据是由DBWR写入的,DBWR是一个很底层的后台进程,不负责与用户交互。用户的交互是由LGWR完成的。
在问题10中,如果存在没有写入的数据,那么机器突然断电,数据完整性会不会损坏?
不会的,因为数据库的完整性是LGWR来保证的,而且ORACLE保证了DBWR写入数据文件的任何修改已经被记录在重做日志文件中。当系统再次启动的时候,通过读取重做日志文件就可以知道那些数据没有被提交。这时候ORACLE会自动回滚那些数据。所以说联机日志的损坏,特别是当前联机日志的损坏,对数据库的影响是巨大的,可能会导致数据库的不完整。
Oracle安裝完成后的初始用户名与密码?
sys/change_on_install
system/manager
scott/tiger
sysman/oem_temp
创建Sequence
create sequence zxk increment by 10 start with 10 maxvalue 1000 cycle ;
数据字典
数据字典是ORACLE数据库的最重要的部分之一,是由一组只读的表及其视图所组成。这些表和视图是数据库被建立同时由数据库系统建立起来的,起着系统状态的目录表的作用。数据字典描述表、列、索引、用户、访问权以及数据库中的其它实体,当其中的一个实体被建立、修改或取消时,数据库将自动修改数据字典。因此,数据字典总是包含着数据库的当前描述,可用SQL存取数据字典,由于数据字典为只读,只允许查询。数据字典中全部基本表和用户可存取视图为ORACLE用户SYS所持有,所有对象包含在SYS模式中。当ORACLE数据库系统启动后,数据字典总是可用,它驻留在SYSTEM表空间中。数据字典包含视图集,在许多情况下,每一视图集有三种视图包含有类似信息,彼此以前缀相区别,前缀为USER、ALL和DBA。
9、个检查表结构的方法
1)DESCRIBE命令
sql>desc dbname;
2)DBMS_METADATA.GET_DDL包
10、怎样查看数据库引擎的报错
alert log.
11、比较truncate和delete命令
1、在功能上,truncate是清空一个表的内容,它相当于delete from table_name。
2、 delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollback segments, 而truncate不会。
3、在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!而用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,相当于windows中用shift+delete删除数据,不能够恢复!
4、truncate调整high water mark而delete不;truncate之后,TABLE的HWM退回到 INITIAL和NEXT的位置(默认)delete则不可以。
5、truncate只能对TABLE,delete可以是table,view,synonym。
6、TRUNCATE TABLE的对象必须是本模式下的,或者有drop any table的权限 而 DELETE则是对象必须是本模式下的,或被授予 DELETE ON SCHEMA.TABLE或DELETE ANY TABLE的权限。
7、在外层中,truncate或者delete后,其占用的空间都将释放。
8、truncate和delete只删除数据,而drop则删除整个表(结构和数据)。
在删除大数据量时(一个表中大部分数据时),可以采用以下步骤:
1、先将不需要删除的数据复制到一个临时表中
2、trunc table表
3、将不需要删除的数据复制回来。
不同:DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE则一次性地从表中删除所有的数据页并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
truncate的功能可以拆分为:dropping + re-creating a table,但truncate的效率要高。因为truncate无须考虑表索引、约束、触发器等的重建。另外truncate执行后,无法回滚(roll back)
12、归档模式与非归档模式:
非归档模式:只能做冷备份,并且恢复时只能做完全备份.最近一次完全备份到系统出错期间的数据不能恢复。非归档模式只能离线备份,而且必须备份所有的数据文件,控制文件,日志文件!
归档模式:可以做热备份,并且可以做增量备份,可以做部分恢复.归档模式,可以在线或者离线备份数据库,可以是全备份或者是部分备份(单个表空间,数据文件).归档模式能够做到零数据丢失。当然归档会消耗一些存储和性能资源。归档模式,数据库的日志可以长时间保存,有了归档日志,可以随时恢复归档日期内任何时间点的数据,便于数据库数据安全保护。
RMAN备份:必须使用archivelog,对于是否使用ARCHIVELOG,得看应用具体情况的.数据库归档模式,可以使用rman或手工在线备份数据。
用ARCHIVE LOG LIST可以查看期模式状态时归档模式还是非归档模式.
sql>archive log list;
sql>alter dbname archivelog;
sql>alter dbname noarchivelog;
13、如何建立备份控制文件?
SQL> alter database backup controlfile to trace;
14、数据库的状态:
四种状态:open,close,mount,nomount
打开数据库:
STARTUP NOMOUNT– 启动instance,但是不装载数据库
STARTUP MOUNT -启动instance,并装载数据库,但是不打开数据库
STARTUP OPEN– 启动instance,并装载数据库,然后打开数据库
1)启动&装载&打开&限制仅DBA访问:STARTUP RESTRICT;
取消:ALTER SYSTEM DISABLE RESTRICTED SESSION;
2)强制启动:STARTUP FORCE;
3)只读方式打开数据库:STARTUP OPEN READ ONLY;
关闭数据库:
SHUTDOWN NORMAL;
SHUTDOWN IMMEDIATE;
SHUTDOWN TRANSACTIONAL;
SHUTDOWN ABORT;
15、解释$ORACLE_HOME和$ORACLE_BASE的区别?
ORACLE_BASE是oracle的根目录,ORACLE_HOME是oracle产品的目录。
16、如何判断数据库的时区?
SQL> select dbtimezone from dual;
SQL> select sessiontimezone from dual;
SQL> select sysdate from dual;
SQL> select systimestamp from dual;
SQL> select current_date from dual;
SQL> select current_timestamp from dual;
17、解释GLOBAL_NAMES
GLOBAL_NAME:Global name of the database,是数据库的一个持久性设置.
GLOBAL_NAMES:用于设定数据库链接名称是否必须与远程数据库的GLOBAL_NAME匹配,默认为false。如果这个参数设置为TRUE,在建立数据库链接时就必须用相同的名字连结远程数据库。
18、物化视图:materialized view
Oracle数据库中有两种view,一种是存储为pure SQL,一种是维护一张表。是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。
物化视图对于前台数据库使用者来说如同一个实际的表,具有和表相通的一般select操作,而其实际上是一个视图,一个定期刷新数据的视图(具体刷新时间在定义物化视图的时候已有定义),使用物化视图可以实现视图的所有功能,而物化视图确不是在使用时才读取,大大提高了读取速度,特别适用抽取大数据量表某些信息以及数据链连接表使用.
具体语法如下:
CREATE MATERIALIZED VIEW an_user_base_file_no_charge
REFRESH COMPLETE START WITH SYSDATE
NEXT TRUNC(SYSDATE+29)+5.5/24
as
select distinct user_no
from cw_arrearage t
where (t.mon = dbms_tianjin.getLastMonth or
t.mon = add_months(dbms_tianjin.getLastMonth, -1))
drop materialized view an_user_base_file_no_charge;
补充:
Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。
物化视图可以分为以下三种类型:包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
创建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。
查询重写(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVE*。**ST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。
在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。
物化视图日志:如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
可以指明ON PREBUILD TABLE语句将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated。
物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。
19、当用户进程出错,哪个后台进程负责清理它?
PMON:进程监控进程
20、哪个后台进程刷新materialized views?
The Job Queue Processes:作业队列进程
21、如何判断哪个session正在连结以及它们等待的资源?
V$SESSION / V$SESSION_WAIT
22、如何分辨某个用户是从哪台机器登陆ORACLE的:
SELECT machine , terminal FROM V$SESSION
23、如何查看系统被锁的事务时间:
select * from v$locked_object ;
24、如何以archivelog的方式运行oracle:
在init.Ora中,log_archive_start = true,重启。
25、怎么获取有哪些用户在使用数据库:
select username from v$session;
26、数据表中的字段最大数是多少:
表或视图中的最大列数为 1000
27、怎样查得数据库的SID:
select name from v$database;也可以直接查看 init.ora文件
28、创建Sequence:create sequence zxk increment by 10 start with 10 maxvalue 1000 cycle ;
29、oracle日志
Oracle9i中有2种日志,一种称为Redo Log(重做日志),另一种叫做Archive Log(归档日志)。重做日志redo log file是LGWR进程(日志写入进程)从Oracle实例中的redo log buffer写入的,是循环利用的。就是说一个redo log file(group)写满后,才写下一个。归档日志archive log是当数据库运行在归档模式下时,一个redo log file(group)写满后,由ARCn进程(归档进程)将重做日志的内容备份到归档日志文件下,然后这个redo log file(group)才能被下一次使用。不管数据库是否是归档模式,重做日志是肯定要写的。而只有数据库在归档模式下,重做日志才会备份,形成归档日志。归档日志结合全备份,用于数据库出现问题后的恢复使用。
30、如何强制进行 Log Switch?
当一个redo log file被写满了之后要换另外一个redo log file,这个时候要用到的操作叫log switch。
SQL>ALTER SYSTEM SWITCH LOGFILE;
31、Coalescing做了什么?
Coalescing针对于字典管理的tablespace进行碎片整理,将临近的小extents合并成单个的大extent.
32、oracle表空间
Oracle数据库(tablespace)是由若干个表空间构成的。任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。
在Oracle 10g中有以下几种比较特殊的表空间:
(1)系统表空间
系统表空间(system tablespace)是每个Oracle数据库都必须具备的。其功能是在系统表空间中存放诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产生存储碎片以及争用系统资源的问题,应创建一个独立的表空间用来单独存储用户数据。
(2)SYSAUX表空间
SYSAUX表空间是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX也是许多Oracle数据库的默认表空间,它减少了由数据库和DBA管理的表空间数量,降低了SYSTEM表空间的负荷。
(3)临时表空间
相对于其他表空间而言,临时表空间(temp tablespace)主要用于存储Oracle数据库运行期间所产生的临时数据。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。
(4)撤销表空间
用于保存Oracle数据库撤销信息,即保存用户回滚段的表空间称之为回滚表空间(或简称为RBS撤销表空间(undo tablespace))。在Oracle8i中是rollback tablespace,从Oracle9i开始改为undo tablespace。在Oracle 10g中初始创建的只有6个表空间sysaux、system、temp、undotbs1、example和users。其中temp是临时表空间,undotbs1是undo撤销表空间。
33、创建用户时,需要赋予新用户什么权限才能使它联上数据库。CONNECT
34、如何在tablespace里增加数据文件?ALTER TABLESPACE ADD DATAFILE SIZE
35、如何变动数据文件的大小?ALTER DATABASE DATAFILE RESIZE ;
36、哪个VIEW用来检查数据文件的大小?DBA_DATA_FILES
37、哪个VIEW用来判断tablespace的剩余空间?DBA_FREE_SPACE
38、如何判断谁往数据库里面插入了一条记录?
三种方法:事先打开审计功能或者在表上建立触发器,事后可以通过logmnr查看。
1)数据库审计功能:
先设置audit_trail参数,决定审计结果保存地点; 然后执行audit insert on schema.table_name whenever successful;这样就行了,在有人做insert操作后,根据audit_trail参数到相应位置去看审计结果就行了。
2)触发器:
create or replace trigger tgname
after insert
on tbname -->判断此表是否被插入记录
for each row
begin
insert into ta(日期) values(sysdate) ;
commit;
end ;
建触发器其实也是审计,是基于值的审计,比数据库审计慢,不过审计的内容可以更详细。
3)logmnr查看日志
39、如何重构索引?
SQL>ALTER INDEX indexname REBUILD;
快速重建索引:
alter session set workarea_size_policy=manual;
oracle 10G以上默认auto,修改成manual才能设置排序区大小。
alter session set sort_area_size=1073741824;
alter session set sort_area_retained_size=1073741824;
设置排序区大小为1G
alter session set db_file_multiblock_read_count=128;
alter index IDX_POI_ID_NAME rebuild online parallel 4 nologging---4个并行操作。
需要注意的是在并行重构完成以后,一定要取消索引的并行度,否则,在OLTP环境中,可能会因为意外的使用并行而出现严重性能问题。alter index IDX_POI_ID_NAME noparallel;
40、oracle partitioning
Oracle分区是 Oracle9i企业版的一个选项,可以增强各种应用程序的可管理性、性能和可用性。分区允许将表、索引以及索引编排表细分为更小的段,从而能在更细的粒度级管理和访问这些数据库对象。Oracle提供丰富的分区模式来满足每一种商务需求。而且,由于它在 SQL语句中是完全透明的,分区几乎可应用于任何应用程序。
分区的优点
分区能改善各种应用程序的可管理性、性能和可用性,具有非常多的优点。分区往往根据数量级提高某些查询或维护操作的性能。另外,分区可以极大地简化常见的管理任务。分区还可以使数据库设计人员和管理人员能够处理一些最前沿的应用程序而引发的最棘手的难题。分区在构建 TB级的系统或对可用性要求极高的系统时非常关键。
分区的基本知识
分区允许将表、索引或索引编排表细分为更小的段。数据库对象的每个段就叫一个区。每个区有自己的名称,也可以具备自己的存储特征。从数据库管理员的角度看,分区的对象有多个段,既可以一起管理也可单独管理。这就赋予管理人员相当大的灵活性来管理分区的对象。然而,从应用的角度看,分区的表与不分区的表是一致的;在通过 SQL DML命令访问分区表时不需要做任何的修改。
表通过使用‘分区键’分区;分区键是确定某个行所在区的一组列。
Oracle9i提供四种表的分区技术:
1)范围分区:每个区由一系列分区键的值来指定(对于将日期列作为分区键的表,‘1月-2001年’区包含分区键值为‘01-1月-2001’至‘31-1月-2001’的所有行)
2)列表分区:每个区由一列分区键值指定(对于将区域列作为分区键值的表,‘北美州’区可能包含的值有‘加拿大’、‘美国’以及‘墨西哥’)
3)哈希分区:哈希算法应用于分区键值,来确定某个行的区
4)范围-哈希组合分区:即范围和哈希分区技术的结合。表首先进行范围分区,然后每个范围区再单独通过哈希分区技术进行分区。
索引编排表既可做范围分区也可做哈希分区。
Oracle9i还提供三种类型的分区索引:
1)本地索引:本地索引是分区表中的一种索引,分区方法与基本分区表的完全一样。本地索引的每个区只对应于基表的一个区。
2)全局分区索引:全局分区索引是分区或非分区表中的索引,通过该表中的不同分区键分区。全局分区索引只能采用范围分区法。例如,表可根据月份进行范围分区,这样就有 12个区,而该表的索引使用不同的分区键进行范围分区,就会有不同数量的区。
3)全局非分区索引:全局非分区索引基本上与非分区表的索引一致。索引结构未被分区。
Oracle提供一套强健的技术用于表、索引和索引编排表的分区,因此分区功能可最优地应用于任何商务环境中的任何应用程序。 Oracle还另外提供了一组完整的 SQL命令用于管理分区表。其中的命令包括添加新区、删除区、拆分分区以及合并分区。
通过限制要检查或操作的数据量和启用并行执行,Oracle分区选项提供许多性能的优点。这些特性包括:
1)分区修剪 (Partitioning Pruning):分区修剪是最简单也是最有效的通过分区改善性能的方法。分区修剪通常根据几个数量级改善查询性能。例如,假定一个应用程序中有一个包含订单历史记录的订单表,而且该表已经按周进行了分区。请求一周内定单的查询只会访问订单表的一个区。如果订单表有 2年的历史数据,该查询将访问一个区而不是 104个区。仅仅由于分区修剪功能的作用,该查询的执行速度实际上快了 100倍。分区修剪与 Oracle其它所有的性能特性一起发挥作用。Oracle将分区修剪功能与任何的索引技术、连接技术或并行访问方法一起使用。
2)智能化分区连接 (Partition-wise Join):分区也可通过使用被称为智能化分区连接的技术改善多表连接的性能。智能化分区连接可用于将两个表连接在一起,而且这两个表都在连接键上分区。智能化分区连接将大型的连接拆分为小的连接,在每个区间执行,减少了整个连接的时间。这显著地提高了串行和并行执行的性能。
3)更新和删除的并行执行:分区能够并行执行 UPDATE、DELETE和 MERGE语句。当访问分区和非分区的数据库对象时,Oracle会并行化 SELECT语句和 INSERT语句。不过,为了并行化 UPDATE、DELETE和 MERGE语句,目标表必须进行分区。并行执行这些 SQL操作可极大地改善性能,尤其是对涉及大量数据PDATE、DELETE或 MERGE操作。
41、刚编译了一个PL/SQL Package但是有错误报道,如何显示出错信息?
SHOW ERRORS
42、如何搜集表的各种状态数据?
ANALYZE:用于分析表或者索引结构的一致性,判断索引与表间是否匹配<cascade>,有没有坏块,数据是不是正确分布在正确的分区中,索引压缩效率等。DBMS_UTILITY.ANALYZE_SCHEMA是等同于analyze的,只是DBMS_UTILITY是在PLSQL中调用了analyze命令。另外ORACLE提供了dbms_stats,该包提供了分析优化相关的信息的更强的功能,但是他不能分析非优化相关的信息。
analyze命令分两种,一种是分析优化相关的信息,语句为analyze table [index] compute[estimate] statistics [for语句];如果要分析非优化相关的信息,语句如analyze index ... validate structure;analyze table ... validate structure [cascade]等。
43、oracle trace
SQL Trace主要是对数据库进行SQL监测,可以随时监测和调整作用于数据的应用程序。比如ERP系统它的应用界面很多,涉及的底层操作也很多,如果想知道在某个界面的操作在底层数据库执行了哪些SQL语句,就需要开启Trace功能记录下这些SQL操作,方便开发人员了解上层应用程序对数据库做了哪些动作。
alter session set sql_trace = true; /*开启*/
alter session set sql_trace = false; /*关闭*/
DBMS_SESSION.SET_SQL_TRACE也可以启动session级别的sql trace。
44、IMPORT和SQL*LOADER这2个工具的不同点?
这两个ORACLE工具都是用来将数据导入数据库的。区别是:IMPORT工具只能处理由另一个ORACLE工具EXPORT生成的数据。而SQL*LOADER可以导入不同的ASCII格式的数据源。
45、用于网络连接的2个文件?
TNSNAMES.ORA, SQLNET.ORA
46、有一个A数据库,分别复制到B和C。 B要求每次A数据更新B也同时更新,C每天更新一次就行,如何制定复制策略!
a->b
1)、如果使用SQL Server复制功能,那么让a->b使用事务性复制方式(同步复制)。
2)、如果表不多,也可以自己写触发器,利用linkserver+distribute transaction。
a->c
1)、如果使用SQL Server复制功能,那么让a->b使用快照复制方式,在某一时间点进行一次性复制。
2)、也可以自己写bat,将a备份后,通过ftp传输备份介质,恢复c。(比较麻烦,不推荐)
47、 有一个数据库200G大小,每天增加50M允许用户随时访问,制定备份策略(详细说明)。
这种情况可以采用增量备份方式。每周日做一次全备份,周一到周六作增量备份(由于数据量较少,可以考虑每30分钟增量备份一次)。这样可以尽量减少性能消耗,而且如果transaction log丢失的情况下,可以保证最多丢失30分钟数据。
48、管理50台数据库,日常工作是检查数据库作业是否完成,你该如何完成这项检查工作?
在每台机器上建立linkserver,然后在DBA管理服务器上做个分布式视图,每次查询该视图,各个机器上的作业情况一目了然。分布式视图写法:
create view vw_job
as
select '机器一' as MName,* from linkserver1..sysjobactivity
union all
select '机器二' as MName,* from linkserver2..sysjobactivity
union all
select '机器三' as MName,* from linkserver3..sysjobactivity
。。。
49、数据库三级模式:
数据库结构分为3级:面向用户或应用程序员的用户级、面向建立和维护数据库人员的概念级、面向系统程序员的物理级。用户级对应外模式,概念级对应模式,物理级对应内模式,使不同级别的用户对数据库形成不同的视图。所谓视图,就是指观察、认识和理解数据的范围、角度和方法,是数据库在用户“眼中"的反映,很显然,不同层次(级别)用户所“看到’’的数据库是不相同的。
1)模式.
模式又称概念模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。它是由数据库管理系统提供的数据模式描述语言(Data Description Language,DDL)来描述、定义的,体现、反映了数据库系统的整体观。
2)外模式
外模式又称子模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。用户可以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(Data Manipulation Lang uage,DML)对这些数据记录进行。外模式反映了数据库的用户观。
3)内模式
内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式翱物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义,它是数据库的存储观。在一个数据库系统中,只有唯一的数据库, 因而作为定义 、描述数据库存储结构的内模式和定义、描述数据库逻辑结构的模式,也是惟一的,但建立在数据库系统之上的应用则是非常广泛、多样的,所以对应的外模式不是惟一的,也不可能是惟一的。
三级模式间的映射
数据库的三级模式是数据库在三个级别 (层次)上的抽象,使用户能够逻辑地、抽象地处理数据而不必关心数据在计算机中的物理表示和存储。实际上,对于一个数据库系统而言一有物理级数据库是客观存在的,它是进行数据库操作的基础,概念级数据库中不过是物理数据库的一种逻辑的、抽象的描述(即模式),用户级数据库则是用户与数据库的接口,它是概念级数据库的一个子集(外模式)。 用户应用程序根据外模式进行数据操作,通过外模式一模式映射,定义和建立某个外模式与模式间的对应关系,将外模式与模式联系起来,当模式发生改变时,只要改变其映射,就可以使外模式保持不变,对应的应用程序也可保持不变;另一方面,通过模式一内模式映射,定义建立数据的逻辑结构(模式)与存储结构(内模式)间的对应关系,当数据的存储结构发生变化时,只需改变模式一内模式映射,就能保持模式不变,因此应用程序也可以保持不变。
50、 关系数据库管理系统能实现的专门关系运算?
选择、连接和投影
51、oracle RBO, CBO
ORACLE提供了CBO、RBO两种SQL优化器。RBO是Rule Based Optimizer。CBO是Cost Based Optimizer。CBO在ORACLE7引入,但在ORACLE8i中才成熟。ORACLE已经明确声明在ORACLE9i之后的版本中(ORACLE 10G ),RBO将不再支持。因此选择CBO是必然的趋势。CBO和 RBO作为不同的SQL优化器,对SQL语句的执行计划产生重大影响,如果要对现有的应用程序从RBO向CBO移植,则必须充分考虑这些影响,避免SQL语句性能急剧下降;但是,对新的应用系统,则可以考虑直接使用CBO,在CBO模式下进行SQL语句编写、分析执行计划、性能测试等工作,这需要开发者对CBO的特性比较熟悉。
在CBO下写SQL语句的注意事项:
1)RBO自ORACLE 6版以来被采用,有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说对数据不“敏感”;CBO计算各种可能“执行计划”的“代价”,即cost,从中选用cost最低的方案,作为实际运行方案。各“执行计划”的cost的计算根据,依赖于数据表中数据的统计分布,ORACLE数据库本身对该统计分布并不清楚,必须要分析表和相关的索引(使用ANALYZE命令),才能搜集到CBO所需的数据。
2)使用CBO时,编写SQL语句时,不必考虑"FROM"子句后面的表或视图的顺序和"WHERE"子句后面的条件顺序;ORACLE自7版以来采用的许多新技术都是基于CBO的,如星型连接排列查询,哈希连接查询,函数索引,和并行查询等。
3)一般而言,CBO所选择的“执行计划”都不会比RBO的“执行计划”差,而且相对而言,CBO对程序员的要求没有RBO那么苛刻,节省了程序员为了从多个可能的“执行计划”中选择一个最优的方案而花费的调试时间,但在某些场合下也会存在问题。较典型的问题有:有时,表明明建有索引,但查询过程显然没有用到相关的索引,导致查询过程耗时漫长,占用资源巨大,这时就需要仔细分析执行计划,找出原因。例如,可以看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引,表dept的列deptno上无索引,WHERE语句有emp.deptno=dept.deptno条件。在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno上的索引显然是用不上,最多在其上做索引全扫描或索引快速全扫描。
4)如果一个语句使用 RBO的执行计划确实比CBO好,则可以通过加 " rule"提示,强制使用RBO。
5)使用CBO时,SQL语句 "FROM"子句后面的表,必须全部使用ANALYZE命令分析过,如果"FROM"子句后面的是视图,则此视图的基础表,也必须全部使用ANALYZE命令分析过;否则,ORACLE会在执行此SQL语句之前,自动进行ANALYZE命令分析,这会极大导致SQL语句执行极其缓慢。
6)使用CBO时,SQL语句 "FROM"子句后面的表的个数不宜太多,因为CBO在选择表连接顺序时,会对"FROM"子句后面的表进行阶乘运算,选择最好的一个连接顺序。假如"FROM"子句后有6个表,则其可选择的连接顺序就是6*5*4*3*2*1 = 720种,CBO选择其中一种,而如果"FROM"子句后有12个表,则其可选择的连接顺序就是12*11*10*9*8*7*6*5*4*3*2*1= 479001600种,可以想象从中选择一种,会消耗多少CPU时间?如果实在是要访问很多表,则最好使用 ORDER提示,强制使用"FROM"子句表固定的访问顺序。
7)使用CBO时,SQL语句中不能引用系统数据字典表或视图,因为系统数据字典表都未被分析过,可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能严重下降。
8)使用CBO时,要注意看采用了哪种类型的表连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。CBO有时会偏重于SMJ和 HJ,但在OLTP系统中,NL一般会更好,因为它高效的使用了索引。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。
9)使用CBO时,必须保证为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析,可用SQL语句“analyze table xxx compute statistics for all indexes;"ORACLE掌握了充分反映实际的统计数据,才有可能做出正确的选择。
10)使用CBO时,要注意被索引的字段的值的数据分布,会影响SQL语句的执行计划。例如:表emp,共有一百万行数据,但其中的emp.deptno列,数据只有4种不同的值,如10、20、30、40。虽然emp数据行有很多,ORACLE缺省认定表中列的值是在所有数据行均匀分布的,也就是说每种deptno值各有25万数据行与之对应。假设SQL搜索条件DEPTNO=10,利用deptno列上的索引进行数据搜索效率,往往不比全表扫描的高,ORACLE理所当然对索引“视而不见”,认为该索引的选择性不高。
优化模式包括Rule、Choose、First rows、All rows四种方式:
1)Rule:基于规则的方式。
2)Choose:默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
3)First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
4)All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走RBO的方式。
设定选用哪种优化模式:
1)Instance级别我们可以通过在initSID.ora文件中设定
OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS
如果没设定OPTIMIZER_MODE参数则默认用的是Choose方式。
2)Sessions级别通过ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS来设定。
3)语句级别用Hint(/*+ ... */)来设定
为什么表的某个字段明明有索引,但执行计划却不走索引?
1)优化模式是all_rows的方式
2)表作过analyze,有统计信息(最可能的就是统计信息有误)
3)表很小,上文提到过的,Oracle的优化器认为不值得走索引。
52、oracle访问数据库的存取方式:
1)全表扫描:(Full Table Scans, FTS)
为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件。一个多块读操作可以使一次I/O能读取多块数据块 (db_block_multiblock_read_count参数设定),而不是只读取一个数据块,这极大的减少了I/O总次数,提高了系统的吞吐量,所以利用多块读的方法可以十分高效地实现全表扫描,而且只有在全表扫描的情况下才能使用多块读操作。在这种访问模式下,每个数据块只被读一次。使用FTS的前提条件:在较大的表上不建议使用全表扫描,除非取出数据的比较多,超过总量的5% -- 10%,或你想使用并行查询功能时。
2)通过ROWID的表存取(Table Access by ROWID或rowid lookup)
行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。这种存取方法不会用到多块读操作,一次I/O只能读取一个数据块。我们会经常在执行计划中看到该存取方法,如通过索引查询数据。
3)索引扫描(Index Scan或index lookup)
我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引查找(index lookup)。一个rowid唯一的表示一行数据,该行对应的数据块是通过一次i/o得到的,在此情况下该次i/o只会读取一个数据库块。
在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。索引扫描可以由2步组成:(1)扫描索引得到对应的rowid值。 (2)通过找到的rowid从表中读出具体的数据。每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1步的 I/O经常是逻辑I/O,即数据可以从内存中得到。但是对于第2步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,是极其费时间的。所以如果多大表进行索引扫描,取出的数据如果大于总量的5% -- 10%,使用索引扫描会效率下降很多。
根据索引的类型与where限制条件的不同,有4种类型的索引扫描:
1)索引唯一扫描(index unique scan)
2)索引范围扫描(index range scan)
3)索引全扫描(index full scan)
4)索引快速扫描(index fast full scan)
53、查看Oracle sql语句执行计划:
SQL>EXPLAIN PLAN FOR select * from dual;
54、pctused与pctfree
pctused(percent used)与pctfree(percent free)是Oracle的两个与性能相关的块级存储参数。
pctused:已用百分比,一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。 pctfree:空闲百分比,用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。 freelist:可用列表是表中的一组可插入数据的可用块。
行连接:指一行存储在多个块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。 行迁移:指一个数据行不适合放入当前块而被重新定位到另一个块(那里有充足的空间)中,但在原始块中保留一个指针的情形。原始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置。
计算公式:
PCTFREE=(Average Row Size-Initial Row Size)*100/Average Row Size
PCTUSED=(100-PCTFREE) -Average Row Size * 100/Availabe Data Space
55、oracle表空间管理
表空间(Tablespace)——为数据库提供使用空间的逻辑结构,其对应物理结构是数据文件,一个表空间可以包含多个数据文件。本地管理表空间(Locally Managed Tablespace简称LMT)——8i以后出现的一种新的表空间的管理模式,通过本地位图来管理表空间的空间使用。 字典管理表空间(Dictionary-Managed Tablespace简称DMT)——8i以前包括以后都还可以使用的一种表空间管理模式,通过数据字典管理表空间的空间。
本地化管理:
就是指Oracle不再利用数据字典表来记录Oracle表空间里面的区的使用状况,而是在每个表空间的数据文件的头部加入了一个位图区,在其中记录每个区的使用状况。每当一个区被使用,或者被释放以供重新使用时,Oracle都会更新数据文件头部的这个记录,反映这个变化。
本地化管理的表空间的创建过程:
语法:CREATE TABLESPACE表空间名字
DATAFILE’数据文件详细信息’
[EXTENT MANAGEMENT { LOCAL
{AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]
关键字EXTENT MANAGEMENT LOCAL指定这是一个本地化管理的表空间。对于系统表空间,只能在创建数据库的时候指定EXTENT MANGEMENT LOCAL,因为它是数据库创建时建立的第一个表空间。 在8i中,字典管理还是默认的管理方式,当选择了LOCAL关键字,即表明这是一个本地管理的表空间。当然还可以继续选择更细的管理方式:是 AUTOALLOCATE还是 UNIFORM.。若为AUTOALLOCATE,则表明让Oracle来决定区块的使用办法;若选择了UNIFORM,则还可以详细指定每个区块的大小,若不加指定,则为每个区使用1M大小。
本地管理表空间与字典管理表空间相比大大提高了管理效率和数据库性能,其优点如下:
1)减少了递归空间管理
本地管理表空间是自己管理分配,而不是象字典管理表空间需要系统来管理空间分配,本地表空间是通过在表空间的每个数据文件中维持一个位图来跟踪在此文件中块的剩余空间及使用情况。并及时做更新。这种更新只对表空间的额度情况做修改而不对其他数据字典表做任何update操作,所以不会产生任何回退信息,从而大大减少了空间管理,提高了管理效率。同时由于本地管理表空间可以采用统一大小分配方式(UNIFORM),因此也大大减小了空间管理,提高了数据库性能。
2)系统自动管理extents大小或采用统一extents大小
本地管理表空间有自动分配(AUTOALLOCATE)和统一大小分配(UNIFORM)两种空间分配方式,自动分配方式(AUTOALLOCATE)是由系统来自动决定extents大小,而统一大小分配(UNIFORM)则是由用户指定extents大小。这两种分配方式都提高了空间管理效率。
3)减少了数据字典之间的竞争
因为本地管理表空间通过维持每个数据文件的一个位图来跟踪在此文件中块的空间情况并做更新,这种更新只修改表空间的额度情况,而不涉及到其他数据字典表,从而大大减少了数据字典表之间的竞争,提高了数据库性能。
4)不产生回退信息
因为本地管理表空间的空间管理除对表空间的额度情况做更新之外不修改其它任何数据字典表,因此不产生回退信息,从而大大提高了数据库的运行速度。
5)不需合并相邻的剩余空间
因为本地管理表空间的extents空间管理会自动跟踪相邻的剩余空间并由系统自动管理,因而不需要去合并相邻的剩余空间。同时,本地管理表空间的所有extents还可以具有相同的大小,从而也减少了空间碎片。
6)减少了空间碎片
7)对临时表空间提供了更好的管理
表空间管理方式转换:
字典管理表空间每当表或其他对象需要扩大的时候都检查其数据字典以确保有可用的空间分配给对象,然后给对象分配一个新区段并更新其可用空间信息。本地管理表空间保存数据文件本身的空间管理信息,而且表空间自动跟踪每个数据文件块的可用或已用状态。 在事务比较多的数据库中显然字典管理每次插入数据时都会检查数据字典,这就使得数据库性能有所损耗。
1)命令方式转移。
首先你要新建一个oracle表空间,在oracle 10g以后默认都是采用本地管理表空间的。
对于表空间的转移使用命令: ALTER TABLE temp MOVE TABLESPACE new_temp;
对于索引你需要重建: ALTER TABLE index REBUILD TABLESPACE new_index;
显然上面的方法并不适用于对system表进行转换,因为你不能建立2个同名的system表。
2)采用oracle提供的PL/SQL数据包中的DBMS_SPACE_ADMIN.
在转换system表前,你必须把所有的其他表空间转换为本地管理。
EXECUTE dbms_space_admin.tablespace_migrate_to_local("tablespace"); ——转行表空间
然后同样的方法将system表空间也进行转换。
EXECUTE dbms_space_admin.tablespace_migrate_to_local("system");
使用这种方法很好,但是它建立的表空间没有automatic segment space managerment选项,所有字典管理表空间都是用默认手动段空间管理,而且在转换为本地管理的表空间是不能进行修改。还有一个缺点,就是表空间如果存在空间碎片的话,此方法也不能解决碎片问题。
=======》oracle建议采用第一种方法。
56、acle ASSM
Oracle自动段空间管理。从10g开始,oracle开始提供Shrink的命令,假如我们的表空间中支持自动段空间管理 (ASSM),就可以使用这个特性缩小段,即降低HWM。
创建一个本地管理的表空间,采用段自动管理方式
create tablespace demo
datafile /ora01/oem/demo01.dbf
size 50m
EXTENT MANAGEMENT LOCAL --一定是本地管理
SEGMENT SPACE MANAGEMENT AUTO. --ASSM管理的标志
57、如果一个表在2004-08-04 10:30:00被drop,在有完善的归档和备份的情况下,如何恢复?
手工拷贝回所有备份的数据文件
startup mount;
alter database recover automatic until time '2004-08-04:10:30:00';
alter database open resetlogs;
58、rman是什么,有何特点?
RMAN(Recovery Manager)是DBA的一个重要工具,用于备份、还原和恢复oracle数据库, RMAN可以用来备份和恢复数据库文件、归档日志、控制文件、系统参数文件,也可以用来执行完全或不完全的数据库恢复。RMAN有三种不同的用户接口:
COMMAND LINE方式、GUI方式(集成在OEM中的备份管理器)、API方式(用于集成到第三方的备份软件中)。
具有如下特点:
1)功能类似物理备份,但比物理备份强大N倍;
2)可以压缩空块;
3)可以在块水平上实现增量;
4)可以把备份的输出打包成备份集,也可以按固定大小分割备份集;
5)备份与恢复的过程可以自动管理;
6)可以使用脚本(存在Recovery catalog中)
7)可以做坏块监测
59、standby的特点
备用数据库(standby database):ORACLE推出的一种高可用性(HIGH AVAILABLE)数据库方案,在主节点与备用节点间通过日志同步来保证数据的同步,备用节点作为主节点的备份,可以实现快速切换与灾难性恢复,从920开始,还开始支持物理与逻辑备用服务器。
Oracle 9i中的三种数据保护模式分别是:
1)、MAXIMIZE PROTECTION:最大数据保护与无数据分歧,LGWR将同时传送到备用节点,在主节点事务确认之前,备用节点也必须完全收到日志数据。如果网络不好,引起LGWR不能传送数据,将引起严重的性能问题,导致主节点DOWN机。
2)、MAXIMIZE AVAILABILITY:无数据丢失模式,允许数据分歧,允许异步传送。正常情况下运行在最大保护模式,在主节点与备用节点的网络断开或连接不正常时,自动切换到最大性能模式,主节点的操作还是可以继续的。在网络不好的情况下有较大的性能影响。
3)、MAXIMIZE PERFORMANCE:这种模式应当可以说是从8i继承过来的备用服务器模式,异步传送,无数据同步检查,可能丢失数据,但是能获得主节点的最大性能。9i在配置DATA GUARD的时候默认就是MAXIMIZE PERFORMANCE。
60、SGA主要有那些部分,主要作用是什么
db_cache:
数据库缓存(Block Buffer)对于Oracle数据库的运转和性能起着非常关键的作用,它占据Oracle数据库SGA(系统共享内存区)的主要部分。Oracle数据库通过使用LRU算法,将最近访问的数据块存放到缓存中,从而优化对磁盘数据的访问.
shared_pool:
共享池的大小对于Oracle性能来说都是很重要的。共享池中保存数据字典高速缓冲和完全解析或编译的的PL/SQL块和SQL语句及控制结构
large_pool:
使用MTS配置时,因为要在SGA中分配UGA来保持用户的会话,就是用Large_pool来保持这个会话内存。 使用RMAN做备份的时候,要使用Large_pool这个内存结构来做磁盘I/O缓存器
java_pool:
为java procedure预备的内存区域,如果没有使用java proc,java_pool不是必须的
61、statspack有何认识
Oracle有提供一个用于诊断性能问题的工具包(statspack).当然,可能也有一些第三方的用于oracle性能诊断的工具,但是我想没有其它工具比ORACLE本身提供的工具更全面,更准确了。STATSPACK需要安装。安装后我们需要设置一下检查的时间间隔,实际上就是创建一个oracle的JOB。Statspack或根据我们设定的时间间隔来从oracle的动态性能视图中捕捉一些与性能相关的数据,然后根据一定的公式进行计算,生成一个有关于oracle各项性能指标的报告。报告罗列了一些实际的活动状况(负载,内存命中率等等),最高等待事件,以及TOP SQL等内容,是我们进行性能诊断的一个比较综合的一个工具。
62、如果系统现在需要在一个很大的表上创建一个索引,你会考虑哪些因素,如何做以尽量减小对应用的影响。
在系统比较空闲时: 使用nologging选项(如果有dataguard则不可以使用nologging),建索引时,Oracle会对数据按照索引进行排序,所以要增大的sort_ared_size(workarea_size_policy=manual)或pga_aggregate_target(workarea_size_policy=auto)
63、关于oracle自带的表
emp:
empno:员工编号; ename:员工名字; job:员工工种; mgr:上司; hiredate:入职时间;sal: 基本工资; comm: 补贴; deptno:所属部门编号;
dept:
deptno:部门编号; dname:部门名称; loc:地理位置;
salgrade:
grade: 工资等级; losal:最低限额; hisal:最高限额;
dual:
系统自带的一张空表; 可用于计算数据:select 2*3 from dual;
64、 回滚段的作用是什么
事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。
事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在undo表空间中,ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。
读一致性:当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。当ORACLE执行Select语句时,ORACLE依照当前的系统改变号(SYSTEM CHANGE NUMBER-SCN)来保证任何前于当前SCN的未提交的改变不被该语句处理。可以想象:当一个长时间的查询正在执行时,若其他会话改变了该查询要查询的某个数据块,ORACLE将利用回滚段的数据前影像来构造一个读一致性视图。
65、 绑定变量是什么?绑定变量有什么优缺点?
绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,查询bind value在运行时传递,然后绑定执行。优点是减少硬解析,降低CPU的争用,节省shared_pool ;缺点是不能使用histogram,sql优化比较困难。
66、不借助第三方工具,怎样查看sql的执行计划
1)使用Explain Plan,查询PLAN_TABLE;
SQL> EXPLAIN PLAN
SET STATEMENT_ID='QUERY1'
FOR
SELECT *
FROM a
WHERE aa=1;
SQL> SELECT operation, options, object_name, object_type, ID, parent_id
FROM plan_table
WHERE STATEMENT_ID = 'QUERY1'
ORDER BY ID;
2)SQLPLUS中的SET TRACE即可看到Execution Plan Statistics
SET AUTOTRACE ON;
67、如何定位重要(消耗资源多)的SQL
使用CPU多的用户session
SELECT a.SID, spid, status, SUBSTR (a.program, 1, 40) prog, a.terminal,a.SQL_TEXT,
osuser, VALUE / 60 / 100 VALUE
FROM v$session a, v$process b, v$sesstat c
WHERE c.statistic# = 12 AND c.SID = a.SID AND a.paddr = b.addr
ORDER BY VALUE DESC;
68、如何跟踪某个session的SQL
利用TRACE跟踪
ALTER SESSION SET SQLTRACE ON;
COLUMN SQL format a200;
SELECT machine, sql_text SQL
FROM v$sqltext a, v$session b
WHERE address = sql_address
AND machine = '&A'
ORDER BY hash_value, piece;
69、Oracle学习两大块:
一块是开发,一块是管理。开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做form。有点类似于程序员,需要有较强的逻辑思维和创造能力,是青春饭J;管理则需要对oracle数据库的原理有深刻的认识,有全局操纵的能力和紧密的思维,责任较大,因为一个小的失误就会down掉整个数据库,相对前者来说,后者更看重经验。
===>IF走数据库路线:数据库管理的责任重大,很少公司愿意请一个刚刚接触oracle的人去管理数据库。对于刚刚毕业的年轻人来说,可以先选择做开发,有一定经验后转型,去做数据库的管理
===>深入学习的方向:
管理:可以考OCP(Oracle9i Certified Professional)证书,对oracle先有一个系统的学习,然后看Oracle Concepts、oracle online document,对oracle的原理会有更深入的了解,同时可以开始进行一些专题的研究如:RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&RECOVER等等。
开发:对于想做Oracle开发的,在了解完Oracle基本的体系结构之后,可以重点关注PL/SQL及Oracle的开发工具这一部分。 PL/SQL主要是包括怎么写SQL语句,怎么使用Oracle本身的函数,怎么写存储过程、存储函数、触发器等。 Oracle的开发工具主要就是Oracle自己的Developer Suite(Oracle Forms Developer and Reports Developer这些),学会如何熟练使用这些工具。
70、oracle中的动态性能表:
表名 |
说明 |
V$ACCESS |
显示数据库中的对象信息 |
V$ARCHIVE |
数据库系统中每个索引的归档日志方面的信息 |
V$BACKUP |
所有在线数据文件的状态 |
V$BGPROCESS |
描述后台进程 |
V$CIRCUIT |
有关虚拟电路信息 |
V$DATABASE |
控制文件中的数据库信息 |
V$DATAFILE |
控制文件中的数据文件信息 |
V$DBFILE |
构成数据库所有数据文件 |
V$DB_OBJECT_CACHE |
表示库高速缓存中被缓存的数据库对象 |
V$DISPATCHER |
调度进程信息 |
V$ENABLEDPRIVS |
那些特权接通 |
V$FILESTAT |
文件读/写统计信息 |
V$FIXED_TABLE |
显示数据库中所有固定表、视图和派生表 |
V$INSTANCE |
当前实例状态 |
V$LATCH |
每类闩锁的信息 |
V$LATCHHOLDER |
当前闩锁占有者的信息 |
V$LATCHNAME |
在V$LATCH表中表示的闩锁的译码闩锁名 |
V$LIBRARYCACHE |
库高速缓冲存储管理统计 |
V$LICENSE |
许可限制信息 |
V$LOADCSTAT |
SQL*Loader在直接装入执行过程中的编译统计 |
V$LOCK |
有关封锁和资源信息,不包含DDL封锁 |
V$LOG |
控制文件中的日志文件信息 |
V$LOGFILE |
有关日志文件信息 |
V$LOGHIST |
控制文件中的日志历史信息 |
V$LOGHISTORY |
日志历史中所有日志的归档日志名 |
V$NLS_PARAMETERS |
NLS参数的当前值 |
V$OPEN_CURSOR |
每一个用户会话期当前已打开和分析的光标 |
V$PARAMETER |
当前参数值的信息 |
V$PROCESS |
当前活动进程的信息 |
V$QUEUE |
多线索信息队列的信息 |
V$REVOVERY_LOG |
需要完成介质恢复的归档日志 |
V$RECOVERY_FILE |
需要介质恢复的文件状态 |
V$REQDIST |
请求时间直方图,分为12个范围 |
V$RESOURCE |
有关资源信息 |
V$ROLLNAME |
所有在线回滚段的名字 |
V$ROLLSTAT |
所有在线回滚段的统计信息 |
V$ROWCACHE |
数据字典活动的统计信息(每一个包含一个数据字典高速缓存的统计信息) |
V$SESSION |
每一个当前会话期的会话信息 |
V$SESSION_WAIT |
列出活动会话等待的资源或事件 |
V$SESSTAT |
对于每一个当前会话的当前统计值 |
V$SESS_IO |
每一个用户会话的I/O统计 |
V$SGA |
系统全局区统计信息 |
V$SGASTAT |
系统全局区的详细信息 |
V$SHARED_SERVER |
共享服务器进程信息 |
V$SQLAREA |
共享光标高速缓存区的统计信息,每一个有一个共享光标的统计信息 |
V$SQLTEXT |
属于SGA中的共享SQL光标的SQL语句文本 |
V$STATNAME |
在V$SESSTAT表中表示的统计信息的译码统计名 |
V$SYSSTAT |
表V$SESSETA中当前每个统计的全面的系统值 |
V$THREAD |
从控制文件中得到线索信息 |
V$TIMER |
以百分之一秒为单位的当前时间 |
V$TRANSACTION |
有关事务的信息 |
V$TYPE_SIZE |
各种数据库成分的大小 |
V$VERSION |
ORACLE Server中核心库成员的版本号,每个成员一行 |
V$WAITSTAT |
块竞争统计,当时间统计可能时,才能更新该表 |
71、SQL常用命令:
数据检索: Select
数据维护(DML): insert、update、delete
数据定义(DDL):create、drop、alert、rename、truncate
事务处理控制:commit、rollback、savepoint
数据控制(DCL):Grant、revoke
72、SQL*Plus的使用:
1)文件命令
a) SAVE filename把当前SQL缓冲区的内容存储在文件filename中
b) GET filename把文件filename中的内容写入当前SQL缓冲区
c) START filename执行存储在filename中的内容
d) @ filename执行存储在 filename中的内容
e) EDIT filename打开文本编辑器,把当前SQL缓冲区的内容写入文件afiedt.buf
f) SPOOL filename把查询的数据结果存储在filename中
g) EXIT退出SQL*Plus
2)文本编辑命令
a) A[PPEND] text
b) C[HANGE]/old/new
c) CL[EAR]buff[ER]
d) DEL
e) I[NPUT] text
f) L[IST] n
g) N text
73、oracle数据字典的四大视图类型:
- user用户拥有的对象
- all用户可访问对象
- DBA所有数据对象
- v$服务器性能对象
74、oracle通用数据类型:
1)BINARY_INTEGER: 基本数值整型,-2147483647 -----2147483647
2)NUMBER[(precision,scale):]基本浮点数值型
3)CHAR[(maximun_length)]: 固定长度的字符型,最大值为32760
4)LONG:可变常字符型,最大长度为32760
5)LONG RAW:二进制型,最大长度为32760
6)VARCHAR2(maximum_length): 可变长字符型,最大长度为32767
7)DATE:日期和时间类型
8)BOOLEAN: 逻辑型(TRUE、FALSE或NULL)
75、数据库引擎
数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
76、Mysql引擎:
在缺省情况下,MySQL支持三个引擎:ISAM、MyISAM和HEAP。另外两种类型InnoDB和Berkley(BDB),也常常可以使用。
ISAM
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支 持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时 数据,通过其复制特性,MySQL能够支持这样的备份应用程序。
MyISAM
MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的 MyISAMPack工具。MyISAM强调了快速读取操作,这可能就是为什么MySQL受到了Web开发如 此青睐的主要原因:在Web开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和Internet平台提供商(Internet Presence Provider,IPP)只允许使用MyISAM格式。
HEAP
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和 MyISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费 大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。让我再重复一遍:在你用完 表格之后,不要忘记删除表格。
InnoDB和Berkley DB
InnoDB和Berkley DB(BDB)数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MySQL++ API。在使用MySQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性 中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。
数据库引擎设定与切换:
1)CREATE TABLE tblMyISAM (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
value_a TINYINT
)TYPE=MyISAM;
2)ALTER TABLE tblMyISAM CHANGE TYPE=InnoDB;
3)SHOW TABLE STATUS FROM tblInnoDB;
77、Mysql6的新特性:(与mysql5比较)
1)新Falcon事务存储引擎(“Falcon存储引擎” ) 。
2)支持更多的Unicode字符集: utf16, utf32,和4字节utf8。 这些字符集支持这些附加的Unicode字符集,也就是那些在基础多语言基础之外的字符 。
3)增加了 BACKUP DATABASE和 RESTORE语句来进行备份和还原操作.见第6.3节, “使用MySQL备份” 。
4)改进INFORMATION_SCHEMA数据库,并增加了INFORMATION_SCHEMA.PARAMETERS表,INFORMATION_SCHEMA.ROUTINES增加了新列
5)对子查询和Join进行了优化,包括对MyISAD和InnoB存储引擎分散范围内的批量索引访问。
6)RESET SLAVE不再更改复制连接的参数;以前,它重置他们到命令行指定的数值
7)LOCK TABLES语法已经扩展,支持不会自动事务提交的事务表锁。在后面的 LOCK TABLES ... IN SHARE MODE或者 LOCK TABLES ... IN EXCLUSIVE MODE你可以使用未提及的表级锁,你也可以确保 LOCK TABLES语句可以连续的得到多次的事务锁,增加额外的表格到锁集合,而无需解锁以前已经锁住的表格。当使用LOCK TABLES with IN SHARE MODE或者在 EXCLUSIVE MODE ,表级锁在事务结束前不会解锁。 使用LOCK TABLE获得的事务锁在事务结束时释放,包括显示的提交或者回滚,或者由于语句引起的隐式提交,或者由于链接关闭. LOCK TABLES的行为在 READ和WRITE锁时报出不变(也就是当不使用 IN SHARE MODE或者 IN EXCLUSIVE MODE )。
8)增强的XML功能,包括一个新的LOAD XML语法
9)支持扩展的注释,包括表,列和索引。
78、oracle版本间比较:
Oracle 11g: g= grid computing
1.数据库管理部分
◆数据库重演(Database Replay)
这一特性可以捕捉整个数据的负载,并且传递到一个从备份或者standby数据库中创建的测试数据库上,然后重演负责以测试系统调优后的效果。
◆SQL重演(SQL Replay)和前一特性类似。但是只是捕捉SQL负载部分,而不是全部负载。
◆计划管理(Plan Management) 这一特性允许你将某一特定语句的查询计划固定下来,无论统计数据变化还是数据库版本变化都不会改变她的查询计划。
◆自动诊断知识库(Automatic Diagnostic Repository ADR) 当Oracle探测到重要错误时,会自动创纪一个事件(incident),并且捕捉到和这一事件相关的信息,同时自动进行数据库健康检查并通知DBA。此外,这些信息还可以打包发送给Oracle支持团队。
◆事件打包服务(Incident Packaging Service)如果你需要进一步测试或者保留相关信息,这一特性可以将与某一事件相关的信息打包。并且你还可以将打包信息发给oracle支持团队。
◆基于特性打补丁(Feature Based Patching) 在打补丁包时,这一特性可以使你很容易区分出补丁包中的那些特性是你正在使用而必须打的。企业管理器(EM)使你能订阅一个基于特性的补丁服务,因此企业管理器可以自动扫描那些你正在使用的特性有补丁可以打。
◆自动SQL优化(Auto SQL Tuning) 10g的自动优化建议器可以将优化建议写在SQL profile中。而在11g中,你可以让oracle自动将能3倍于原有性能的profile应用到SQL语句上。性能比较由维护窗口中一个新管理任务来完成。
◆访问建议器(Access Advisor) 11g的访问建议器可以给出分区建议,包括对新的间隔分区(interval partitioning)的建议。间隔分区相当于范围分区(range partitioning)的自动化版本,她可以在必要时自动创建一个相同大小的分区。范围分区和间隔分区可以同时存在于一张表中,并且范围分区可以转换为间隔分区。
◆自动内存优化(Auto Memory Tuning) 在9i中,引入了自动PGA优化;10g中,又引入了自动SGA优化。到了 11g,所有内存可以通过只设定一个参数来实现全表自动优化。你只要告诉oracle有多少内存可用,她就可以自动指定多少内存分配给PGA、多少内存分 配给SGA和多少内存分配给操作系统进程。当然也可以设定最大、最小阈值。
◆资源管理器(Resource Manager) 11g的资源管理器不仅可以管理CPU,还可以管理IO。你可以设置特定文件的优先级、文件类型和ASM磁盘组。
◆ADDM,ADDM在10g被引入。11g中,ADDM不仅可以给单个实例建议,还可以对整个RAC(即数据库级别)给出建议。另外,还可以将一些指示(directive)加入ADDM,使之忽略一些你不关心的信息。
◆AWR基线(AWR Baselines) AWR基线得到了扩展。可以为一些其他使用到的特性自动创建基线。默认会创建周基线。
2.PLSQL部分
◆结果集缓存(Result Set Caching) 这一特性能大大提高很多程序的性能。在一些MIS系统或者OLAP系统中,需要使 用到很多"select count(*)"这样的查询。在之前,我们如果要提高这样的查询的性能,可能需要使用物化视图或者查询重写的技术。在11g,我们就只需要加一个 /*+result_cache*/的提示就可以将结果集缓存住,这样就能大大提高查询性能。当然,在这种情况下,我们可能还要关心另外一个问题:完整性。因为在oracle中是通过一致性读来保证数据的完整性的。而显然,在这种新特性下,为提高性能,是从缓存中的结果集中读取数据,而不会从回滚段中读取数据的。关于这个问题,答案是完全能保证完整性。因为结果集是被独立缓存的,在查询期间,任何其他DML语句都不会影响结果集中的内容,因而可以保证数据的完整性。
◆对象依赖性改进 在11g之前,如果有函数或者视图依赖于某张表,一旦这张表发生结构变化,无论是否涉及到函数或视图所依赖的属性,都会使函数或视图变为invalid。在11g中,对这种情况进行了调整:如果表改变的属性与相关的函数或视图无关,则相关对象状态不会发生变化。
◆正则表达式的改进 在10g中,引入了正则表达式。这一特性大大方便了开发人员。11g,oracle再次对这一特性进行了改进。其中,增加了一个名为regexp_count的函数。另外,其他的正则表达式函数也得到了改进。
◆新SQL语法 =>我们在调用某一函数时,可以通过=>来为特定的函数参数指定数据。而在11g中,这一语法也同样可以出现在sql语句中了。例如,你可以写这样的语句:select f(x=>6) from dual;
◆对TCP包(utl_tcp、utl_smtp…)支持FGAC(Fine Grained Access Control)安全控制
◆增加了只读表(read-only table) 在以前,我们是通过触发器或者约束来实现对表的只读控制。11g中不需要这么麻烦了,可以直接指定表为只读表。
◆触发器执行效率提高了
◆设置触发器顺序 可能在一张表上存在多个触发器。在11g中,你可以指定它们的触发顺序,而不必担心顺序混乱导致数据混乱。
◆混合触发器(compound trigger) 这是11g中新出现的一种触发器。她可以让你在同一触发器中同时具有申明部分、before过程部分、after each row过程部分和after过程部分。
◆创建无效触发器(Disabled Trigger) 11g中,开发人员可以可以闲创建一个invalid触发器,需要时再编译她。
◆在非DML语句中使用序列(sequence) 在之前版本,如果要将sequence的值赋给变量,需要通过类似以下语句实现:select seq_x.next_val into v_x from dual;在11g中,不需要这么麻烦了,下面语句就可以实现:v_x := seq_x.next_val;
◆PLSQL_Warning 11g中,可以通过设置PLSQL_Warning=enable all,如果在"when others"没有错误爆出就发警告信息。
◆PLSQL的可继承性 可以在oracle对象类型中通过super(和java中类似)关键字来实现继承性。
◆编译速度提高 因为不在使用外部C编译器了,因此编译速度提高了。
◆改进了DBMS_SQL包 其中的改进之一就是DBMS_SQL可以接收大于32k的CLOB了。另外还能支持用户自定义类型和bulk操作。
◆增加了continue关键字 在PLSQL的循环语句中可以使用continue关键字了(功能和其他高级语言中的continue关键字相同)。
◆新的PLSQL数据类型——simple_integer这是一个比pls_integer效率更高的整数数据类型。
3.其他部分
◆增强的压缩技术 可以最多压缩2/3的空间。
◆高速推进技术 可以大大提高对文件系统的数据读取速度。
◆增强了DATA Guard可以创建standby数据库的快照,用于测试。结合数据库重演技术,可以实现模拟生成系统负载的压力测试。
◆在线应用升级 也就是热补丁——安装升级或打补丁不需要重启数据库。
◆数据库修复建议器 可以在错误诊断和解决方案实施过程中指导DBA。
◆逻辑对象分区 可以对逻辑对象进行分区,并且可以自动创建分区以方便管理超大数据库(Very Large Databases VLDBs)。
◆新的高性能的LOB基础结构
◆新的PHP驱动
Oracle 10g:
1)对新的架构支持
对 Intel 64位平台的支持。支持 infiniband。极大地改进了多层开发架构下的性能和可扩展能力。新的版本也借用了 Windows操作系统对 Fiber支持的优势。
2)高速数据处理能力
在这个版本中,一个新类型的表对象被引入。该表结构对大量插入和解析数据很有益处。这个表结构对 FIFO的数据处理应用有着很好的支持。这样的应用在电信、生产应用中常常能够用到。通过使用这种优化的表结构能够对电信级的应用起到巨大的性能改进作用。
3)RAC workload管理
一个新的服务框架。使得管理员作为服务来设置、管理监视应用负载。
4)针对 OLAP的分区
通过对哈希分区的全局索引的支持可以提供大量的并发插入的能力
5)新的改进的调度器( Scheduler )
引入了一个新的数据库调度器,提供企业级调度功能。这个调度器可以使得管理员有能力在特定日期、特定时间调度 Job。还有能力创建调度对象的库能够和既有的对象被其他的用户共享。
6)简化的数据库配置与升级
提供了预升级检查能力,有效地减少升级错误。去除了了很多和数据库配置有关的任务或者对其加以自动化。在初始安装的时候,所有数据库都被预配置包括在 OEM环境中而无需建立一个管理资料库。补丁程序可以自动标记并自动从 Oracle Metalink下载。
7)自动存储管理
新版本的数据库能够配置成使用 Oracle提供的存储虚拟层( Storage Virtualization Layer)。自动并简化数据库的存储。管理员现在可以管理少数的磁盘组而无需管理数千个文件--自动存储管理功能可以自动配置磁盘组,提供数据冗余和数据的优化分配。
8)自动的基于磁盘备份与恢复
10G也极大的简化了备份与恢复操作。这个改进被称作Disk based Recovery Area,可以被一个联机Disk Cache用来进行备份与恢复操作。备份可以调度成自动化操作,自动化优化调整。备份失败的时候,可以自动重启,以确保 Oracle能够有一个一致的环境使用。
9)应用优化
以前的版本中, DBA更多时候要手工对 SQL语句进行优化调整。这里引入了一些新的工具,从此 DBA无需手工做这些累人的事情。(这样的说法似乎有些太绝对)
10)自动化统计收集
为对象自动化收集优化统计。
11)自动化实例调整
DBA需要干预的越来越少么?好消息还是坏消息?
12)自动化内存调整
上一个版本对 UGA能够进行自动化 Tuning,这版本能够对 SGA相关的参数进行调整。这意味着 DBA只需要对2个内存参数进行配置:用户可用的总的内存数量和共享区的大小。
13)缩短应用和数据库升级的宕机时间
通过使用 standby数据库。允许在不同版本的 standby和产品数据库间切换。现有的联机重定义功能能够支持一步克隆所有相关的数据库对象。
14)回闪 (Flashback)任何错误
该版本的 Oracle也扩展了 Flashback的能力。加了一个新类型的 Log文件,该文件记录了数据库块的变化。这个新的 Log文件也被自动磁盘备份和恢复功能所管理。如果有错误发生,例如针对不成功的批处理操作,DBA可以运行 FlashBack。用这些 before Images快速恢复整个数据库到先前的时间点--无须进行恢复操作,这个新功能也可以用到 Standby数据库中。 Flashback是数据库级别的操作,也能回闪整个表。既有的 FlashBack查询的能力也已经加强。在这个版本中,管理员能够快速查看特定事务导致的变化。
15)Enhanced Data Guard Infrastructure
16)超大数据库的支持
可支持到 8E的数据量。改进的存储、备份、恢复管理也对超大数据库有着很好的支持。分区可以支持索引组织表。
17)缩短信息周转时间
新版本的 Oracle提供了加强的 ETL功能。可以方便的构建大型数据仓库和多个数据集市。一个新的变化数据捕捉的框架允许管理员能够轻易的捕捉并发布数据的变化。新的 CDC功能利用的是 Oracle的 Stream技术架构。 对于大数据量的转移,新版本提供了对可传输表的跨平台的支持,允许大批量数据快速从数据库上的脱离并附接到第二个数据库上。
18)增强的外部表功能
19)SQL Loader的功能加强
20)增强的 SQL分析能力
21)增强的 OLAP分析功能
Oracle内建的分析功能得到增强。提供了新的基于 PL/SQL和 XML的接口。提供了新的并行能力,以便于进行聚合和 SQL IMPERT操作。一些算法得到改进。同时 OEM能够用来监视并管理数据挖掘环境。
22)BIOINFORMATICS的支持
这个版本包含对 BIOINFORMATICS技术的特定支持。包括对 Double和 Float数据类型的 Native支持。内建的统计函数支持常见的 ANOVA分析等。
23)改进的数据挖掘的能力
24)XML方面的增强,多媒体,文档与文本管理,
25)SQL语言,PL/SQL语言,JDBC支持更好
1、存储过程
概念: 我们将某些需要多次调用的实现某个特定任务的代码段编写成一个过程,在服务器通过过程名来电泳它们。
使用: 创建时就已经编译和优化,调用后相关信息就保存在内存中,下次使用时直接使用。
分类: 系统存储过程、用户自定义存储过程
优点: (1)实现了模块化编程。
(2)存储过程具有对数据库立即访问的功能。
(3)使用存储过程可以加快程序的运行速度。
(4)使用存储过程可以减少网络流量。
(5)使用存储过程可以提高数据库的安全性。
系统存储过程:
a.存储过程保存在master数据库中,其前缀是SP_,它们为检索系统表的信息提供了方便快捷的方法。(?是否所有的存储过程都保存在master中)
b.本地存储过程名称前面没有前缀sp_
c.临时存储过程属于本地存储过程,在存储过程名称前加一个“#”,只能存在一个用户会话中,名称前加“##”其为全局存储过程,存在所有的用户会话中。
创建存储过程:
创建存储过程注意事项:(1)输入参数、输出参数
(2) sql语句
(3)返回给调用者的状态值
(4) 一个存储过程最大尺寸的为128 M
用T-sql 语句创建存储过程:
格式:create proc 存储过程名(
@name char(10) ,
@id int output
) as
Sql语句……
执行存储过程: exec 存储过程名
注意:有输出的存储过程运行时格式为,exexc 存储过程名 输入实参,输出实参output
存储过程的要点:
存储过程被创建之后,它的名字就存储在系统表sysobjects中,它的源代
码存放在系统表syscomments中。
使用系统存储过程:
(1) sp_help name -- 参数name 为要查看的存储过程的名称
(2) sp_helptext name -- name (存~名)返回存储过程的源代码
(3) sp_stored_procedures –返回当前数据库的存储过程列表
(4) sp_rename a,b -- a为旧名,b为新名
删除存储过程: drop procedure name --name为存储过程名
2、 游标
a) 为什么使用游标?
答:使用游标(光标)实现以逐行的形式集中处理数据,而无须将数据行的集合全部读到应用程序来处理。游标可在数据库服务器内部处理结果集。
b) 游标分类
(1)根据处理特性:静态游标、动态游标、关键字游标(键集驱动游标 )。
(2)在结果集中移动方式:滚动游标(默认)和前向游标(FORWARD_ONLY)。
(3)结果集是否允许修改:只读游标和可写游标
c) 创建游标步骤
a. 声明游标(declare)
b. 打开游标(open)
c. 存取游标(fetch)
d. 关闭游标(close)
e. 删除游标(deallocate)
d) 创建游标格式
--声明游标
declare 游标名 cursor
for
--打开游标
open 游标名
--存取游标
fetch 游标
3、事务
A. 什么是事务?
答:事务是用户定义的一个操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位(构成单一逻辑工作单元的操作集合)
B. 事务的特点?(简称ACID)
答:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
C. 事务分类?
答:(1)显式事务:当明确键入 begin trans 和 commit 语句时,就会发生
(2)隐式事务:implicit_transactions on 语句,将隐性事务模式设置为打开
(3)自动提交事务:默认为此事务。
D. 事务的工作方式?
答:(1)创建(开始)事务: begin trans 事务名
(2)提交事务:commit 事务名
(3)回滚事务:rollback tran 事务名
(4)事务中设置保存点:save tran 保存点名(注意)保存点是指一个位置,此位置之前的事务语句不可回滚,即:有效的事务语句
E. 事务例子1?(仅sql中)CHAP7
4、数据库的安全性
(1)概念?
答:是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。
(3)角色?
答:是向用户分配系统特权的主要方式。
(4)角色分类?
答:a.服务器角色:
Sysadmin:可以在 SQL Server 中执行任何活动。
Securityadmin:可以管理登录和 CREATE DATABASE 权限,还可以读取错误日志和更改 密码。
Serveradmin:可以设置服务器范围的配置选项,关闭服务器。
Setupadmin:可以管理链接服务器和启动过程。
Processadmin:可以管理在 SQL Server 中运行的进程。
Diskadmin:可以管理磁盘文件。
Dbcreator:可以创建、更改和除去数据库。
b.数据库角色{public 角色:其包含在每个数据库中,它不能被删除,每个用户都属于public角色
固定数据库角色:(每个数据库都拥有以下固定数据库角色)
db_owner:在数据库中有全部权限。
db_securityadmin:可以管理全部权限、对象所有权、角色和角色成员资格。
db_accessadmin:可以添加或删除用户 ID。
db_ddladmin:可以发出 ALL DDL,但不能发出 GRANT、REVOKE 或 DENY 语句。
db_backupoperator :可以发出 DBCC、CHECKPOINT 和 BACKUP 语句。
db_datareader :可以选择数据库内任何用户表中的所有数据。
db_denydatawriter :不能更改数据库内任何用户表中的任何数据。
db_denydatareader:不能选择数据库内任何用户表中的任何数据。
5、范式
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
第三范式是在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → → "的决定关系,则传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段 → 非关键字段x → 非关键字段y
简言之数据库五大范式:
第一范式:对于表中的每一行,必须且仅仅有唯一的行值.在一行中的每一列仅有唯一的值并且具有原子性.
(第一范式是通过把重复的组放到每个独立的表中,把这些表通过一对多关联联系起来这种方式来消除重复组的)
第二范式:第二范式要求非主键列是主键的子集,非主键列活动必须完全依赖整个主键。主键必须有唯一性的元素,一个主键可以由一个或更多的组成唯一值的列组成。一旦创建,主键无法改变,外键关联一个表的主键。主外键关联意味着一对多的关系.(第二范式处理冗余数据的删除问题。当某张表中的信息依赖于该表中其它的不是主键部分的列的时候,通常会违反第二范式)
第三范式:第三范式要求非主键列互不依赖.(第三范式规则查找以消除没有直接依赖于第一范式和第二范式形成的表的主键的属性。我们为没有与表的主键关联的所有信息建立了一张新表。每张新表保存了来自源表的信息和它们所依赖的主键)
第四范式:第四范式禁止主键列和非主键列一对多关系不受约束
第五范式:第五范式将表分割成尽可能小的块,为了排除在表中所有的冗余
。
6、连接
左外连接:左外连接的查询结果集包括指定左表中的所有行,而不仅仅是连接列所匹配的行,如果左表的某行在右表中没有找到相匹配的行,则结果集中的右表的相对应位置为Null
右外连接:右外连接的查询结果集包括指定右表中的所有行,而不仅仅是连接列所匹配的行,如果右表的某行在左表中没有找到相匹配的行,则结果集中的左表的相对应位置为Null
7、索引
索引是对数据库表中一个或多个列的值进行排序的结构
索引的好处:有助于更快的获取信息
缺 点:占用磁盘空间,并且降低添加、删除和更新的速度。
聚、非异同:在聚集索引中,表中各行的物理数据与键值的逻辑顺序相同。表能包含一个聚集索引;非聚集索引,表中的各行的物理顺序与键值的逻辑顺序不匹配
8、视图
回答什么是视图,视图有什么好处,视图有哪些注意事项,创建视图,删除视图,重命名视图的语法是分别什么?在MS企业管理器中列出pubs库所有用户表的关系,并且用表连接查出author所对应的pub信息显示au_fname,au_lname,pub_name三列,并创建视图。
视图是一个虚拟的表,提供一个或多个表中一系列的访问;他是从一个或多个表中派生出来的虚拟对象;
好 处:简单的重复使用复杂的SQL查询语句
注意事项:只能用户查询,不宜增删改;
语法:创建视图:CREATE VIEW view_name AS 查询语句
删除视图:drop view view_name
重命名视图:SP-RENAME old_view_name,new_view_name
回答什么是子查询。查看联机丛书了解子查询中都使用哪些关键字,分别是什么意思?解释in关键字和exists的特点和区别
子查询:在一个查询语句中使用另一个查询语句的结果
关键字 In:确定股、给定的值是否与子查询或链表中的值相匹配
Not in:通过not in关键字引入的子查询也返回一列0值或更多值
Exists:使用exists引入一个子查询时,就相当于进行一次存在测试,外部查询的where语句测 试子查询返回的行是否存在。子查询实际上不返回任何数据,它只返回turn或FALSE值;
9、什么是触发器,作用,优点
触发器是一种特殊类型的存储过程,它不同于前面介绍过的一般的存储过程。一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过事件进行触发而被执行
触发器是一个功能强大的工具,它与表格紧密相连,在表中数据发生变化时自动强制执行。触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能。
作用:主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。强化约束:触发器能够实现比check语句更为复杂的约束。跟踪变化:可以侦测数据库内的操作,从而不允许数据库中未经允许的指定更新和变化。级联运行:可以侦测到数据库内的操作,并自动地级联影响整个数据库的各项操作,该操作又导致该表上触发器被触发。存储过程的调用:为了响应数据库的更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用。
优点:触发器是自动的:当对表中的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。 触发器可以通过数据库中的相关表进行层叠更改。 触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。
SQL和T-SQL语句
1.按姓氏笔画排
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as
2.数据库加密:
select encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同
3.取回表中字段:
declare @list varchar(1000),@sql nvarchar(1000)
select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
set @sql='select '+right(@list,len(@list)-1)+' from 表A'
exec (@sql)
4.查看硬盘分区:
EXEC master..xp_fixeddrives
5.比较A,B表是否相等:
if (select checksum_agg(binary_checksum(*)) from A) = (select checksum_agg(binary_checksum(*)) from B)
print '相等'
else
print '不相等'
6.杀掉所有的事件探察器进程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
EXEC sp_msforeach_worker '?'
7.记录搜索:
开头到N条记录
Select Top N * From 表
-------------------------------
N到M条记录(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc
----------------------------------
N到结尾记录
Select Top N * From 表 Order by ID Desc
8.如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'
9:获取当前数据库中的所有用户表
select Name from sysobjects where xtype='u' and status>=0
10:获取某一个表的所有字段
select name from syscolumns where id=object_id('表名')
11:查看与某一个表相关的视图、存储过程、函数
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'
12:查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype='P'
13:查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01
14:查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = '表名'
[n].[标题]:
Select * From TableName Order By CustomerName
[n].[标题]:
Select * From TableName Order By CustomerName
1. 查看数据库的版本
select @@version
2. 查看数据库所在机器操作系统参数
exec master..xp_msver
3. 查看数据库启动的参数
sp_configure
4. 查看数据库启动时间
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1
查看数据库服务器名和实例名
print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)
print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)
5. 查看所有数据库名称及大小
sp_helpdb
重命名数据库用的SQL
sp_renamedb 'old_dbname', 'new_dbname'
6. 查看所有数据库用户登录信息
sp_helplogins
查看所有数据库用户所属的角色信息
sp_helpsrvrolemember
修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程
更改某个数据对象的用户属主
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
注意: 更改对象名的任一部分都可能破坏脚本和存储过程。
把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本
7. 查看链接服务器
sp_helplinkedsrvlogin
查看远端数据库用户登录信息
sp_helpremotelogin
8.查看某数据库下某个数据对象的大小
sp_spaceused @objname
还可以用sp_toptables过程看最大的N(默认为50)个表
查看某数据库下某个数据对象的索引信息
sp_helpindex @objname
还可以用SP_NChelpindex过程查看更详细的索引情况
SP_NChelpindex @objname
clustered索引是把记录按物理顺序排列的,索引占的空间比较少。
对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。
查看某数据库下某个数据对象的的约束信息
sp_helpconstraint @objname
9.查看数据库里所有的存储过程和函数
use @database_name
sp_stored_procedures
查看存储过程和函数的源代码
sp_helptext '@procedure_name'
查看包含某个字符串@str的数据对象名称
select distinct object_name(id) from syscomments where text like '%@str%'
创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数
解密加密过的存储过程和函数可以用sp_decrypt过程
10.查看数据库里用户和进程的信息
sp_who
查看SQL Server数据库里的活动用户和进程的信息
sp_who 'active'
查看SQL Server数据库里的锁的情况
sp_lock
进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程.
spid是进程编号,dbid是数据库编号,objid是数据对象编号
查看进程正在执行的SQL语句
dbcc inputbuffer ()
推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句
sp_who3
检查死锁用sp_who_lock过程
sp_who_lock
11.收缩数据库日志文件的方法
收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为M
backup log @database_name with no_log
dbcc shrinkfile (@database_name_log, 5)
12.分析SQL Server SQL 语句的方法:
set statistics time ...{on | off}
set statistics io ...{on | off}
图形方式显示查询执行计划
在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L 或者点击工具栏里的图形
文本方式显示查询执行计划
set showplan_all ...{on | off}
set showplan_text ...{ on | off }
set statistics profile ...{ on | off }
13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法
先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作
alter database [@error_database_name] set single_user
修复出现不一致错误的表
dbcc checktable('@error_table_name',repair_allow_data_loss)
或者可惜选择修复出现不一致错误的小型数据库名
dbcc checkdb('@error_database_name',repair_allow_data_loss)
alter database [@error_database_name] set multi_user
CHECKDB 有3个参数:
repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,
以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。
修复操作可以在用户事务下完成以允许用户回滚所做的更改。
如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。
如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。
修复完成后,请备份数据库。
repair_fast 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。
这些修复可以很快完成,并且不会有丢失数据的危险。
repair_rebuild 执行由 repair_fast 完成的所有修复,包括需要较长时间的修复(如重建索引)。
执行这些修复时不会有丢失数据的危险。
理解备份策略
备份策略是用户根据数据库运行的业务特点,制定的备份类型的组合。例如对一般的事务性数据库,使用“完整备份”加“差异备份”类型的组合,当然还要选择适当的“恢复模式”。下面提供了几种参考策略,主要包括“完全数据库备份策略”、“数据库和事务日志备份策略”、“差异备份策略”和“文件或文件组备份策略”。
1.完全数据库备份策略
完全数据库备份策略是定期执行数据库的“完整备份”、备份数据只依赖于“备份完整”。例如,定期修改数据的小型数据库,每天下午进行数据的少量修改,可以在每天18:00进行数据库的完整备份。完全数据库备份策略适用于以下情况。
► 如果数据库数据量小,总的备份时间是可以接受的。
► 如果数据库数据仅有很少的变化或数据库是只读的。
注意:如果使用“完整恢复模式”的数据库选项,用户应该定期清除事务日志。如果用户实现了完全数据库备份策略,数据库被配置使用完整、大容量日志模式,事务日志会被填充。当事务日志变满时,SQL Server 2005可能阻止数据库活动,直到事务日志被清空。如果用户设置数据库恢复模式为简单模式,则这样的问题将会减少。
2.数据库和事务日志备份策略
当数据库要求较严格的可恢复性,而由于时间和效率的原因,仅通过使用数据库的完整备份实现这样可恢复性并不可行时,可以考虑使用数据库加事务日志备份策略。即在数据库完整备份的基础上,增加事务日志备份,以记录全部数据库的活动。
当数据库实现数据库和事务日志备份策略时,用户应备份从最近的数据库完整备份开始,使用事务日志备份。数据库实现数据和事务日志备份策略一般用于经常进行修改操作的数据库上。
3.差异备份策略
差异备份策略包括执行常规的数据库“完整备份”加“差异备份”,并且可以在完整备份和差异备份中间执行事务日志备份。恢复数据库的过程则为,首先恢复数据库的“完整备份”,其次是最新一次的“差异备份”,最后执行最新一次“差异备份”以后的每一个“事务日志备份”。该策略在日常工作中被大量使用。差异备份策略一般用于以下备份需求的数据库。
► 数据库变化比较频繁。
► 备份数据库的时间尽可能短。
4.文件或文件组备份策略
文件或文件组备份策略主要包含备份单个文件或文件组的操作。通常这类策略用于备份读写文件组。备份文件和文件组期间,通常要备份事务日志,以保证数据库的可用性。这种策略虽然灵活,但是管理起来比较复杂,SQL Server 2005不能自动地维护文件关系的完整性。使用文件或文件组策略通常在数据库非常庞大,完整备份耗时太长的情况下使用。
Transact-SQL 中的新特性和增强的功能
数据类型
新数据类型 |
|
bigint |
table |
sql_variant |
|
数据库控制台命令 (DBCC)
新命令 |
|
DBCC CHECKCONSTRAINTS |
DBCC DROPCLEANBUFFERS |
DBCC CLEANTABLE |
DBCC FREEPROCCACHE |
DBCC CONCURRENCYVIOLATION |
DBCC INDEXDEFRAG |
增强的命令 |
|
DBCC CHECKALLOC |
DBCC CHECKFILEGROUP |
DBCC CHECKDB |
DBCC SHOWCONTIG |
DBCC CHECKTABLE |
|
函数
新函数 |
|
BINARY_CHECKSUM |
fn_virtualfilestats |
CHECKSUM |
GETUTCDATE |
CHECKSUM_AGG |
HAS_DBACCESS |
COLLATIONPROPERTY |
IDENT_CURRENT |
COUNT_BIG |
INDEXKEY_PROPERTY |
DATABASEPROPERTYEX |
OBJECTPROPERTY |
fn_helpcollations |
OPENDATASOURCE |
fn_listextendedproperty |
OPENXML |
fn_servershareddrives |
ROWCOUNT_BIG |
fn_trace_geteventinfo |
SCOPE_IDENTITY |
fn_trace_getfilterinfo |
SERVERPROPERTY |
fn_trace_getinfo |
SESSIONPROPERTY |
fn_trace_gettable |
SQL_VARIANT_PROPERTY |
信息架构视图
新信息架构视图 |
|
PARAMETERS |
ROUTINE_COLUMNS |
ROUTINES |
|
复制存储过程
新复制存储过程 |
|
sp_addmergealternatepublisher |
sp_getqueuedrows |
sp_addscriptexec |
sp_getsubscriptiondtspackagename |
sp_adjustpublisheridentityrange |
sp_helparticledts |
sp_attachsubscription |
sp_helpmergealternatepublisher |
sp_browsesnapshotfolder |
sp_helpreplicationoption |
sp_browsemergesnapshotfolder |
sp_ivindexhasnullcols |
sp_changesubscriptiondtsinfo |
sp_marksubscriptionvalidation |
sp_copysnapshot |
sp_mergearticlecolumn |
sp_disableagentoffload |
sp_repladdcolumn |
sp_dropanonymouseagent |
sp_repldropcolumn |
sp_dropmergealternatepublisher |
sp_restoredbreplication |
sp_enableagentoffload |
sp_resyncmergesubscription |
sp_getagentoffloadinfo |
sp_vupgrade_replication |
保留关键字
COLLATE、FUNCTION 和 OPENXML 是 SQL Server 2000 中的保留关键字。
以下这些词已不再是保留关键字。
AVG |
COMMITTED |
CONFIRM |
CONTROLROW |
COUNT |
ERROREXIT |
FLOPPY |
ISOLATION |
LEVEL |
MAX |
MIN |
MIRROREXIT |
ONCE |
ONLY |
PERM |
PERMANENT |
PIPE |
PREPARE |
PRIVILEGES |
REPEATABLE |
SERIALIZABLE |
SUM |
TAPE |
TEMP |
TEMPORARY |
UNCOMMITTED |
WORK |
|
语句
新语句 |
|
ALTER FUNCTION |
DROP FUNCTION |
CREATE FUNCTION |
|
增强的语句 |
|
ALTER DATABASE |
CREATE TABLE |
ALTER TABLE |
CREATE TRIGGER |
BACKUP |
INDEXPROPERTY |
COLUMNPROPERTY |
OBJECTPROPERTY |
CREATE INDEX |
RESTORE |
CREATE STATISTICS |
|
系统存储过程
新系统存储过程 |
|
sp_addextendedproperty |
sp_delete_maintenance_plan_job |
sp_add_log_shipping_database |
sp_dropextendedproc |
sp_add_log_shipping_plan |
sp_get_log_shipping_monitor_info |
sp_add_log_shipping_plan_database |
sp_helpconstraint |
sp_add_log_shipping_primary |
sp_helpindex |
sp_add_log_shipping_secondary |
sp_help_maintenance_plan |
sp_add_maintenance_plan |
sp_invalidate_textptr |
sp_add_maintenance_plan_db |
sp_remove_log_shipping_monitor |
sp_add_maintenance_plan_job |
sp_resolve_logins |
sp_can_tlog_be_applied |
sp_settriggerorder |
sp_change_monitor_role |
sp_trace_create |
sp_change_primary_role |
sp_trace_generateevent |
sp_change_secondary_role |
sp_trace_setevent |
sp_create_log_shipping_monitor_account |
sp_trace_setfilter |
sp_define_log_shipping_monitor |
sp_trace_setstatus |
sp_delete_log_shipping_database |
sp_updateextendedproperty |
sp_delete_log_shipping_plan |
sp_update_log_shipping_monitor_info |
sp_delete_log_shipping_plan_database |
sp_update_log_shipping_plan |
sp_delete_log_shipping_primary |
sp_update_log_shipping_plan_database |
sp_delete_log_shipping_secondary |
sp_xml_preparedocument |
sp_delete_maintenance_plan |
sp_xml_removedocument |
sp_delete_maintenance_plan_db |
|
增强的系统存储过程 |
|
sp_helptrigger |
sp_serveroption |
sp_tableoption |
sp_who |
系统表
新系统表 |
|
logmarkhistory |
MSsync_states |
log_shipping_databases |
sysdbmaintplan_databases |
log_shipping_monitor |
sysdbmaintplan_history |
log_shipping_plan_databases |
sysdbmaintplan_jobs |
log_shipping_plan_history |
sysdbmaintplans |
log_shipping_plans |
sysmergeschemaarticles |
log_shipping_secondaries |
sysopentapes |
Mssub_identity_range |
|
数据类型
新数据类型 |
|
bigint |
table |
sql_variant |
|
数据库控制台命令 (DBCC)
新命令 |
|
DBCC CHECKCONSTRAINTS |
DBCC DROPCLEANBUFFERS |
DBCC CLEANTABLE |
DBCC FREEPROCCACHE |
DBCC CONCURRENCYVIOLATION |
DBCC INDEXDEFRAG |
增强的命令 |
|
DBCC CHECKALLOC |
DBCC CHECKFILEGROUP |
DBCC CHECKDB |
DBCC SHOWCONTIG |
DBCC CHECKTABLE |
|
函数
新函数 |
|
BINARY_CHECKSUM |
fn_virtualfilestats |
CHECKSUM |
GETUTCDATE |
CHECKSUM_AGG |
HAS_DBACCESS |
COLLATIONPROPERTY |
IDENT_CURRENT |
COUNT_BIG |
INDEXKEY_PROPERTY |
DATABASEPROPERTYEX |
OBJECTPROPERTY |
fn_helpcollations |
OPENDATASOURCE |
fn_listextendedproperty |
OPENXML |
fn_servershareddrives |
ROWCOUNT_BIG |
fn_trace_geteventinfo |
SCOPE_IDENTITY |
fn_trace_getfilterinfo |
SERVERPROPERTY |
fn_trace_getinfo |
SESSIONPROPERTY |
fn_trace_gettable |
SQL_VARIANT_PROPERTY |
信息架构视图
新信息架构视图 |
|
PARAMETERS |
ROUTINE_COLUMNS |
ROUTINES |
|
复制存储过程
新复制存储过程 |
|
sp_addmergealternatepublisher |
sp_getqueuedrows |
sp_addscriptexec |
sp_getsubscriptiondtspackagename |
sp_adjustpublisheridentityrange |
sp_helparticledts |
sp_attachsubscription |
sp_helpmergealternatepublisher |
sp_browsesnapshotfolder |
sp_helpreplicationoption |
sp_browsemergesnapshotfolder |
sp_ivindexhasnullcols |
sp_changesubscriptiondtsinfo |
sp_marksubscriptionvalidation |
sp_copysnapshot |
sp_mergearticlecolumn |
sp_disableagentoffload |
sp_repladdcolumn |
sp_dropanonymouseagent |
sp_repldropcolumn |
sp_dropmergealternatepublisher |
sp_restoredbreplication |
sp_enableagentoffload |
sp_resyncmergesubscription |
sp_getagentoffloadinfo |
sp_vupgrade_replication |
保留关键字
COLLATE、FUNCTION 和 OPENXML 是 SQL Server 2000 中的保留关键字。
以下这些词已不再是保留关键字。
AVG |
COMMITTED |
CONFIRM |
CONTROLROW |
COUNT |
ERROREXIT |
FLOPPY |
ISOLATION |
LEVEL |
MAX |
MIN |
MIRROREXIT |
ONCE |
ONLY |
PERM |
PERMANENT |
PIPE |
PREPARE |
PRIVILEGES |
REPEATABLE |
SERIALIZABLE |
SUM |
TAPE |
TEMP |
TEMPORARY |
UNCOMMITTED |
WORK |
|
语句
新语句 |
|
ALTER FUNCTION |
DROP FUNCTION |
CREATE FUNCTION |
|
增强的语句 |
|
ALTER DATABASE |
CREATE TABLE |
ALTER TABLE |
CREATE TRIGGER |
BACKUP |
INDEXPROPERTY |
COLUMNPROPERTY |
OBJECTPROPERTY |
CREATE INDEX |
RESTORE |
CREATE STATISTICS |
|
系统存储过程
新系统存储过程 |
|
sp_addextendedproperty |
sp_delete_maintenance_plan_job |
sp_add_log_shipping_database |
sp_dropextendedproc |
sp_add_log_shipping_plan |
sp_get_log_shipping_monitor_info |
sp_add_log_shipping_plan_database |
sp_helpconstraint |
sp_add_log_shipping_primary |
sp_helpindex |
sp_add_log_shipping_secondary |
sp_help_maintenance_plan |
sp_add_maintenance_plan |
sp_invalidate_textptr |
sp_add_maintenance_plan_db |
sp_remove_log_shipping_monitor |
sp_add_maintenance_plan_job |
sp_resolve_logins |
sp_can_tlog_be_applied |
sp_settriggerorder |
sp_change_monitor_role |
sp_trace_create |
sp_change_primary_role |
sp_trace_generateevent |
sp_change_secondary_role |
sp_trace_setevent |
sp_create_log_shipping_monitor_account |
sp_trace_setfilter |
sp_define_log_shipping_monitor |
sp_trace_setstatus |
sp_delete_log_shipping_database |
sp_updateextendedproperty |
sp_delete_log_shipping_plan |
sp_update_log_shipping_monitor_info |
sp_delete_log_shipping_plan_database |
sp_update_log_shipping_plan |
sp_delete_log_shipping_primary |
sp_update_log_shipping_plan_database |
sp_delete_log_shipping_secondary |
sp_xml_preparedocument |
sp_delete_maintenance_plan |
sp_xml_removedocument |
sp_delete_maintenance_plan_db |
|
增强的系统存储过程 |
|
sp_helptrigger |
sp_serveroption |
sp_tableoption |
sp_who |
系统表
新系统表 |
|
logmarkhistory |
MSsync_states |
log_shipping_databases |
sysdbmaintplan_databases |
log_shipping_monitor |
sysdbmaintplan_history |
log_shipping_plan_databases |
sysdbmaintplan_jobs |
log_shipping_plan_history |
sysdbmaintplans |
log_shipping_plans |
sysmergeschemaarticles |
log_shipping_secondaries |
sysopentapes |
Mssub_identity_range |
|
控制流语言
此表显示 Transact-SQL 控制流关键字。
关键字 |
描述 |
BEGIN...END |
定义语句块。 |
BREAK |
退出最内层的 WHILE 循环。 |
CONTINUE |
重新开始 WHILE 循环。 |
GOTO label |
从 label 所定义的 label 之后的语句处继续进行处理。 |
IF...ELSE |
定义条件以及当一个条件为 FALSE 时的操作。 |
RETURN |
无条件退出。 |
WAITFOR |
为语句的执行设置延迟。 |
WHILE |
当特定条件为 TRUE 时重复语句。 |
可与控制流语言语句一起使用的其它 Transact-SQL 语句有:
CASE
/*...*/(注释)
--(注释)
DECLARE @local_variable
EXECUTE
RAISERROR
CREATE 创建的东西有
CREATE DATABASE
CREATE DEFAULT
CREATE FUNCTION
CREATE INDEX
CREATE PROCEDURE
CREATE RULE
CREATE SCHEMA
CREATE STATISTICS
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DROP 删除的一些东西
DROP DATABASE
DROP DEFAULT
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP RULE
DROP STATISTICS
DROP TABLE
DROP TRIGGER
DROP VIEW
一些常用的函数:
EXP
返回所给的 float 表达式的指数值。
语法
EXP ( float_expression )
参数
float_expression
是 float 类型的表达式。
返回类型
float
FLOOR
返回小于或等于所给数字表达式的最大整数。
语法
FLOOR ( numeric_expression )
DATEDIFF
返回跨两个指定日期的日期和时间边界数。
语法
DATEDIFF ( datepart , startdate , enddate )
DATENAME
返回代表指定日期的指定日期部分的字符串。
语法
DATENAME ( datepart , date )
DAY
返回代表指定日期的天的日期部分的整数。
语法
DAY ( date )
参数
date
类型为 datetime 或 smalldatetime 的表达式。
返回类型
int
注释
DATEADD
在向指定日期加上一段时间的基础上,返回新的 datetime 值。
语法
DATEADD ( datepart , number, date )
DATEPART
返回代表指定日期的指定日期部分的整数。
语法
DATEPART ( datepart , date )
参数
datepart
是指定应返回的日期部分的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。
日期部分 |
缩写 |
year |
yy, yyyy |
quarter |
qq, q |
month |
mm, m |
dayofyear |
dy, y |
day |
dd, d |
week |
wk, ww |
weekday |
dw |
Hour |
hh |
minute |
mi, n |
second |
ss, s |
millisecond |
ms |
聚合函数
聚合函数对一组值执行计算并返回单一的值。除 COUNT 函数之外,聚合函数忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。
所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时,都返回相同的值。有关函数确定性的更多信息,请参见确定性函数和非确定性函数。
仅在下列项中聚合函数允许作为表达式使用:
SELECT 语句的选择列表(子查询或外部查询)。
COMPUTE 或 COMPUTE BY 子句。
HAVING 子句。
Transact-SQL 编程语言提供下列聚合函数:
AVG |
MAX |
BINARY_CHECKSUM |
MIN |
CHECKSUM |
SUM |
CHECKSUM_AGG |
STDEV |
COUNT |
STDEVP |
COUNT_BIG |
VAR |
GROUPING |
VARP |
配置函数
这些标量函数返回当前配置选项设置的信息。
@@DATEFIRST |
@@OPTIONS |
@@DBTS |
@@REMSERVER |
@@LANGID |
@@SERVERNAME |
@@LANGUAGE |
@@SERVICENAME |
@@LOCK_TIMEOUT |
@@SPID |
@@MAX_CONNECTIONS |
@@TEXTSIZE |
@@MAX_PRECISION |
@@VERSION |
@@NESTLEVEL |
游标函数
这些标量函数返回有关游标的信息。
@@CURSOR_ROWS
CURSOR_STATUS
@@FETCH_STATUS
日期和时间函数
这些标量函数对日期和时间输入值执行操作,并返回一个字符串、数字值或日期和时间值。
下表列出日期和时间函数以及它们的确定性属性。有关函数确定性的更多信息,请参见确定性函数和非确定性函数。
函数 |
确定性 |
DATEADD |
具有确定性 |
DATEDIFF |
具有确定性 |
DATENAME |
不具有确定性 |
DATEPART |
除了用作 DATEPART (dw, date) 外都具有确定性。dw 是工作日的日期部分,取决于由设置每周第一天的 SET DATEFIRST 所设置的值。 |
DAY |
具有确定性 |
GETDATE |
不具有确定性 |
GETUTCDATE |
不具有确定性 |
MONTH |
具有确定性 |
YEAR |
具有确定性 |
数学函数
这些标量函数通常对作为参数提供的输入值执行计算,并返回一个数字值。
ABS |
DEGREES |
RAND |
ACOS |
EXP |
ROUND |
ASIN |
FLOOR |
SIGN |
ATAN |
LOG |
SIN |
ATN2 |
LOG10 |
SQUARE |
CEILING |
PI |
SQRT |
COS |
POWER |
TAN |
COT |
RADIANS |
字符串函数
这些标量函数对字符串输入值执行操作,返回字符串或数字值。
ASCII |
NCHAR |
SOUNDEX |
CHAR |
PATINDEX |
SPACE |
CHARINDEX |
REPLACE |
STR |
DIFFERENCE |
QUOTENAME |
STUFF |
LEFT |
REPLICATE |
SUBSTRING |
LEN |
REVERSE |
UNICODE |
LOWER |
RIGHT |
UPPER |
LTRIM |
RTRIM |
系统函数
函数 |
确定性 |
APP_NAME |
不具有确定性 |
CASE 表达式 |
具有确定性 |
CAST 和 CONVERT |
除非与 datetime、smalldatetime 或 sql_variant 一起使用,其它时候都具有确定性。 |
COALESCE |
具有确定性 |
COLLATIONPROPERTY |
不具有确定性 |
CURRENT_TIMESTAMP |
不具有确定性 |
CURRENT_USER |
不具有确定性 |
DATALENGTH |
具有确定性 |
@@ERROR |
不具有确定性 |
fn_helpcollations |
具有确定性 |
fn_servershareddrives |
不具有确定性 |
fn_virtualfilestats |
不具有确定性 |
FORMATMESSAGE |
不具有确定性 |
GETANSINULL |
不具有确定性 |
HOST_ID |
不具有确定性 |
HOST_NAME |
不具有确定性 |
IDENT_CURRENT |
不具有确定性 |
IDENT_INCR |
不具有确定性 |
IDENT_SEED |
不具有确定性 |
@@IDENTITY |
不具有确定性 |
IDENTITY(函数) |
不具有确定性 |
ISDATE |
只有与 CONVERT 函数一起使用,指定 CONVERT 样式参数且样式参数不等于 0、100、9 或 109 时才具有确定性。样式 0 和 100 使用默认格式 mon dd yyyy hh:miAM(或 PM)。样式 9 和 109 使用默认格式加毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)。 |
ISNULL |
具有确定性 |
ISNUMERIC |
具有确定性 |
NEWID |
不具有确定性 |
NULLIF |
具有确定性 |
PARSENAME |
具有确定性 |
PERMISSIONS |
不具有确定性 |
@@ROWCOUNT |
不具有确定性 |
ROWCOUNT_BIG |
不具有确定性 |
SCOPE_IDENTITY |
不具有确定性 |
SERVERPROPERTY |
不具有确定性 |
SESSIONPROPERTY |
不具有确定性 |
SESSION_USER |
不具有确定性 |
STATS_DATE |
不具有确定性 |
SYSTEM_USER |
不具有确定性 |
@@TRANCOUNT |
不具有确定性 |
USER_NAME |
不具有确定性 |
文本和图像函数
这些标量函数对文本或图像输入值或列执行操作,返回有关这些值的信息。
PATINDEX
TEXTPTR
TEXTVALID
GETDATE
按 datetime 值的 Microsoft® SQL Server™ 标准内部格式返回当前系统日期和时间。
语法
GETDATE ( )
返回类型
Datetime
1. 行列转换--普通 假设有张学生成绩表(CJ)如下 Name Subject Result 张三 语文 80 张三 数学 90 张三 物理 85 李四 语文 85 李四 数学 92 李四 物理 82 想变成 姓名 语文 数学 物理 张三 80 90 85 李四 85 92 82 declare @sql varchar(4000) set @sql = 'select Name' select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']' from (select distinct Subject from CJ) as a select @sql = @sql+' from test group by name' exec(@sql) 2. 行列转换--合并 有表A, id pid 1 1 1 2 1 3 2 1 2 2 3 1 如何化成表B: id pid 1 1,2,3 2 1,2 3 1 创建一个合并的函数 create function fmerg(@id int) returns varchar(8000) as begin declare @str varchar(8000) set @str='' select @str=@str+','+cast(pid as varchar) from 表A where id=@id set @str=right(@str,len(@str)-1) return(@str) End go --调用自定义函数得到结果 select distinct id,dbo.fmerg(id) from 表A 3. 如何取得一个数据表的所有列名 方法如下:先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。 SQL语句如下: declare @objid int,@objname char(40) set @objname = 'tablename' select @objid = id from sysobjects where id = object_id(@objname) select 'Column_name' = name from syscolumns where id = @objid order by colid 是不是太简单了? 呵呵 不过经常用阿. 4. 通过SQL语句来更改用户的密码 修改别人的,需要sysadmin role EXEC sp_password NULL, 'newpassword', 'User' 如果帐号为SA执行EXEC sp_password NULL, 'newpassword', sa 5. 怎么判断出一个表的哪些字段不允许为空? select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename 6. 如何在数据库里找到含有相同字段的表? a. 查已知列名的情况 SELECT b.name as TableName,a.name as columnname From syscolumns a INNER JOIN sysobjects b ON a.id=b.id AND b.type='U' AND a.name='你的字段名字' b. 未知列名查所有在不同表出现过的列名 Select o.name As tablename,s1.name As columnname From syscolumns s1, sysobjects o Where s1.id = o.id And o.type = 'U' And Exists ( Select 1 From syscolumns s2 Where s1.name = s2.name And s1.id <> s2.id ) 7. 查询第xxx行数据 假设id是主键: select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id)
如果使用游标也是可以的 fetch absolute [number] from [cursor_name] 行数为绝对行数 8. SQL Server日期计算 a. 一个月的第一天 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) b. 本周的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) c. 一年的第一天 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) d. 季度的第一天 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) e. 上个月的最后一天 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) f. 去年的最后一天 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) g. 本月的最后一天 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) h. 本月的第一个星期一 select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), 0) i. 本年的最后一天 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。
SQL SERVER 与EXCEL的数据转换 1、在SQL SERVER里查询Excel数据: -- ====================================================== SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$] 下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。 SELECT * FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions ------------------------------------------------------------------------------------------------- 2、将Excel的数据导入SQL server : -- ====================================================== SELECT * into newtable FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$] 实例: SELECT * into newtable FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions ------------------------------------------------------------------------------------------------- 3、将SQL SERVER中查询到的数据导成一个Excel文件 -- ====================================================== T-SQL代码: EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P""' 参数:S 是SQL服务器名;U是用户;P是密码 说明:还可以导出文本文件等多种格式 实例:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"' EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:\ authors.xls -c -Sservername -Usa -Ppassword' 在VB6中应用ADO导出EXCEL文件代码: Dim cn As New ADODB.Connection cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;" cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:\DT.xls -c -Sservername -Usa -Ppassword'" ------------------------------------------------------------------------------------------------- 4、在SQL SERVER里往Excel插入数据: -- ====================================================== insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...table1 (A1,A2,A3) values (1,2,3) T-SQL代码: INSERT INTO OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$] (bestand, produkt) VALUES (20, 'Test') -------------------- 休正版本 -------------------- 1. 行列转换--普通 SQL: declare @sql varchar(4000) set @sql = 'select Name' select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']' from (select distinct Subject from CJ) as a select @sql = @sql+' from CJ group by name' exec(@sql) 2.行列转换--合并 SQL: create function fmerg(@id int) returns varchar(8000) as begin declare @str varchar(8000) set @str='' select @str=@str+','+cast(pid as varchar) from A where id=@id set @str=right(@str,len(@str)-1) return(@str) End go select distinct id,dbo.fmerg(id)as pid from A drop function fmerg 3.如何取得一个数据表的所有列名 SQL: declare @objid int,@objname char(40) set @objname = '1' select @objid = id from sysobjects where id = @objname select 'Column_name' = name from syscolumns where id = @objid order by colid
|
sql 关键字
1、常用增删改查
select 用于查看 select * from *,
delete 用于删除 delete from table where *,
insert 插入 insert into table values ????,
update 更新 update table set * = * ,
create 创建 'create datebase datebasename',
alter 修改 alter table tablename add *;
drop 删除 drop table or drop datebase;
2、常用约束
primary key 主键,唯一性约束;
foreign key 外键;
unique 唯一性约束,不能与主键共用于一个字段;
identity 自增约束;(自增的开始格式,自增量);
default 默认约束;
not null 不为空约束
3、常用数据类型
char() , varchar() , int ,smallint, tinyint,bigint,float,decimal, datetime,money;
4、常用语句中的关键字
between and 用与两者之间的约束;
check 增加约束;
in 一般用于类似 '=' 作用;
on 一般情况与 join 合用 table1 join table2 on 某一条件
order by 按照一定顺序排列asc 升序 desc降序
group by 分组 having 后加约束条件
like 用于搜索 模糊搜索
as 作为的意思
聚合函数 :统计记录的个数:COUNT