面试题:聊一聊分布式对象存储解决方案

OSS(Object Storage Service)俗称对象存储,主要提供图片、文档、音频、视频等二进制文件的海量存储功能。目前除了公有云提供对象存储服务外,一般私有云比较关心一些开源的分布式对象存储解决方案,本文列举了一些常见的技术方案供参考。

概念普识

块存储

通常SAN(Storage Area Network)结构的产品属于块存储,比如我们常见的硬盘、磁盘阵列等物理盘。

文件存储

一般NAS(Network Attached Storage)产品都是文件级存储,如Ceph的CephFS,另外GFS、HDFS、FastDFS等也属于文件存储。

对象存储

同时兼顾着SAN高速直接访问磁盘特点及NAS的分布式共享特点的一类存储,一般是通过RESTful接口访问。

开源解决方案介绍

Swift

Swift 是 OpenStack 社区核心子项目,是一个弹性可伸缩、高可用的分布式对象存储系统,使用Python语言实现,采用 Apache 2.0 许可协议。

Swift 提供一个基于RESTful HTTP接口的 Object Storage API,用于创建,修改和获取对象和元数据。用户可以使用 Swift 高效、安全且廉价地存储大量数据。Swift 整体架构:

总的来说,企业如果想要建立可扩展的分布式对象存储集群,可以考虑 Swift。

Ceph

Ceph是一种高性能、高可用、可扩展的分布式存储系统,统一的对外提供对象存储、块存储以及文件存储功能,底层使用C/C++语言。

其中对象存储功能支持 2 种接口:

1、兼容S3:提供了对象存储接口,兼容 S3 RESTful 接口的一个大子集。

2、兼容Swift:提供了对象存储接口,兼容 Openstack Swift 接口的一个大子集。

Ceph是一个企业级分布式存储系统,功能强大,不仅可以为企业建立对象存储服务,还可以帮助企业建立自己的云平台,具有广泛的应用场景特别是在云环境下使用广泛。

Minio

Minio是一个企业级、兼容S3接口的对象存储系统。Minio基于 Apache 2.0 许可协议,采用Go语言实现,客户端支持Java、Python、Go等多种语言,是一种轻量级、高并发的开源解决方案,可以作为云存储方案用来保存海量的图片,视频,文档等。

大数据集成方面,Minio支持各种常见的查询计算引擎,比如Spark、Presto、Hive以及Flink等,可以使用这些处理框架查询分析对象数据,此外,Minio支持Parquet,Json、Csv格式等多种文件存储格式,包括压缩与编码。更多特性可以参考官网 地址https://min.io。Minio架构:

Minio主要为人工智能、机器学习而设计,并适用于其他大数据负载。从架构与功能方面考虑,Minio是一个比较好的开源对象存储解决方案。

HBase MOB

这是利用HBase的MOB特性支持对象存储功能。Apache HBase2.0 版本开始支持中等对象存储(Medium Object Storage,简称 MOB),这个特性使得HBase能够非常良好的存储大小在100KB-10M的图片、文档、音频、短视频等二进制数据。

架构如上,HBase MOB的设计类似于HBase + HDFS的方式,中等对象在写入HDFS之前同样是先写入MemStore,但是刷写与其他写入数据不同,MOB数据被刷写到MOB File中,MOB File被存放在特殊的Region中。

MOB特性在Apache HBase 2.0、CDH 5.4.x 或 HDP 2.5.x 及以上版本支持,用户可以基于HBase MOB特性设计自己的对象存储服务。

Hadoop Ozone

Ozone是 Apache Hadoop 的子项目,为了提供分布式、可扩展的对象存储功能,主要是为了弥补HDFS在小文件存储方面的不足之处。Ozone建立在一个高可用、支持块复制的Hadoop分布式数据存储层之上,称为Hadoop Distributed Data Store(HDDS),上层可对接 Spark、Hive 以及 Yarn 等计算调度引擎。但是目前还处于alpha内部测试版本,暂时不建议生产环境中使用。

小结

对象存储主要是解决海量图片、文档、音视频的存储,其中主流的重量级解决方案是Swift与Ceph,它们各有特点,可以参考搜索引擎上的对比,Hadoop生态体系中备受关注的是HBase MOB,另外轻量级的Minio也是一种比较好的选择。MongoDB也提供了大文件存储模块GridFS。建议根据实际情况做技术选型。

0

Jvm面试题总结大全及答案

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2.Java内存结构?

方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。

  • Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
  • 方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  • 程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
  • JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
  • 本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

3.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在常量池中,常量池是方法区的一部分,。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整,栈空间用光了会引发StackOverflowError,而堆和常量池空间不足则会引发OutOfMemoryError。

String str = new String(“hello”);

上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而”hello”这个字面量是放在方法区的。

补充1:较新版本的Java(从Java 6的某个更新开始)中,由于JIT编译器的发展和”逃逸分析”技术的逐渐成熟,栈上分配、标量替换等优化技术使得对象一定分配在堆上这件事情已经变得不那么绝对了。

补充2:运行时常量池相当于Class文件常量池具有动态性,Java语言并不要求常量一定只有编译期间才能产生,运行期间也可以将新的常量放入池中,String类的intern()方法就是这样的。 看看下面代码的执行结果是什么并且比较一下Java 7以前和以后的运行结果是否一致。

String s1 = new StringBuilder(“go”)

.append(“od”).toString();

System.out.println(s1.intern() == s1);

String s2 = new StringBuilder(“ja”)

.append(“va”).toString();

System.out.println(s2.intern() == s2);

4.对象分配规则

  • 对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。
  • 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
  • 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
  • 动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
  • 空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。

5.什么是类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

6.类加载器

  • 启动类加载器:Bootstrap ClassLoader,负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库
  • 扩展类加载器:Extension ClassLoader,该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载DK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。
  • 应用程序类加载器:Application ClassLoader,该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器

7.描述一下JVM加载class文件的原理机制?

答:JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。 由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。 类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:

  • Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
  • Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
  • System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

8.描述一下JVM加载class文件的原理机制?

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。

由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:

  • 1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
  • 2)如果类中存在初始化语句,就依次执行这些初始化语句。

类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。

从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:

  • Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
  • Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
  • System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

9.Java对象创建过程

1.JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在后边讲)

2.为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲分配(TLAB)”

3.将除对象头外的对象内存空间初始化为0

4.对对象头进行必要设置

10.类的生命周期

类的生命周期包括这几个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程,如下图;

  • 加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
  • 连接,连接又包含三块内容:验证、准备、初始化。 1)验证,文件格式、元数据、字节码、符号引用验证; 2)准备,为类的静态变量分配内存,并将其初始化为默认值; 3)解析,把类中的符号引用转换为直接引用
  • 初始化,为类的静态变量赋予正确的初始值
  • 使用,new出对象程序中使用
  • 卸载,执行垃圾回收

11.Java对象结构

Java对象由三个部分组成:对象头、实例数据、对齐填充。

对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)

12.Java对象的定位方式

句柄池、直接指针。

13.如何判断对象可以被回收?

判断对象是否存活一般有两种方式:

  • 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
  • 可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

14.JVM的永久代中会发生垃圾回收么?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)

15.引用的分类

  • 强引用:GC时不会被回收
  • 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收
  • 弱引用:描述有用但不是必须的对象,在下一次GC时被回收
  • 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference实现虚引用,虚引用用来在GC时返回一个通知。

###GC是什么?为什么要有GC? 答:GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。 垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于android系统中垃圾回收的不可预知性。

补充:垃圾回收机制有很多种,包括:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。标准的Java进程既有栈又有堆。栈保存了原始型局部变量,堆保存了要创建的对象。Java平台对堆内存回收和再利用的基本算法被称为标记和清除,但是Java对其进行了改进,采用“分代式垃圾收集”。这种方法会跟Java对象的生命周期将堆内存划分为不同的区域,在垃圾收集过程中,可能会将对象移动到不同区域:

  • 伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。
  • 幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
  • 终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。 与垃圾回收相关的JVM参数:

-Xms / -Xmx — 堆的初始大小 / 堆的最大大小 -Xmn — 堆中年轻代的大小 -XX:-DisableExplicitGC — 让System.gc()不产生任何作用 -XX:+PrintGCDetails — 打印GC的细节 -XX:+PrintGCDateStamps — 打印GC操作的时间戳 -XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小 -XX:NewRatio — 可以设置老生代和新生代的比例 -XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布 -XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大值 -XX:TargetSurvivorRatio:设置幸存区的目标使用率

16.判断一个对象应该被回收

1.该对象没有与GC Roots相连

2.该对象没有重写finalize()方法或finalize()已经被执行过则直接回收(第一次标记)、否则将对象加入到F-Queue队列中(优先级很低的队列)在这里finalize()方法被执行,之后进行第二次标记,如果对象仍然应该被GC则GC,否则移除队列。 (在finalize方法中,对象很可能和其他 GC Roots中的某一个对象建立了关联,finalize方法只会被调用一次,且不推荐使用finalize方法)

17.回收方法区

方法区回收价值很低,主要回收废弃的常量和无用的类。

如何判断无用的类:

1.该类所有实例都被回收(Java堆中没有该类的对象)

2.加载该类的ClassLoader已经被回收

3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方利用反射访问该类

18.垃圾收集算法

GC最基础的算法有三种: 标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。

  • 标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
  • 复制算法,“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
  • 标记-压缩算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
  • 分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

19.垃圾回收器

  • Serial收集器,串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。
  • ParNew收集器,ParNew收集器其实就是Serial收集器的多线程版本。
  • Parallel收集器,Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。
  • Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
  • CMS收集器,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
  • G1收集器,G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征

20.GC日志分析

摘录GC日志一部分(前部分为年轻代gc回收;后部分为full gc回收):

2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]

2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]

复制代码

通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化;ParOldGen表示gc回收前后老年代的内存变化;PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回城,耗时长,因此一般尽量减少full gc的次数

21.调优命令

Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo

  • jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
  • jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
  • jmap,JVM Memory Map命令用于生成heap dump文件
  • jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
  • jstack,用于生成java虚拟机当前时刻的线程快照。
  • jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。

22.调优工具

常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory Analyzer Tool)、GChisto。

  • jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控
  • jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
  • MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
  • GChisto,一款专业分析gc日志的工具

23.Minor GC与Full GC分别在什么时候发生?

新生代内存不够用时候发生MGC也叫YGC,JVM内存不够的时候发生FGC

24.你知道哪些JVM性能调优

  • 设定堆内存大小

-Xmx:堆内存最大限制。

  • 设定新生代大小。 新生代不宜太小,否则会有大量对象涌入老年代

-XX:NewSize:新生代大小

-XX:NewRatio 新生代和老生代占比

-XX:SurvivorRatio:伊甸园空间和幸存者空间的占比

  • 设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC
0

Hadoop面试题精选集合带答案

1. 以下哪一项不属于Hadoop可以运行的模式___C___。

A. 单机(本地)模式

B. 伪分布式模式

C. 互联模式

D. 分布式模式

2. Hadoop的作者是下面哪一位__B____。

A. Martin Fowler

B. Doug cutting

C. Kent Beck

D. Grace Hopper

3. 下列哪个程序通常与 NameNode 在同一个节点启动__D___。

A. TaskTracker

B. DataNode

C. SecondaryNameNode

D. Jobtracker

4. HDFS 默认 Block Size的大小是___B___。

A.32MB

B.64MB

C.128MB

D.256M

5. 下列哪项通常是集群的最主要瓶颈____C__。

A. CPU

B. 网络

C. 磁盘IO

D. 内存

6. 下列关于MapReduce说法不正确的是_____C_。

A. MapReduce是一种计算框架

B. MapReduce来源于google的学术论文

C. MapReduce程序只能用java语言编写

D. MapReduce隐藏了并行计算的细节,方便使用

8. HDFS是基于流数据模式访问和处理超大文件的需求而开发的,具有高容错、高可靠性、高可扩展性、高吞吐率等特征,适合的读写任务是 __D____。

A.一次写入,少次读

B.多次写入,少次读

C.多次写入,多次读

D.一次写入,多次读

9. HBase依靠__A____存储底层数据。

A. HDFS

B. Hadoop

C. Memory

D. MapReduce

10. HBase依赖___D___提供强大的计算能力。

A. Zookeeper

B. Chubby

C. RPC

D. MapReduce

11. HBase依赖___A___提供消息通信机制

A. Zookeeper

B. Chubby

C. RPC

D. Socket

12. 下面与HDFS类似的框架是___C____?

A. NTFS

B. FAT32

C. GFS

D. EXT3

13. 关于 SecondaryNameNode 下面哪项是正确的___C___。

A. 它是 NameNode 的热备

B. 它对内存没有要求

C. 它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间

D. SecondaryNameNode 应与 NameNode 部署到一个节点

14. 大数据的特点不包括下面哪一项___D___。

A. 巨大的数据量

B. 多结构化数据

C. 增长速度快

D. 价值密度高

HBase测试题

1. HBase来源于哪一项? C

A The Google File System

B MapReduce

C BigTable

D Chubby

2. 下面对HBase的描述哪些是正确的? B、C、D

A 不是开源的

B 是面向列的

C 是分布式的

D 是一种NoSQL数据库

3. HBase依靠()存储底层数据 A

A HDFS

B Hadoop

C Memory

D MapReduce

4. HBase依赖()提供消息通信机制 A

A Zookeeper

B Chubby

C RPC

D Socket

5. HBase依赖()提供强大的计算能力 D

A Zookeeper

B Chubby

C RPC

D MapReduce

6. MapReduce与HBase的关系,哪些描述是正确的? B、C

A 两者不可或缺,MapReduce是HBase可以正常运行的保证

B 两者不是强关联关系,没有MapReduce,HBase可以正常运行

C MapReduce可以直接访问HBase

D 它们之间没有任何关系

7. 下面哪些选项正确描述了HBase的特性? A、B、C、D

A 高可靠性

B 高性能

C 面向列

D可伸缩

8. 下面与Zookeeper类似的框架是?D

A Protobuf

B Java

C Kafka

D Chubby

9. 下面与HDFS类似的框架是?C

A NTFS

B FAT32

C GFS

D EXT3

10. 下面哪些概念是HBase框架中使用的?A、C

A HDFS

B GridFS

C Zookeeper

D EXT3

第二部分:HBase核心知识点

11. LSM含义是?A

A 日志结构合并树

B 二叉树

C 平衡二叉树

D 基于日志结构的合并树

12. 下面对LSM结构描述正确的是? A、C

A 顺序存储

B 直接写硬盘

C 需要将数据Flush到磁盘

D 是一种搜索平衡树

13. LSM更能保证哪种操作的性能?B

A 读

B 写

C 随机读

D 合并

14. LSM的读操作和写操作是独立的?A

A 是。

B 否。

C LSM并不区分读和写

D LSM中读写是同一种操作

15. LSM结构的数据首先存储在()。 B

A 硬盘上

B 内存中

C 磁盘阵列中

D 闪存中

16 HFile数据格式中的Data字段用于()。A

A 存储实际的KeyValue数据

B 存储数据的起点

C 指定字段的长度

D 存储数据块的起点

17 HFile数据格式中的MetaIndex字段用于()。D

A Meta块的长度

B Meta块的结束点

C Meta块数据内容

D Meta块的起始点

18 HFile数据格式中的Magic字段用于()。A

A 存储随机数,防止数据损坏

B 存储数据的起点

C 存储数据块的起点

D 指定字段的长度

19 HFile数据格式中的KeyValue数据格式,下列选项描述正确的是()。A、D

A 是byte[]数组

B 没有固定的结构

C 数据的大小是定长的

D 有固定的结构

20 HFile数据格式中的KeyValue数据格式中Value部分是()。C

A 拥有复杂结构的字符串

B 字符串

C 二进制数据

D 压缩数据

第三部分:HBase高级应用介绍

31 HBase中的批量加载底层使用()实现。A

A MapReduce

B Hive

C Coprocessor

D Bloom Filter

32. HBase性能优化包含下面的哪些选项?A、B、C、D

A 读优化

B 写优化

C 配置优化

D JVM优化

33. Rowkey设计的原则,下列哪些选项的描述是正确的?A、B、C

A 尽量保证越短越好

B 可以使用汉字

C 可以使用字符串

D 本身是无序的

34. HBase构建二级索引的实现方式有哪些? A、B

A MapReduce

B Coprocessor

C Bloom Filter

D Filter

35. 关于HBase二级索引的描述,哪些是正确的?A、B

A 核心是倒排表

B 二级索引概念是对应Rowkey这个“一级”索引

C 二级索引使用平衡二叉树

D 二级索引使用LSM结构

36. 下列关于Bloom Filter的描述正确的是?A、C

A 是一个很长的二进制向量和一系列随机映射函数

B 没有误算率

C 有一定的误算率

D 可以在Bloom Filter中删除元素

第四部分:HBase安装、部署、启动

37. HBase官方版本可以安装在什么操作系统上?A、B、C

A CentOS

B Ubuntu

C RedHat

D Windows

38. HBase虚拟分布式模式需要()个节点?A

A 1

B 2

C 3

D 最少3个

39. HBase分布式模式最好需要()个节点?C

A 1

B 2

C 3

D 最少

关于hadoop的选择题

1、Doug Cutting所创立的项目的名称都受到其家人的启发,以下项目不是由他创立的项目是

A. Hadoop

B. Nutch

C. Lucene

D. Solr

答案:D

2、配置Hadoop时,JAVA_HOME包含在哪一个配置文件中

A. hadoop-default.xml

B. hadoop-env.sh

C. hadoop-site.xml

D. configuration.xsl

答案:B

知识点:hadoop配置

3、Hadoop配置文件中,hadoop-site.xml显示覆盖hadoop-default.xml里的内容。在版本0.20中,hadoop-site.xml被分离成三个XML文件,不包括

A. conf-site.xml

B. mapred-site.xml

C. core-site.xml

D. hdfs-site.xml

答案:A

知识点:hadoop配置

4、HDFS默认的当前工作目录是/user/$USER,fs.default.name的值需要在哪个配置文件内说明

A. mapred-site.xml

B. core-site.xml

C. hdfs-site.xml

D. 以上均不是

答案:B

知识点:hadoop配置

5、关于Hadoop单机模式和伪分布式模式的说法,正确的是

A. 两者都起守护进程,且守护进程运行在一台机器上

B. 单机模式不使用HDFS,但加载守护进程

C. 两者都不与守护进程交互,避免复杂性

D. 后者比前者增加了HDFS输入输出以及可检查内存使用情况

答案:D

知识点:hadoop配置

6、下列关于Hadoop API的说法错误的是

A. Hadoop的文件API不是通用的,只用于HDFS文件系统

B. Configuration类的默认实例化方法是以HDFS系统的资源配置为基础的

C. FileStatus对象存储文件和目录的元数据

D. FSDataInputStream是java.io.DataInputStream的子类

答案:A

//HDFS

7、HDFS的NameNode负责管理文件系统的命名空间,将所有的文件和文件夹的元数据保存在一个文件系统树中,这些信息也会在硬盘上保存成以下文件:

A.日志

B.命名空间镜像

C.两者都是

答案:C

知识点:

8、HDFS的namenode保存了一个文件包括哪些数据块,分布在哪些数据节点上,这些信息也存储在硬盘上。

A.正确

B.错误

答案:B

知识点:在系统启动的时候从数据节点收集而成的

