欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.net 面试题总结(持续更新中)(待纠正)

程序员文章站 2022-04-12 21:42:01
...

.NET相关

1.会话cookie应用程序

       会议常用于保存用户信息;饼干用于自动登陆。

        会议的过期时间:页面不被关闭,会话不活动了开始计算,一旦会议再次活动,计时清零;

        饼干的过期时间是从当前时间开始计算。

         会话保存在服务端,饼干保存在客户端。

       应用存储的是所有用户共享的信息,比如总访问数等高速缓存,页面缓存。

        会议为每个用户创建,用于存储单个用户的信息。

2.接口,类和抽象类的区别

        接口:不能被实例化;接口成员必须是public,定义接口时不能给出具体实现代码,所以继承接口必须给出接口所有的实现方法实现和属性,可以多继承。

         类:可以被实例化;定义时可以给出也可以不给出具体实现,继承时不需要给出所有的实现方法,只能继承一个父类。

         抽象类:不可以被实例化只能用来继承;抽象类中的抽象方法在继承后必须在子类中给出实现,除非子类也是抽象类。只能继承一个父类。

3.接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可继承实体类?

    接口可以继承接口;抽象类可以实现接口;抽象类继承实体类的前提是有明确的构造函数。

4. 数组,ArrayList和List的区别

         数组:定义时必须包含长度;

  1. int [] intInner1 = new int [2] {1,2};   
  2. int [] inInner2 = {1,2};

        ArrayList:不用定义长度。没有定义类型

  1. ArrayList arrList1 =  new  ArrayList();
  2. arrList.add( “ABC”); //新增
  3. arrList.add(123);
  4. arrList.RemoveAt(0); //删除数组
  5. arrList.Insert(0, “你好”);

        列表定义了数据类型

  1. List < string > list =  new  List < string >(); 
  2. list.add( “你好”);

5.递归算法实现1,1,2,3,5,8,13,21,34 .......,求第30个数。

public static void main()
{
    console.Write(美孚(30));
}
public static int Foo(int n)
{
    如果(n <= 0)返回0;
    否则如果(n> 0 && n <= 1)返回1;   
    否则返回Foo(n)= Foo(n-2)+ Foo(n-1);
}

6.私人,公共,受保护,内部访问修饰符的访问权限

私人:私有成员,在类的内部才能访问;

市民:公共成员,完全公开,没有访问限制;

保护:保护成员,在类的内部和继承类中访问

内部:在同一命名空间内访问(也就是说如果有别的项目引用了该命名控件,是不能访问到内部的)

7.重写和重载的区别

        重载是同一个函数的几种形式,当类包含两个名称相同但签名不同的方法时发生重载。用方法的重载来提供在愿意上完成相同功能而功能能不同的方法。要求参数列表不同

        覆盖是重写父类的函数,在类的继承中使用,通过编写子类方法可以改变父类虚方法的实现。要求参数列表相同。

8.求1-2 + 3-4 + 5-6 + 7-8 + 9 + ......米的实现方式。

int sum = 0;
for(int i = 0; i <m; i ++)
{
   如果(M%2 = 0)
   {
      求和=米;
   }
   其他
   {
      总和+ =米;
   }
}

9.堆和栈的区别 

    A.  栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;

    堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小;

    B.引用类型总是存放在堆中。

    值类型和指针总是放在它们被声明的地方。

    调用方法:系统先将一段编码(堆的首部地址)放到栈上,紧接着放置方法的参数然后代码执行到方法时,查找栈中放该堆首部地址的所有参数,并通过堆的首部地址来控制堆。

    引用类型:总是放在堆当中。

    当我们使用引用类型时,实际上只是在处理该类型的指针。而非引用类型本身,使用值类型的话则是使用其本身。

详解:https : //www.cnblogs.com/codingsilence/archive/2011/02/28/2146584.html

10.引用类型和值类型的区别

A.  值类型和引用类型:
     值类型的变量直接包含他们的数据,而类型引用变量的存储
    引用类型存储对他们的数据的引用,后者称为对象:
