.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=-123.567F;
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 |
最后看看执行计划的比较,后面的方式多了一个步骤(过滤):
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
from SC where C#='002') b
where a.score>b.score and a.s#=b.s#;
2、查询平均成绩大于60分的同学的学号和平均成绩;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查询所有同学的学号、姓名、选课数、总成绩;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查询姓“李”的老师的个数;
select count(distinct(Tname))
from Teacher
where Tname like '李%';
5、查询没学过“叶平”老师课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');
6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');
7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select S#,Sname
from Student
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='叶平'));
8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;
9、查询所有课程成绩小于60分的同学的学号、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
10、查询没有学全所有课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';
12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;
select distinct SC.S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='001');
13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
update SC set score=(select avg(SC_2.score)
from SC SC_2
where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');
14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
select S# from SC where C# in (select C# from SC where S#='1002')
group by S# having count(*)=(select count(*) from SC where S#='1002');
15、删除学习“叶平”老师课的SC表记录;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';
16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、
号课的平均成绩;
Insert SC select S#,'002',(Select avg(score)
from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');
17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
SELECT S# as 学生ID
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语
,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩
FROM SC AS t
GROUP BY S#
ORDER BY avg(t.score)
18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分
FROM SC L ,SC AS R
WHERE L.C# = R.C# and
L.score = (SELECT MAX(IL.score)
FROM SC AS IL,Student AS IM
WHERE L.C# = IL.C# and IM.S#=IL.S#
GROUP BY IL.C#)
AND
R.Score = (SELECT MIN(IR.score)
FROM SC AS IR
WHERE R.C# = IR.C#
GROUP BY IR.C#
);
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩
,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数
FROM SC T,Course
where t.C#=course.C#
GROUP BY t.C#
ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分
,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数
,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分
,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数
,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数
,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分
,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数
FROM SC
21、查询不同老师所教不同课程平均分从高到低显示
SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩
FROM SC AS T,Course AS C ,Teacher AS Z
where T.C#=C.C# and C.T#=Z.T#
GROUP BY C.C#
ORDER BY AVG(Score) DESC
22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)
[学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
SELECT DISTINCT top 3
SC.S# As 学生学号,
Student.Sname AS 学生姓名 ,
T1.score AS 企业管理,
T2.score AS 马克思,
T3.score AS UML,
T4.score AS 数据库,
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分
FROM Student,SC LEFT JOIN SC AS T1
ON SC.S# = T1.S# AND T1.C# = '001'
LEFT JOIN SC AS T2
ON SC.S# = T2.S# AND T2.C# = '002'
LEFT JOIN SC AS T3
ON SC.S# = T3.S# AND T3.C# = '003'
LEFT JOIN SC AS T4
ON SC.S# = T4.S# AND T4.C# = '004'
WHERE student.S#=SC.S# and
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
NOT IN
(SELECT
DISTINCT
TOP 15 WITH TIES
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
FROM sc
LEFT JOIN sc AS T1
ON sc.S# = T1.S# AND T1.C# = 'k1'
LEFT JOIN sc AS T2
ON sc.S# = T2.S# AND T2.C# = 'k2'
LEFT JOIN sc AS T3
ON sc.S# = T3.S# AND T3.C# = 'k3'
LEFT JOIN sc AS T4
ON sc.S# = T4.S# AND T4.C# = 'k4'
ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
SELECT SC.C# 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.C#=Course.C#
GROUP BY SC.C#,Cname;
24、查询学生平均成绩及其名次
SELECT 1+(SELECT COUNT( distinct 平均成绩)
FROM (SELECT S#,AVG(score) AS 平均成绩
FROM SC
GROUP BY S#
) AS T1
WHERE 平均成绩 > T2.平均成绩) as 名次,
S# as 学生学号,平均成绩
FROM (SELECT S#,AVG(score) 平均成绩
FROM SC
GROUP BY S#
) AS T2
ORDER BY 平均成绩 desc;
25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
26、查询每门课程被选修的学生数
select c#,count(S#) from sc group by C#;
27、查询出只选修了一门课程的全部学生的学号和姓名
select SC.S#,Student.Sname,count(C#) AS 选课数
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=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,count(*) from Student group by Sname having count(*)>1;;
31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(char(11),DATEPART(year,Sage))='1981';
32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname='数据库'and score <60;
35、查询所有学生的选课情况;
SELECT SC.S#,SC.C#,Sname,Cname
FROM SC,Student,Course
where SC.S#=Student.S# and SC.C#=Course.C# ;
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
SELECT distinct student.S#,student.Sname,SC.C#,SC.score
FROM student,Sc
WHERE SC.score>=70 AND SC.S#=student.S#;
37、查询不及格的课程,并按课程号从大到小排列
select c# from sc where scor e <60 order by C# ;
38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';
39、求选了课程的学生人数
select count(*) from sc;
40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# );
41、查询各个课程及相应的选修人数
select count(*) from sc group by C#;
42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;
43、查询每门功成绩最好的前两名
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
select C# as 课程号,count(*) as 人数
from sc
group by C#
order by count(*) desc,c#
45、检索至少选修两门课程的学生学号
select S#
from sc
group by s#
having count(*) > = 2
46、查询全部学生都选修的课程的课程号和课程名
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平');
48、查询两门以上不及格课程的同学的学号及其平均成绩
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;
49、检索“004”课程分数小于60,按分数降序排列的同学学号
select S# from SC where C#='004'and score <60 order by score desc;
50、删除“002”同学的“001”课程的成绩
delete from Sc where S#='001'and C#='001';
问题描述:
本题用到下面三个关系表:
CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
BOOKS 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期
备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
要求实现如下15个处理:
1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。
2. 找出借书超过5本的读者,输出借书卡号及所借图书册数。
3. 查询借阅了"水浒"一书的读者,输出姓名及班级。
4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。
5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者。
6. 查询现有图书中价格最高的图书,输出书名及作者。
7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。
8. 将"C01"班同学所借图书的还期都延长一周。
9. 从BOOKS表中删除当前无人借阅的图书记录。
10.如果经常按书名查询图书信息,请建立合适的索引。
11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。
12.建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)。
13.查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出。
14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。
15.对CARD表做如下修改:
a. 将NAME最大列宽增加到10个字符(假定原为6个字符)。
b. 为该表增加1列NAME(系名),可变长,最大20个字符。
1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束
--实现代码:
CREATE TABLE BORROW(
CNO int FOREIGN KEY REFERENCES CARD(CNO),
BNO int FOREIGN KEY REFERENCES BOOKS(BNO),
RDATE datetime,
PRIMARY KEY(CNO,BNO))
2. 找出借书超过5本的读者,输出借书卡号及所借图书册数
--实现代码:
SELECT CNO,借图书册数=COUNT(*)
FROM BORROW
GROUP BY CNO
HAVING COUNT(*)>5
3. 查询借阅了"水浒"一书的读者,输出姓名及班级
--实现代码:
SELECT * FROM CARD c
WHERE EXISTS(
SELECT * FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME=N'水浒'
AND a.CNO=c.CNO)
4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期
--实现代码:
SELECT * FROM BORROW
WHERE RDATE<GETDATE()
5. 查询书名包括"网络"关键词的图书,输出书号、书名、作者
--实现代码:
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE BNAME LIKE N'%网络%'
6. 查询现有图书中价格最高的图书,输出书名及作者
--实现代码:
SELECT BNO,BNAME,AUTHOR FROM BOOKS
WHERE PRICE=(
SELECT MAX(PRICE) FROM BOOKS)
7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出
--实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO AND b.BNAME=N'计算方法'
AND NOT EXISTS(
SELECT * FROM BORROW aa,BOOKS bb
WHERE aa.BNO=bb.BNO
AND bb.BNAME=N'计算方法习题集'
AND aa.CNO=a.CNO)
ORDER BY a.CNO DESC
8. 将"C01"班同学所借图书的还期都延长一周
--实现代码:
UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE)
FROM CARD a,BORROW b
WHERE a.CNO=b.CNO
AND a.CLASS=N'C01'
9. 从BOOKS表中删除当前无人借阅的图书记录
--实现代码:
DELETE A FROM BOOKS a
WHERE NOT EXISTS(
SELECT * FROM BORROW
WHERE BNO=a.BNO)
10. 如果经常按书名查询图书信息,请建立合适的索引
--实现代码:
CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME)
11. 在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)
--实现代码:
CREATE TRIGGER TR_SAVE ON BORROW
FOR INSERT,UPDATE
AS
IF @@ROWCOUNT>0
INSERT BORROW_SAVE SELECT i.*
FROM INSERTED i,BOOKS b
WHERE i.BNO=b.BNO
AND b.BNAME=N'数据库技术及应用'
12. 建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名)
--实现代码:
CREATE VIEW V_VIEW
AS
SELECT a.NAME,b.BNAME
FROM BORROW ab,CARD a,BOOKS b
WHERE ab.CNO=a.CNO
AND ab.BNO=b.BNO
AND a.CLASS=N'力01'
13. 查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出
--实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME IN(N'计算方法',N'组合数学')
GROUP BY a.CNO
HAVING COUNT(*)=2
ORDER BY a.CNO DESC
14. 假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句
--实现代码:
ALTER TABLE BOOKS ADD PRIMARY KEY(BNO)
15.1 将NAME最大列宽增加到10个字符(假定原为6个字符)
--实现代码:
ALTER TABLE CARD ALTER COLUMN NAME varchar(10)
15.2 为该表增加1列NAME(系名),可变长,最大20个字符
--实现代码:
ALTER TABLE CARD ADD 系名 varchar(20)
问题描述:
为管理岗位业务培训信息,建立3个表:
S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN ) C#,CN 分别代表课程编号、课程名称
SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
要求实现如下5个处理:
1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名
2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位
3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位
4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位
5. 查询选修了课程的学员人数
6. 查询选修课程超过5门的学员学号和所属单位
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(DISTINCT [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)
if not object_id('cj')is null
drop table cj
go
create table cj(stuName nvarchar(10),KCM nvarchar(10),cj numeric(5,2))
insert into cj select '张三','语文',98
union select '李四','语文',89
union select '王五','语文',67
union select '周攻','语文',56
union select '张三','数学',89
union select '李四','数学',78
union select '王五','数学',90
union select '周攻','数学',87
方法一:
select stuname from
(select stuName,kcm,(select count(*) from cj where stuname!=a.stuname and kcm=a.kcm and cj>a.cj) cnt from cj a) x
group by stuname having max(cnt)<=1
go
方法二:
SELECT stuname FROM cj1 a
where cj IN(SELECT TOP 2 cj FROM cj1 WHERE kcm=a.kcm ORDER BY cj desc)
GROUP BY stuname HAVING(count(1)>1)
方法三:
select distinct stuname from cj a
where not exists(select kcm from cj b where a.stuname=stuname
and (select count(*) from cj where kcm=b.kcm and stuname!=a.stuname and cj>b.cj)>1)