9、Secondary namenode就是namenode出现问题时的备用节点

A.正确

B.错误

答案:B

知识点:它和元数据节点负责不同的事情。其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。合并过后的命名空间镜像文件也在Secondary namenode保存了一份,以防namenode失败的时候,可以恢复。

10、出现在datanode的VERSION文件格式中但不出现在namenode的VERSION文件格式中的是

A. namespaceID

B. storageID

C. storageType

D. layoutVersion

答案:B

知识点:其他三项是公有的。layoutVersion是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号;namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的;storageType表示此文件夹中保存的是数据节点的类型

11、Client在HDFS上进行文件写入时,namenode根据文件大小和配置情况,返回部分datanode信息,谁负责将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块

A. Client

B. Namenode

C. Datanode

D. Secondary namenode

答案:A

知识点:HDFS文件写入

12、HDFS的是基于流数据模式访问和处理超大文件的需求而开发的,默认的最基本的存储单位是64M,具有高容错、高可靠性、高可扩展性、高吞吐率等特征,适合的读写任务是

A.一次写入,少次读写

B.多次写入,少次读写

C.一次写入,多次读写

D.多次写入,多次读写

答案:C

知识点:HDFS特性

13、HDFS无法高效存储大量小文件,想让它能处理好小文件,比较可行的改进策略不包括

A. 利用SequenceFile、MapFile、Har等方式归档小文件

B. 多Master设计

C. Block大小适当调小

D. 调大namenode内存或将文件系统元数据存到硬盘里

答案:D

知识点:HDFS特性

14、关于HDFS的文件写入,正确的是

A. 支持多用户对同一文件的写操作

B. 用户可以在文件任意位置进行修改

C. 默认将文件块复制成三份存放

D. 复制的文件块默认都存在同一机架上

答案:C

知识点:在HDFS的一个文件中只有一个写入者,而且写操作只能在文件末尾完成,即只能执行追加操作。默认三份文件块两块在同一机架上,另一份存放在其他机架上。

15、Hadoop fs中的-get和-put命令操作对象是

A. 文件

B. 目录

C. 两者都是

答案:C

知识点:HDFS命令

16、Namenode在启动时自动进入安全模式,在安全模式阶段,说法错误的是

A. 安全模式目的是在系统启动时检查各个DataNode上数据块的有效性

B. 根据策略对数据块进行必要的复制或删除

C. 当数据块最小百分比数满足的最小副本数条件时,会自动退出安全模式

D. 文件系统允许有修改

答案:D

知识点:HDFS安全模式

//MapReduce

17、MapReduce框架提供了一种序列化键/值对的方法,支持这种序列化的类能够在Map和Reduce过程中充当键或值,以下说法错误的是

A. 实现Writable接口的类是值

B. 实现WritableComparable<T>接口的类可以是值或键

C. Hadoop的基本类型Text并不实现WritableComparable<T>接口

D. 键和值的数据类型可以超出Hadoop自身支持的基本类型

答案:C

18、以下四个Hadoop预定义的Mapper实现类的描述错误的是

A. IdentityMapper<K, V>实现Mapper<K, V, K, V>,将输入直接映射到输出

B. InverseMapper<K, V>实现Mapper<K, V, K, V>,反转键/值对

C. RegexMapper<K>实现Mapper<K, Text, Text, LongWritable>,为每个常规表达式的匹配项生成一个(match, 1)对

D. TokenCountMapper<K>实现Mapper<K, Text, Text, LongWritable>,当输入的值为分词时,生成(taken, 1)对

答案:B

知识点:InverseMapper<K, V>实现Mapper<K, V, V, K>

19、下列关于HDFS为存储MapReduce并行切分和处理的数据做的设计,错误的是

A. FSDataInputStream扩展了DataInputStream以支持随机读

B. 为实现细粒度并行,输入分片(Input Split)应该越小越好

C. 一台机器可能被指派从输入文件的任意位置开始处理一个分片

D. 输入分片是一种记录的逻辑划分,而HDFS数据块是对输入数据的物理分割

答案:B

知识点:每个分片不能太小,否则启动与停止各个分片处理所需的开销将占很大一部分执行时间

20、针对每行数据内容为”Timestamp Url”的数据文件,在用JobConf对象conf设置conf.setInputFormat(WhichInputFormat.class)来读取这个文件时,WhichInputFormat应该为以下的

A. TextInputFormat

B. KeyValueTextInputFormat

C. SequenceFileInputFormat

D. NLineInputFormat

答案:B

知识点:四项主要的InputFormat类。KeyValueTextInputFormat以每行第一个分隔符为界,分隔符前为key,之后为value,默认制表符为\t

21、有关MapReduce的输入输出,说法错误的是

A. 链接多个MapReduce作业时,序列文件是首选格式

B. FileInputFormat中实现的getSplits()可以把输入数据划分为分片,分片数目和大小任意定义

C. 想完全禁止输出,可以使用NullOutputFormat

D. 每个reduce需将它的输出写入自己的文件中,输出无需分片

答案:B

知识点:分片数目在numSplits中限定,分片大小必须大于mapred.min.size个字节,但小于文件系统的块

22、Hadoop Streaming支持脚本语言编写简单MapReduce程序,以下是一个例子:

bin/hadoop jar contrib/streaming/hadoop-0.20-streaming.jar

—input input/filename

—output output

—mapper ‘dosth.py 5’

—file dosth.py

—D mapred.reduce.tasks=1

23、以下说法不正确的是

A. Hadoop Streaming使用Unix中的流与程序交互

B. Hadoop Streaming允许我们使用任何可执行脚本语言处理数据流

C. 采用脚本语言时必须遵从UNIX的标准输入STDIN,并输出到STDOUT

D. Reduce没有设定,上述命令运行会出现问题

答案:D

知识点:没有设定特殊的reducer,默认使用IdentityReducer

24、在高阶数据处理中,往往无法把整个流程写在单个MapReduce作业中,下列关于链接MapReduce作业的说法,不正确的是

A.Job和JobControl类可以管理非线性作业之间的依赖

B.ChainMapper和ChainReducer类可以用来简化数据预处理和后处理的构成

C.使用ChainReducer时,每个mapper和reducer对象都有一个本地JobConf对象

D.ChainReducer.addMapper()方法中,一般对键/值对发送设置成值传递,性能好且安全性高

答案:D

知识点:ChainReducer.addMapper()方法中,值传递安全性高,引用传递性能高

25、下面哪个程序负责 HDFS 数据存储。答案C datanode

a)NameNode

b)Jobtracker

c)Datanode

d)secondaryNameNode

e)tasktracker

26. HDfS 中的 block 默认保存几份? 答案A默认3分

a)3 份

b)2 份

c)1 份

d)不确定

27. 下列哪个程序通常与 NameNode 在一个节点启动?答案D

a)SecondaryNameNode

b)DataNode

c)TaskTracker

d)Jobtracker

28. Hadoop 作者 答案C Doug cutting

a)Martin Fowler

b)Kent Beck

c)Doug cutting

29. HDFS 默认 Block Size 答案:B

a)32MB

b)64MB

c)128MB

30、下列哪项通常是集群的最主要瓶颈:答案:C磁盘

a)CPU

b)网络

c)磁盘IO

d)内存

31. 关于 SecondaryNameNode 哪项是正确的?答案C

a)它是 NameNode 的热备

b)它对内存没有要求

c)它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间

d)SecondaryNameNode 应与 NameNode 部署到一个节点。

多选题:

1. 下列哪项可以作为集群的管理?答案:ABD

a)Puppet

b)Pdsh

c)Cloudera Manager

d)Zookeeper

2. 配置机架感知的下面哪项正确:答案ABC

a)如果一个机架出问题,不会影响数据读写

b)写入数据的时候会写到不同机架的 DataNode 中

c)MapReduce 会根据机架获取离自己比较近的网络数据

3. Client 端上传文件的时候下列哪项正确?答案B

a)数据经过 NameNode 传递给 DataNode

b)Client 端将文件切分为 Block,依次上传

c)Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作

4. 下列哪个是 Hadoop 运行的模式:答案ABC

a)单机版

b)伪分布式

c)分布式

5. Cloudera 提供哪几种安装 CDH 的方法?答案:ABCD

a)Cloudera manager

b)Tarball

c)Yum

d)Rpm

判断题:

1. Ganglia 不仅可以进行监控,也可以进行告警。( 正确)

2. Block Size 是不可以修改的。(错误 )

3. Nagios 不可以监控 Hadoop 集群,因为它不提供 Hadoop 支持。(错误 )

4. 如果 NameNode 意外终止,SecondaryNameNode 会接替它使集群继续工作。(错误 )

5. Cloudera CDH 是需要付费使用的。(错误 )

6. Hadoop 是 Java 开发的,所以 MapReduce 只支持 Java 语言编写。(错误 )

7. Hadoop 支持数据的随机读写。(错 )

8. NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata 信息并反馈 client 端。(错误)

9. Hadoop 自身具有严格的权限管理和安全措施保障集群正常运行。(错误 )

10. Slave 节点要存储数据,所以它的磁盘越大越好。( 错误)

11. hadoop dfsadmin –report 命令用于检测 HDFS 损坏块。(错误 )

12. Hadoop 默认调度器策略为 FIFO(正确 )

13. 集群内每个节点都应该配 RAID,这样避免单磁盘损坏,影响整个节点运行。(错误 )

14.因为 HDFS 有多个副本,所以 NameNode 是不存在单点问题的。(错误 )

15. 每个 map 槽就是一个线程。(错误 )

16. Mapreduce 的 input split 就是一个 block。(错误 )

17. DataNode 首次加入 cluster 的时候,如果 log 中报告不兼容文件版本,那需要 NameNode执行“Hadoop namenode -format”操作格式化磁盘。(错误 )

18. NameNode 的 Web UI 端口是 50030,它通过 jetty 启动的 Web 服务。(错误 )

19. Hadoop 环境变量中的 HADOOP_HEAPSIZE 用于设置所有 Hadoop 守护线程的内存。它默认是 200 GB。( 错误)

单纯的课本内容,并不能满足学生的需要,通过补充,达到内容的完善

0

SQLServer面试题总结

一、Sql常用语法

下列语句部分是Mssql语句,不可以在access中使用。

SQL分类:

DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)

DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)

DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句:

1、说明:创建数据库

CREATE DATABASE database-name

2、说明:删除数据库

drop database dbname

3、说明:备份sql server

— 创建 备份数据的 device

USE master

EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:mssql7backupMyNwind_1.dat’

— 开始 备份

BACKUP DATABASE pubs TO testBack

4、说明:创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:

A:create table tab_new like tab_old (使用旧表创建新表)

B:create table tab_new as select col1,col2… from tab_old definition only

5、说明:删除新表drop table tabname

6、说明:增加一个列

Alter table tabname add column col type注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

7、说明:添加主键: Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col)

8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname注:索引是不可更改的,想更改必须删除重新建。

9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname

10、说明:几个简单的基本的sql语句选择:select * from table1 where 范围插入:insert into table1(field1,field2) s(1,2)删除:delete from table1 where 范围更新:update table1 set field1=1 where 范围查找:select * from table1 where field1 like ’%1%’ —like的语法很精妙,查资料!排序:select * from table1 order by field1,field2 [desc]总数:select count * as totalcount from table1求和:select sum(field1) as sum from table1平均:select avg(field1) as avg from table1最大:select max(field1) as max from table1最小:select min(field1) as min from table1

11、说明:几个高级查询运算词

A: UNION 运算符

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

B: EXCEPT 运算符

EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

C: INTERSECT 运算符

INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。

12、说明:使用外连接

A、left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

不错的sql语句

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)法一:select * into b from a where 1<>1法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件例子:..from b in ‘”&Server.MapPath(“.”)&”data.mdb” &”‘ where..

4、说明:子查询(表名1:a 表名2:b)

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、说明:外连接查询(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a )

select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法

select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、说明:四表联查问题:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where …..

12、说明:日程安排提前五分钟提醒

SQL: select * from 日程安排 where datediff(‘minute’,f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页

select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

14、说明:前10条记录

select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、说明:随机取出10条数据

select top 10 * from tablename order by newid()

18、说明:随机选择记录

select newid()

19、说明:删除重复记录

Delete from tablename where id not in (select max(id) from tablename group by col1,col2,…)

20、说明:列出数据库里所有的表名

select name from sysobjects where type=’U’

21、说明:列出表里的所有的

select name from syscolumns where id=object_id(‘TableName’)

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

select type,sum(case vender when ‘A’ then pcs else 0 end),sum(case vender when ‘C’ then pcs else 0 end),sum(case vender when ‘B’ then pcs else 0 end) FROM tablename group by type显示结果:

type vender pcs电脑 A 1电脑 A 1光盘 B 2光盘 A 2手机 B 3手机 C 3

23、说明:初始化表table1

TRUNCATE TABLE table1

24、说明:选择从10到15的记录

select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

二、sql技巧

如何删除一个表中重复的记录?

create table a_dist(id int,name varchar(20))

insert into a_dist values(1,’abc’)

insert into a_dist values(1,’abc’)

insert into a_dist values(1,’abc’)

insert into a_dist values(1,’abc’)

exec up_distinct ‘a_dist’,’id’

select * from a_dist

create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))

–f_key表示是分组字段﹐即主键字段

as

begin

declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer

select @sql = ‘declare cur_rows cursor for select ‘+@f_key+’ ,count(*) from ‘ +@t_name +’ group by ‘ +@f_key +’ having count(*) > 1′

exec(@sql)

open cur_rows

fetch cur_rows into @id,@max

while @@fetch_status=0

begin

select @max = @max -1

set rowcount @max

select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key

if @type=56

select @sql = ‘delete from ‘+@t_name+’ where ‘ + @f_key+’ = ‘+ @id

if @type=167

select @sql = ‘delete from ‘+@t_name+’ where ‘ + @f_key+’ = ‘+””+ @id +””

exec(@sql)

fetch cur_rows into @id,@max

end

close cur_rows

deallocate cur_rows

set rowcount 0

end

select * from systypes

select * from syscolumns where id = object_id(‘a_dist’)

查询数据的最大排序问题(只能用一条语句写)

CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0))

insert into hard values (‘A’,’1′,3)

insert into hard values (‘A’,’2′,4)

insert into hard values (‘A’,’4′,2)

insert into hard values (‘A’,’6′,9)

insert into hard values (‘B’,’1′,4)

insert into hard values (‘B’,’2′,5)

insert into hard values (‘B’,’3′,6)

insert into hard values (‘C’,’3′,4)

insert into hard values (‘C’,’6′,7)

insert into hard values (‘C’,’2′,3)

要求查询出来的结果如下:

qu co je

———– ———– —–

A 6 9

A 2 4

B 3 6

B 2 5

C 6 7

C 3 4

就是要按qu分组,每组中取je最大的前2位!!

而且只能用一句sql语句!!!

select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)

求删除重复记录的sql语句?

怎样把具有相同字段的纪录删除,只留下一条。

例如,表test里有id,name字段

如果有name相同的记录 只留下一条,其余的删除。

name的内容不定,相同的记录数不定。

有没有这样的sql语句?

==============================

A:一个完整的解决方案:

将重复的记录记入temp1表:

select [标志字段id],count(*) into temp1 from [表名]

group by [标志字段id]

having count(*)>1

2、将不重复的记录记入temp1表:

insert temp1 select [标志字段id],count(*) from [表名] group by [标志字段id] having count(*)=1

3、作一个包含所有不重复记录的表:

select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)

4、删除重复表:

delete [表名]

5、恢复表:

insert [表名] select * from temp2

6、删除临时表:

drop table temp1

drop table temp2

================================

B:

create table a_dist(id int,name varchar(20))

insert into a_dist values(1,’abc’)

insert into a_dist values(1,’abc’)

insert into a_dist values(1,’abc’)

insert into a_dist values(1,’abc’)

exec up_distinct ‘a_dist’,’id’

select * from a_dist

create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))

–f_key表示是分组字段﹐即主键字段

as

begin

declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer

select @sql = ‘declare cur_rows cursor for select ‘+@f_key+’ ,count(*) from ‘ +@t_name +’ group by ‘ +@f_key +’ having count(*) > 1′

exec(@sql)

open cur_rows

fetch cur_rows into @id,@max

while @@fetch_status=0

begin

select @max = @max -1

set rowcount @max

select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key

if @type=56

select @sql = ‘delete from ‘+@t_name+’ where ‘ + @f_key+’ = ‘+ @id

if @type=167

select @sql = ‘delete from ‘+@t_name+’ where ‘ + @f_key+’ = ‘+””+ @id +””

exec(@sql)

fetch cur_rows into @id,@max

end

close cur_rows

deallocate cur_rows

set rowcount 0

end

select * from systypes

select * from syscolumns where id = object_id(‘a_dist’)

行列转换–普通

假设有张学生成绩表(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)

行列转换–合并

有表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

如何取得一个数据表的所有列名

方法如下:先从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

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =’users’

通过SQL语句来更改用户的密码

修改别人的,需要sysadmin role

EXEC sp_password NULL, ‘newpassword’, ‘User’

如果帐号为SA执行EXEC sp_password NULL, ‘newpassword’, sa

怎么判断出一个表的哪些字段不允许为空?

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE=’NO’ and TABLE_NAME=tablename

如何在数据库里找到含有相同字段的表?

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=’你的字段名字’

未知列名查所有在不同表出现过的列名

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

)

查询第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]

行数为绝对行数

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))。

获取表结构[把 ‘sysobjects’ 替换 成 ‘tablename’ 即可]

SELECT CASE IsNull(I.name, ”)

When ” Then ”

Else ‘*’

End as IsPK,

Object_Name(A.id) as t_name,

A.name as c_name,

IsNull(SubString(M.text, 1, 254), ”) as pbc_init,

T.name as F_DataType,

CASE IsNull(TYPEPROPERTY(T.name, ‘Scale’), ”)

WHEN ” Then Cast(A.prec as varchar)

ELSE Cast(A.prec as varchar) + ‘,’ + Cast(A.scale as varchar)

END as F_Scale,

A.isnullable as F_isNullAble

FROM Syscolumns as A

JOIN Systypes as T

ON (A.xType = T.xUserType AND A.Id = Object_id(‘sysobjects’) )

LEFT JOIN ( SysIndexes as I

JOIN Syscolumns as A1

ON ( I.id = A1.id and A1.id = object_id(‘sysobjects’) and (I.status & 0x800) = 0x800 AND A1.colid <= I.keycnt) )

ON ( A.id = I.id AND A.name = index_col(‘sysobjects’, I.indid, A1.colid) )

LEFT JOIN SysComments as M

ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, ‘IsConstraint’) = 1 )

ORDER BY A.Colid ASC

提取数据库内所有表的字段详细说明的SQL语句

SELECT

(case when a.colorder=1 then d.name else ” end) N’表名’,

a.colorder N’字段序号’,

a.name N’字段名’,

(case when COLUMNPROPERTY( a.id,a.name,’IsIdentity’)=1 then ‘√’else ”

end) N’标识’,

(case when (SELECT count(*)

FROM sysobjects

WHERE (name in

(SELECT name

FROM sysindexes

WHERE (id = a.id) AND (indid in

(SELECT indid

FROM sysindexkeys

WHERE (id = a.id) AND (colid in

(SELECT colid

FROM syscolumns

WHERE (id = a.id) AND (name = a.name))))))) AND

(xtype = ‘PK’))>0 then ‘√’ else ” end) N’主键’,

