分页的实现:
大家往往会经常看到网页上的分页,比如说有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的升序来排的,
那我们什么时候去使用这个索引呢?
就是当在数据量很大的时候,这时候我们就感觉用索引查找速度很快的感觉,那如果说你
才有几页的数据这时候我用不用索引没什么差别,而且我们要常用的字段,排序的字段,
不然如果说你去为你不会去查的,或者说很少去查字段创建索引,有意义吗没有把,
这里我们要清楚怎么去创建索引,使用的这样 一个方式。