SQL 2005(四)最新修改

分页的实现:
大家往往会经常看到网页上的分页,比如说有15条数据,每页显示5条,那么我点击下一条

它是不是跳到第二页显示另外另5条数据,那么它是怎么实现的呢?
照这样子的思路我们可以想到,第一页1-5,第二页6-10,第三页11-15
那这样子的范围又要怎么描述呢?第一页是很好实现的,关键是这以后的要怎么描述,
就拿第二页来说,这6怎么来的,是不是就是每页显示的条数*(当前页数-1)+1,10呢?

就是当前页数*每页显示的条数,是这样吧,之后以此类推,
下面我们应该关注的是怎么用语句来描述的问题了:
比如说我事先创建了一张表mytable,里面有15条记录,
第一页是不是很好实现:select top 5 * from mytable
第二页呢我们要用到子查询:select top 5 * from mytable where sno not in(select

top 5 sno from mytable)--这句是不是相当说把select top 5 sno from mytable的数据

拿掉,然后剩下的在找5条数据
第三页只要把子查询子句里面的5替换成10,也就是select top 5 * from mytable where

sno not in(select top 10 sno from mytable)
第一条语句中的5代表每页显示的条数,第二条语句前一个5也是表示每页显示的条数,后

一个表示(当前页数-1)*每页显示的条数,
第三页也带下去看下,没错,没问题

 

更进一步的:
我们声明两个变量
declare @page int
declare @current int
set @page=5
set @current=2
select top 5 * from mytable where sno not in(select top 10 sno from mytable)
下面的数字用变量替代就好了
select top @page  * from mytable where sno not in(select top (@current-1)*

@page  sno from mytable)
这个只是我们的想法,执行下发现@page附近有语法错误
如果我们用这种方法,那要怎么改正呢
declare @page int
declare @current int
declare @sql nvarchar(500)
set @page=5
set @current=2
set @sql= n'select top'+cast(@page as nvarchar(10))
set @sql= @sql+n'* from mytable where sno not in('
set @sql= @sql+n'select top'+cast((@current-1)* @page as nvarchar(10))
set @sql= @sql+n'sno from mytable)'
execute(@sql)
select top @page  * from mytable where sno not in(select top (@current-1)*@page  sno from mytable)

 


使用指定的替换值替换NULL:这两种方式都可以实现替换,但在实际操作中要根据需要选

择,前者只能是替换空值的,后者的话可以替换任意满足条件的;
1.ISNULL()  2.case

比如说s_edu在表里值是未知,而查询出来是NULL,我们要怎么来处理?
select ISNULL(s_edu,'未知') from Stu就这么简单
还有就是case
select '教育程度'=case when s_edu is null then '未知'
else s_edu
end
from Stu


怎么创建视图,什么又是视图?
像我们应该都有看到过WORD,PPT,这些的视图,它的视图就只是改变外观显示有没有,这

里的视图也是这样的一个意思

select s_name,score from course c inner join Stu s
on c.sno=s.sno
go
查询出这样的结果,那么如果下次还要用到这个结果,每次都得这样执行就显得很麻烦,

这时候我们用视图来暂时存放这个操作的结果,这个就比较方便了
create view v1
as
select s_name,score from course c inner join Stu s
on c.sno=s.sno
go
然后我执行 select * from v1 这样是不是方便多了  当然在程序里面一样可以执行这个

语句
不管今后我的语句写的多么复杂,我们都可以用视图的方式来表示,
还有要注意一点就是,视图的话它只是一张虚拟的表,系统并没有再分配空间出来存放这

些数据的,显示出来的这些数据还是存放在原来的表中,

 

创建索引:就像是每本书它都有个目录一样,这样就方便查找,效率更高,这里也是这样

一个意思

我们创建一张表有主键的之后是不是都有看到默认排序了1,2,3....这样子的默认的是升

创建 primary key约束的时候,将在列上自动创建唯一索引,默认情况下,是一个聚集索

引,但是在创建约束时我们可以指定创建非聚集索引。
一张只能有一个主键也是不是就意味着说也只能有一个聚集索引,而允许多个非聚集索引

,因为数据行本身只能按一个顺序存储,这种聚集索引它的逻辑顺序跟物理顺序是一一对

应的。

那什么又是非聚集索引呢?
它就是说逻辑顺序跟物理顺序是没有关联的,彼此关系不是对应的关系,没有像聚集索引

那样一一对应的关系的

那如果说我要通过代码的方式来创建索引,它会是聚集的还是非聚集的呢
前面我们有说过一张表只能有一个聚集索引,然后可以有多个的非聚集索引
用代码的方式当然它创建的是非聚集索引,因为我们根本就没有在创建主键约束,
还有注意唯一性约束跟主键约束的区别,前者可以为空,但也只能是一个为空,后者的话

它不允许为空;


下面来看下创建索引的语法:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name |

"NULL" } ]

[ ; ]

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ]
        table_or_view_name
}


这个地方可以写多个字段,多个字段充当索引的时候叫做组合索引也叫复合索引,当然我

也可以不指定[ UNIQUE ] [ CLUSTERED | NONCLUSTERED ],那么就是以默认的方式(非聚

集索引)来创建,还有这个<object>可以是表名或者是视图名,后面括号里面就是列名了

create index _index
on Stu(sname)--为名字创建索引,这时候就会以名字来排序
go
select * from Stu
go
下面我们关注的是怎么来用索引
select * from Stu with(index(_index))
go
执行下我们发现查询的结构不一样,因为我们创建索引的时候就默认的会有个升序的排序

,而且这里是以sname的升序来排的,

那我们什么时候去使用这个索引呢?
就是当在数据量很大的时候,这时候我们就感觉用索引查找速度很快的感觉,那如果说你

才有几页的数据这时候我用不用索引没什么差别,而且我们要常用的字段,排序的字段,

不然如果说你去为你不会去查的,或者说很少去查字段创建索引,有意义吗没有把,
这里我们要清楚怎么去创建索引,使用的这样 一个方式。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值