b.name N’类型’,

a.length N’占用字节数’,

COLUMNPROPERTY(a.id,a.name,’PRECISION’) as N’长度’,

isnull(COLUMNPROPERTY(a.id,a.name,’Scale’),0) as N’小数位数’,

(case when a.isnullable=1 then ‘√’else ” end) N’允许空’,

isnull(e.text,”) N’默认值’,

isnull(g.[value],”) AS N’字段说明’

FROM syscolumns a

left join systypes b

on a.xtype=b.xusertype

inner join sysobjects d

on a.id=d.id and d.xtype=’U’ and d.name<>’dtproperties’

left join syscomments e

on a.cdefault=e.id

left join sysproperties g

on a.id=g.id AND a.colid = g.smallid

order by object_name(a.id),a.colorder

快速获取表test的记录总数[对大容量表非常有效]

快速获取表test的记录总数:

select rows from sysindexes where id = object_id(‘test’) and indid in (0,1)

update 2 set KHXH=(ID+1)\2 2行递增编号

update [23] set id1 = ‘No.’+right(‘00000000’+id,6) where id not like ‘No%’ //递增

update [23] set id1= ‘No.’+right(‘00000000’+replace(id1,’No.’,”),6) //补位递增

delete from [1] where (id%2)=1

奇数

替换表名字段

update [1] set domurl = replace(domurl,’Upload/Imgswf/’,’Upload/Photo/’) where domurl like ‘%Upload/Imgswf/%’

截位

SELECT LEFT(表名, 5)

截位

SELECT LEFT(表名, 5)

三、(MS SQL Server)SQL语句导入导出大全

/******* 导出到excel

EXEC master..xp_cmdshell ‘bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S”GNETDATA/GNETDATA” -U”sa” -P””‘

/*********** 导入Excel

SELECT *

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=”c:\test.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0′)…xactions

SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+’ ’ 转换后的别名

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=”c:\test.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0’)…xactions

select * from OPENROWSET(‘MICROSOFT.JET.OLEDB.4.0′,’Excel 5.0;HDR=YES;DATABASE=c:\Book1.xls’,Sheet1$)

HDR=YES;Excel第一行当成标题行

HDR=NO;第一行不当成标题行

/** 导入文本文件

EXEC master..xp_cmdshell ‘bcp “dbname..tablename” in c:\DT.txt -c -Sservername -Usa -Ppassword’

/** 导出文本文件

EXEC master..xp_cmdshell ‘bcp “dbname..tablename” out c:\DT.txt -c -Sservername -Usa -Ppassword’

EXEC master..xp_cmdshell ‘bcp “Select * from dbname..tablename” queryout c:\DT.txt -c -Sservername -Usa -Ppassword’

导出到TXT文本,用逗号分开

exec master..xp_cmdshell ‘bcp “库名..表名” out “d:\tt.txt” -c -t ,-U sa -P password’

BULK INSERT 库名..表名

FROM ‘c:\test.txt’

WITH (

FIELDTERMINATOR = ‘;’,

ROWTERMINATOR = ‘\n’

)

–/* dBase IV文件

select * from

OPENROWSET(‘MICROSOFT.JET.OLEDB.4.0′

,’dBase IV;HDR=NO;IMEX=2;DATABASE=C:\’,’select * from [客户资料4.dbf]’)

–*/

–/* dBase III文件

select * from

OPENROWSET(‘MICROSOFT.JET.OLEDB.4.0′

,’dBase III;HDR=NO;IMEX=2;DATABASE=C:\’,’select * from [客户资料3.dbf]’)

–*/

–/* FoxPro 数据库

select * from openrowset(‘MSDASQL’,

‘Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\’,

‘select * from [aa.DBF]’)

–*/

/**************导入DBF文件****************/

select * from openrowset(‘MSDASQL’,

‘Driver=Microsoft Visual FoxPro Driver;

SourceDB=e:\VFP98\data;

SourceType=DBF’,

‘select * from customer where country != “USA” order by country’)

go

/***************** 导出到DBF ***************/

如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句

insert into openrowset(‘MSDASQL’,

‘Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\’,

‘select * from [aa.DBF]’)

select * from 表

说明:

SourceDB=c:\ 指定foxpro表所在的文件夹

aa.DBF 指定foxpro表的文件名.

/*************导出到Access********************/

insert into openrowset(‘Microsoft.Jet.OLEDB.4.0’,

‘x:\A.mdb’;’admin’;”,A表) select * from 数据库名..B表

/*************导入Access********************/

insert into B表 selet * from openrowset(‘Microsoft.Jet.OLEDB.4.0’,

‘x:\A.mdb’;’admin’;”,A表)

********************* 导入 xml 文件

DECLARE @idoc int

DECLARE @doc varchar(1000)

–sample XML document

SET @doc =’

<root>

<Customer cid= “C1″ name=”Janine” city=”Issaquah”>

<Order oid=”O1″ date=”1/20/1996″ amount=”3.5″ />

<Order oid=”O2″ date=”4/30/1997″ amount=”13.4″>Customer was very satisfied

</Order>

</Customer>

<Customer cid=”C2″ name=”Ursula” city=”Oelde” >

<Order oid=”O3″ date=”7/14/1999″ amount=”100″ note=”Wrap it blue

white red”>

<Urgency>Important</Urgency>

Happy Customer.

</Order>

<Order oid=”O4″ date=”1/20/1996″ amount=”10000″/>

</Customer>

</root>

— Create an internal representation of the XML document.

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

— Execute a SELECT statement using OPENXML rowset provider.

SELECT *

FROM OPENXML (@idoc, ‘/root/Customer/Order’, 1)

WITH (oid char(5),

amount float,

comment ntext ‘text()’)

EXEC sp_xml_removedocument @idoc

/********************导整个数据库*********************************************/

用bcp实现的存储过程

/*

实现数据导入/导出的存储过程

根据不同的参数,可以实现导入/导出整个数据库/单个表

调用示例:

–导出调用示例

—-导出单个表

exec file2table ‘zj’,”,”,’xzkh_sa..地区资料’,’c:\zj.txt’,1

—-导出整个数据库

exec file2table ‘zj’,”,”,’xzkh_sa’,’C:\docman’,1

–导入调用示例

—-导入单个表

exec file2table ‘zj’,”,”,’xzkh_sa..地区资料’,’c:\zj.txt’,0

—-导入整个数据库

exec file2table ‘zj’,”,”,’xzkh_sa’,’C:\docman’,0

*/

if exists(select 1 from sysobjects where name=’File2Table’ and objectproperty(id,’IsProcedure’)=1)

drop procedure File2Table

go

create procedure File2Table

@servername varchar(200) –服务器名

,@username varchar(200) –用户名,如果用NT验证方式,则为空”

,@password varchar(200) –密码

,@tbname varchar(500) –数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表

,@filename varchar(1000) –导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt

,@isout bit –1为导出,0为导入

as

declare @sql varchar(8000)

if @tbname like ‘%.%.%’ –如果指定了表名,则直接导出单个表

begin

set @sql=’bcp ‘+@tbname

+case when @isout=1 then ‘ out ‘ else ‘ in ‘ end

+’ “‘+@filename+'” /w’

+’ /S ‘+@servername

+case when isnull(@username,”)=” then ” else ‘ /U ‘+@username end

+’ /P ‘+isnull(@password,”)

exec master..xp_cmdshell @sql

end

else

begin –导出整个数据库,定义游标,取出所有的用户表

declare @m_tbname varchar(250)

if right(@filename,1)<>’\’ set @filename=@filename+’\’

set @m_tbname=’declare #tb cursor for select name from ‘+@tbname+’..sysobjects where xtype=”U”’

exec(@m_tbname)

open #tb

fetch next from #tb into @m_tbname

while @@fetch_status=0

begin

set @sql=’bcp ‘+@tbname+’..’+@m_tbname

+case when @isout=1 then ‘ out ‘ else ‘ in ‘ end

+’ “‘+@filename+@m_tbname+’.txt ” /w’

+’ /S ‘+@servername

+case when isnull(@username,”)=” then ” else ‘ /U ‘+@username end

+’ /P ‘+isnull(@password,”)

exec master..xp_cmdshell @sql

fetch next from #tb into @m_tbname

end

close #tb

deallocate #tb

end

go

/**********************Excel导到Txt****************************************/

想用

select * into opendatasource(…) from opendatasource(…)

实现将一个Excel文件内容导入到一个文本文件

假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)

且银行帐号导出到文本文件后分两部分,前8位和后8位分开。

如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2

然后就可以用下面的语句进行插入

注意文件名和目录根据你的实际情况进行修改.

insert into

opendatasource(‘MICROSOFT.JET.OLEDB.4.0′

,’Text;HDR=Yes;DATABASE=C:\’

)…[aa#txt]

–,aa#txt)

–*/

select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)

from

opendatasource(‘MICROSOFT.JET.OLEDB.4.0′

,’Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls’

–,Sheet1$)

)…[Sheet1$]

如果你想直接插入并生成文本文件,就要用bcp

declare @sql varchar(8000),@tbname varchar(50)

–首先将excel表内容导入到一个全局临时表

select @tbname='[##temp’+cast(newid() as varchar(40))+’]’

,@sql=’select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)

into ‘+@tbname+’ from

opendatasource(”MICROSOFT.JET.OLEDB.4.0”

,”Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls”

)…[Sheet1$]’

exec(@sql)

–然后用bcp从全局临时表导出到文本文件

set @sql=’bcp “‘+@tbname+'” out “c:\aa.txt” /S”(local)” /P”” /c’

exec master..xp_cmdshell @sql

–删除临时表

exec(‘drop table ‘+@tbname)

用bcp将文件导入导出到数据库的存储过程:

/*–bcp-二进制文件的导入导出

支持image,text,ntext字段的导入/导出

image适合于二进制文件;text,ntext适合于文本数据文件

注意:导入时,将覆盖满足条件的所有行

导出时,将把所有满足条件的行也出到指定文件中

此存储过程仅用bcp实现

邹建 2003.08—————–*/

/*–调用示例

–数据导出

exec p_binaryIO ‘zj’,”,”,’acc_演示数据..tb’,’img’,’c:\zj1.dat’

–数据导出

exec p_binaryIO ‘zj’,”,”,’acc_演示数据..tb’,’img’,’c:\zj1.dat’,”,0

–*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)

drop procedure [dbo].[p_binaryIO]

GO

Create proc p_binaryIO

@servename varchar (30),–服务器名称

@username varchar (30), –用户名

@password varchar (30), –密码

@tbname varchar (500), –数据库..表名

@fdname varchar (30), –字段名

@fname varchar (1000), –目录+文件名,处理过程中要使用/覆盖:@filename+.bak

@tj varchar (1000)=”, –处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀

@isout bit=1 –1导出((默认),0导入

AS

declare @fname_in varchar(1000) –bcp处理应答文件名

,@fsize varchar(20) –要处理的文件的大小

,@m_tbname varchar(50) –临时表名

,@sql varchar(8000)

–则取得导入文件的大小

if @isout=1

set @fsize=’0′

else

begin

create table #tb(可选名 varchar(20),大小 int

,创建日期 varchar(10),创建时间 varchar(20)

,上次写操作日期 varchar(10),上次写操作时间 varchar(20)

,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int)

insert into #tb

exec master..xp_getfiledetails @fname

select @fsize=大小 from #tb

drop table #tb

if @fsize is null

begin

print ‘文件未找到’

return

end

end

–生成数据处理应答文件

set @m_tbname='[##temp’+cast(newid() as varchar(40))+’]’

set @sql=’select * into ‘+@m_tbname+’ from(

select null as 类型

union all select 0 as 前缀

union all select ‘+@fsize+’ as 长度

union all select null as 结束

union all select null as 格式

) a’

exec(@sql)

select @fname_in=@fname+’_temp’

,@sql=’bcp “‘+@m_tbname+'” out “‘+@fname_in

+'” /S”‘+@servename

+case when isnull(@username,”)=” then ”

else ‘” /U”‘+@username end

+'” /P”‘+isnull(@password,”)+'” /c’

exec master..xp_cmdshell @sql

–删除临时表

set @sql=’drop table ‘+@m_tbname

exec(@sql)

if @isout=1

begin

set @sql=’bcp “select top 1 ‘+@fdname+’ from ‘

+@tbname+case isnull(@tj,”) when ” then ”

else ‘ where ‘+@tj end

+'” queryout “‘+@fname

+'” /S”‘+@servename

+case when isnull(@username,”)=” then ”

else ‘” /U”‘+@username end

+'” /P”‘+isnull(@password,”)

+'” /i”‘+@fname_in+'”‘

exec master..xp_cmdshell @sql

end

else

begin

–为数据导入准备临时表

set @sql=’select top 0 ‘+@fdname+’ into ‘

+@m_tbname+’ from ‘ +@tbname

exec(@sql)

–将数据导入到临时表

set @sql=’bcp “‘+@m_tbname+'” in “‘+@fname

+'” /S”‘+@servename

+case when isnull(@username,”)=” then ”

else ‘” /U”‘+@username end

+'” /P”‘+isnull(@password,”)

+'” /i”‘+@fname_in+'”‘

exec master..xp_cmdshell @sql

–将数据导入到正式表中

set @sql=’update ‘+@tbname

+’ set ‘+@fdname+’=b.’+@fdname

+’ from ‘+@tbname+’ a,’

+@m_tbname+’ b’

+case isnull(@tj,”) when ” then ”

else ‘ where ‘+@tj end

exec(@sql)

–删除数据处理临时表

set @sql=’drop table ‘+@m_tbname

end

–删除数据处理应答文件

set @sql=’del ‘+@fname_in

exec master..xp_cmdshell @sql

go

/** 导入文本文件

EXEC master..xp_cmdshell ‘bcp “dbname..tablename” in c:\DT.txt -c -Sservername -Usa -Ppassword’

改为如下,不需引号

EXEC master..xp_cmdshell ‘bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword’

/** 导出文本文件

EXEC master..xp_cmdshell ‘bcp “dbname..tablename” out c:\DT.txt -c -Sservername -Usa -Ppassword’

此句需加引号

四、sql常见面试题

sql理论题

1.触发器的作用?

答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

2。什么是存储过程?用什么来调用?

答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

3。索引的作用?和它的优点缺点是什么?

答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

3。什么是内存泄漏?

答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

4。维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?

答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

5。什么是事务?什么是锁?

答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

6。什么叫视图?游标是什么

答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

7。为管理业务培训信息,建立3个表:

S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄

C(C#,CN)C#,CN分别代表课程编号,课程名称

SC(S#,C#,G) S#,C#,G分别代表学号,所选的课程编号,学习成绩

(1)使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名?

答案:select s# ,sn from s where S# in(select S# from c,sc where c.c#=sc.c# and cn=’税收基础’)

(2) 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位?

答:select sn,sd from s,sc where s.s#=sc.s# and sc.c#=’c2’

(3) 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位?

答:select sn,sd from s where s# not in(select s# from sc where c#=’c5’)

(4)查询选修了课程的学员人数

答:select 学员人数=count(distinct s#) from sc

(5) 查询选修课程超过5门的学员学号和所属单位?

答:select sn,sd from s where s# in(select s# from sc group by s# having count(distinct c#)>5)

是查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,完整的查询语句如下:

select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by A

) T) order by A

要求是查询表A中存在ID重复三次以上的记录,完整的查询语句如下:

select * from(select count(ID) as count from table group by ID)T where T.count>3

create table testtable1

(

id int IDENTITY,

department varchar(12)

)

select * from testtable1

insert into testtable1 values(‘设计’)

insert into testtable1 values(‘市场’)

insert into testtable1 values(‘售后’)

/*

结果

id department

1 设计

2 市场

3 售后

*/

create table testtable2

(

id int IDENTITY,

dptID int,

name varchar(12)

)

insert into testtable2 values(1,’张三’)

insert into testtable2 values(1,’李四’)

insert into testtable2 values(2,’王五’)

insert into testtable2 values(3,’彭六’)

insert into testtable2 values(4,’陈七’)

/*

用一条SQL语句,怎么显示如下结果

id dptID department name

1 1 设计 张三

2 1 设计 李四

3 2 市场 王五

4 3 售后 彭六

5 4 黑人 陈七

*/

答案是:

SELECT testtable2.* , ISNULL(department,’黑人’)

FROM testtable1 right join testtable2 on testtable2.dptID = testtable1.ID

 

在面试应聘的SQL Server数据库开发人员时,我运用了一套标准的基准技术问题。下面这些问题是我觉得能够真正有助于淘汰不合格应聘者的问题。它们按照从易到难的顺序排列。当你问到关于主键和外键的问题时,后面的问题都十分有难度,因为答案可能会更难解释和说明,尤其是在面试的情形下。

你能向我简要叙述一下SQL Server 2000中使用的一些数据库对象吗?

你希望听到的答案包括这样一些对象:表格、视图、用户定义的函数,以及存储过程;如果他们还能够提到像触发器这样的对象就更好了。如果应聘者不能回答这个基本的问题,那么这不是一个好兆头。

NULL是什么意思?

NULL(空)这个值是数据库世界里一个非常难缠的东西,所以有不少应聘者会在这个问题上跌跟头您也不要觉得意外。 NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符。

什么是索引?SQL Server 2000里有什么类型的索引?

任何有经验的数据库开发人员都应该能够很轻易地回答这个问题。一些经验不太多的开发人员能够回答这个问题,但是有些地方会说不清楚。简单地说,索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。这个行标识符是一个指向磁盘上数据的指针。它允许每个表格有多个非聚集索引。

什么是主键?什么是外键?

主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。

什么是触发器?SQL Server 2000有什么不同类型的触发器?

让未来的数据库开发人员知道可用的触发器类型以及如何实现它们是非常有益的。触发器是一种专用类型的存储过程,它被捆绑到SQL Server 2000的表格或者视图上。在SQL Server 2000里,有INSTEAD-OF和AFTER两种触发器。INSTEAD-OF触发器是替代数据操控语言(Data Manipulation

Language,DML)语句对表格执行语句的存储过程。例如,如果我有一个用于TableA的INSTEAD-OF-UPDATE

触发器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新语句则不会执行操作。

AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。

您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?

这个与关系相关的问题有两个可能的答案。第一个答案(而且是您希望听到的答案)是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。

另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。

对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?

你正在寻找进行与数据操控有关的应聘人员。对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。

你可以用什么来确保表格里的字段只接受特定范围里的值?

这个问题可以用多种方式来回答,但是只有一个答案是“好”答案。您希望听到的回答是Check限制,它在数据库表格里被定义,用来限制输入该列的值。

触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。因此,微软建议使用Check限制而不是其他的方式来限制域的完整性。

如果应聘者能够正确地回答这个问题,那么他的机会就非常大了,因为这表明他们具有使用存储过程的经验。

返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。返回参数总是INT数据类型。

OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以用作输出参数的数据类型是有一些限制的。)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。

什么是相关子查询?如何使用这些查询?

经验更加丰富的开发人员将能够准确地描述这种类型的查询。相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。

什么是SQL注入式攻击?

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如:

⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。

⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子:

