突然想到个问题,在做测试的时候又发现了几个问题。希望大家帮我解释下。看来学习不能想当然,其实很多时候还真不是你想的那样。要多思考,多测试。
    create table tb
(col1 int,
 col2 int
)
insert into tb values (1,1)
insert into tb values (1,1)
insert into tb values (1,2)
insert into tb values (2,1)
insert into tb(id1) values (1)
insert into tb(number) values (1)
insert into tb(id1) values (1)
insert into tb(number) values (1)
问题1:能不能插入(null,null)值,如果能怎么做,如果不能为什么?   select top 4 * from tb order by col1 desc
   select top 5 * from tb order by col1 desc
   select top 6 * from tb order by col1 desc
  2 1
1 NULL
1 2
1 1
==========
2 1
1 2
1 1
1 1
1 NULL
==========
2 1
1 2
1 1
1 1
1 NULL
1 NULL========
问题2 :使用order by 排序时,select top 4 * from tb order by col1 desc 为什么没有出现重复列;col2在此三句查询中是按照什么方式排序的?
测试环境是SQL Server 2000

解决方案 »

  1.   

    create table tb
    (id1 int,
     number int
    )
    go
    --楼主,你定义的列名与插入的不一致吧!
    insert into tb values (1,1)
    insert into tb values (1,1)
    insert into tb values (1,2)
    insert into tb values (2,1)
    insert into tb(id1) values (1)
    insert into tb(number) values (1)
    insert into tb(id1) values (1)
    insert into tb(number) values (1)--1.直接插入NULL,对这个表结构,可以的.如果列定义了主键,或NOT NULL,那就不能插入了
    insert into tb select null,null
    insert into tb select null,null
    select * from tb
    /*
    id1         number
    ----------- -----------
    1           1
    1           1
    1           2
    2           1
    1           NULL
    NULL        1
    1           NULL
    NULL        1
    NULL        NULL
    NULL        NULL(10 行受影响)*/
      select top 4 * from tb order by id1 desc
      select top 5 * from tb order by id1 desc
      select top 6 * from tb order by id1 desc--2.你说的重复列是指未出现number相同的吧,这当然与 DBMS 的排序算法有关了,但是,这重要吗?
    --既然你没有对第二列排序,那只要第一列排序正确,第二列怎么排都是满足你的需求的.
    --如果你要对第二列的顺序也作要求,那就把它也放在 order by 子句里好了,你又不对它排序,
    --那就根本没必要考虑它是怎么排序的,因为你所想像的,并不是你能肯定的!/*
    id1         number
    ----------- -----------
    2           1
    1           NULL
    1           2
    1           1
    id1         number
    ----------- -----------
    2           1
    1           2
    1           1
    1           1
    1           NULL
    id1         number
    ----------- -----------
    2           1
    1           2
    1           1
    1           1
    1           NULL
    1           NULL
    */go
    drop table tb
      

  2.   

    1、按楼主给的建表语句看两列插入NULL都是可以的,直接 insert into tb select NULL,NULL就可以。2、至于楼主按id1排序后,id2按什么排序,这个不用太深究吧!如果楼主想指定id2按升序或是降序,可以将该列加在order by后,反正最终的效果实现楼主的需求即可。
      

  3.   

    1.
    insert into tb values (null,null)
    OK!
    因为没做什么约束.
      

  4.   

    首先肯定的是能插入两列null。
    insert into table values (null,null)
    问题2 :使用order by 排序时,select top 4 * from tb order by col1 desc 为什么没有出现重复列;col2在此三句查询中是按照什么方式排序的?
    测试环境是SQL Server 2000你所查询的是前四行数据,还没轮到重复数据的出现 所以没有出现重复值
    col2 排序 排序指的是 order by 后面跟的列,你的查询语句里面没有col2 所以 col2 没有排序
      

  5.   

    --楼主,你定义的列名与插入的不一致吧!
    ==============
    id1=col1,number=col2.改了下,没完全改过来。
    问题1,我知道了,谢谢大家。
    问题2,col2的排序以前认为是按照插入值的顺序来排序的。结果发现和想象的有很大区别。估计可能也比较复杂。再等一下,晚上结贴。