【转载】.NET面试题
2010-03-07 21:40 Virus-BeautyCode 阅读(1608) 评论(0) 编辑 收藏 举报
.net笔试题
姓名: 日期:
1. 填空: (1)面向对象的语言具有________性、_________性、________性。
(2)能用foreach遍历访问的对象需要实现 ________________接口或声明________________方法的类型。
(3)列举ADO.net中的五个主要对象_______________、_____________、_______________、_______________、_________________。
2. 不定项选择:
(1) 以下叙述正确的是:
A. 接口中可以有虚方法。 B. 一个类可以实现多个接口。
C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。
(2) 从数据库读取记录,你可能用到的方法有:
A. ExecuteNonQuery B. ExecuteScalar
C. Fill D. ExecuteReader
3. 简述 private、 protected、 public、 internal 修饰符的访问权限。
4. 写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键, 注意:ID可能不是连续的。)
5 .列举ASP.NET 页面之间传递值的几种方式。
6. 写出程序的输出结果
class Class1 {
private string str = "Class1.str";
private int i = 0;
static void StringConvert(string str) {
str = "string being converted.";
}
static void StringConvert(Class1 c) {
c.str = "string being converted.";
}
static void Add(int i) {
i++;
}
static void AddWithRef(ref int i) {
i++;
}
static void Main() {
int i1 = 10;
int i2 = 20;
string str = "str";
Class1 c = new Class1();
Add(i1);
AddWithRef(ref i2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
7.写出程序的输出结果
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B: A
{
public B()
{
Console.WriteLine('B');
}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();
a.Fun();
}
}
8. 写出程序的输出结果:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1 (i + 1);
}
public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
}
}
9. 一列数的规则如下: 1、1、2、3、5、8、13、21、34......
求第30位数是多少, 用递归算法实现。(C#语言)
10. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
要求: 1.要有联动性,老鼠和主人的行为是被动的。
2.考虑可扩展性,猫的叫声可能引起其他联动效应。
参考答案:
1. (1) 继承性、封装性、多态性。(考基本概念)
(2) IEnumerable 、 GetEnumerator (对foreach机制的理解,本来不想出这题的,凑分)
(3) ... (送分题, 对ADO.net的了解)
评分标准:一空1分,满分10分。
2. (1) B、C (考对接口的理解) (2) B、C、D (考查对ADO.net的熟练程度)
评分标准: 一题5分,不选或者错选均不得分。漏选得2分。满分10分。
3. . private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
评分标准:答对1题2分,2题5分,3题7分。全对10分。 (送分题)
4. 解1: select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
评分标准: 写对即10分。(答案不唯一,datagrid 分页可能需要用到)
5. 1.使用QueryString, 如....?id=1; response. Redirect()....
2.使用Session变量
3.使用Server.Transfer
....等等
评分标准: 答对1点得3分, 两点7分, 3点10分。
6. (考查值引用和对象引用)
10
21
0
str
string being converted.
评分标准:答对一点得2分,满分10分。
7. A
B
A.Fun()
评分标准: 写出A.B 得5分,写出A.Fun()得5分,满分10分。
(考查在继承类中构造函数, 以及new 方法, )
8. 2
5
1
6
评分标准: 答对一点得2分,两点得5分,3点得7分。全对得10分。
(一些人做这题,头都晕了.... ^_^ )
9.
public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
评分标准: 写出return Foo(i -1) + Foo(i - 2); 得5分。
写出if(i > 0 && i <= 2) return 1; 得5分。
方法参数过多需要扣分(扣除分数 = 参数个数 - 1)
不用递归算法扣5分
(递归算法在树结构建立等方面比较常用)
10
要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象
评分标准: <1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)
<2>从Mouse和Master中提取抽象(5分)
<3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)
public interface Observer
{
void Response(); //观察者的响应,如是老鼠见到猫的反映
}
public interface Subject
{
void AimAt(Observer obs); //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject subj)
{
this.name = name;
subj.AimAt(this);
}
public void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer
{
public Master(Subject subj)
{
subj.AimAt(this);
}
public void Response()
{
Console.WriteLine("Host waken!");
}
}
public class Cat : Subject
{
private ArrayList observers;
public Cat()
{
this.observers = new ArrayList();
}
public void AimAt(Observer obs)
{
this.observers.Add(obs);
}
public void Cry()
{
Console.WriteLine("Cat cryed!");
foreach (Observer obs in this.observers)
{
obs.Response();
}
}
}
class MainClass
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1", cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
}
}
//---------------------------------------------------------------------------------------------
设计方法二: 使用event -- delegate设计..
public delegate void SubEventHandler();
public abstract class Subject
{
public event SubEventHandler SubEvent;
protected void FireAway()
{
if (this.SubEvent != null)
this.SubEvent();
}
}
public class Cat : Subject
{
public void Cry()
{
Console.WriteLine("cat cryed.");
this.FireAway();
}
}
public abstract class Observer
{
public Observer(Subject sub)
{
sub.SubEvent += new SubEventHandler(Response);
}
public abstract void Response();
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject sub) : base(sub)
{
this.name = name;
}
public override void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer
{
public Master(Subject sub) : base(sub){}
public override void Response()
{
Console.WriteLine("host waken");
}
}
class Class1
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1", cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
}
}
1. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)
3. C#, Java 和 c++的特点,有什么相同的地方,不同的地方,C#分别从c++和java中吸取了他们那些优点?
4. C#可否对内存进行直接的操作?(这可是个难点哦?要注意!)
5. 用Visual C++ 6.0编写的代码(unmanaged code),如何在CLR下和其他dot net component结合?
6. 以前作过的一些项目?介绍一下自己的编程经验。(这是蒙混不过去的,基本一问就知道是真是假)
7. 你对公司有什么期望?你的薪水期望值?为什么学计算机?以前的工作经验(这非常重要)?
Q3: 维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么
Q4:ADO。NET相对于ADO等主要有什么改进?
Q5:ASP。NET与ASP相比,主要有哪些进步?
Q6:C#中的委托是什么?事件是不是一种委托?
Q7:描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
Q8:C#中要使一个类支持FOREACH遍历,实现过程怎样?
Q10:写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击时显示“禁止右键”。并在2分钟后自动关闭页面。
Q11:你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用
Q12:接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?
Q13:自定义控件和一般用户控件的异同?如果要用这两者之一,你会选择哪种?为什么
Q14:大概描述一下ASP。NET服务器控件的生命周期
Q15:UML
Q16:面向对象的概念,主要特点
Q17:类划分的依据。类粒度问题
Q18:事物管理问题
第一,谈谈final, finally, finalize的区别。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
第四,&和&&的区别。
第五,HashMap和Hashtable的区别。
第六,Collection 和 Collections的区别。
第七,什么时候用assert。
第八,GC是什么? 为什么要有GC?
第九,String s = new String("xyz");创建了几个String Object?
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
第十二,sleep() 和 wait() 有什么区别?
第十三,Java有没有goto?
第十四,数组有没有length()这个方法? String有没有length()这个方法?
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
第十七,给我一个你最常见到的runtime exception。
第十八,error和exception有什么区别?
第十九,List, Set, Map是否继承自Collection接口?
第二十,abstract class和interface有什么区别?
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
第二十三,启动一个线程是用run()还是start()?
第二十四,构造器Constructor是否可被override?
第二十五,是否可以继承String类?
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
第三十二,编程题: 写一个Singleton出来。
数据库方面:
1.存储过程和函数的区别
2.事务是什么?
3.游标的作用?如何知道游标已经到了最后?
4.触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
1。用C#实现以下功能
a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
b 对上面生成的数组排序,需要支持升序、降序两种顺序
2。请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
3。请说明.net中的错误处理机制,并举例
4。请说出强名的含义
5。请列出c#中几种循环的方法,并指出他们的不同
6。请指出.net中所有类型的基类
7。请指出GAC的含义
8。SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值
您在什么情况下会用到虚方法?它与接口有什么不同?
Q:Override与重载有什么区别?
Q:值类型与引用类型有什么区别?
Q:怎样理解静态变量?
Q:向服务器发送请求有几种方式?
Q:DataReader与Dataset有什么区别?
Q:如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?
Q:用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
Q:软件开发过程一般有几个阶段?每个阶段的作用?
Q:微软推出了一系列的Application Block,请举出您所知道的Application Block并说明其作用?
Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式?
Q:您对WebService的体会?
Q:您对编程的兴趣如何?工作中遇到不懂的问题是怎样去解决的?您一般怎样去提高自己的编程水平?
Q:您离职的原因是什么?
Q:通过超链接怎样传递中文参数?
Q:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
Q:请编程实现一个冒泡排序算法?
1、override与重载的区别
2、.net的错误处理机制是什么
3、C#中接口和类的异同
4、DataReader和DataSet的异同
1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.
2.如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明.
3.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.
4.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
一.填空题
1.c#中的三元运算符是__?:___?
2.当整数a赋值给一个object对象时,整数a将会被__装箱(封装)___?
3.类成员有_____种可访问形式? this.;new Class().Method;
4.public static const int A=1;这段代码有错误么?是什么? const不能用static修饰
5.float f=
int i=(int)f;
i的值现在是_____? 123
6.利用operator声明且仅声明了“==”,有什么错误么?
7.委托声明的关键字是______? delagete
8.用sealed修饰的类有什么特点?密封,不能继承
9.在Asp.net中所有的自定义用户控件都必须继承自________?Control
10.在.Net中所有可序列化的类都被标记为_____?
11.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?gc
12.下面的代码中有什么错误吗?_______
using System;
class A
{
public virtual void F(){
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F(); // new public abstract void F();
}
13.当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___(可以 or 不可以)从T派生出新的类,不可以____(可以 or 不可以)直接创建T的任何实例。
14.下面这段代码有错误么?
switch (i){
case():
CaseZero();
break;
case 1:
CaseOne();
break;
case 2:
dufault; //wrong
CaseTwo();
break;
}
15.在.Net中,类System.Web.UI.Page 可以被继承么?可以
二.简答题
1.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法
4.谈谈类和结构的区别?类是引用类型、结构是值类型
5.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。
6.对于这样的一个枚举类型:
enum Color:byte{
Red,
Green,
Blue,
Orange
}
string[] ss=Enum.GetNames(typeof(Color));
byte[] bb=Enum.GetValues(typeof(Color));
试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。
7.您了解设计模式么?请列出您所知道的设计模式的名称。 //
8.请在SQL Server中设计表来保存一个树状结构的组织结构图(假设结构图中只有名称这一项内容需要保存),如果我想查询某一职位下的所有职位,用一个存储过程来实现,你有什么思路?
9.什么叫做SQL注入,如何防止?请举例说明。
10.下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
//不相等,因为比较的是对象
1.写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用 例 。
2.对一支纸杯设计测试用例(可以是广义的杯,不一定是某一支特定功能的杯)
开发语言概念题
3.什么是反射?
4.用Singleton如何写设计模式
5.C#中的垃圾回收机制是怎样的?
6.什么是Application Pool?
7.链表和数组的区别,各有什么优缺点.
8.Remoting在客户端服务器怎么实现 ?
9.什么是友元函数?
10.用标准C如何实现多态?
11.什么是虚函数?
12.什么是抽象函数?
13.什么是内存泄漏,怎样最简单的方法判断被存泄漏 ?
英语题
14.用英文介绍一下使用C#/C++做的项目,主要功能
15.如果要与美国开电话会议,会如何与美国的工程师沟通
16.如果老板认为你的技术落后,你会怎么回答
数据库知识题
17.使用什么工具来调用存储过程
18.SQL Server的两种索引是何形式?索引的作用?索引的优缺点?
19.触发器的作用
其它知识题及问题
20.什么是Web Service?
21.什么是XML?
22.Socket怎么实现?
原文地址:【.NET面试题】C#系列2
A、任何一个使用.NET的人
1、描述线程与进程的区别?
2、什么是Windows服务,它的生命周期与标准的EXE程序有什么不同 ?
3、Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?
4、EXE和DLL之间的区别是什么?
5、什么是强类型,什么是弱类型?哪种更好些?为什么?
6、PID是什么?在做系统的故障排除时如何使用它?
7、单个TCP/IP端口上能够侦听多少个进程?
8、什么是GAC?它解决了什么问题?
B、中级.NET开发人员
1、阐述面向接口、面向对象、面向方面编程的区别
2、什么是Interface?它与Class有什么区别?
3、什么是反射?
4、使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?
5、类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗?
6、从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?
7、调用Assembly.Load算静态引用还是动态引用?
8、何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile?
9、什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同? Assembly.Load("foo.dll"); 这句话是否正确?
10、做强签名的assembly与不做强签名的assembly有什么不同?
11、DateTime是否可以为null?
12、什么叫JIT?什么是NGEN?它们分别有什么限制和好处?
13、.NET CLR中一代的垃圾收集器是如何管理对象的生命周期的?什么叫非确定性终结? Finalize()和Dispose()之间的区别?
14、using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的。
15、tasklist /m "mscor*" 这句命令是干嘛的?
16、in-proc和out-of-proc的区别 .NET里的哪一项技术能够实现out-of-proc通讯?
17、当你在ASP.NET中运行一个组件时,它在Windows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?
C、高级开发人员/架构师
1、DateTime.Parse(myString); 这行代码有什么问题?
2、PDB是什么东西? 在调试中它应该放在哪里?
3、什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
4、写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查", 什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
代码加上需要安全权限的特性有什么好处?
5、gacutil /l ¦ find /i "Corillian" 这句命令的作用是什么? sn -t foo.dll 这句命令是干嘛的?
6、DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
7、对比OOP和SOA,它们的目的分别是什么?
8、XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
9、为什么不提倡catch(Exception)? Debug.Write和Trace.Write有什么不同?何时应该使用哪一个? Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
10、JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
11、对比抽象基类和接口的使用 a.Equals(b)和a == b一样吗? 在对象比较中,对象一致和对象相等分别是指什么? 12、在.NET中如何实现深拷贝(deep copy)? 请解释一下IClonable 什么叫装箱?
string是值类型还是引用类型?
13、XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
14、为什么不应该在.NET中使用out参数?它究竟好不好? 特性能够放到某个方法的参数上?如果可以,这有什么用?
D、C# 组件开发人员
1、什么时候使用override?什么时候使用new? 什么叫shadowing?
2、解释virtual、sealed、override和abstract的区别 Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d 解释这个字符串每个部分的重要性和作用
3、解释public、protected、private和internal的区别 使用Primary Interop Assembly (PIA)有什么好处?
4、NUnit是通过什么机制获知需要测试哪些方法的? 5、catch(Exception e){throw e;}和catch(Exception e){throw;}的区别
6、typeof(foo)和myFoo.GetType()的区别?
7、public class c{ public c(string a) : this() {;}; public c() {;} } 解释第一个构造函数中发生了什么? 这个构造函数有什么用? 8、this是干嘛用的?能够用在static方法中?
E、ASP.NET (UI)开发人员
1、阐述一个基于浏览器的Form POST如何变成一个服务器端的事件,如Button1_OnClick。
2、什么是PostBack? 什么是ViewState? 它是否被编码过? 是否被加密过?谁会使用ViewState?
3、 <machinekey>元素是干嘛用的?它用于哪两项ASP.NET技术?
4、说出ASP.NET 1.1中的3种Session State提供程序以及它们的优缺点?
5、什么叫Web Gardening? 在设计中如何使用它? 假设有一个ASP.NET应用程序,那么单独一个进程中允许多少应用程序对象?那两个进程呢?启用了Web Gardening的2个进程呢?这对设计有何影响?
6、ASP.NET会重用多个请求之间的线程吗?是否每个HttpRequest都有自己的线程?
7、你是否应该用ASP.NET的Thread Local存储? [ThreadStatic]属性在ASP.NET中有用吗?它有没有副作用?是好是坏?
8、如何使用HttpHandler简化现有的为.aspx页面提供验证图片的设计 HttpModule订阅的是什么类型的事件? 这对于实现有何影响?如果不打算重新编译ASP.NE应用程序,应该怎么做?
9、说出表示任意一个终端(URL)的方式,以及ASP.NET中把请求路由到那个终点的方式 解释cookie的工作原理。给出一个滥用Cookie的例子。 10、解释HttpRequest.ValidateInput()的重要性? 哪些数据是通过HTTP Header传递的? 对比HTTP动词GET和POST?
11、什么是HEAD? 说出至少6个HTTP状态码以及它们的含义
12、if-not-modified-since的工作原理是什么? 用ASP.NET如何实现它?
13、解释 <@OutputCache%>和如何使用VaryByParam、VaryByHeader. VaryByCustom是如何工作的?
14、如何通过q=? (除了q=5)来实现ASP.NET HTML输出缓冲和缓冲过期(比如http://localhost/page.aspx?q=5)?
F、XML开发人员
1、XML命名空间的作用? 何时适合使用DOM?何时不适合?有没有尺度限制? 什么是WS-I基本配置?它重要在哪里? 写一个小XML文档,其中使用的是默认的命名空间,以及一个合法的(前缀)命名空间,其中要有分别属性这两个命名空间的元素 元素和特性的基本区别在哪里? 格式完好的XML和有效的XML有什么区别?
2、.NET中如何验证XML?
3、myXmlDocument.SelectNodes("//mynode"); 为什么这句代码不好?什么时候它是好的?
4、拉式解析(XmlReader)与事件读取器(Sax)的区别 XPathDocument和XmlDocument的区别? 在何种情况下应该用哪一个?
5、“XML片断”与“XML文档”有什么区别 什么叫格式规范的XML?
6、XML InfoSet规范与Xml DOM有什么不同? InfoSet是要解决什么问题? 比较DTD和XSD,它们的相似点与区别分别是什么?哪个更好些?为什么?
7、System.Xml支持DTD吗?如果支持,如何使用? XML Schema能够表示为对象图?对象图能够表示为XML Schema?
原文地址:t_sql中的COUNT函数
1 count函数的定义
count函数的定义可见MSDN。定义如下:
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } ) |
那么 COUNT 有两种使用方式 COUNT (expression)和 COUNT (*),它返回一个对一个表按某列计数的值。 |
-
COUNT
(*)返回表的行数。它不会过滤
null
和重复的行。
-
COUNT
(expression)会过滤掉
null
值,所以值
null
行不会加入到计数当中,但如果不在expression前面加上
distinct
关键字,它是会过滤掉重复行的。
以此可以得出一个结论: count (*)返回值总是大于或等于 count (expression)的返回值。 |
在应用中,好多人喜欢使用 COUNT (1),这里面的1其实就是一个expression,因为你的表中没有列名为1的列,那么它的返回结果是和 COUNT (*)一模一样的, |
个人觉得效率也是没有差别的。 |
; WITH cte1(c1,c2, Description) AS ( |
SELECT 1, 1, 'This is a fox' UNION ALL |
SELECT 2, NULL , 'Firefox' UNION All |
SELECT NULL , 2, 'People consider foxes as clever but sly animals' UNION All |
SELECT NULL , NULL , NULL UNION ALL |
SELECT 3, NULL , 'This is me' UNION ALL |
SELECT 3, 3, 'Fox on the run' ) |
结果如下:
如结果所示,COUNT(*),COUNT(2)和COUNT(3)是一模一样的。而COUNT(c1)显然过滤掉了NULL值。
注意,COUNT 的参数expression可以为常量(像上面的2,3…),表的列,函数,还可以是语句,具体可见MSDN的定义。下面展示了这个应用。
如果想为cte1中列Description中有字符串'fox’进行计数,典型的做法是:
SELECT COUNT (*) FROM cte1 |
WHERE PATINDEX( '%fox%' ,cte1.Description) <> 0 |
这种做法是where中过滤,另外一种方式是在expression中定义查找条件:
SELECT COUNT ( NULLIF (PATINDEX( '%fox%' , cte1.Description), 0)) |
FROM cte1 |
如果description列中没有字符串'fox'那么PATINDEX函数返回的是0,NULLIF函数因为两个参数相等,那么结果是NULL,因为NULL不会参与计数,所以列中没有'fox’的行不会
参与计数,达到了查找的目的。
当然,我们还可在expression中使用case表达式:
SELECT COUNT ( CASE |
WHEN PATINDEX( '%fox%' ,cte1.Description) <> 0 THEN 1 |
ELSE <STRONG> NULL </STRONG> END ) |
FROM cte1 |
注意ELSE语句后面必须是NULL,如果是非NULL,ELSE语句也会参与COUNT计数的。
2 在count函数后接聚合窗口函数OVER。注意聚合窗口函数中是不能有ORDER BY,ORDER BY只能出现在排名函数的over子句中。OVER字句的定义见MSDN。
SELECT c.*, COUNT (*) OVER(PARTITION BY c.c1) 'c1 * count' , |
COUNT (c1) OVER(PARTITION BY c.c1) 'c1 c1 count' , |
COUNT (*) OVER(PARTITION BY c.c2) 'c2 count' , |
COUNT ( CASE |
WHEN LEFT (c.Description, 1) IN ( 'T' ) THEN 1 |
ELSE NULL END ) OVER(PARTITION BY LEFT (c.Description, 1)) 'start with T' , |
COUNT ( CASE |
WHEN LEFT (c.Description, 1) IN ( 'T' , 'F' , 'P' ) THEN 1 |
ELSE NULL END ) OVER(PARTITION BY LEFT (c.Description, 1)) 'start with T, F OR P' |
FROM cte1 c |
注意OVER字句不能为OVER(PARTITION BY c.c1 ORDER BY c.c1),这是因为 count 不是排名函数。 |
以上的运行结果为: |
<A href= "http://images.cnblogs.com/cnblogs_com/fgynew/WindowsLiveWriter/t_sqlcount_11359/result333_4.png" ><IMG style= "BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=result333 border=0 alt=result333 src= "http://images.cnblogs.com/cnblogs_com/fgynew/WindowsLiveWriter/t_sqlcount_11359/result333_thumb_1.png" width=804 height=183></A> |
可以看出,在使用OVER子句时候,COUNT还是遵循了最基本的准则,COUNT(*)会对null行计数,而COUNT(expression)则不会。
以上在COUNT 的expression中设置条件显然不是一种很优化的方式,因为这种方式会首先读取表中的所有数据,是对表进行扫描,而在where子句中设置条件进行过滤是一种很好的方式。因为从逻辑上讲,where先于select执行,所有数据库引擎只会读取部分数据,不是读取所有数据。如果要对以表中c1列的null进行统计,可以有两种方式:
SELECT COUNT (*) |
FROM cte1 |
WHERE c1 IS NULL |
或者:
SELECT COUNT ( CASE |
WHEN c1 IS NULL THEN 'x' |
ELSE NULL END ) |
FROM cte1 |
最后看看执行计划的比较,后面的方式多了一个步骤(过滤):