System.Text.StringBuilder query = new System.Text.StringBuilder(
   “SELECT * from Users WHERE login = ‘”)
   .Append(txtLogin.Text).Append(“‘ AND password='”)
   .Append(txtPassword.Text).Append(“‘”);

⑶ 攻击者在用户名字和密码输入框中输入”‘或’1’=’1″之类的内容。

⑷ 用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = ” or ‘1’=’1′ AND password = ” or ‘1’=’1’。

⑸ 服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。

⑹ 由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。

如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。

系统环境不同,攻击者可能造成的损害也不同,这主要由应用访问数据库的安全权限决定。如果用户的帐户具有管理员或其他比较高级的权限,攻击者就可能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表

如何防范SQL注入式攻击?

好在要防止ASP.NET应用被SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。

⑴ 对于动态构造SQL查询的场合,可以使用下面的技术:

第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,”SELECT * from Users WHERE login = ”’ or ”1”=”1′ AND password = ”’ or ”1”=”1′”显然会得到与”SELECT * from Users WHERE login = ” or ‘1’=’1′ AND password = ” or ‘1’=’1′”不同的结果。

第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如”SELECT * from Users WHERE login = ‘mas’ — AND password =””之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。

第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。

⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。

⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。

⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。

在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如 RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。

⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了”消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。 System.Web.Security.FormsAuthentication类有一个 HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒处理。

⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理

五、Sql常见题目

为管理岗位业务培训信息,建立3个表:

S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄

C (C#,CN ) C#,CN 分别代表课程编号、课程名称

SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩

1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名

–实现代码:

Select SN,SD FROM S Where [S#] IN( Select [S#] FROM C,SC Where C.[C#]=SC.[C#] AND CN=N’税收基础’)

2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位

–实现代码:

Select S.SN,S.SD FROM S,SC Where S.[S#]=SC.[S#] AND SC.[C#]=’C2′

3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位

–实现代码:

Select SN,SD FROM S Where [S#] NOT IN( Select [S#] FROM SC Where [C#]=’C5′)

4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位

–实现代码:

Select SN,SD FROM S Where [S#] IN( Select [S#] FROM SC RIGHT JOIN C ON SC.[C#]=C.[C#] GROUP BY [S#] HAVING COUNT(*)=COUNT([S#]))

5. 查询选修了课程的学员人数

–实现代码:

Select 学员人数=COUNT(DISTINCT [S#]) FROM SC

6. 查询选修课程超过5门的学员学号和所属单位

–实现代码:

Select SN,SD FROM S Where [S#] IN( Select [S#] FROM SC GROUP BY [S#] HAVING COUNT(DISTINCT [C#])>5)

题目2:

问题描述:

S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名

C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师

SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩

1. 找出没有选修过“李明”老师讲授课程的所有学生姓名

–实现代码:

Select SNAME FROM S Where NOT EXISTS( Select * FROM SC,C Where SC.CNO=C.CNO AND CNAME=’李明’ AND SC.SNO=S.SNO)

2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

–实现代码:

Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE) FROM S,SC,( Select SNO FROM SC Where SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2 )A Where S.SNO=A.SNO AND SC.SNO=A.SNO GROUP BY S.SNO,S.SNAME

3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名

–实现代码:

Select S.SNO,S.SNAME FROM S,( Select SC.SNO FROM SC,C Where SC.CNO=C.CNO AND C.CNAME IN(‘1′,’2′) GROUP BY SNO HAVING COUNT(DISTINCT CNO)=2 )SC Where S.SNO=SC.SNO

4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号

–实现代码:

Select S.SNO,S.SNAME FROM S,( Select SC1.SNO FROM SC SC1,C C1,SC SC2,C C2 Where SC1.CNO=C1.CNO AND C1.NAME=’1′ AND SC2.CNO=C2.CNO AND C2.NAME=’2′ AND SC1.SCGRADE>SC2.SCGRADE )SC Where S.SNO=SC.SNO

5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩

–实现代码:

Select S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩] FROM S,( Select SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE FROM SC SC1,C C1,SC SC2,C C2 Where SC1.CNO=C1.CNO AND C1.NAME=’1′ AND SC2.CNO=C2.CNO AND C2.NAME=’2’ AND SC1.SCGRADE>SC2.SCGRADE )SC Where S.SNO=SC.SNO

求其中同一个号码的两次通话之间间隔大于10秒的通话记录ID

例如:6,7,8,9,10条记录均符合

ID 主叫号码 被叫号码 通话起始时间 通话结束时间 通话时长

1 98290000 0215466546656 2007-02-01 09:49:53.000 2007-02-01 09:50:16.000 23

2 98290000 021546654666 2007-02-01 09:50:29.000 2007-02-01 09:50:41.000 12

3 98290000 021546654666 2007-02-01 09:50:58.000 2007-02-01 09:51:12.000 14

4 68290900 0755133329866 2007-02-01 10:04:31.000 2007-02-01 10:07:13.000 162

5 78290000 0755255708638 2007-02-01 10:48:26.000 2007-02-01 10:49:23.000 57

6 78290000 0755821119109 2007-02-01 10:49:39.000 2007-02-01 10:52:55.000 196

7 78290000 035730928370 2007-02-01 11:30:45.000 2007-02-01 11:31:58.000 73

8 78290000 0871138889904 2007-02-01 11:33:47.000 2007-02-01 11:35:00.000 73

9 68290000 035730928379 2007-02-01 11:52:20.000 2007-02-01 11:54:56.000 156

10 68290000 0298521811199 2007-02-01 12:44:45.000 2007-02-01 12:45:04.000 19

答案:

SELECT DISTINCT a.* FROM dbo.hc a left join dbo.hc b

ON a.主叫号码=b.主叫号码

WHERE a.id<>b.id AND (DATEDIFF(second,a.通话起始时间,b.通话结束时间)>10 AND

DATEDIFF(second,b.通话起始时间,a.通话结束时间)>10)

Sql Server关于按周统计的问题

统计Sql Server里一个销售明细表里某个时间段的销售额,而且要按周进行比较,以下是该语句的写法:

select sum(销售金额), datename(week, 销售日期-1) from sales where 销售日期 betwee begindate and enddate group by datename(week, 销售日期-1)

注意:这里之所以要把销售日期-1是因为sql server默认的一周的第一天是星期天,而我们习惯的统计是以星期一到星期天计算的,所以减一。

六、临时表

临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。

临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该表,则 SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除

七、视图

视图可以被看成是虚拟表或存储查询。除非是索引视图,否则视图的数据不会作为非重复对象存储在数据库中。数据库中存储的是 SELECT 语句。SELECT 语句的结果集构成视图所返回的虚拟表。用户可以采用引用表时所使用的方法,在 Transact-SQL 语句中引用视图名称来使用此虚拟表

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。分布式查询也可用于定义使用多个异类源数据的视图。例如,如果有多台不同的服务器分别存储您的单位在不同地区的数据,而您需要将这些服务器上结构相似的数据组合起来,这种方式就很有用。

通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少

视图种类:索引视图和索引视图

SQL Server 2005 查询处理器对索引视图和非索引视图将区别对待:

索引视图的行以表的格式存储在数据库中。如果查询优化器决定使用查询计划的索引视图,则索引视图将按照基表的处理方式进行处理。

只有非索引视图的定义才存储,而不存储视图的行。查询优化器将视图定义中的逻辑纳入执行计划,而该执行计划是它为引用非索引视图的 SQL 语句生成的。

SQL Server 查询优化器用于决定何时使用索引视图的逻辑与用于决定何时对表使用索引的逻辑相似。如果索引视图中的数据包括所有或部分 SQL 语句,而且查询优化器确定视图的某个索引是低成本的访问路径,则不论查询中是否引用了该视图的名称,查询优化器都将选择此索引

当 SQL 语句引用非索引视图时,分析器和查询优化器将分析 SQL 语句的源和视图的源,然后将它们解析为单个执行计划。没有单独用于 SQL 语句或视图的计划

创建视图前请考虑如下准则:

只能在当前数据库中创建视图。但是,如果使用分布式查询定义视图,则新视图所引用的表和视图可以存在于其他数据库甚至其他服务器中。

视图名称必须遵循标识符的规则,且对每个架构都必须唯一。此外,该名称不得与该架构包含的任何表的名称相同。

您可以对其他视图创建视图。Microsoft SQL Server 2005 允许嵌套视图。但嵌套不得超过 32 层。根据视图的复杂性及可用内存,视图嵌套的实际限制可能低于该值。

不能将规则或 DEFAULT 定义与视图相关联。

不能将 AFTER 触发器与视图相关联,只有 INSTEAD OF 触发器可以与之相关联。

定义视图的查询不能包含 COMPUTE 子句、COMPUTE BY 子句或 INTO 关键字。

定义视图的查询不能包含 ORDER BY 子句,除非在 SELECT 语句的选择列表中还有一个 TOP 子句。

定义视图的查询不能包含指定查询提示的 OPTION 子句。

定义视图的查询不能包含 TABLESAMPLE 子句。

不能为视图定义全文索引定义。

不能创建临时视图,也不能对临时表创建视图。

不能删除参与到使用 SCHEMABINDING 子句创建的视图中的视图、表或函数,除非该视图已被删除或更改而不再具有架构绑定。另外,如果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句,而这些语句又会影响该视图的定义,则这些语句将会失败。

尽管查询引用一个已配置全文索引的表时,视图定义可以包含全文查询,仍然不能对视图执行全文查询。

下列情况下必须指定视图中每列的名称:

视图中的任何列都是从算术表达式、内置函数或常量派生而来。

视图中有两列或多列原应具有相同名称(通常由于视图定义包含联接,因此来自两个或多个不同表的列具有相同的名称)。

希望为视图中的列指定一个与其源列不同的名称。(也可以在视图中重命名列。)无论重命名与否,视图列都会继承其源列的数据类型。

若要创建视图,必须获得数据库所有者授予您创建视图的权限,并且如果使用架构绑定创建视图,您必须对视图定义中所引用的表或视图具有适当权限

CREATE VIEW [ schema_name . ] view_name [ (column [ ,…n ] ) ]

[ WITH <view_attribute> [ ,…n ] ]

AS select_statement [ ; ]

[ WITH CHECK OPTION ]

<view_attribute> ::=

{

[ ENCRYPTION ]

    [ SCHEMABINDING ]

    [ VIEW_METADATA ]     }

0

运维必会的MySQL企业面试题及答案(开发也可以看看)

面试题1 :MySQL集群和高可用方案有哪些,再生产场景你都用过哪些方案?
常用mysql集群可以使用双主一从,一主多从; 高可用方案:MMM、MHA、mysql+ha+drbd  读写分离:MySQL+proxy 、Amoeba

生产中我使用的是双主3从,其中从库两台对外提供读服务,一台对内给开发或者DBA提供服务

blob.png

blob.png

面试题2:MySQL数据库如何实现读写分离,你的公司是怎么实现的(请答出200服务器以上规模企业数据库的解决方案)

我们公司使用的是mysql+proxy进行读写分离。在生产中,可以有这样两种方法

1.主库:web oldboy123 10.0.0.% 3306 (slect,insert,delete,update),主库忽略mysql同步授权【binlog-ignore-db=mysql     replicate-ignore-db=mysql】

从库:主库的web用户同步到从库,然后回收权限insert,delete,update,下面具体是回收权限方法

1

2

mysql> REVOKE insert,update,delete ON oldboy.* FROM ‘web1’@’10.0.0.%’;

Query OK, 0 rows affected (0.00 sec)mysql> show grants for web@’10.0.0.%’;+————————————————————————————————————+| Grants for web1@10.0.0.%                                                                                   |+————————————————————————————————————+| GRANT USAGE ON *.* TO ‘web1’@’10.0.0.%’ IDENTIFIED BY PASSWORD ‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257’ || GRANT SELECT ON oldboy.* TO ‘web1’@’10.0.0.%’                                                            |+————————————————————————————————————+2 rows in set (0.00 sec)

2.主库:web oldboy123 10.0.0.% 3306 (select,insert,delete,update)

从库:web oldboy123 10.0.0.% 3306 (select)

设置 read-only确保从库为只读

面试题3:开发有一堆数据插入,如何防止插入的中文数据产生乱码?

1.询问开发应用程序支持什么字符集 2.将数据转换为相应应用程序字符集保存 3.设置服务器端字符集(修改配置文件my.cnf, 使用命令 set names utf-8)

面试题4:如何批量更改数据库表的引擎,例如:myisam改成innodb。

方法一:

1.通过mysqldump -uroot -poldboy -S /data/3306/mysql.sock -x -B oldboy > /opt/oldboy.sql

2.使用sed替换,sed -i ‘s/myisam/innodb/g’ /opt/oldboy.sql

3.mysql -uroot -poldboy -S /data/3306/mysql.sock </opt/oldboy.sql

方法二:

1.登录数据库,执行下面的脚本

mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e “alter table oldboy.test engine=MyISAm;”

ALTER TABLE oldboy ENGINE = INNODB;

#!/bin/sh

myuser=root

mypasswd=lixiang123

socket=/tmp/mysql.sock

mycmd=”mysql -u$myuser -p$mypasswd -S $socket”

mydump=”mysqldump -u$myuser -p$mypasswd -S $socket”

for database in $mycmd -e "show databases;"|sed '1,2d'|egrep -v "mysql|performance_schema"

do

for tables in mydump -e "show tables from $databses;"|sed '1d'

do

$mycmd “alter table $database.$tables engine = innodb;”

done

done

面试题5:如何批量更改数据库字符集,例如;GBK更改为UTF8。

方法一:可以通过mysqldump命令备份出一个sql文件,再使用sed命令替换sed -i ‘s/GBK/UTF8/g’

方法二:通过shell脚本循环,过滤出数据库结合 alter database test set character utf8

1

2

3

4

5

6

7

8

9

10

11

mysql> help alter database

Name: ‘ALTER DATABASE’

Description:

Syntax:

ALTER {DATABASE | SCHEMA} [db_name]

alter_specification …

ALTER {DATABASE | SCHEMA} db_name

UPGRADE DATA DIRECTORY NAME

alter_specification:

[DEFAULT] CHARACTER SET [=] charset_name

| [DEFAULT] COLLATE [=] collation_name

面试题6 :你的数据库是如何备份的(请答出200服务器以上规模企业数据库备份的解决方案)

我公司的服务器采用的一主多从的方案,然后单独拿出一台服务器作为数据备份,同时采用inotify监控软件实时将从库产生的mysql-bin.******文件同步到本地。如果采用更安全的方法可以使用xtrabackup工具进行物理备份,将数据备份到备份服务器

面试题7:key_buffer_size参数作用,如何修改这个参数不重启数据库就可以生效?

key_buffer_size是数据库索引缓存

set global key_buffer_size = 26777216;不过这个只是临时生效,想要彻底生效可以在配置文件中修改

面试题8:delete from test和truncate table test区别?

delete from test是逻辑删除

truncate table test 是物理删除

面试题9:你维护的企业里MySQL服务架构能说下么?

我们企业采用的是一主三从,当主挂掉时能够自动切换到从上面(这个采用的是MMM 、keepalived实现的),读写分离Amoba

面试题10:网站打开慢,请给出排查方法,如果是因为数据库慢导致,如何排查并解决,请分析并举例?

网站打开慢的具体分析方法为:使用top,vmstat,free等命令帮助分析系统性能瓶颈

如果发现网站打开慢是由数据库造成的,那么可以采用下面的方法进行分析:1.修改配置文件#log-slow-queries = /data/3307/slow.log,开启mysql满日志查询,人为观察或是使用第三方工具mysqlsla分析慢查询最多的语句 2.通过explain 分析 慢查询语句 3.如果上述得出是结果为下面内容表示改语句并未走索引,而系统给出的可以创建的索引是primary(主键),但是具体创建索引可以根据具体条件判断,即 where后面跟随的语句

possible_keys: PRIMARY

key: NULL

面试题11:什么是数据库的事务,事务有哪些特性?

数据库事务是指逻辑上的一组sql语句,组成这组操作的各个sql语句,执行时要么成功要么失败

数据库事务:具有原子性、隔离性、持久性、一致性

面试题12:MySQL有哪些常用引擎?企业中如何批量更改表的引擎?

企业中常用的引擎有:MyISAM InnoDB Cluster Memory

1

2

3

4

5

6

7

8

9

10

11

12

13

14

mysql> show engines;

+——————–+———+—————————————————————-+————–+——+————+

| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |

+——————–+———+—————————————————————-+————–+——+————+

| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |

| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |

| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |

| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |

| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |

| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |

| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |

| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |

+——————–+———+—————————————————————-+————–+——+————+

8 rows in set (0.00 sec)

面试题13: MyISAM与Innodb数据库引擎有什么特点与区别,企业中如何选择?

MyISAM引擎:1.不支持事务 2.表级锁定 3.读写互相阻塞,但是读的时候并不阻塞另外的读 4.只会缓存索引 5.读取速度快,占用服务器资源相对较少 6.不支持外键约束

Innodb引擎:1.支持事务 2.支持行级锁定 3.读写阻塞与事务隔离级别相关 4.具有非常高的缓存性能 5. 5.5版本以后已经支持全文索引 6支持外键 7.占用资源比较多

InnoDB引擎在企业使用场景

1.需要事务 2.行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成 3.数据读写及更新较为频繁的场景,如微信 微博 SNS BBS等 4.数据一致性要求较高的业务,如银行 5.硬件设备内存较大,可以利用InnoDB较好的缓存能力来提供内存的利用率,尽可能减少磁盘IO 6.相比MyISAM引擎,InnoDB引擎更消耗资源,速度没有MyISAM引擎快

MyISAM引擎企业中使用场景

1.不支持事务 2.读数据比较多的应用 3.硬件资源较差的机器 4.对数据的一致性要求不高的业务 5.采用主从复制,从库可以使用MyISAM 6.数据修改相对较少的业务

面试题14:MySQL binlog的工作模式有哪些?各有什么特点,企业中如何选择?

1.Row(行模式);

将一条语句变成多条语句,例如:删除一个表delete from test,里面有五条数据它会生成3条语句,delete 张三 from test where id=1;delete 李四 from test where id=2;delete 王五 from test where id=3;

2.Statement(语句模式)

每一条修改的数据都会完整的记录到主库master的binlog里面,在slave上完整执行在master执行的sql语句;例如:主库操作delete from test;那么在从可也会执行delete from test;

3.mixed(混合模式)

结合前面的两种模式,如果在工作中有使用函数 或者触发器等特殊功能需求的时候,使用混合模式

例如当输出的数据达到100万条的时候,它就会选择 statement模式,而不会选择Row Level行模式

面试题15:如何分表分库备份及批量恢复(口述脚本实现过程)?

#!/bin/sh

myuser=root

mypasswd=lixiang123

socket=/tmp/mysql.sock

mycmd=”mysql -u$myuser -p$mypasswd -S $socket”

mydump=”mysqldump -u$myuser -p$mypasswd -S $socket”

for database in $mycmd -e "show databases;"|sed '1,2d'|egrep -v "mysql|performance_schema"

do

for tables in mydump -e "show tables from $databses;"|sed '1d'

do

$mydump $database $tables|gzip >/data/backup/${database}/${databse}_${tables}_$(date +%F)_sql.gz

done

done

面试题16:企业中MySQLDUMP备份时使用了-A -B参数,请问此时如何进行单表单库恢复?

寻找另外一台mysql备份机器,将先前mysqldump产生的sql文件导入;在按照面试题033的方法进行分表分库备份,将产生的结果再次导入线上服务器

面试题17:生产场景不停不锁主库,不夜里操作,如何白天从容批量创建从库?

mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -A -B -F –master-data=1 -x >/3306.sql

从库在change master to master_host = ‘10.0.0.101’, master_port=3306, master_user=’rep’, master_password=’oldboy123′;

start slave;

面试题18:生产场景,一主多从环境,从库宕机,请问你如何恢复?

从库宕机不太影响主机业务,然后查看从库是服务上的宕机还是服务器宕机,如果是应用程序的问题,查看从库的具体状态再另外分析

面试题19:生产场景,一主多从环境,主库宕机,请问你如何恢复,注意要说完整过程。

当1主多从时,留一台从库专门用来做数据备份

如果主库能够ssh连接上,mysql_bin.0000**文件没有丢失,将其补全到所有从库

选定一个从库提升为主库,开启binlog并将其他所有从库change master to

面试题20:解释下有关数据库的ACID是什么意思?

原子性:一个事务(transaction)中的所有操作,要么成功要么全部失败,并不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精准度、串联性以及后续数据库可以自发性的完成预设工作

隔离性:当两个或多个事务并发访问(此处访问指的是查询和修改操作)数据库的同一数据时所表现出来的相互关系。事务隔离分为不同级别,包括读未提交(read uncommitted)、读提交(read committed)、可重复读(repeated read)和串行化(Serializable)

持久化:在事务完成以后,该事务对数据所做的更改便持久地保存在数据库之中,并且是完全的

面试题21:企业生产MySQL 如何优化?

1.选择好的硬件,做raid10

2.开启慢查询,做索引

3.设置sleep超时时间

4.开启mysql慢查询日志,通过mysqlsla分析日志定时发送给开发,做sql语句的优化

面试题22:企业生产MySQL 如何设计备份方案?你是怎么做的?

我们企业采用的双主三从,实际是双主单写,两台主之间做keepalived高可用,另外两台从库实现读写分离,还有一台从库用来做备份用

面试题23:企业中MySQL root密码忘了怎么解决,多实例密码忘了又如何解决?

1

2

3

4

首先停止mysql,kill mysqld

mysqld_safe –defaults-file=/data/3306/my.cnf –skip-grant-table &

mysql -uroot -S /data/3306/mysql.sock

update mysql.user set password=password(“123456”) where user=’root’ and host=’localhost’;

面试题24:什么是MySQL引擎? MyISAM与Innodb数据库引擎特点与区别?
mysql数据库引擎是表的一种存储机制,不同的存储引擎可能在存取空间大小,存储性能以及引擎功能存在不同。常见的数据库引擎有MyISAM,Innodb,MEMORY, Cluster(集群)

MyISAM:

1.不支持事务  2.表级锁定 3.读写互相阻塞 4.只会缓存索引 5.读取速度较快,占用资源较少 6.不支持外键约束,但是支持全文索引

InnoDB:

1.支持事务 2.行级锁定(5.6版本以后支持全文索引) 3.读写阻塞与事务隔离级别相关 4.高速缓存(DATA caches) 5.占用系统资源较多 6.支持外键约束,支持全文索引

面试题25:如何配置描述MySQL多实例?

面试题26:工作中数据库被误操作执行了一个删除的SQL语句,你如何完整恢复丢失的数据?

1.首先得刷新mysql-binlong文件,查看具体mysql-bin.*****文件

mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -F –master-data=2 -B oldboy > /opt/oldboy.sql

2.得到出问题时候具体的文件mysql-bin.000006

mysqlbinlog -d oldboy mysql-bin.000006 >/bin.sql (在mysql_bin文件导出oldboy库的sql语句到bin.sql文件中)

3.查看oldboy.sql文件,过滤出刚刚误操作的语句删除掉 ,再次导入sql文件即可

mysql -urtoo -poldboy -S /data/3306/mysql.sock  -B oldboy </opt/oldboy.sql

[如果忘记之前执行了什么语句,那么就定位到那个时候的时间,然后再次按照上述操作执行,尽量减少数据的丢失]

在恢复数据的时候尽量停止掉mysql,不然一边恢复数据又一边写入数据 【如果可以容忍一段时间的数据丢失,那么可以不关闭数据库

备注:全量备份到出问题只产生了一个 mysql-bin.000021 文件,可是使用下面方法恢复,如果产生多个文件可以使用追加的方法

面试题27:MySQL出现同步延迟有哪些原因?如何解决?
1.从库太多

2.从库的硬件性能差会导致同步延迟
3.慢sql语句过多

4.主从复制的设计问题(例如主从采用单线程,而主库并发太大,来不及传入从库)

5.网络问题

面试题28:详细MySQL主从同步的原理及配置主从的完整步骤。
主库开启bin_log,这时主库就会产生mysql_bin.000***文件和IO线程,如果从库想要连接主库,必须在主库上面进行授权grant replication on *.* to rep@10.0.0.% indentified by ‘123456’;这个时候在从库要change master to ……到主库,与主库建立IO线程的连接同时在从库要开启同步开关start slave,此时从库就会产生一份really_log和sql线程,sql线程负责把数据写入磁盘

面试题29:MySQL如何实现双向互为主从复制A<==>B?

主库从库都需要开启bin_log日志文件

主库:#________m-m m1 start________

auto_increment_increment    = 2        #自增ID的间隔
auto_increment_offset           = 1        #ID的初始位置
log-slave-updates   = 1
log-bin = /data/3306/mysql-bin
expire_logs_days = 7
#________m-m m1 end________

从库:

#________m-m m1 start________

auto_increment_increment    = 2        #自增ID的间隔
auto_increment_offset           = 2        #ID的初始位置
log-slave-updates   = 1
log-bin = /data/3306/mysql-bin
expire_logs_days = 7
#________m-m m1 end________

面试题30:MySQL如何实现级联同步A–>B–>C?
从库B开启bin_log日志

在配置文件my.cnf下面模块添加如下内容:

log-bin = /data/3307/mysql-bin

log-slave-updates = 1

expire_logs_days = 7

面试题31:MySQL主从复制故障如何解决?如何监控主从复制是否故障?
在从库使用show slave status\G;查看从库的IO线程和SQL线程是否为yes,如果遇上具体问题具体分析。一般会出现创建库的问题,语句的问题。我们只需要在修改从库配置文件my.cnf

slave-skip-errors = 1032,1062,1005,1007

查看从库Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0,这三个状态是否正常,想要查看主从同步到底延迟多少,可以在主库插入时间戳

时间戳设置:

主库:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

CREATE TABLE test (‘id’ INT (3) UNSIGNED AUTO_INCREMENT, ‘date1’ TIMESTAMP (8) PRIMARY KEY(‘id’));

insert into test values(1,null);

mysql> select * from test;

+—-+———————+

| id | date1               |

+—-+———————+

|  2 | 2015-07-30 05:04:02 |

+—-+———————+

1 row in set (0.00 sec)

从库

mysql> select * from test;

+—-+———————+

| id | date1               |

+—-+———————+

|  1 | 2015-07-30 04:59:22 |

|  2 | 2015-07-30 05:04:02 |

+—-+———————+

2 rows in set (0.00 sec)

可以看到从库id=2的记录与主库基本无差异

面试题32:MySQL Sleep线程过多如何解决?

在配置文件修改超时时间

[mysqld]
interactive_timeout = 120 ;此参数设置后wait_timeout自动生效。
wait_timeout = 120

php程序不要使用长连接;java程序调整连接池

打开mysql慢查询

面试题33:如何调整已有MySQL数据库的字符集,例如:从UTF8改成GBK,请给出完整步骤。

面试题34:请描述MySQL里中文数据乱码的背后原理,以及工作中如何防止数据库数据乱码?

1.linux客户端字符集 UTF8(应用程序) 2.linux服务器端字符集 LANG=”zh_CN.UTF-8″ 3.数据库  客户端字符集 UTF8

面试题35:MySQL库授权oldboy用户管理bbs库的所有表,10.0.0.0整个网段访问,密码是123456,请给出详细命令(不低于2种方法)?

方法一:

1 grant all on bbs.* to oldboy@10.0.0.% identified by ‘123456’;

方法二:

登录mysql,可以用>help create user;查看帮助

CREATE USER ‘jeffrey’@’localhost’ IDENTIFIED BY PASSWORD ‘*90E462C37378CED12064BB3388827D2BA3A9B689’;

1

2

create user ‘oldboy’@’10.0.0.%’ identified by password ‘123456’;

grant all on bbs.* to ‘oldboy’@’10.0.0%’;

0

MySQL初级考试试面试题及答案

一、单项选择题

1.以下聚合函数求最大值的是( )

A.MAX

B.IF

C.CASE

D.AVG

答案:A

2.SQL语句中的条件用以下哪一项来表达( )

A.THEN

B.WHILE

C.WHERE

D.IF

答案:C

3.在视图上不能完成的操作是( )

A.查询

B.在视图上定义新的视图

C.更新视图

D.在视图上定义新的表

答案:D

4.可以用( )来声明游标

A.CREATE TABLE

B.ALTER CURSOR

C.SET GLOBAL

D.DECLARE CURSOR

答案:D

5.使用CREATE TABLE语句的( )子句,在创建基本表时可以启用全文本搜索

A.FULLTEXT

B.ENGINE

C.FROM

D.WHRER

答案:A

6.以下能够删除一列的是( )

A.alter table emp remove addcolumn

B.alter table emp drop column addcolumn

C.alter table emp delete column addcolumn

D.alter table emp delete addcolumn

答案:B

7.若要撤销数据库中已经存在的表S,可用( )。

A.DELETE TABLE S

B.DELETE S

C.DROP S

D.DROP TABLE S

答案:D

8.查找表结构用以下哪一项( )

A.FIND

B.SELETE

C.ALTER

D.DESC

答案:D

9.要得到最后一句SELECT查询到的总行数,可以使用的函数是( )

A.FOUND_ROWS

B.LAST_ROWS

C.ROW_COUNT

D.LAST_INSERT_ID

答案:A

10.SELECT语句的完整语法较复杂,但至少包括的部分是( )

A.仅SELECT

B.SELECT,FROM

C.SELECT,GROUP

D.SELECT,INTO

答案:B

11.UNIQUE惟一索引的作用是( )

A.保证各行在该索引上的值都不得重复

B.保证各行在该索引上的值不得为NULL

C.保证参加惟一索引的各列,不得再参加其他的索引

D.保证惟一索引不能被删除

答案:A

12.用于将事务处理写到数据库的命令是( )

A.insert

B.rollback

C.commit

D.savepoint

答案:C

13.查找条件为:姓名不是NULL的记录( )

A.WHERE NAME ! NULL

B.WHERE NAME NOT NULL

C.WHERE NAME IS NOT NULL

D.WHERE NAME!=NULL

答案:C

14.主键的建立有( )种方法

A.一

B.四

C.二

D.三

答案:D

15.在视图上不能完成的操作是( )

A.更新视图数据

B.在视图上定义新的基本表

C.在视图上定义新的视图

D.查询

答案:B

16.在SQL语言中,子查询是( ) 。

A.选取单表中字段子集的查询语句

B. 选取多表中字段子集的查询语句

C.返回单表中数据子集的查询语言

D.嵌入到另一个查询语句之中的查询语句

答案:D

17.向数据表中插入一条记录用以下哪一项( )

A.CREATE

B.INSERT

C.SAVE

D.UPDATE

答案:B

18.在select语句的where子句中,使用正则表达式过滤数据的关键字是( )

A.like

B.against

C.match

D.regexp

答案:D

19.SQL语言的数据操纵语句包括SELECT、INSERT、UPDATE、DELETE等。其中最重要的,也是使用最频繁的语句是( )。

A.UPDATE

B.SELECT

C.DELETE

D.INSERT

答案:B

20. 以下哪种操作能够实现实体完整性( )

A.设置唯一键

B.设置外键

C.减少数据冗余

D.设置主键

答案:B

21.SQL语言中,删除一个视图的命令是( )

A.REMOVE

B.CLEAR

C.DELETE

D.DROP

答案:D

22.修改数据库表结构用以下哪一项( )

A.UPDATE

B.CREATE

C.UPDATED

D.ALTER

答案:D

23.在全文本搜索的函数中,用于指定被搜索的列的是( )

A.MATCH()

B.AGAINST()

C.FULLTEXT()

D.REGEXP()

答案:A

24.以下语句错误的是( )

A.select sal+1 from emp;

B.select sal*10,sal*deptno from emp;

C.不能使用运算符号

D.select sal*10,deptno*10 from emp;

答案:C

25.下列( )不属于连接种类

A.左外连接

B.内连接

C.中间连接

D.交叉连接

答案:C

26.若用如下的SQL语句创建了一个表SC:( )

CREATE TABLE SC (S# CHAR(6) NOT NULL,C# CHAR(3) NOT NULL,SCORE INTEGER,NOTE CHAR(20));向SC表插入如下行时,( )行可以被插入 。

A.(NULL,’103’,80,’选修’)

B.(’200823’,’101’,NULL,NULL)

C.(’201132’,NULL,86,’ ’)

D.(’201009’,’111’,60,必修)

答案:B

27.删除用户账号命令是( )

A.DROP USER

B.DROP TABLE USER

C.DELETE USER

D.DELETE FROM USER

答案:A

28.以下语句错误的是( )

A. alter table emp delete column addcolumn;

B. alter table emp modify column addcolumn char(10);

C.alter table emp change addcolumn addcolumn int;

D. alter table emp add column addcolumn int;

答案:A

29.组合多条SQL查询语句形成组合查询的操作符是( )

A.SELECT

B.ALL

C.LINK

D.UNION

答案:D

30.创建数据库使用以下哪项( )

A.create mytest

B.create table mytest

C.database mytest

D.create database mytest

答案:D

31.以下哪项用来分组( )

A.ORDER BY

B.ORDERED BY

C.GROUP BY

D.GROUPED BY

答案:D

32.SQL是一种( )语言。

A. 函数型

B.高级算法

C.关系数据库

D. 人工智能

答案:C

33.删除数据表用以下哪一项( )

A.DROP

B.UPDATE

C.DELETE

D.DELETED

答案:A

34.若要在基本表S中增加一列CN(课程名),可用( )

A.ADD TABLE S ALTER(CN CHAR(8))

B.ALTER TABLE S ADD(CN CHAR(8))

C.ADD TABLE S(CN CHAR(8))

D.ALTER TABLE S (ADD CN CHAR(8))

答案:B

35.下列的SQL语句中,( )不是数据定义语句。

A.CREATE TABLE

B.GRANT

C.CREATE VIEW

D. DROP VIEW

答案:B

36.以下删除记录正确的( )

A.delete from emp where name=’dony’;

B.Delete * from emp where name=’dony’;

C.Drop from emp where name=’dony’;

D.Drop * from emp where name=’dony’;

答案:A

37.删除经销商1018的数据记录的代码为( ) from distributors where distri_num=1018

A.drop table

B.delete *

C.drop column

D.delete

答案:D

38.按照姓名降序排列( )

A.ORDER BY DESC NAME

B.ORDER BY NAME DESC

C.ORDER BY NAME ASC

D.ORDER BY ASC NAME

答案:B

39.可以在创建表时用( )来创建唯一索引,也可以用( )来创建唯一索引

A.Create table,Create index

B.设置主键约束,设置唯一约束

C.设置主键约束,Create index

D.以上都可以

答案:C

40.在SELECT语句中,使用关键字( )可以把重复行屏蔽

A.TOP

B.ALL

C.UNION

D.DISTINCT

答案:D

41.以下聚合函数求平均数的是( )

A.COUNT

B.MAX

C.AVG

D.SUM

答案:C

42.返回当前日期的函数是( )

A.curtime()

B.adddate()

C.curnow()

D.curdate()

答案:D

43.用来插入数据的命令是( ),用于更新的命令是( )

A.INSERT,UPDATE

B.CREATE,INSERT INTO

C.DELETE,UPDATE

D.UPDATE,INSERT

答案:A

44.SELECT COUNT(SAL) FROM EMP GROUP BY DEPTNO;意思是( )

A.求每个部门中的工资

B.求每个部门中工资的大小

C.求每个部门中工资的综合

D.求每个部门中工资的个数

答案:D

45.以下表达降序排序的是( )

A.ASC

B.ESC

C.DESC

D.DSC

答案:C

46.以下哪项不属于数据模型( )

A.关系模型

B.网状模型

C.层次模型

D.网络模型

答案:A

47.有三个表,它们的记录行数分别是10行、2行和6行,三个表进行交叉连接后,结果集中共有( )行数据

A.18

B.26

C.不确定

D.120

答案:D

48.从GROUP BY分组的结果集中再次用条件表达式进行筛选的子句是( )

A.FROM

B.ORDER BY

C.HAVING

D.WHERE

答案:C

49.为数据表创建索引的目的是( )

A.提高查询的检索性能

B.归类

C.创建唯一索引

D.创建主键

答案:A

50.如果要回滚一个事务,则要使用( )语句。

A.commit transaction

B. begin transaction

C. revoke 

D.rollback transaction

答案:D

51.查找数据表中的记录用以下哪一项( )

A.ALTRE

B.UPDATE

C.SELECT

D.DELETE

答案:C

52.在MySQL中,建立数据库用( )

A.CREATE TABLE命令

B.CREATE TRIGGER命令

C.CREATE INDEX命令

D.CREATE DATABASE命令

答案:D

53.MySQL中,预设的、拥有最高权限超级用户的用户名为( )

A.test

B.Administrator

C.DA

D.root

答案:D

54.以下插入记录正确的( )

A.insert into emp(ename,hiredate,sal) values (value1,value2,value3);

B.insert into emp (ename,sal)values(value1,value2,value3);

C.insert into emp (ename)values(value1,value2,value3);

D.insert into emp (ename,hiredate,sal)values(value1,value2);

答案:A

55.在SQL语言中的视图VIEW是数据库的( )

A.外模式

B.存储模式

C.模式

D. 内模式

答案:A

56.以下哪项用来排序( )

A.ORDERED BY

B.ORDER BY

C.GROUP BY

D.GROUPED BY

答案:B

57.以下聚合函数求个数的是( )

A.AVG

B.SUM

C.MAX

D.COUNT

答案:D

58.在select语句中,实现选择操作的子句是( )

A.select

B.group by

C.where

D.from

答案:C

59.查找数据库中所有的数据表用以下哪一项( )

A.SHOW DATABASE

B.SHOW TABLES

C.SHOW DATABASES

D.SHOW TABLE

答案:B

60.触发器不是响应以下哪一语句而自动执行的Mysql语句

A.select

B.insert

C.delete

D.update

答案:A

61.( )表示一个新的事务处理块的开始

A.START TRANSACTION

B.BEGIN TRANSACTION

C.BEGIN COMMIT

D.START COMMIT

答案:A

62.以下语句不正确的是( )

A.select * from emp;

B.select ename,hiredate,sal from emp;

C.select * from emp order deptno;

D.select * from where deptno=1 and sal<300;

答案:C

63.delete from employee语句的作用是( )

A.删除当前数据库中整个employee表,包括表结构

B.删除当前数据库中employee表内的所有行

C.由于没有where子句,因此不删除任何数据

D.删除当前数据库中employee表内的当前行

答案:B

64.按照班级进行分组( )

A.ORDER BY CLASSES

B.DORDER CLASSES

C.GROUP BY CLASSES

D.GROUP CLASSES

答案:C

65.格式化日期的函数是( )

A.DATEDIFF()

B.DATE_FORMAT()

C.DAY()

D.CURDATE()

答案:B

66.例如数据库中有A表,包括学生,学科,成绩 ,序号四个字段 , 数据库结构为

学生 学科 成绩 序号

张三 语文 60 1

张三 数学 100 2

李四 语文 70 3

李四 数学 80 4

李四 英语 80 5

上述哪一列可作为主键列( )

A.序号

B.成绩

C.学科

D.学生

答案:A

67.学生关系模式 S( S#,Sname,Sex,Age),S的属性分别表示学生的学号、姓名、性别、年龄。要在表S中删除一个属性“年龄”,可选用的SQL语句是( )。

A. UPDATE S Age

B.DELETE Age from S

C.ALTER TABLE S ‘Age’

D. ALTER TABLE S DROP Age

答案:D

68.以下哪项用于左连接( )

A.JOIN

B.RIGHT JOIN

C.LEFT JOIN

D.INNER JOIN

答案:C

69.一张表的主键个数为( )

A.至多3个

B.没有限制

C.至多1个

D.至多2个

答案:C

70.SQL语言是( )的语言,轻易学习 。

A.导航式

B.过程化

C.格式化

D.非过程化

答案:D

71.在正则表达式中,匹配任意一个字符的符号是( )

A..

B.*

C.?

D.-

答案:A

72.条件“BETWEEN 20 AND 30”表示年龄在20到30之间,且( )

A.包括20岁不包括30岁

B.不包括20岁包括30岁

C.不包括20岁和30岁

D.包括20岁和30岁

答案:D

73.以下表示可变长度字符串的数据类型是( )

A.TEXT

B.CHAR

C.VARCHAR

D.EMUM

答案:C

74.以下说法错误的是( )

A.SELECT max(sal),deptno,job FROM EMP group by sal;

B.SELECT max(sal),deptno,job FROM EMP group by deptno;

C.SELECT max(sal),deptno,job FROM EMP;

D.SELECT max(sal),deptno,job FROM EMP group by job;

答案:C

75.以下匹配’1 ton’和’2 ton’及’3 ton’的正则表达式是( )

A.’123 ton’

B.’1,2,3 ton’

C.'[123] ton’

D.’1|2|3 ton’

答案:C

76.拼接字段的函数是( )

A.SUBSTRING()

B.TRIM()

C.SUM()

D.CONCAT()

答案:D

77.以下删除表正确的( )

A.Delete * from emp

B.Drop database emp

C.Drop * from emp

D.delete database emp

答案:B

78.下列说法错误的是( )

A.GROUP BY 子句用来分组 WHERE 子句的输出

B.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。

C.聚合函数需要和group by 一起使用

D.HAVING 子句用来从FROM的结果中筛选行

答案:D

79.条件年龄BETWEEN 15 AND 35表示年龄在15至35之间,且( )

A.不包括15岁和35岁

B.包括15岁但不包括35岁

C.包括15岁和35岁

D.包括35岁但不包括15岁

答案:C

80.创建视图的命令是( )

A.alter view

B.alter table

C.create table

D.create view

答案:D

81.存储过程是一组预先定义并( )的Transact-SQL语句

A.保存

B.编写

C.编译

D.解释

答案:C

82.返回字符串长度的函数是( )

A.len()

B.length()

C.left()

D.long()

答案:B

83.从数据表中查找记录用以下哪一项( )

A.UPDATE

B.FIND

C.SELECT

D.CREATE

答案:C

84.SQL语言集数据查询、数据操纵、数据定义和数据控制功能于一体,其中,CREATE、DROP、ALTER语句是实现哪种功能( )

A.数据操纵

B.数据控制

C.数据定义

D.数据查询

答案:C

85.以下哪项不属于DML操作( )

A.insert

B.update

C.delete

D.create

答案:D

86.按照姓名升序序排列( )

A.ORDER BY NAME ASC

B.ORDER BY ASC NAME

C.ORDER BY NAME DESC

D.ORDER BY DESC NAME

答案:A

87.有关系S(S#,SNAME,SAGE),C(C#,CNAME),SC(S#,C#,GRADE)。其中S#是学生号,SNAME是学生姓名,SAGE是学生年龄, C#是课程号,CNAME是课程名称。要查询选修“ACCESS”课的年龄不小于20的全体学生姓名的SQL语句是SELECT SNAME FROM S,C,SC WHERE子句。这里的WHERE子句的内容是( )。

A.SAGE>=20 and CNAME=’ ACCESS’

B.S.S# = SC.S# and C.C# = SC.C# and SAGE in>=20 and CNAME in ‘ACCESS’

C.SAGE in>=20 and CNAME in ‘ACCESS’

D.S.S# = SC.S# and C.C# = SC.C# and SAGE>=20 and CNAME=‘ACCESS’

答案:D

88.以下哪项属于DDL操作( )

A.update

B.create

C. insert

D.delete

答案:B

89.查找条件为:姓名为NULL的记录( )

A.WHERE NAME NULL

B.\WHERE NAME IS NULL

C.WHERE NAME=NULL

D.\WHERE NAME ==NULL

答案:B

90.条件“IN(20,30,40)”表示( )

A.年龄在20到40之间

B.年龄在20到30之间

C.年龄是20或30或40

D.年龄在30到40之间

答案:C

91.正则表达式的转义符是( )

A.\\

B.\

C.;

D.$$

答案:A

92.更新数据表中的记录用以下哪一项( )

A.DELETE

B.ALTRE

C.UPDATE

D.SELECT

答案:C

93.关系数据库中,主键是( )

A.创建唯一的索引,允许空值

B.只允许以表中第一字段建立

C.允许有多个主键的

D.为标识表中唯一的实体

答案:D

94.使用SELECT语句随机地从表中挑出指定数量的行,可以使用的方法是( )

A.在LIMIT子句中使用RAND()函数指定行数,并用ORDER BY子句定义一个排序规则

B.只要使用LIMIT子句定义指定的行数即可,不使用ORDER BY子句

C.只要在ORDER BY子句中使用RAND()函数,不使用LIMIT子句

D.在ORDER BY子句中使用RAND()函数,并用LIMIT子句定义行数

答案:D

95.进入要操作的数据库TEST用以下哪一项( )

A.IN TEST

B.SHOW TEST

C.USER TEST

D.USE TEST

答案:D

96.例如数据库中有A表,包括学生,学科,成绩三个字段 , 数据库结构为

学生 学科 成绩

张三 语文 80

张三 数学 100

李四 语文 70

李四 数学 80

李四 英语 80

如何统计每个学科的最高分( )

A.select 学生,max(成绩) from A group by 学生;

B.select 学生,max(成绩) from A group by学科;

C.select 学生,max(成绩) from A order by学生;

D.select 学生,max(成绩) from A group by 成绩;

答案:B

97.下列哪些语句对主键的说明正确( )

A.主键可重复

B.主键不唯一

C.在数据表中的唯一索引

D.主键用foreign key修饰

答案:C

98.数据库服务器、数据库和表的关系,正确的说法是( )

A.一个数据库服务器只能管理一个数据库,一个数据库只能包含一个表

B.一个数据库服务器可以管理多个数据库,一个数据库可以包含多个表

C.一个数据库服务器只能管理一个数据库,一个数据库可以包含多个表

D.一个数据库服务器可以管理多个数据库,一个数据库只能包含一个表

答案:B

99.例如数据库中有A表,包括学生,学科,成绩三个字段 , 数据库结构为

学生 学科 成绩

张三 语文 60

张三 数学 100

李四 语文 70

李四 数学 80

李四 英语 80

如何统计最高分>80的学科( )

A.SELECT MAX(成绩) FROM A GROUP BY学科 HAVING MAX(成绩)>80;

B.SELECT学科 FROM A GROUP BY学科 HAVING成绩>80;

C.SELECT学科 FROM A GROUP BY学科 HAVING MAX(成绩)>80;

D.SELECT学科 FROM A GROUP BY学科 WHERE MAX(成绩)>80;

答案:C

100.统计每个部门中人数( )

A.SELECT SUM(ID) FROM EMP GROUP BY DEPTNO;

B.SELECT SUM(ID) FROM EMP ORDER BY DEPTNO;

C.SELECT COUNT(ID) FROM EMP ORDER BY DEPTNO;

D.SELECT COUNT(ID) FROM EMP GROUP BY DEPTNO;

答案:D

101.DECIMAL是( )数据类型

A.可变精度浮点值

B.整数值

C.双精度浮点值

D.单精度浮点值

答案:A

102.视图是一种常用的数据对象,它是提供( )和( )数据的另一种途径,可以简化数据库操作

A.插入,更新

B.查看,检索

C.查看,存放

D.检索,插入

答案:C

103.删除数据表中的一条记录用以下哪一项( )

A.DELETED

B.DELETE

C.DROP

D.UPDATE

答案:B

二、多项选择题

1.触发器是响应以下任意语句而自动执行的一条或一组MYSQL语句( )

A.UPDATE

B.INSERT

C.SELECT

D.DELETE

答案:B,A,D

2.对于删除操作以下说法正确的是()

A.drop database 数据库名: 删除数据库

B.delete from 表名; 删除表中所有记录条

C.delete from 表名 where 字段名=值;删除符合条件的记录条

D.drop table 表名;删除表

答案:B,C,D,A

3.下面正确的说法是( )

A.关键字只能由单个的属性组成

B.在一个关系中,关键字的值不能为空

C.一个关系中的所有候选关键字均可以被指定为主关键字

D.关键字是关系中能够用来惟一标识元组的属性

答案:D,B,C

4. 以下说法正确的是( )

A. 字符型既可用单引号也可用双引号将串值括起来

答案:A,D,B

5.关于主键下列说法正确的是()

A.可以是表中的一个字段,

B.是确定数据库中的表的记录的唯一标识字段,

C.该字段不可为空也不可以重复

D.可以是表中的多个字段组成的。

答案:B,A,D,C

6.mySQL支持哪些逻辑运算符

A.&&

B.||

C.NOT

D.AND

答案:D,C

7.以下不属于浮点型的是()

A.smallint

B.mediumint

C.float

D.int

答案:A,B,D

8.下列正确的命令是( )

A.show tables;

B.show columns;

C.show columns from customers;

D.show databases;

答案:D,A,C

9.正则表达式中,重复元字符“*”表示( )

A.无匹配

B.只匹配1个

C.0个匹配

D.多个匹配

答案:C,D

10.下面对 union 的描述正确的是( )

A.union 只连接结果集完全一样的查询语句

B.union 可以连接结果集中数据类型个数相同的多个结果集

C.union 是筛选关键词,对结果集再进行操作

D.任何查询语句都可以用 union 来连接

答案:D,A,C

11.下列哪一个逻辑运算符的优先级排列不正确( )

A.AND/NOT/OR

B.NOT/AND/OR

C.OR/NOT /AND

D.OR/AND/NOT

答案:A,C,D

12. 对某个数据库进行筛选后 , ( )。

A. B)可以选出符合某些条件组合的记录

B.D)不能选择出符合条件组合的记录

C.A)可以选出符合某些条件的记录

D.C)只能选择出符合某一条件的记录

答案:C,A

13.下列语句错误的是( )

A.select * from orders where ordername is not null;

B.select * from orders where ordername<>null;

C.select * from orders where ordername is null;

D.select * from orders where ordername not is null;

答案:D,B

14.在下列关于关系的叙述中,正确的是( )

A.C)行在表中的顺序无关紧要

B. A)表中任意两行的值不能相同

C. D)列在表中的顺序无关紧要

D.B)表中任意两列的值不能相同

答案:B,A,C

15.下面系统中属于关系数据库管理系统的是( )

A. B)MS_SQL SERVER

B.A)Oracle