简单说:值类型直接存储其值,
B类  值类型:简单类型,枚举,结构  引用类型:类型,接口类型,数组类型和委托类型:类型存储对值得引用。引用类型分为引用和引用对象。

参考:https : //www.cnblogs.com/xiao-hei/p/3847501.html

11.Net的错误机制 

    面试题中的标准答案是:.net错误处理机制采用try-> catch-> finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

参考: https//blog.csdn.net/lovejesuslove/article/details/50943591 

    百度后答案:Page_Error事件> ErrorPage属性> Application_Error事件>   <customErrors>配置项(按照优先级排序)

 1.Page_Error事件

    Page_Error事件提供一种捕获在页级别出现的错误的方法。您可以只显示错误信息(正如下面的示例代码所示),也可以记录事件或执行某个其他操作。

DE < 私人 无效  的Page_Load 对象  发件人 系统EventArgs的  é
   {
 //放置用户代码在这里初始化页面

        抛出 新的 异常“页面错误!” ;
   }
 
 protected  void  Page_Error object  sender  EventArgs  e
   {
      Exception  objErr  =  Server GetLastError GetBaseException ;
   响应“错误:”  +  objErr 消息;
      服务器ClearError ;
 //同样要注意这些代码的使用

  }
DE <

备注:。此示例在浏览器中显示详细的错误信息,提供此示例只是为了进行说明向应用程序的最终用户显示详细信息一定要小心更适当的做法是向用户显示一条消息,告知已发生错误,然后将具体的错误详细信息记录在日志中
    2.ErrorPage属性
     你几乎可以在页面任何时候设置的errorPage属性,从而确定页面发生错误的时候会重定向至哪个页面要让的errorPage属性能够发挥作用,通过<customErrors>配置项中的模式属性必须设为“开”。

DE <    这个ErrorPage  =  “〜/ ErrorHandling / PageError.html” ; DE <

    如果Page_Error和ErrorPage都存在,当抛出异常时,页面执行顺序是怎样的呢?Page_Error事件处理函数,如果Page_Error()事件中调用函数Server .ClearError()清除异常信息,则不会跳转到的errorPage属性指定页面;如果没有调用Server.ClearError(),异常信息会继续向上抛,页面会跳转到的errorPage指定页面这也就证明了优先级顺序Page_Error事件事件>的errorPage属性
     3。Application_Error事件
    与Page_Error事件相类似,您可以使用Application_Error事件捕获发生在应用程序中的错误。由于事件发生在整个应用程序范围内,因此您可以记录应用程序的错误信息或处理其他可能发生的应用程序级别的错误。在Global.asax中文件中添加如下代码就OK了。

DE < protected  void  Application_Error object  sender  EventArgs  e
      {
         Exception  ex  =  Server GetLastError GetBaseException ;
         
//实际应用中这里可以将异常信息记录或是保存到数据库中

         
//还可以将错误发邮件给网站维护人员

         回复“错误:”  +  EX 消息;
         
//清除异常,避免继续传递给上一级处理

         
//这里上级就是<CustomerErrors>配置节了

         Server ClearError;
     }
DE <

      4. <customErrors>配置项
       配置文件web.config中的<customErrors>配置节,可将重定向页指定为默认的错误页defaultRedirect或者根据引用的HTTP错误代码指定特定页。如果发生在应用程序以前的任一级别都未捕获到的错误,则显示这个自定义页。
DE < <的customErrors模式= “开”  的defaultRedirect = “〜/ ErrorHandling中/ ApplicationError.html” >  <错误的StatusCode = “404”  重定向= “〜/ ErrorHandling / 404.html“  / >  < / customErrors > DE <
    同样,如果Application_Error和<customerErrors>同时存在,也存在执行顺序的问题。因为优先级Application_Error事件>  <customErrors>配置项,所以发生应用程序级错误时,优先执行Application_Error事件中的代码,如果Application_Error事件中调用了Server.ClearError()函数,<customerErrors>配置节中的的defaultRedirect不起作用,因为异常已经被清除;如果的Application_Error事件中没用调用了Server.ClearError()函数,错误页会重新定位到defaultRedict指定的URL页面,为用户显示友好出错信息。
       通过对.NET提供的以上四种错误处理机制的分析,我们可以把它们从不同的角度分类,便于我们理解和使用。

