《Java基础知识复习资料-精品文档资料整理.doc》由会员分享,可在线阅读,更多相关《Java基础知识复习资料-精品文档资料整理.doc(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1.java语言是强类型还是弱类型语言?为什么?Java 是强类语言,在使用变量时有如下规则: 变量必须声明,并且初始化以后才能使用。 变量必须有明确的类型(type)。 变量不能重复定义。javascript是一种弱类型语言,即变量在声明时,不能明确声明其类型 变量的类型是在运行时确定的,并且可以随时改变2.JAVA的数据类型有哪些?基本数据类型(八种):整型: byte 1字节, short 2字节, int 4字节, long 8字节浮点型: float 4字节, double 8字节【float 类型共 32位(不 int相同),其中 1位为符号位, 指数 8 位, 尾数23 位。】【
2、double 类型能表示64位,其中1 位符号位,11位指数,52位尾数】【浮点数的字面量默认是double】字符型: char 2字节【unicode编码值】boolean型: boolean 1字节 【值只有true和false】隐式类型转换:正方向: charbyteshort intlongfloatdouble负方向: 引用类型(自定义类型):对象:比如String 数组:int 接口:interface3.JAVA中成员变量和局部变量的区别?成员变量:是在类范围内定义的(也叫成员属性) 类属性:使用static修饰的就是类属性。作用域: 类属性的作用域与这个类的生存范围相同,它作为
3、类的一个成员,与类共存亡。只要类存在,程序就可以访问该类的类属性。实例属性:不被static修饰的就是实例属性。作用域: 实例属性则从这个类的实例(对象)被创建开始存在,直到系统完全销毁这个实例,它作为实例(对象)的一个成员,与实例(对象)共存亡。只要实例存在,程序就可以访问该实例的实例属性。局部变量:在一个方法内定义的变量。(包括方法的形式参数)1.形参:作用域是整个方法体2.方法局部变量:一个代码块中3.代码块局部变量:一个代码块中注意:局部变量除了形式参数外,都必须显示初使化(必须显示指定初使值)。否则不可以访问它们。形式参数不须显示初使化,它在被调用时由系统完成。4.前+和后+的区别?
4、i+, 后+, 先将 i 的值作为整个表达的值, 然后将i 增加 1。 +i, 先+, 先将 i 增加1, 然后将 i 的值作为整个表达的值。5. 短路运算符和非短路运算符的区别?短路运算符条件1 & 条件 2,如果条件1不成立,则条件2不执行;非短路运算符条件1 & 条件 2,两个条件都会执行。6.怎样取得数组的长度?数组:arr.length 集合:list.size() 字符串:str.length()7. 实现数组拷贝(复制)的2种方法?System.arraycopy(src , srcPos, dest , destPos , length) ; src - 源数组。 srcPos
5、 - 源数组中的起始位置。 dest - 目标数组。 destPos - 目标数据中的起始位置。 length - 要复制的数组元素的数量。 Arrays.copyOf(src , length):是 JDK1.6 版本提供的方法,比起System.arraycopy()使用更简便.(注:当然,可以用新建数组用for循环的方式进行复制)8.java中的4种访问制权限有哪些?分别作用范围是什么?(1).public:最大访问控制权限,对所有的类都可见。(2).protect:修饰的,在类内部、同一个包、子类中能访问(3).default:包访问权限,即同一个包中的类可以可见。默认不显式指定访问控
6、制权限时就是default包访问控制权限。(4).private:最严格的访问控制权限,仅该类本身可见。(注:访问控制修饰符可以修饰类,成员变量,方法,但是修饰类只用public和default)9.JAVA5的新特性有哪些?(1)循环(For-each循环)for (type variable : array) bodyfor (type variable : arrayList)body而1.4必须是:for (int i = 0; i array.length; i+) type variable = arrayi;bodyfor (int i = 0; i arrayList.size
7、(); i+)type variable = (type) arrayList.get(i); body(2)泛型以ArrayList为例,包括创建一个容器对象和取得容器内对象操作:1.5 ArrayList arrayList =new ArrayList(); arrayList.get(i)1.4 ArrayList arrayList =new ArrayList();(Type) arrayList.get(i)(3) 自动装箱拆箱在JDK5.0以前,在原始类型与相应的包装类之间的转化是不能自动完成的。要完成这种转化,需要手动调用包装类的构造函数,在JDK5.0环境中,可以自动转化:
8、1.5 Integer wrapper = n;int n = wrapper;1.4 Integer wrapper = new Integer(n);int n = wrapper.intValue();自动装包/拆包大大方便了基本类型数据和它们包装类地使用。自动装包:基本类型自动转为包装类.(int Integer);自动拆包:包装类自动转为基本类型.(Integer int); (4)静态导入静态导入功能对于JDK 5.0以前的版本是不支持的。import static java.lang.Math;import static java.lang.System;.1.5 out.pri
9、ntln(sqrt(PI);1.4 System.out.println(Math.sqrt(Math.PI);(5) 可变参数(Varargs)可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。在JDK1.5之前,可以用重载来实现,但是这样就需要写很多的重载函数。line1 public void write(Object. objs) line2 for (Object obj: objs)line3 System.out.println(obj);line4 10.面向对象编程中几种对象组合方式is-a /has-a/use-a:(1).i
10、s-a组合:一个类继承具有相似功能的另一个类,根据需要在所继承的类基础上进行扩展。优点:具有共同属性和方法的类可以将共享信息抽象到父类中,增强代码复用性,同时也是多态的基础。缺点:子类中扩展的部分对父类不可见,另外如果共性比较少的时候使用继承会增加冗余代码。(2).has-a组合:has-a组合是在一个类中引用另一个类作为其成员变量。优点:可扩展性和灵活性高。在对象组合关系中应优先考虑has-a组合关系。缺点:具有共性的类之间看不到派生关系。 (3).use-a组合:是一个类中使用到了另外一个类,依赖关系11.构造方法(构造器)特点? Java 中的构造器(构造方法)声明在类内部。 方法名与类
11、名一致的方法叫构造方法 构造方法不能声明返回值类型。 构造方法可以包含参数,参数一般是创建对象实例必须依赖的条件(前提条件)。子类默认调用父类的无参构造器,如果父类没有无参构造器,那么子类必需显示的去调用父类的有参构造器如果一个类没有提供无参构造器,那么编译器将会自动提供一个无参构造器。12.JAVA中属性和方法的静态绑定和动态绑定?静态绑定:Java 根据引用变量类型查找属性动态绑定:java 根据实际的对象查找方法13. JavaBean 规范?1) 必须有包(package) 2) Java 类,具有无参数构造器 3) 有用 getXxx() 和 setXxx() 声明的Bean属性 n
12、 如:getName() 和 setName(String n) 声明的 Bean属性为:name, 不是否有实例变量 name 无关 n boolean类型的get方法可以有两种形式:getMarried() 戒者 isMarried() 4) 必须实现序列化接口(注:在学习IO 的时候具体学习)14.static关键字的特点?static 静态关键字修饰:属性、方法、内部类、代码块static 修饰的资源属于类级别,是全体对象实例共享的资源static 变量在类加载期间初始化静态代码块是在类加载期间运行的代码块,由于类只加载一次,所以静态代码块只执行一次!15.final关键字的特点?fi
13、nal可以修饰类,方法,变量final 修饰的类,不能再被继承final修饰的方法,不能覆盖final 方法final 修饰的变量 final的局部变量,只能初始化不能改final的方法参数,不能改 final 的引用,引用指向不能改,但是对象的属性可以改16.常见的final类有哪些?Java 的 String 就是 final类,不能被继承!Math 是final类,不能被继承!Integer 、Long、Character 等包装类是 final类,不能被继承!17.抽象类和接口的区别?抽象类-不具体的类 1 抽象方法,只有行为的概念,没有具体的行为实现。 使用:abstract 关键字
14、修饰,并且没有方法体。 2 包含抽象方法的类,就一定是抽象类。 使用: abstract 关键字修饰,包含抽象方法。 如:平面图形一定可以计算面积。 public abstract class CRMSystem public abstract Client addClient( String name, String qq); 3 抽象方法和抽象类非常适合作为系统的分析和设计的工具。 4 抽象类不能直接创建实例。可以定义引用变量。 5 抽象类只能被继承,一个具体类继承一个抽象类,必须实 现所有抽象方法。接口 1. 接口:全部的方法都是抽象方法,全部的属性都是常量。 接口用来表示纯抽象概念,没
15、有任何具体的方法和属性。 2 .不能实例化,可以定义变量。 3 .接口变量可以引用具体实现类的实例。 4 .接口只能被实现,一个具体类实现接口,必须使用全部的 抽象方法。 5 .接口之间可以继承。 6 .一个具体类可以实现多个接口,实现多继承现象,表示: 一个概念即是XXX也是XXX. 7 .接口中的属性,默认是常量 public static final 8 .接中的方法一定是:public abstract 9 .实现一个接口,使用关键字implements, 实现实际上是 一种继承关系。接口和实现类是父子类型的关系18.重载和重写的区别?重载:方法名相同,参数不同(参数类型或者长度) 重
16、载和修饰符和返回类型无关。一是方法的参数列表必须改变,包括参数的类型,参数的个数多少,参数顺序。二是重载对返回类型,访问修饰符,异常声明没有任何限制,可以作任意的修改。实质上,重载只是创建了一个方法而已,特殊的地方在于方法的名字。重写:两同两小一大(规则)两同:方法名相同 参数类型 相同两小:返回值类型(基本数据类型要一致,引用类型可以是其子类) 抛出的异常要小(也可以抛出父类型的异常的部分异常,或者不抛出异常)一大:访问控制修饰符大(1)重写方法必须和被重写方法具有相同的参数列表,返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型。 (2)重写方法的访问控制修饰符不能比被重写方法更
17、严格(比如一个在父类中声明为public的方法重写成一个protected的方法)。 (3)只有实例方法才能被重写,超类中的final方法不能被重写。 (4)重写方法不能抛出新的检查异常,或者是抛出比被重写方法声明的检查异常更广泛的检查异常。19.=和equals()的区别?“=”,比较引用值和基本数据类型是否相等。 u xxx.equals()方法比较对象的内容是否相等。默认的比较规则是:比较引用20为什么要同时覆盖hashcode()和equals()?hashCode()方法要不equals 方法一同覆盖(Sun公司规定) u 当两个对象equals 比较为true 时,应具有相同的ha
18、shCode()值 u 当两个对象equals 比较为false 时,应具有不相同的hashCode()值 u hashCode() 值要稳定(一致性),一个对象创建以后就不应该再变化 默认的hashCode()值是当前堆对象地址转换的一个整数,这个整数不是内存地址!在java的中,判断两个对象是否相等的规则是:首先,判断两个对象的hashCode是否相等如果不相等,认为两个对象也不相等如果相等,则判断两个对象用equals运算是否相等如果不相等,认为两个对象也不相等如果相等,认为两个对象相等21.String类有哪些常用的方法?charAt() length() trim() toLower
19、Case() toUpperCase() indexOf()lastIndexOf() endsWith() startsWith() substring(int start, int end) substring(int start) toCharArray() 22.String,StringBuilder,StringBuffer的区别?String = char + 操作(复制创建新对象) char不可变 StringBuilder = char + 对char操作(处理当前数组内容) char可变1) StringBuilder 是变长字符序列 2) StringBuilder 方法
20、:append,insert . 都返回当前 StringBuilder 对象本身的引用StringBuffer 和 StringBuilder API 几乎一样! StringBuffer 是 java早期提供的(JDK1.0),速度稍慢,线程安全 StringBuilder 是 Java5 以后提供的(JDK5.0),速度快,非线程安全23.谈谈集合框架的理解?集合框架包括集合不映射(Collection and Map)List 元素有先后次序的集合, 元素有 index 位置, 元素可以重复,继承自 Collection 接口,实现类: ArrayList, Vector, Linke
21、dListList 表示有先后次序的对象集合ArrayList是使用变长数组算法实现的,ArrayList 实现自 List1) ArrayList 和 Vector 的比较 n Vector(1.0 版本提供的),线程安全的,效率稍低,也是使用变长数组算法实现的,继承自 List 接口n ArrayList,线程不安全的,效率高速度快(现在较常用) 2) ArrayList 和 LinkedList 的比较 n LinkedList 是采用双向循环链表实现的 List n ArrayList 是采用变长数组算法实现的的 List在ArrayList的中间插入或删除一个元素意味着这个列表中剩余
22、的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。ArrayList查询速度快,而LinkedList增删速度快Set 元素无续, 不能重复添加, 是数学意义上的集合, 继承自 Collection 接口 n 实现类: HashSet(是一个只有 Key的 HashMap),使用Set时要重写hashCode,equals方法HashMap 以键-值对(关键字:值)的形式存储对象,关键字 key 是唯一的、不重复的1) key 可以是任何对象,Value可以任何对象 2) (key:value)成对放置在集合中 3) 重复的 key 算一个,重复添加是替换操作(
23、会覆盖原来的元素)4)HashMap 根据 key 检索查找value 值HashMap 新,非线程安全,不检查锁,快 Hashtable 旧 (JDK1.2 版本以前),线程安全,检查锁,慢一点(差的很小)23.散列表的特点?散列表中存放的对象是不连续的,所以称为“散列表”散列表的优点:查找迅速在 ArrayList 中查找 Mac,顺序查找,需要查找 5 次 在 HashMap 中(底层实现原理是散列表)查找 Mac,经过散列运算,仅需 1 次24.java泛型的作用是什么?泛型是 Java5 以后提出的语法现象,作用是在编译期检查的类型约束(运行期不检查泛型),泛型可以用来约束类中元素的
24、类型25.Collection和Collections的区别?Collection是集合接口,下面有子接口,List,Set集合的工具类为 Collections,同数组的工具类 Arrays 相同,其中提供了许多的方法,诸如排序、二分查找、打乱、填充等操作。26.内部类的分类?各有什么特点?1) 根据位置的不同,Java 中的内部类分为四种: n 静态内部类 u 使用 static 修饰,声明在类体中 u 静态内部类中可以访问外部类的静态成员 n 成员内部类 u 声明在类体中,不使用static,具有类的成员特征,也就是,必须有类的实例才能创建内部类实例 u 内部类实例可以访问共享外部类的成
25、员变量(很常用) u 如:链表的节点就可以定义为内部类 n 局部内部类 把类声明在方法中,就是局部内部类,作用域 u 类似局部变量(很少见) n 匿名内部类 匿名类,非常常见,可以写在任何地方,就像一般的语句 语法更象是创建对象:Date d = new Date()/.; 匿名类是对原类的一个继承,同时创建了实例, 就是继承以后的类体 类体中可使用所有类的语法 匿名类不能写构造器 匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现2) 任何内部类都编译成独立的class 文件 3) 最大的作用:封装!27.怎么将Date和String互相转换?28Java中的异常理解?异常是程序运行过程
26、过程出现的错误,在Java中用类来描述,用对象来表示具体的异常。Java将其区分为Error与Exception,Error是程序无力处理的错误,Exception是程序可以处理的错误。 1)Error与Exception Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。Error:一般指虚拟机相关问题,如虚拟机崩溃,虚拟机出错等这种错误无法恢复或不可捕获,将导致应用程序中断。对于Error一般不编写针对性代码对齐进行处理。Exception是程序本身可以处理的异常,这种异常分两大类运行
27、时异常和非运行时异常。程序中应当尽可能去处理这些异常。2)运行时异常和非运行时异常检查异常:当代码中抛出了一个检查异常,那么编译器在编译代码时会检查代码是否有处理该异常的代码片段,没有则编译不通过。非检查异常:编译器不检查该类异常抛出是否有代码处理。(ClassNotFoundException不是RuntimeException的子类) 运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException,ArrayIndexOutOfBoundsException, ClassCastException
28、等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。 非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。自定义异常 (自己定义异常表达错误) MyException extends Exception 检测(check)异常 MyException extends R
29、untimException 运行时(runtime)异常29.JAVA中异常处理的方式有哪些?1)trycatchfinallytry /(尝试运行的)程序代码catch(异常类型 异常的变量名) /异常处理代码finally /注:子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误。finally块中一定会执行吗?2)throws,throwthrow关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常
30、,该方法的调用者才必须处理或者重新抛出该异常。30.实现序列化的作用?(implements Serializable)序列化的作用是,将数据分解成字节流,以便存储在文件中或在网络上传输。31.IO流的分类?以及常用流的写法?分为:字节流和字符流 或者 输入流和输出流 InputStream is = new FileInputStream(gbk.txt); Reader in = new InputStreamReader(is); BufferedReader reader = new BufferedReader(in);PrintWriter out = new PrintWtire
31、r( new OutputStreamWriter( new FileOutputStream(filename); 32.创建线程的两种方式?继承 Thread 类(extends Thread)或者实现Runnable 接口(implements Runnable) 1) 继承 Thread 类 n 实现步骤: 继承 Thread 类, 覆盖run()方法, 提供并发运程的过程 创建这个类的实例 使用 start() 方法启动线程 2) 实现 Runnable 接口 n 实现步骤: 实现 Runnable 接口, 实现run()方法, 提供并发运程的过程 创建这个类的实例, 用这个实例作为
32、Thread 构造器参数,创建Thread 类 使用 start() 方法启动线程 33.线程的5 中状态 1) New 新建状态 n 当程序使用new关键字创建了一个线程后,该线程就处于新建状态,此时线程还未启动,当线程对象调用start()方法时,线程启动,进入Runnable 状态 2) Runnable 可运行(就绪)状态 n 当线程处于Runnable 状态时,表示线程准备就绪,等待获取CPU 3) Running 运行(正在运行)状态 n 假如该线程获取了CPU,则进入Running 状态,开始执行线程体,即run()方法中的内容 n 注意: 如果系统叧有1个CPU,那么在仸意时间
33、点则叧有1条线程处于Running 状态; 如果是双核系统,那么同一时间点会有2条线程处于Running 状态 但是,当线程数大于处理器数时,依然会是多条线程在同一个CPU 上轮换执行 当一条线程开始运行时,如果它不是一瞬间完成,那么它不可能一直处于Running 状态, 线程在执行过程中会被中断,目的是让其它线程获得执行的机会,像这样线程调度的策 略取决于底层平台。对于抢占式策略的平台而言,系统系统会给每个可执行的线程一小 段时间来处理仸务,当该时间段(时间片)用完,系统会剥夺该线程所占资源(CPU), 让其他线程获得运行机会。 n 调用yield()方法,可以使线程由Running 状态进
34、入Runnable 状态 4) Block 阻塞(挂起)状态 n 当如下情冴下,线程会进入阻塞状态: 线程调用了sleep()方法主动放弃所占CPU 资源 线程调用了一个阻塞式IO 方法(比如控制台输入方法),在该方法返回前,该线程被阻塞 . n 当正在执行的线程被阻塞时,其它线程就获得执行机会了。需要注意的是,当阻塞结束时,该线程将进入Runnable 状态,而非直接进入Running 状态 5) Dead 死亡状态 n 当线程的run()方法执行结束,线程进入Dead 状态 n 需要注意的是,不要试图对一个已经死亡的线程调用start()方法,线程死亡后将不能再次作为线程执行,系统会抛出I
35、llegalThreadStateException 异常注: 1) new运算创建线程后,线程进入New状态(初始状态) 2) 调用 start()方法后,线程从New状态进入Runnable 状态(就绪状态) n start()方法是在main()方法(Running 状态)中调用的 3) 线程结束后,进入Dead 状态(死亡状态),被对象垃圾回收 4) main()方法结束后,其它线程,比如上例中p1和p2 开始抢着进入Running 状态 n 由谁抢到是底层操作系统决定(操作系统分配时间片) n 单核处理器:在一个时间点上叧有一个线程在Running 状态;双核处理器:2 个 n 如果
36、p1 进入Running 状态,当操作系统分配给它的时间片到期时,p1进入 Runnable状态,p2进入Running 状态 n 在期间有可能其它的进程的线程获得时间片,那么p1和p2同时进入Runnable 状态,等待操作系统分配时间片 5) 线程进入Dead 状态后,叧能被垃圾回收,不能再开始 6) 如果线程在运行过程中,自己调用了yield()方法,则主动由 Running 状态进入Runnable 状态 34. 异步与同步的区别?1) 异步 并发, 各干自己的。如: 一群人上卡车 2) 同步 步调一致的处理。 如: 一群人上公交车35.数据库中,char和varchar类型的区别?c
37、har(n) 表示定长字符串( 方便查询 ) 最长放入n个字符 , 放入的数据如果不够n个字符则补空格 , 无论如何都占n个字符长度。 varchar(n) 表示变长字符串( 节省空间 ) 最长放入n个字符 , 放入的数据是几个长度就占多大空间。select decode(a2,A,AAAA,BBBB) FROM table ;select decode(a1,A ,AAAA,BBBB) FROM TT ; -此处是两个空格36.在数据库中怎么做表的复制?(一条语句完成)?create table emp_xxx as select * from emp_yyy ;(注:如何将一个表中的数据复
38、制到另外一个表中?insert into table(select * from table2);两个表结构一样insert into table(name,age) (select name,age from table2);复制指定的字段)37.分别简述一下DDL,DML,DQL,TCL,DCL?1)数据定义语言DDL( Data Definition Language ) , 是 SQL语言集中负责数据结构定义不数据库对象定义的语言 , 主要有create、alter、drop 和truncate 四种常用语句。DDL对数据结构起作用。 create 数据库对象的创建 alter 修改数
39、据库对象 drop 删除数据库对象 truncate 清空表数据2) 数据操纵语言DML( Data Manipulation Language ) , 用户通过它可以实现对数据表的基本操作, 即对表中数据的增、删、改。 DML对数据起作用。 n insert 插入操作 n update 更新操作 n delete 删除操作3) 数据查询语言DQL( Data Query Language ) , 用户主要通过它实现对数据的查询操作。 n select 查询操作 4) TCL事务控制语句是用来对DML操作进行确认的。 commit 提交数据 rollback 数据回滚 savepoint 保存
40、点 5) 数据控制语言(Data Control Language,DCL)用于对用户授权或撤销其权限,也可使用角色实现对用户的批量授权或撤销权限,在应用开发层面较少用到。 grant(授予权限)/revoke(回收权限)38.Oracle常用的单行函数有哪些?round( 数字 , 小数点后的位数)用于数字的四舍五入trunc( 数字 , 小数点后的位数)用于截取,如果没有第二个参数 , 默认是 0to_date()和to_char()是时间处理的函数 to_date 将字符串数据 按指定格式 转换为 日期数据 to_char 将日期数据 按指定格式 转换为 字符串数据coalesce( 参
41、数列表 )函数的作用:返回参数列表中第一个非空参数 , 参数列表中最后一个值通常为常量decode()函数是Oracle 中等价于case when语句的函数 , 作用同case 语句相同。 decode 函数语法如下: decode(判断条件 , 匹配1 , 值 1 , 匹配2 , 值2 , , 默认值) nvl(bonus,0) 空值转换函数39.常用的组函数有哪些?AVG 求平均数COUNT 求数量MAX 求最大值MIN 求最小值SUM 求和注意:avg/sum操作数字max/min可以操作各种数据类型组函数默认忽略空值40.判断语句是否正确?select ename,count(*)
42、from emp where ename=KING group by ename;select count(*),sum(sal) from emp group by ename;在SELECT列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中。包含在GROUP BY 子句中的列不必包含在SELECT列表中。41. 研发部有哪些职位?select distinct job from emp_xxx where deptno = ( select deptno from dept_xxx where dname = developer ) ;42.ALL,Any,In的用法?ALL -大于最大值Any-大于最小值子查询的条件是单列还是多列没关系 , 关键是要分清返回的是单行还是多行。如果是单行 , 用单行比较运算符 , = , , all, any, all, ( select avg(nvl(salary,0) from emp_xxx where deptno = 20 ) ;44.什么叫关联子查询?子查询中不再是独立的Sql语句 , 需要依赖主查询传来的参数 , 这种方式叫关联子查询哪些员工的薪水比本部门的平均薪水低?不再和整