C. C)IMS

D. D)DB2

答案:B,A,C

16.下列是MYSQL比较运算符的是( )

A.!=

B.<>

C.==

D.>=

答案:D,B,A

17.Excel 中有关数据库内容 , 描述正确的有( )。

A.每一个 Excel 数据库对应一个工作簿文件

B.一列为一个字段 , 描述实体对象的属性

C.Excel 数据库属于“关系数据模型”, 又称为关系型数据库

D.一行为一个记录 , 描述某个实体对象

答案:D,B,C

18.下面关于使用UPDATE语句,正确的是( )

A.被定义为NOT NULL的列不可以被更新为NULL

B.不能在一个子查询中更新一个表,同时从同一个表中选择

C.不能把ORDER BY或LIMIT与多表语法的UPDATE语句同时使用

D.如果把一列设置为其当前含有的值,则该列不会更新

答案:D,C,B

19. 关于Excel 数据库应用的描述正确的有( )。

A.是一个数据清单

B.是按一定组织方式存储在一起的相关数据的集合

C.是一个数组

D.是程序化的电子表格

答案:B,A

20.关于DELETE和TRUNCATE TABLE的说法,正确的是( )

A.两者都可以删除指定条目的记录

B.前者可以删除指定条目的记录,后者不能

C.两者都反回被删除记录的数目