12 62-63 = 1不成立,请移动一个数字(不可以移动减号和等于号)使等式成立。

    移动6,使其等于2的6次方。

13.填充边缘区别

.net 面试题总结(持续更新中)(待纠正)

保证金:层的边框以外留的空白
背景色:背景颜色
背景图像:背景图片
填充:层的边框到层的内容之间的空白 
边框:边框 
内容:内容
参考:https//www.cnblogs.com/HDK2016/p/6127856.html

14.泛型的使用

    类型参数化

     类型安全检查(实例化了INT类型的栈,就不能处理字符串类型的数据,其他数据类型也一样

//实例化只能保存INT类型的类

Stack <int> a = new Stack <int>(100);
a.Push(10);
a.Push( “8888”); //这一行编译不通过,因为类一个只接收INT类型的数据
int x = a.Pop();

//实例化只能保存字符串类型的类

堆栈<string> b =新堆栈<string>(100);
b.Push(10); //这一行编译不通过,因为类b只接收字符串类型的数据
b.Push( “8888”);
字符串y = b.Pop();

参考:https//www.cnblogs.com/yueyue184/p/5032156.html

15. final finally final ize的区别

final:修饰符(关键字);如果一个类被申明为final,这个类不能派生子类,不能作为父类继承;如果一个变量申明为final,可以保证变量在使用中不被修改,申明变量为最后时必须在申明时给定初值,并且在以后的引用中只能读取不能修改;申明为最终的方法也是只能使用不能重载。

finally:异常处理时调用finally块处理清除操作,如何抛出一个异常,那么相匹配的catch块就会被执行,如果有finally,然后就会进入finally块。

            不管有没捕获到异常最终都会执行。   在连接数据发生异常时,可以用来关闭连接。

            (return,continue和break都没能阻止finally语句块的执行,并且在返回前执行

finalize:使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或执行其他清理工作.finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

16. finalize()与Dispose()区别 

    完成自动释放资源,Dispose()方法用于手动释放资源

17. ADO.net中常用的对象有哪些?分别描述一下。 
    连接打开数据库连接 
    命令执行数据库命令 
    DataAdapter连接数据,执行数据库命令,填充 
    DataSet数据集数据在内存中的缓存,数据结构; 可以视图一个暂存区(高速缓存),把从数据库中所查询到的数据保留起来用来无连接的储存多个表的数据,并包含表与表之间的关联关系。

    DataReader        用来读取数据。因为DataReader在读取数据的时候限制了每次只读取一笔,而且只能,所以使用起来不省节省资源而且效率很好。使用DataReader对象除了效率较好之外,不用因为把数据全部传回,故可以降低网络的负载。    

  DataReader的和数据集的区别:

    DataReader的使用时始终占用的SqlConnection,在线操作数据库。任何对的SqlConnection的操作都会引发的DataReader的异常。因为DataReader的每次只在内存中加载一条数据,所以的占用内存的英文很小的..因为DataReader的的特殊性和高性能。所以DataReader的是只进的。读你了第一条后就不能再去读取第一条了.. 
    数据集则是将数据一次性加载在内存中。抛弃数据库连接。读取完毕即放弃数据库连接。因为数据集数据将全部
加载在内存中。所以比较消耗内存。但是确比DataReader的要灵活..可以动态的添加行,列,数据,数据库对回进行传更新操作。

18.C#委托如何理解

A.什么是委托

从数据结构来讲,的英文委托类状语从句:一样的英文一种用户自定义类型

委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

B.委托的定义

委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

委托的声明原型是 
委托<函数返回类型> <委托名>(<函数参数>)

例如:public delegate void MyDelegate(int number); //定义了一个委托MyDelegate,它可以注册返回void类型且有一个int作为参数的函数

C.委托的实例化

一个使用新的关键字

委托实例化的原型是
<委托类型> <实例化名> =新<委托类型>(<注册函数>)
例子:MyDelegate _MyDelegate = new MyDelegate(CheckMod); //用函数CheckMod实例化上面的MyDelegate委托为_ MyDelegate

b使用匿名方法

<委托类型> <实例化名> =委托(<函数参数>){函数体};

19. .NET常用的几种页面间传递参数的方法

    一个。queryString url参数简单,显示于地址栏,长度有限制,

    湾 会话不能过多使用,容易丢失

    c.ViewState

    d.Cookie不适合使用一次就扔的变量

    e.this.server.Transfer接受页面腰围发送页面准备好,只能定制专门的一页页面接受定制号的页面。不能是一个页面接受任何页面。

    f.application全局的,开销大

20.如果在一个BS系统中,需要传递变量,但是不能使用session,cookie,应用程序,还有哪些方法?

   一个。<input type =“hidden”>

    湾数据库

    c.this.server.Transfer

    d.queryString

21. ASP.NET页面跳转的方法

    a。<a href="default.aspx" />

    湾 <asp:hyperLink NavigatoeUrl =“default.aspx”/>

    c.Response.Redirect()

    d.Server.Transer()

    e.server.Execute()

22.向服务器发送请求的方式,使用情况

    得到:得到从服务器上获取数据,长度受限,在网址中显示出来不安全
    帖子:向服务器传送数据,长度不受限,安全

23.进程与线程

    一个程序至少有一个进程,一个进程至少有一个线程;

线程所在的命名空间:System.Threading;
线程类:Thread th = new Thread(方法名);
//没有要参数的构造函数,常用的为,1个参数,参数类型是委托类型,需要一个方法指向变为
后台线程:
th.IsBackground = true;
线程启动:

th.Start();

如果要执行带参数的方法,那么这个方法的参数必须是对象类型,参数传递的位置在Start方法的括号中
允许跨线程访问对象:
在构造函数的构造方法下面加上:
Control.CheckForIllegalCrossThreadCalls = false;
停止线程:

th.Abort();

//实例化进程类
Process p = new Process();
//创建进程开启路径对象
ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text);
//进程类开启路径指向
p.StartInfo = psi;
//启动进程,不是立刻开启,什么时候开启时由CPU决定

24.多线程

创建多线程的步骤:
1,编写线程所要执行的方法
2,实例化Thread类,并传入一个指向线程所要执行的方法的委托。(这时线程已经产生,但还没有运行)

3,调用线程实例的启动方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定

多线程的优点:可以同时完成多个任务;可以使程序的响应速度更快;可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务;可以随时停止任务;可以设置每个任务的优先级以优化程序性能。

当启动一个可执行程序时,将创建一个主线程。在默认的情况下,C#程序具有一个线程,此线程执行程序中以主要方法开始和结束的代码,main()的方法直接或间接执行的每一个命令都有默认线程(主线程)执行,当主()方法返回时此线程也将终止。

不利方面主要有如下几点:

(1)线程也是程序,所以线程需要占用内存,线程越多,占用内存也越多。

(2)多线程需要协调和管理,所以需要占用CPU时间以便跟踪线程。

(3)线程之间对共享资源的访问会相互影响,必须解决争用共享资源的问题。

(4)线程太多会导致控制太复杂,最终可能造成很多程序缺陷。

25.拆箱和装箱的含义

    拆箱:将一个引用类型转换成值类型

     装箱:将值类型转换为引用类型

26.页面生命周期

.net 面试题总结(持续更新中)(待纠正)

.net 面试题总结(持续更新中)(待纠正)

1.页面生命周期的主要阶段包括:阶段事件/方法   
页面初始化Page_Init  
加载查看状态LoadViewState   
回发数据处理LoadPostData   
页面加载Page_Load   
回发通知RaisePostDataChangedEvent  
回发事件处理RaisePostBackEvent  
页面预渲染Page_PreRender   
保存viewstate SaveViewState   
页面渲染Page_Render   

页面卸载Page_UnLoad  

参考:https//www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html

27.数组有没有长度()方法?字符串有没有长度()方法?

    都没有长度()方法,只有长度属性

28. ViewState

        主要用于保持网页上控件的状态。当网页上的控件被绑定到代码隐藏类中的对象;

    ViewState用来保存页面状态,就是说提交之后我们还可以看到文本框里面的内容就是ViewState保存的功劳。ViewState 
    只维护当前页面的状态,不同页面之间不能共享,Session可以。 

    ViewState的你可以理解为一个隐藏控件。

    的EnableViewState属性设置为假即可禁用ViewState中。

29静态和非静态的区别: 

    一个,用静态声明的方法和变量,不需要实例化该类就调用;

    B,静态的,就一定要用实例化的对象来调用,即用新来实例化。

举例说:

    如果有一个类People,有一个Static的方法MiaoShu(),调用方法就是People.MisoShu()

    有一个非静态的方法getName(),调用方法就是People p = new People(); p.getName(); 

30.简单介绍几个设计模式

    单例模式:保证程序的整个进程中只会被实例化一次;

公共类Singleton {
	私人静态Singleton单身人士;
	静态只读对象Padlock = new object();
	私人单身人士(){}
	公共静态Singleton GetInstance()
	{
		如果(singleton == null)
		{
			锁(挂锁)
			{
				如果(singleton == null)
				{
					singleton = new singleton();
				}
			}
		}
		返回单身人士;
	}
}

    工厂模式(简单工厂,工厂,抽象工厂)


   
 公共接口ICar 
    { 
        void run(); 
    }
    公共课BMWCar:ICar 
    {     
          public void run()     
          {         
            Console.WriteLine(“BMWCar run”);     
          } 
    }
    公开课BenzCar:ICar 
    {     
       public void run()     
      {          
           Console.WriteLine(“BenzCar run”);     
      } 
    }
    公共类Driver 
    {     
           公共静态ICar DriverCar(字符串carType)     
          {         
                开关(carType)        
                {             
                        案例“BMWCar”:返回新BMWCar();             
                        case“BenzCar”:返回新的BenzCar();             
                        默认值:抛出新的Exception();        
                }     
            } 
    }

    公共类客户端 
    { 
        public static void Main() 
        { 
            ICar myCar = Driver.DriverCar(“BenzCar”); 
            myCar.run(); 
            Console.Read(); 
        } 
    } //简单工厂

31. web.config文件中的重要节点

        动态调试编译 - <汇编/>,自定义错误信息 - 通过<customErrors />,身份验证 - <认证/>,授权 - <授权/>,应用程序级别跟踪记录 - <跟踪/>,会话状态设置 - <的sessionState />,全球化 - <全球化/>

32.冒泡排序

33.选择排序

34.Webservice

    用webservice(在webAPI)将数据发往后台,方便系统和系统之间的交互,有一个系统需要另一个Java系统的数据,就需要用java写一个webservice,因此诞生了WDSL用来描述这些webservice的方法。

    web服务的创建方法多种,在ASP.net时代,任何一个网页项目都可以像添加类一样添加web服务程序(选web服务); WCF也提供web服务;一般处理程序也提供webservice服务(选一般处理程序);

    使用Web服务会让系统和系统之间产生依赖关系,高耦合。

JS相关

1. JS的数据类型:数字,字符串,对象,布尔值,null,未定义

2.JS判断数据类型的方法:

    一种

    b.tostring.call();

    c。停顿和构造函数:var a = [2,2,1]; console.log(Array的一个实例); //返回TRUE

    d.hasownProperty

3.Jquery判断数据类型:

    IsArray的()是否为数组

    isEmpthObject()是否为空对象

    isFunction()是否为函数

    ISNUMERIC()是否为数字

<SCRIPT>
    var str ='aaaa';
    var num = 123;
    var fun = function(){};
    var arr = [];
    函数Person(){};
    function Food(){};
    var xiaoming = new Person();
    var bananer = new Food();
    var time = new Date();

    //方法一typeof
    console.log(“方法一typeof”)
    console.log(typeof fun); //功能
    console.log(typeof arr); //对象
    console.log(typeof xiaoming); //对象
    / *缺点:实例对象和数组返回的都是对象,没有办法区分。* /

    //方法二tostring.call();
    console.log(“方法二tostring.call();”)
    的console.log(toString.call(ARR)); // [对象数组]
    的console.log(toString.call(明)); // [[object object]]
    的console.log(toString.call(时间)); // [对象日期]
    的console.log(toString.call(STR)); // [对象字符串]
  //相比typeof来说,对象的类型更加清晰

    //方法三Instanceof和构造函数
    / *用于检测某个实例对象是由哪个构造函数创建出来的* /
    console.log('方法三Instanceof和构造函数')
    的console.log(bananer.constructor); // function Food(){}
    的console.log(xiaoming.constructor); // function Person(){}
    console.log(bananer instanceof Person); // false
    console.log(bananer instanceof Food); // true

   //方法四hasOwnProperty判断某个属性是不是对象自身的属性
   var iphone = {
       名称: 'iphone',
       年龄:100,
       地址:{家: '江苏',电流: '北京昌平'}
   }
console.log(iphone.hasOwnProperty('name'))// true
console.log(iphone.hasOwnProperty('age'))// true
console.log(iphone.hasOwnProperty('地址'))// true
console.log(iphone.hasOwnProperty('home'))// false
</ SCRIPT>
$.isArray([1,2]);// 数组
$.isFunction(function() { }); // 函数function
$.isEmptyObject(null); // null,undefind
$.isXMLDoc();    // xml

参考: https//www.cnblogs.com/kumayato/p/6656493.html

4.Jquery的数据类型: 

    字符串:var typeofStr = typeOf(“hello”); // typeofStr为字符串

    number:typeof(3.1415926)//返回数字

    math:Math.PI圆周率; Math.LN2 2的自然数

    NaN/Infinity:   isNaN(parseInt("Hellp",10)) // true ;   isNaN(parseInt("110",10)); //false

    Interger/float/boolean/object,

    Array: var arr=[1,2,3]; for(var i = 0 ; i <arr.length ; i++)

            var x = [1,2,3];

            $.each(x,function(index,value){console.log("index",index,"value",value);});

4.JS的弹出框的方法:????

    alert()/console.log()/console,error()/console.warn()/console.debug()

5. HTML 控件& ASP控件 区别

    a. asp的控件为服务器端控件,HTML为客户端控件;

    b. ASP控件在服务器解析后,会转化为HTML控件,使客户端浏览器能够显示出来。

    c. ASP控件只是封装.net Framework服务器才能解析出来,而HTML用java, php , asp都可以

    d. ASP控件在使用中如果遇到控件不随着屏幕变化的问题时,需要再次编写CSS

6. Jquery 实现点击div后显示的数字-1 

7.document.getelementByID("name")与$("name")哪个效率高?

SQL 相关

     1. ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

    ROW_NUMBER() over(partition by mpoid order by approveid desc) as approvesort

    以MPOID分组,按照ApproveID排序,每组新增一自增长列:approvesort

    2. RANK() OVER(ORDER BY a)

    按照a排序,新增一自增长列(a的值相同时,列值相同,但是列数依旧+1)

    参考: https://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html 

    3.convert

    CONVERT(data_type(length),data_to_be_converted,style)

style:

111

yy/mm/dd

112

yymmdd

101 mm/dd/yy

    4. 行转列    

select ID , max(case when course='语文' then score) as 语文,max(case when course='英语' then score) as 英语 

     from SC group by ID 

    使用Group by 时,查询的列必须分组,除非使用聚合函数,如果是varchar类型,可以用max() ;如果是日期类型,可以用conver转化为varchar,再用max() . (必须为聚合函数的原因待探究)

     5. nvarchar 和 varchar 的区别

            char:固定长度,存储ANSI字符,不足的补英文半角空格。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义CHAR(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim()。

            nchar:   固定长度,存储Unicode字符,不足的补英文半角空格。

            varchar: 可变长度,存储ANSI字符,根据数据长度自动变化。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

            nvarchar: 可变长度,存储Unicode字符,根据数据长度自动变化。        

如何使用这些类型:

    如果你肯定存储的数据长度,而且不包中文的,可以选择char类型。

    如果肯定存储的数据长度,但可能包括中文,可以选择nchar类型。

    如果不确定存储的数据长度,存储只有英文、数字的最好用varchar

    如果不确定存储的数据长度,也有可能有中文,可以选择nvarchar类型

参考: https://www.cnblogs.com/rency/p/6923615.html

     6. left join / right join / inner join 区别(A+B列)

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

        select * from A left join B on A.ID=B.ID  左表A的记录会全部显示出来,右表B会显示符合条件的记录,B中记录不存在的为NULL

    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

        select * from A right join B on A.ID=B.ID  右表B的记录会全部显示出来,左表A会显示符合条件的记录,A中记录不存在的为NULL

    inner join(等值连接) 只返回两个表中联结字段相等的行

        select * from A join B on A.ID = B,ID 只返回符合条件的记录。

     7. SQL: 要求取出表A中第31到40条记录(主键ID自增长,但ID可能不是连续的)       

          a.select top10* from A where ID not in (select top 30* from A)

          b.select top 10 * from A where ID >(select Max(ID)as ID from (select top 30 ID from A))

          c.select * from(select *,ROW_NUMBER() over(order by ID)as 'userID' from A) as a where a.userID between 31 and 40

          d. select top 10 * from A where ID in (select top 40 ID from A order ID desc)

     8. 如何优化SQL

           视图,索引

    9.SQL 基本知识点:   

   alter table tablename rename column A to B(将A字段名改为B)

       alter table tablename alter column A decimal(18,2) not null (修改A字段的类型)

       alter table tablename add defaule(0) for fieldname with values(修改字段默认值)

                如果字段有默认值,则需要先删除字段约束,再添加默认值

                select c.name from Student A inner join Teachers B on A.ID = B.ID inner join Uesrs U on A.ID = U.ID

                where A.id = object_id('表名') and b.name='字段名'

                根据约束名称删除约束 :alter table tablename drop constranint 约束名

                alter table tablename defaule(0) for 字段名 with values

        alter table tablename add 字段名 type not null default(0) (新增字段)

        alter table tablename drop down column 字段名

     10. 查询每门课程分数都高于90分的学生信息    

select UserID from Student group by UserID having min(score)>90

select MPOID,count(*) from MPOApproval group by MPOID having COUNT(ApproveID)>20 (查询每张PO的审批人多余20人的PO)

    11. SQL中如何将多列数据合并为一列,并用逗号分隔?

        SQL中如何将多行数据合并为一列,并用逗号分隔? 

 SELECT  MPOID ,
        value = ( STUFF(( SELECT    ',' + LearUID+' approevd at '+ convert(varchar(20),approvedate,112)
                          FROM      MPOApproval
                          WHERE     MPOID = Test.MPOID
                        FOR
                          XML PATH('')
                        ), 1, 1, '') )
    FROM MPOApproval AS Test
    GROUP BY MPOID;

 结果

MPOID value
8158
JZhou01 approevd at 20170320,PXu approevd at 20170322,MWang approevd at 20170322            

参考:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html

          https://www.cnblogs.com/no27/p/6398130.html

    12.如何使用T-SQL获取最后一次插入的标识符:

        @@Indentity

    13.SQL用来约束字段的大小区间    

create  table  student(
id  char(8),
name  char(8),
sex  char(2),
phonenum  int,
  constraint  chk_sex  check(sex in ('F','M')),
  约束chk_phonenum检查
(phonenum like'(010)[1-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]'))

    14.如何替换字段为日期格式的年:

更新主题集writeDate = STUFF(convert(varchar(50),writeDate,120),1,4,'2017')

            如何截取字段为日期格式的年份:

选择year(writeDate)作为年,月(writeDate)作为月的Topic

    15.删除重复名字的数据,留下ID最小的

         删除ID>的用户(从用户组中按名称选择最小(ID))


相关标签: .net SQL