D.前者返回被删除记录数目,后者不返回

答案:B,D

21.关于游标,下列说法正确的是( )

A.声明后必须打开游标以供使用

B.结束游标使用时,必须闭游标

C.使用游标前必须声明它

D.游标只能用于存储过程和函数

答案:D,C,A,B

22.下列说法正确的是( )

A.在MySQL中,不允许有空表存在,即一张数据表中不允许没有字段。

B.在MySQL中,对于存放在服务器上的数据库,用户可以通过任何客户端进行访问。

C.数据表的结构中包含字段名、类型、长度、记录。

D.字符型数据其常量标志是单引号和双引号,且两种符号可以混用。

答案:B,A

23.下面数据库名称合法的是( )

A.db1/student

B.db1.student

C.db1_student

D.db1&student

答案:D,C

24.下面语句中,表示过虑条件是vend_id=1002或vend_id=1003的是( )

A.select * from products where vend_id=1002 or vend_id=1003

B.select * from products where vend_id in (1002,1003);

C.select * from products where vend_id not in (1004,1005);

D.select * from products where vend_id=1002 and vend_id=1003

答案:B,A

25.下列哪些列类型是数值型的数据( )。

A.DOUBLE

B.INT

C.SET

D.FLOAT

答案:B,A,D

26.以下否定语句搭配正确的是()

A.not in

B.in not

C.not between and

D.is not null

答案:C,A,D

27.下面检索结果一定不是一行的命令是( )

A.select distinct * from orders ;

B.select * from orders limit 1,2;

C.select top 1 * from orders;

D.select * from orders limit 1;

答案:C,A,B

28.以下哪些是mySQL数据类型()

A.BIGINT

B.TINYINT

C.INTEGER

D.INT

答案:D,C,A,B

29.关于group by 以下语句正确的是( )

A.SELECT store_name FROM Store_Information GROUP BY store_name

B. SELECT SUM(sales) FROM Store_Information GROUP BY sales

C.SELECT store_name, price SUM(sales) FROM Store_Information GROUP BY store_name,price

D.SELECT store_name, SUM(sales) FROM Store_Information GROUP BY store_name

答案:D,C,B

30. 在数据库系统中,有哪几种数据模型?( )

A. D)实体联系模型

B. C)关系模型

C. A)网状模型

D. B)层次模型

答案:C,D,B

31. 关于CREATE语句下列说法正确的是()

A.create table 表名(字段名1 字段类型,字段名2 字段类型,…..)

B. create tables 表名(字段类型,字段名1 字段类型,字段名2…..)

C.create tables 表名(字段名1 字段类型,字段名2 字段类型,…..)

D. create table 表名(字段类型,字段名1 字段类型,字段名2…..)

答案:A,D

32.以下说法正确的是( )

A.一个服务器只能有一个数据库

B.一个服务器可以有多个数据库

C.一个数据库只能建立一张数据表

D.一个数据库可以建立多张数据表

答案:B,D

33.下列说法正确的是( )

A.一张数据表一旦建立完成,是不能修改的。

B.在MySQL中,用户在单机上操作的数据就存放在单机中。

C.在MySQL中,可以建立多个数据库,但也可以通过限定,使用户只能建立一个数据库。

D.要建立一张数据表,必须先建数据表的结构。

答案:C,B,D

34.“show databases like ‘student%’”命令可以显示出以下数据库( )

A.student_my

B.studenty

C.mystudent

D.student

答案:D,A,B

35.下面的选项是关系数据库基本特征的是( )。

A.与列的次序无关

B.不同的列应有不同的数据类型

C.不同的列应有不同的列名

D.与行的次序无关

答案:C,D,A

36.在mysql提示符下,输入____命令,可以查看由mysql自己解释的命令( )

A.\?

B.?

C.help

D.\h

答案:C,D,B

37.下列哪些数据是字符型数据。( )

A.中国

B.“1+2”

C.”can’t”

D.”张三-李四”

答案:B,D,C

38.关于语句limit 5,5,说法正确的是

A.表示检索出第5行开始的5条记录

B.表示检索出行6开始的5条记录

C.表示检索出第6行开始的5条记录

D.表示检索出行5开始的5条记录

答案:C,D

39.SQL语言集几个功能模块为一体,其中包括( )

A.C. DCL

B. B. DML

C. D. DNL

D.A. DDL

答案:D,B,A

40.下列说法正确的是()

A.alter table user drop column sex;

B.alter table user add sex varchar(20);

C.alter table user drop sex;

D.alter table user modify id int primary key;

答案:D,B,A,C

41.视图一般不用于下列哪些语句( )

A.DELETE

B.SELECT

C.INSERT

D.UPDATE

答案:C,D,A

42.在算术运算符、比较运算符、逻辑运算符,这三种符号中,它们的优先级排列不正确的是( )

A.算术/逻辑/比较

B.比较/逻辑/算术

C.比较/算术/逻辑

D.算术/比较/逻辑

答案:A,C,B

43.对同一存储过程连续两次执行命令DROP PROCEDURE IF EXISTS,将会( )

A.第一次执行删除存储过程,第二次产生一个错误

B.第一次执行删除存储过程,第二次无提示

C.存储过程不能被删除

D.最终删除存储过程

答案:B,D

44.关于检索结果排序,正确的是( )

A.关键字DESC表示降序,ASC表示升序

B.如果指定多列排序,只能在最后一列使用升序或降序关键字

C.如果指定多列排序,可以在任意列使用升序或降序关键字

D.关键字ASC表示降序,DESC表示升序

答案:A,C

45.以下语句错误的是()

;

SELECT rank, AVG(salary) FROM people HAVING AVG(salary) > 1000 GROUP BY rank;

A.SELECT rank, AVG(salary) FROM people GROUP BY rank HAVING AVG(salary) > 1000

B.SELECT rank, AVG(salary) FROM people HAVING AVG(salary) > 1000 GROUP BY rank;

C.SELECT AVG(salary) FROM people GROUP BY rank HAVING AVG(salary) > 1000;

D.SELECT rank, AVG(salary) FROM people GROUP BY rank WHERE AVG(salary) > 1000;

答案:D,B

46.创建数据表时,下列哪些列类型的宽度是可以省略的。 ( )

A.DATE

B.INT

C.CHAR

D.TEXT

答案:B,D,A

47.关于主键下列说法正确的是()

A.主键的值对用户而言是没有什么意义

B.主键的主要作用是将记录和存放在其他表中的数据进行关联。

C.一个主键是唯一识别一个表的每一记录,

D.主键是不同表中各记录之间的简单指针。

答案:C,B,D,A

48.您需要显示从2009年1月1日到2009年12月31日雇佣的所有职员的姓名和雇佣日期。职员信息表tblEmployees包含列Name和列HireDate,下面哪些语句能完成该功能 ( )

A.SELECT Name, HireDate FROM tblEmployees

B.SELECT Name, HireDate FROM tblEmployees WHERE HireDate =’2009-01-01’ OR ‘2009-12-31’

C.SELECT Name, HireDate FROM tblEmployees WHERE HireDate BETWEEN ’2008-12-31’ AND ‘2010-01-01’

D.SELECT Name, HireDate FROM tblEmployees WHERE substring(HireDate,1,4)=2009;

答案:C,D

49.以下哪项是事务特性( )

A.独立性

B. 持久性

C.原子性

D. 一致性

答案:C,D,A,B

50.对于显示操作以下说法正确的是()

A.show database;显示所有数据库

B.show table;显示所有表

C.show tables;显示所有表

D.show databases;显示所有数据库

答案:D,B

51.语句select * from products where prod_name like ‘%se%’结果集包括( )

A.检索products表中prod_name字段以’se’结尾的数据

B.检索products表中prod_name字段以’se’开关的数据

C.检索products表中prod_name字段包含’se’的数据

D.检索products表中prod_name字段不包含’se’的数据

答案:C,B,A

52.在mysql提示符下可以输入一个SQL语句,并以( )结尾,然后按回车执行该语句( )

A.“\G”

B.“。”

C.“\g”

D.“;”

答案:D,C,A

53.关于insert语句下列说法正确的是()

A.insert into 表名values(字段名1对应的值);

B.insert into 表名 values(字段名1对应的值,字段名2对应值);

C.insert into 表名(字段名1) value (字段名1对应的值);

D. insert into 表名(字段名1,字段名2) values(字段名1对应的值,字段名2对应值);

答案:D,B

54. 23 关系数据模型哪些优点?( )

A.A)结构简单

B. C)有标准语言

C. B)适用于集合操作

D. D)可表示复杂的语义

答案:A,C,B

55.对某个数据库使用记录单 , 可以进行的记录操作有( )

A.删除

B.新建

C.还原

D.插入

答案:B,A,C

56.关于select语句下列说法正确的是()

A. select (name) from table person: 所有记录的name字段的值

B.select (name) from person where age=12 or name=”aa”; or 或者

C. select (name) from table person where age=12; 查找age=12的记录的那个字段的值

D. select (name,age) from person where age=12 and name=”aa”; and 并且

答案:B,D

57.在字符串比较中,下列哪些是不正确的( )

A.所有标点符号比数字大

B.所有数字都比汉字大

C.所有英文比数字小

D.所有英文字母都比汉字小

答案:B,C,A

58.数据库信息的运行安全采取的主措施有( )。

A.备份与恢复

B.应急

C.风险分析

D.审计跟踪

答案:C,D,A,B

三、填空题

1.select 9/3;的结果为_____。

答案:3.0000

2.补全语句:select vend_id,count(*) as num_prods from products group by ____;

答案:vend_id

3.用SELECT进行模糊查询时,可以使用匹配符,但要在条件值中使用____或%等通配符来配合查询。

答案:-

4.当所查询的表不在当前数据库时,可用___________________________格式来指出表或视图对象

答案:数据库.所有者名称.对象名称

5.语句SELECT “1+2”;的显示结果是____

答案:“1+2”

6.如果MySQL服务名为MySQL5,则在Windows的命令窗口中,启动MySQL服务的指令是____

答案:net start mysql5

7.MySQL是一种______(多用户、单用户)的数据库管理系统

答案:多用户

8.select ‘2.5a’+3;的结果为_____。

答案:5.5

9.select (NULL<=>NULL) is NULL;的结果为_____。

答案:0

10.创建数据表的命令语句是_________

答案:create table

11.____语句可以修改表中各列的先后顺序

答案:ALTER TABLE

12.当某字段要使用AUTO_INCREMENT的属性时,该字段必须是____类型的数据。

答案:INT

13.当某字段要使用AUTO_INCREMENT的属性时,除了该字段必须是指定的类型外,该字段还必须是____

答案:关键字段或索引字段

14.在SELECT语句的FROM子句中最多可以指定_______个表或视图

答案:256

15.ODBC是一种____________

答案:开放式数据库连接

16.在SELECT语句的FROM子句中可以指定多个表或视图,相互之间要用________分隔

答案:逗号

17.Table ‘a1’ already exists这个错误信息的含义是_____

答案:表a1已经存在

18.对一个超过200个汉字的内容,应用一个____型的字段来存放

答案:text

19.在INSERT触发器中,可以引用一个名为____的虚拟表,访问被插入的行

答案:NEW

20.语句SELECT “张三\n李四”的显示结果是_____

答案:”张三\n李四”

21.smallint数据类型占用的字节数分别为

答案:1

22.在DELETE触发器中,可以引用一个名为____的虚拟表,访问被删除的行

答案:OLD

23.察看当前数据库中表名语句是_____。

答案:show tables

24.删除表命令是:___________________________________________。

答案:drop table

25.select ‘Abc’=’abc’;的结果为_____。

答案: 1

26.select -2.0*4.0;的结果为_____。

答案:-8.00

27.tinyint数据类型占用的字节数为___

答案:2

28.补全语句:select vend_id,count(*) from products where prod_price>=10 group by vend_id ____ count(*)>=2;

答案:having

29.计算字段的累加和的函数是:_______

答案:sum()

30.用SELECT进行模糊查询时,可以使用________匹配符

答案:like

四、判断题

1.( )主键被强制定义成NOT NULL和UNIQUE。

答案:Y

2.( )select语句的过滤条件既可以放在where子句中,也可以放在from子句中。

答案:N

3.( )逻辑值的“真”和“假”可以用逻辑常量TRUE和FALSE表示。

答案:Y

4.( )如果在排序和分组的对象上建立了索引,可以极大地提高速度。

答案:Y

5.( )建立索引的目的在于加快查询速度以及约束输入的数据。

答案:Y

6.( )UPDATE语句可以有WHERE子句和LIMIT子句。

答案:Y

7.( )x between y and z等同于x>y && x<z。

答案:N

8.( )MySQL数据库管理系统只能在Windows操作系统下运行。

答案:N

9.( )对于字符串型数据,空字符串’’就是NULL,对于数值型数据0就是NULL。

答案:N

10.( )LTRIM、RTRIM、TRIM函数既能去除半角空格,又能去除全角空格。

答案:N

11.( )NULL和Null都代表空值。

答案:Y

12.( )关系型数据库管理系统简称为RDBMS。

答案:Y

13.( )用union上下连接的各个select都可以带有自己的order by子句。

答案:N

14.( )ALTER TABLE语句可以修改表中各列的先后顺序。

答案:Y

15.( )!=和<>都代表不等于。

答案:Y

16.( )所创建的数据库和表的名字,都可以使用中文。

答案:Y

17.( )SELECT语句的ORDER BY子句定义的排序表达式所参照的列甚至可以不出现在输出列表中。

答案:Y

18.( )在C/S模式中,客户端不能和服务器端安装在同一台机器上。

答案:N

19.( )UPDATE语句修改的是表中数据行中的数据,也可以修改表的结构。

答案:N

20.( )create table 语句中有定义主键的选项。

答案:Y

21.( )结构化查询语言只涉及查询数据的语句,并不包括修改和删除数据的语句。

答案:N

22.( )一句delete语句能删除多行。

答案:Y

23.( )字符串“2008-8-15”

答案:Y

24.( )INSERT语句所插入的数据行数据可以来自另外一个SELECT语句的结果集。

答案:Y

25.( )所有TIMESTAMP列在插入NULL值时,自动填充为当前日期和时间。

答案:Y

26.( )带有GROUP BY子句的SELECT语句,结果集中每一个组只用一行数据来表示。

答案:Y

27.( )UNION中ALL关键字的作用是在结果集中所有行全部列出,不管是否有重复行。

答案:Y

28.( )为了让MySQL较好地支持中文,在安装MySQL时,应该将数据库服务器的缺省字符集设定为gb2312。

答案:N

29.( )只能将表中的一个列定义为主键,不能将多个列定义为复合的主键。

答案:N

30.( )当一个表中所有行都被delete语句删除后,该表也同时被删除了。

答案:N

五、简答题

1.什么是数据库镜像?它有什么用途?

答案:

答:

数据库镜像即根据DBA的要求,自动把整个数据库或者其中的部分关键数据复制到另一个磁盘上。每当主数据库更新时,DBMS自动把更新后的数据复制过去,即DBMS自动保证镜像数据与主数据的一致性。

数据库镜像的用途有:

一是用于数据库恢复。当出现介质故障时,可由镜像磁盘继续提供使用,同时DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本。

二是提高数据库的可用性。在没有出现故障时,当一个用户对某个数据加排它锁进行修改时,其他用户可以读镜像数据库上的数据,而不必等待该用户释放锁。

2.为什么事务非正常结束时会影响数据库数据的正确性

答案:答:

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。

3.什么是物理设计:

答案:对一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,称为数据库的物理设计。物理结构,主要指数据库在物理设备上的存储结构和存取方法。

4.什么是日志文件?为什么要设立日志文件?

答案: 答:

(1)日志文件是用来记录事务对数据库的更新操作的文件。

(2)设立日志文件的目的是: 进行事务故障恢复;进行系统故障恢复;协助后备副本进行介质故障恢复。

5.在数据库系统生存期中,生存期的总开销可分为几项:

答案:规划开销、设计开销、实现与测试开销、操作开销、维护开销。

6.数据库中为什么要有恢复子系统?它的功能是什么?

答案: 答:

因为计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意的破坏是不可避免的,这些故障轻则造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失,因此必须要有恢复子系统。

恢复子系统的功能是:把数据库从错误状态恢复到某一已知的正确状态(亦称为一致状态或完整状态)。

7.数据库运行中可能产生的故障有哪几类?哪些故障影响事务的正常执行?哪些故障破坏数据库数据?

答案:答:数据库系统中可能发生各种各样的故障,大致可以分以下几类:

(1)事务内部的故障;

(2)系统故障;

(3)介质故障;

(4)计算机病毒。

事务故障、系统故障和介质故障影响事务的正常执行;介质故障和计算机病毒破坏数据库数据。

8. 登记日志文件时为什么必须先写日志文件,后写数据库?

答案: 答:

把对数据的修改写到数据库中和把表示这个修改的日志记录写到日志文件中是两个不同的操作。有可能在这两个操作之间发生故障,即这两个写操作只完成了一个。

如果先写了数据库修改,而在运行记录中没有登记这个修改,则以后就无法恢复这个修改了。如果先写日志,但没有修改数据库,在恢复时只不过是多执行一次UNDO操作,并不会影响数据库的正确性。所以一定要先写日志文件,即首先把日志记录写到日志文件中,然后写数据库的修改。

9.数据库转储的意义是什么?

答案:

答:

数据转储是数据库恢复中采用的基本技术。所谓转储即DBA定期地将数据库复制到磁带或另一个磁盘上保存起来的过程。当数据库遭到破坏后可以将后备副本重新装入,将数据库恢复到转储时的状态。

静态转储:在系统中无运行事务时进行的转储操作。静态转储简单,但必须等待正运行的用户事务结束才能进行。同样,新的事务必须等待转储结束才能执行。显然,这会降低数据库的可用性。

动态转储:指转储期间允许对数据库进行存取或修改。动态转储可克服静态转储的缺点,它不用等待正在运行的用户事务结束,也不会影响新事务的运行。但是,转储结束时后援副本上的数据并不能保证正确有效。因为转储期间运行的事务可能修改了某些数据,使得后援副本上的数据不是数据库的一致版本。

为此,必须把转储期间各事务对数据库的修改活动登记下来,建立日志文件(log file)。这样,后援副本加上日志文件就能得到数据库某一时刻的正确状态。

转储还可以分为海量转储和增量转储两种方式。

海量转储是指每次转储全部数据库。增量转储则指每次只转储上一次转储后更新过的数据。从恢复角度看,使用海量转储得到的后备副本进行恢复一般说来更简单些。但如果数据库很大,事务处理又十分频繁,则增量转储方式更实用更有效。

10.试述事务的概念及事务的四个特性。

答案: 答:

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。

事务具有四个特性:原子性、一致性、隔离性)和持续性。

11.数据库恢复的基本技术有哪些?

答案: 答:

数据转储和登录日志文件是数据库恢复的基本技术。

当系统运行过程中发生故障,利用转储的数据库后备副本和日志文件就可以将数据库恢复到故障前的某个一致性状态。

12.数据库设计中的规划阶段的主要任务:

答案:是进行建立数据库的必要性及可行性分析,确定数据库系统在组织中和信息系统中的地位,以及各个数据库之间的联系。

六、编程题

1.表名User

Name Tel Content Date

(b) 请用sql语句把张三的时间更新成为当前系统时间

(c) 请写出删除名为张四的全部记录

(b) update user set date=time() where name=’张三’;

(c) delete from user where name=’张四’;

2.当前数据库是testdb,在该数据库中,有students、scores、courses、majors四个表,其结构及数据如下所列:

students

id

学号

int(11) name

姓名

char(4) sex

性别

char(1) bofd

生日

date mid

专业号

tinyint

1 张三 男 1980-12-03 1

2 王武 女 1980-09-22 3

3 李四 女 1981-03-04 2

4 赵六 女 1981-05-24 1

5 张建国 男 1980-06-02 4

6 赵娟 女 1980-08-30 2

scores

id

学号

char(10) term

学期

tinyint cid

课程编号

smallint score

分数

numerirc(4,1)

1 1 2 80.0

1 2 2 76.0

2 1 3 60.0

2 2 3 65.0

3 4 1 66.0

3 4 2 NULL

3 4 4 81.0

3 4 6 70.0

5 1 2 67.0

6 1 2 50.0

6 2 2 87.0

6 2 3 86.0

courses

cid

课程编号smallint cname

课程名称chr(24)

1 电子商务概论

2 c语言程序设计

3 MySQL数据库

4 php程序设计

5 FoxPro数据库

6 会计原理

majors

mid

专业号tinyint mname

专业名称chr(24)

1 电子商务

2 商务英语

3 计算机硬件

4 计算机软件

5 社区管理

6 日语

不考虑学号、考试科目和学期,计算并列出所有考试成绩中,成绩为优的分数的累加值,和成绩为良的分数的平均值。优和良的界线是90分和80分。(使用一句语句)

答案:select Sum(if(score>90,score,0)) AS 成绩为优的分数累加,

avg(if(score between 80 and 89,score,null)) AS 成绩为良的平均成绩

3.当前数据库是testdb,在该数据库中,有students、scores、courses、majors四个表,其结构及数据如下所列:

students

id

学号

int(11) name

姓名

char(4) sex

性别

char(1) bofd

生日

date mid

专业号

tinyint

1 张三 男 1980-12-03 1

2 王武 女 1980-09-22 3

3 李四 女 1981-03-04 2

4 赵六 女 1981-05-24 1

5 张建国 男 1980-06-02 4

6 赵娟 女 1980-08-30 2

scores

id

学号

char(10) term

学期

tinyint cid

课程编号

smallint score

分数

numerirc(4,1)

1 1 2 80.0

1 2 2 76.0

2 1 3 60.0

2 2 3 65.0

3 4 1 66.0

3 4 2 NULL

3 4 4 81.0

3 4 6 70.0

5 1 2 67.0

6 1 2 50.0

6 2 2 87.0

6 2 3 86.0

courses

cid

课程编号smallint cname

课程名称chr(24)

1 电子商务概论

2 c语言程序设计

3 MySQL数据库

4 php程序设计

5 FoxPro数据库

6 会计原理

majors

mid

专业号tinyint mname

专业名称chr(24)

1 电子商务

2 商务英语

3 计算机硬件

4 计算机软件

5 社区管理

6 日语

将students表中的结构(主键和索引)和数据复制到一个新的students1表中。(分两个步骤两句语句)

答案:create table students1 like students;

insert into students1 select * from students;

4.现有一销售表,表名是sale,它的结构如下:

id int (标识号)

codno char(7) (商品编码)

codname varchar(30) (商品名称)

spec varchar(20) (商品规格)

price numeric(10,2) (价格)

sellnum int (销售数量)

deptno char(3) (售出分店编码)

selldate datetime (销售时间)

要求:写出查询销售时间段在2002-2-15日到2002-4-29之间,分店编码是01的所有记录。

答案:SELECT * FROM sale

WHERE (selldate >= ‘2002-2-15′ AND selldate <=’2002-4-29′)

AND deptno = ’01’

5.编写一个返回表products中prod_price字段平均值且名称为productpricing的存储过程

答案:CREATE PROCEDURE productpricing()

BEGIN

Select avg(prod_price) from products;

End;

6.创建一张学生表,表名stu,包含以下信息:

学号,姓名(8位字符),年龄,性别(4位字符),家庭住址(50位字符),联系电话

答案:Create table stu (学号 int ,

姓名 varchar(8),

年龄 int,

性别 varchar(4),

家庭地址 varchar(50),

联系电话 int

);

0

SQL经典练习题面试题集

表(MYSQL)

Student(sid,Sname,Sage,Ssex) 学生表

CREATE TABLE student (

sid varchar(10) NOT NULL,

sName varchar(20) DEFAULT NULL,

sAge datetime DEFAULT ‘1980-10-12 23:12:36’,

sSex varchar(10) DEFAULT NULL,

PRIMARY KEY (sid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Course(cid,Cname,tid) 课程表

CREATE TABLE course (

cid varchar(10) NOT NULL,

cName varchar(10) DEFAULT NULL,

tid int(20) DEFAULT NULL,

PRIMARY KEY (cid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SC(sid,cid,score) 成绩表

CREATE TABLE sc (

sid varchar(10) DEFAULT NULL,

cid varchar(10) DEFAULT NULL,

score int(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Teacher(tid,Tname) 教师表
CREATE TABLE taacher (

tid int(10) DEFAULT NULL,

tName varchar(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据:(MySQL)

insert into taacher(tid,tName) values (1,’李老师’),(2,’何以琛’),(3,’叶平’);

insert into student(sid,sName,sAge,sSex) values (‘1001′,’张三丰’,’1980-10-12 23:12:36′,’男’),(‘1002′,’张无极’,’1995-10-12 23:12:36′,’男’),(‘1003′,’李奎’,’1992-10-12 23:12:36′,’女’),(‘1004′,’李元宝’,’1980-10-12 23:12:36′,’女’),(‘1005′,’李世明’,’1981-10-12 23:12:36′,’男’),(‘1006′,’赵六’,’1986-10-12 23:12:36′,’男’),(‘1007′,’田七’,’1981-10-12 23:12:36′,’女’);

insert into sc(sid,cid,score) values (‘1′,’001’,80),(‘1′,’002’,60),(‘1′,’003’,75),(‘2′,’001’,85),(‘2′,’002’,70),(‘3′,’004’,100),(‘3′,’001’,90),(‘3′,’002’,55),(‘4′,’002’,65),(‘4′,’003’,60);

insert into course(cid,cName,tid) values (‘001′,’企业管理’,3),(‘002′,’马克思’,3),(‘003′,’UML’,2),(‘004′,’数据库’,1),(‘005′,’英语’,1);

ORACLE(表+数据)

CREATE TABLE student (

sid varchar2(10) NOT NULL,

sName varchar2(20) DEFAULT NULL,

sAge date ,

sSex varchar2(10) DEFAULT NULL,

PRIMARY KEY (sid)

)

CREATE TABLE course (

cid varchar2(10) NOT NULL,

cName varchar2(10) DEFAULT NULL,

tid number(20) DEFAULT NULL,

PRIMARY KEY (cid)

)

CREATE TABLE sc (

sid varchar2(10) DEFAULT NULL,

cid varchar2(10) DEFAULT NULL,

score number(10) DEFAULT NULL

)

CREATE TABLE teacher (

tid number(10) DEFAULT NULL,

tName varchar2(10) DEFAULT NULL

)

insert into course(cid,cName,tid) values (‘001′,’企业管理’,3);

insert into course(cid,cName,tid) values (‘002′,’马克思’,3);

insert into course(cid,cName,tid) values (‘004′,’数据库’,1);

insert into course(cid,cName,tid) values (‘005′,’英语’,1);

insert into sc(sid,cid,score) values (‘1001′,’001’,80);

insert into sc(sid,cid,score) values (‘1001′,’002’,60);

insert into sc(sid,cid,score) values (‘1001′,’003’,70);

insert into sc(sid,cid,score) values (‘1002′,’001’,85);

insert into sc(sid,cid,score) values (‘1002′,’002’,70);

insert into sc(sid,cid,score) values (‘1003′,’004’,90);

insert into sc(sid,cid,score) values (‘1003′,’001’,90);

insert into sc(sid,cid,score) values (‘1003′,’002’,99);

insert into sc(sid,cid,score) values (‘1004′,’002’,65);

insert into sc(sid,cid,score) values (‘1004′,’003’,50);

insert into sc(sid,cid,score) values (‘1005′,’005’,80);

insert into sc(sid,cid,score) values (‘1005′,’004’,70);

insert into sc(sid,cid,score) values (‘1003′,’003’,10);

insert into sc(sid,cid,score) values (‘1003′,’005’,10);

insert into student(sid,sName,sAge,sSex) values (‘1001′,’张三丰’,to_date(‘1980-10-12 23:12:36′,’YYYY-MM-DD HH24:MI:SS’),’男’);

insert into student(sid,sName,sAge,sSex) values (‘1002′,’张无极’,to_date(‘1995-10-12 23:12:36′,’YYYY-MM-DD HH24:MI:SS’),’男’);

insert into student(sid,sName,sAge,sSex) values (‘1003′,’李奎’,to_date(‘1992-10-12 23:12:36′,’YYYY-MM-DD HH24:MI:SS’),’女’);

insert into student(sid,sName,sAge,sSex) values (‘1004′,’李元宝’,to_date(‘1980-10-12 23:12:36′,’YYYY-MM-DD HH24:MI:SS’),’女’);

insert into student(sid,sName,sAge,sSex) values (‘1005′,’李世明’,to_date(‘1981-10-12 23:12:36′,’YYYY-MM-DD HH24:MI:SS’),’男’);

insert into student(sid,sName,sAge,sSex) values (‘1006′,’赵六’,to_date(‘1986-10-12 23:12:36′,’YYYY-MM-DD HH24:MI:SS’),’男’);

insert into student(sid,sName,sAge,sSex) values (‘1007′,’田七’,to_date(‘1981-10-12 23:12:36′,’YYYY-MM-DD HH24:MI:SS’),’女’);

insert into teacher(tid,tName) values (1,’李老师’);

insert into teacher(tid,tName) values (2,’何以琛’);

insert into teacher(tid,tName) values (3,’叶平’);

问题:

1.查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.sid from (select sid,score from SC where cid=’001′) a,(select sid,score
from SC where cid=’002′) b
where a.score>b.score and a.sid=b.sid;
2、查询平均成绩大于60分的同学的学号和平均成绩;
select sid,avg(score)
from sc
group by sid having avg(score) >60;
3、查询所有同学的学号、姓名、选课数、总成绩;
select Student.sid,Student.Sname,count(SC.cid),sum(score)
from Student left Outer join SC on Student.sid=SC.sid
group by Student.sid,Sname
4、查询姓“李”的老师的个数;
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’;
5、查询没学过“叶平”老师课的同学的学号、姓名;
select Student.sid,Student.Sname
from Student
where sid not in (select distinct( SC.sid) from SC,Course,Teacher where SC.cid=Course.cid and Teacher.tid=Course.tid and Teacher.Tname=’叶平’);
6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
A:select Student.sid,Student.Sname from Student,SC where Student.sid=SC.sid and SC.cid=’001’and exists( Select * from SC as SC_2 where SC_2.sid=SC.sid and SC_2.cid=’002′);

B:SELECT s.sid,s.sName

FROM student s, (SELECT sid,COUNT(cid) FROM sc WHERE cid IN (‘001′,’002′) GROUP BY sid HAVING COUNT(cid)>=2) t WHERE s.sid = t.sid
7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select sid,Sname
from Student
where sid in (select sid from SC ,Course ,Teacher where SC.cid=Course.cid and Teacher.tid=Course.tid and Teacher.Tname=’叶平’ group by sid having count(SC.cid)=(select count(cid) from Course,Teacher where Teacher.tid=Course.tid and Tname=’叶平’));
8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
1>Select sid,Sname from (select Student.sid,Student.Sname,score ,(select score from SC SC_2 where SC_2.sid=Student.sid and SC_2.cid=’002′) score2
from Student,SC where Student.sid=SC.sid and cid=’001′) S_2 where score2 <score;

2>SELECT s.sid,s.sName FROM student s,

(SELECT sid,score FROM sc WHERE cid = ‘001’) sc_1,

(SELECT sid,score FROM sc WHERE cid = ‘002’) sc_2

WHERE sc_1.sid = sc_2.sid AND s.sid = sc_2.sid AND sc_2.score < sc_1.score
9、查询所有课程成绩小于60分的同学的学号、姓名;
select sid,Sname
from Student
where sid not in (select Student.sid from Student,SC where S.sid=SC.sid and score>60);
10、查询没有学全所有课的同学的学号、姓名;
1>

select Student.sid,Student.Sname
from Student,SC
where Student.sid=SC.sid group by Student.sid,Student.Sname having count(cid) <(select count(cid) from Course);

2>

SELECT s.sid,s.sname FROM student s,

(SELECT sid,COUNT(cid) FROM sc GROUP BY sid HAVING COUNT(cid) < (SELECT COUNT(cid) FROM course) )t

WHERE s.sid = t.sid
11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
select sid,Sname from Student,SC where Student.sid=SC.sid and cid in (select cid from SC where sid=’1001′);
13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
UPDATE sc,(SELECT c.cid,AVG(score) avgs FROM sc,course c,teacher t WHERE sc.cid = c.cid AND

c.tid = t.tid AND t.tName = ‘叶平’ GROUP BY c.cid)sc_2 SET sc.score = sc_2.avgs WHERE sc.cid = sc_2.cid

14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
select sid from SC where cid in (select cid from SC where sid=’1002′)
group by sid having count(*)=(select count(*) from SC where sid=’1002′);

15、删除学习“叶平”老师课的SC表记录;
DELETE FROM sc WHERE sc.cid IN (SELECT sc.cid FROM course c ,teacher t WHERE sc.cid = c.cid AND c.tid = t.tid AND t.tName = ‘叶平’)

17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
SELECT sid as 学生ID
,(SELECT score FROM SC WHERE SC.sid=t.sid AND cid=’004′) AS 数据库
,(SELECT score FROM SC WHERE SC.sid=t.sid AND cid=’001′) AS 企业管理
,(SELECT score FROM SC WHERE SC.sid=t.sid AND cid=’005′) AS 英语
,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩
FROM SC AS t
GROUP BY sid
ORDER BY avg(t.score)
18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
select cid “课程ID”,max(score) “最高分”,min(score) “最低分” from sc group by cid

  1. 按各科平均成绩从低到高和及格率的百分数从高到低排序
    oracle>

SELECT t.cid AS 课程号,MAX(course.Cname)AS 课程名,nvl(AVG(score),0) AS 平均成绩

,100 * SUM(CASE WHEN nvl(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数

FROM SC T,Course

WHERE t.cid=course.cid

GROUP BY t.cid

ORDER BY 100 * SUM(CASE WHEN nvl(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC

Mysql>

SELECT t.cid AS 课程号,MAX(course.Cname)AS 课程名,IFNULL(AVG(score),0) AS 平均成绩

,100 * SUM(CASE WHEN IFNULL(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数

FROM SC T,Course

WHERE t.cid=course.cid

GROUP BY t.cid

ORDER BY 100 * SUM(CASE WHEN IFNULL(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC

20、查询如下课程平均成绩和及格率的百分数(用”1行”显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
SELECT SUM(CASE WHEN cid =’001′ THEN score ELSE 0 END)/SUM(CASE cid WHEN ‘001’ THEN 1 ELSE 0 END) AS 企业管理平均分
,100 * SUM(CASE WHEN cid = ‘001’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN cid = ‘001’ THEN 1 ELSE 0 END) AS 企业管理及格百分数
,SUM(CASE WHEN cid = ‘002’ THEN score ELSE 0 END)/SUM(CASE cid WHEN ‘002’ THEN 1 ELSE 0 END) AS 马克思平均分
,100 * SUM(CASE WHEN cid = ‘002’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN cid = ‘002’ THEN 1 ELSE 0 END) AS 马克思及格百分数
,SUM(CASE WHEN cid = ‘003’ THEN score ELSE 0 END)/SUM(CASE cid WHEN ‘003’ THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN cid = ‘003’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN cid = ‘003’ THEN 1 ELSE 0 END) AS UML及格百分数
,SUM(CASE WHEN cid = ‘004’ THEN score ELSE 0 END)/SUM(CASE cid WHEN ‘004’ THEN 1 ELSE 0 END) AS 数据库平均分
,100 * SUM(CASE WHEN cid = ‘004’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN cid = ‘004’ THEN 1 ELSE 0 END) AS 数据库及格百分数
FROM SC
21、查询不同老师所教不同课程平均分从高到低显示
SELECT MAX(t.tid) “教师ID”,MAX(t.tName) “教师姓名”,c.cid “课程ID”, MAX(c.cName) “课程名称” ,AVG(sc.score) “平均成绩”

FROM sc,course c,teacher t WHERE sc.cid = c.cid AND c.tid = t.tid GROUP BY c.tid,c.cid

ORDER BY AVG(sc.score) DESC

  1. 统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
    SELECT SC.cid as 课程ID, Cname as 课程名称
    ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 – 85]
    ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 – 70]
    ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 – 60]
    ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
    FROM SC,Course
    where SC.cid=Course.cid
    GROUP BY SC.cid,Cname;

    26、查询每门课程被选修的学生数
    select cid,count(sid) from sc group by cid;
    27、查询出只选修了一门课程的全部学生的学号和姓名
    select SC.sid,Student.Sname,count(cid) AS 选课数
    from SC ,Student
    where SC.sid=Student.sid group by SC.sid ,Student.Sname having count(cid)=1;
    28、查询男生、女生人数
    Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex=’男’;
    Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex=’女’;
    29、查询姓“张”的学生名单
    SELECT Sname FROM Student WHERE Sname like ‘张%’;
    30、查询同名同性学生名单,并统计同名人数
    SELECT sName,sSex ,COUNT(*) FROM student GROUP BY sName,sSex HAVING COUNT(*) > 1
    31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)

Mysql>
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(char(11),DATEPART(year,Sage))=’1981′;

Oracle>

select * from student where substr(to_char(sage,’yyyy-MM-dd’),1,4)= ‘1981’
32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
Select cid,Avg(score) from SC group by cid order by Avg(score),cid DESC ;
33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select Sname,SC.sid ,avg(score)
from Student,SC
where Student.sid=SC.sid group by SC.sid,Sname having avg(score)>85;
34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.sid=Student.sid and SC.cid=Course.cid and Course.Cname=’数据库’and score <60;
35、查询所有学生的选课情况;
SELECT SC.sid,SC.cid,Sname,Cname
FROM SC,Student,Course
where SC.sid=Student.sid and SC.cid=Course.cid ;
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
SELECT distinct student.sid,student.Sname,SC.cid,SC.score
FROM student,Sc
WHERE SC.score>=70 AND SC.sid=student.sid;
37、查询不及格的课程,并按课程号从大到小排列
select cid from sc where scor e <60 order by cid ;
38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
select SC.sid,Student.Sname from SC,Student where SC.sid=Student.sid and Score>80 and cid=’003′;
39、求选了课程的学生人数
select count(*) from sc;
40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.sid=SC.sid and SC.cid=C.cid and C.tid=Teacher.tid and Teacher.Tname=’叶平’ and SC.score=(select max(score)from SC where cid=C.cid );
41、查询各个课程及相应的选修人数
select count(*) from sc group by cid;
42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
select distinct A.sid,B.score from SC A ,SC B where A.Score=B.Score and A.cid <>B.cid ;
43、查询每门功课成绩最好的前两名
SELECT *

FROM sc t1

WHERE (

SELECT COUNT(*)

FROM sc t2

WHERE t1.cid=t2.cid

AND t2.score>=t1.score

) <=2 ORDER BY t1.cid

44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT cid “课程号”,COUNT(*) “选修人数” FROM sc GROUP BY cid HAVING COUNT(*) >10 ORDER BY COUNT(*) DESC,cid

45、检索至少选修两门课程的学生学号
select sid
from sc
group by sid
having count(*) > = 2
46、查询全部学生都选修的课程的课程号和课程名
SELECT s.sName,c.cName, COUNT(*) FROM student s,course c, sc WHERE s.sid = sc.sid AND sc.cid = c.cid GROUP BY sc.cid HAVING COUNT(*) = (SELECT COUNT(*) FROM student)
47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
SELECT DISTINCT Sname FROM Student WHERE sid NOT IN (SELECT sid FROM Course,Teacher,SC WHERE Course.tid=Teacher.tid AND SC.cid=course.cid AND Tname=’叶平’);
48、查询两门以上不及格课程的同学的学号及其平均成绩
select sid,avg(ifnull(score,0)) from SC where sid in (select sid from SC where score <60 group by sid having count(*)>2)group by sid;
49、检索“004”课程分数小于60,按分数降序排列的同学学号
select sid from SC where cid=’004’and score <60 order by score desc;
50、删除“1002”同学的“001”课程的成绩
delete from Sc where sid=’1002′ and cid=’001′;

0

Jsp/Servlet面试题总结

1、说一说Servlet生命周期

Servlet的生命周期分为三部分
初始化:Web容器加载servlet,调用init()方法进行初始化。
处理请求:当请求到达时,运行其service()方法。Service()会根据表单的请求类型调用相对doGet()方法或者是doPost()方法。
销毁:当服务器关闭时,调用distroy()方法销毁servlet。

2、get提交和post提交有何区别

get一般用于从服务器上获取数据,post一般用于向服务器传送数据。
get的请求参数是拼接在url后面,可以在浏览器地址栏看见,post是放在http包的包体中。
get方法提交的数据只能是文本,大小不能超过1024个字节,而post不仅可以提交文本还有二进制文件。所以要上传文件,就使用post请求方式。

3、jsp与servlet有什么区别

jsp的本质就是一个servlet 他会被容器转化成servlet,在编译成class文件,调用jspService()处理请求。
jsp注重的是页面展示,servlet注重的是流程控制和事务处理

4、doGet与doPost方法的两个参数是什么

HttpServletRequest:封装了与请求相关的信息
HttpServletResponse:封装了与响应相关的信息

5、request.getAttribute()和request.getParameter的区别?

a.有setAttribute,没有setParameter方法 
b.getParameter获取到的值只能是字符串,不可以是对象,而getAttribute获取到的值是Object类型的。
c.getParameter获取from表单传递过来的值;getAttribute只能获取使用setAttribute设置的值。

6、jsp有哪些内置对象,作用是什么

request:包含用户端请求的信息
response:包含服务器传回客户端的响应信息
session:与请求有关的会话期
pageContext:管理网页属性
application:服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息
out:向客户端输出数据
config:servlet的架构部件
page:指网页本身
exception:针对错误页面才可使用

7、四种会话跟踪技术作用域

page:一个页面
request::一次请求
session:一次会话
application:服务器从启动到停止。

8、JSP中动态INCLUDE和静态INCLUDE有什么区别

(动态包含使用使用page属性实现。)
(静态包含使用<%@include file=””>使用file属性实现。)
Include指令用于把另外一个页面包含到当前页面中,在转换成servlet的时候包含进去的。
动态include用动作实现,它总会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
静态include用伪码实现,不会检查所包含的文件变化,使用于包含静态页面

9、forward和redirect的区别

请求转发与重定向
请求转发:服务器内部跳转,浏览器地址栏的地址不变,重定向:告诉浏览器,发送二次跳转。
请求转发:可以共享request里面的数据,重定向:不能共享数据。
请求转发:只能在同一个项目跳转,重定向:可以跨域访问。
请求转发:效率高,重定向:效率低。

10、说出JSP的6个动作指令和作用?

jsp:include:在页面被请求的时候引入一个静态或动态的文件。
jsp:useBean:实力化一个对象。
jsp:setProperty:设置对象的属性。
jsp:getProperty:获取对象的属性。
jsp:forward:请求转发。

11、JSP的3种跳转方式

response.sendRedirct( “path” ):请求重定向
页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中。 跳转后浏览器地址栏变化。

request.getRequestDispatcher(“path”).forward( request,response ) :请求转发
Servlet页面跳转的路径是相对路径。forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute

12、谈谈Servlet过滤器的作用?

在请求到达servlet之前,执行过滤器,过滤器决定是否执行(可以进行权限控制),可以提前设置一些参数(比如在执行action前设置统一字符集)。
当你在执行一个方法,在这个方法前或方法后执行一些方法(防止重复提交)。

13、谈谈Servlet监听器的作用

对特定的事件进行监听,当产生这些事件的时候,会执行监听器的代码,分为生命周期监听器和数据变化监听器(统计在线人数(监听session)、网站的访问量(request))。

14、请简要描述jstl

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了核心库
c标签,fmt格式化标签,fn字符串处理标签,sql标签,xml标签。Jstl还提供了实现自定义标签功能,方便我们的页面控件编写。

15、如何现实servlet的单线程模式

Jsp修改page指令   <%@ page isThreadSafe=”false”%>,将编译后的servlet实现SingleThreadModel接口。

16、介绍el表达式

EL表达式全名是Expression Language
EL表达式一般操作的是作用域(page、request、session、application)中的属性,使用${标识符}.

17、tomcat如何调优

对jvm的堆的最大值修改为可用内存的80%(修改catalina.bat的相关参数)。
禁用DNS查询(直接使用IP地址访问)。
修改最大线程连接数。
设置超时机制。

18、tomcat部署的方式有几种

1.将web项目文件拷贝到webapps目录中。
2.在tomcat中的conf目录下修改server.xml文件,在host节点中添加标签。并指向项目所在路径。
3.在tomcat中conf\Catalina\localhost目录下添加一个xml文件 文件名可用随意取,并写入一个标签,并指向项目所在路径。
4.用tomcat在线后台管理器,一般tomcat都打开了,直接上传war就可以

0