日度归档:2018年7月18日

mssql sqlserver sql脚本中on和where后的区别


摘要:
下文讲述sql脚本中 on where的使用区别,
实验环境:sqlserver 2008

sqlserver 连接两张或多张表时,sql引擎将连接后的结果生成临时表,然后输出给用户,下文讲述各种连接中,on和where关键字的用法区别,如下:

例: select * from A left join B on …
1 on 条件,无论条件是否成立, 都会返回A表的记录,并生成相应的临时表
2 where 条件,on 条件生成临时表后,然后再对临时表执行where过滤操作,where条件不为真时,则剔除掉。

例:
表A:A

keyId

info
1

10
2

20
3

30
表B:B
keyId

name
1

测试
1

测试B
20

测试C

————————-
语句1: select * form A left join B on (A.keyId = B.keyId) where B.name=’测试’
语句2:select * form A left join B on (A.keyId = B.keyId and B.name=’测试B’)
————————
第一条SQL的过程:
1、中间表 on条件: A.keyId = B.keyId

A.keyId

A.info

B.keyId

B.name
1

10

1

测试
1

10

1

测试B

2
20

null

null

3
30

null

null

2、再对中间表过滤 where 条件: B.name=’测试’

A.keyId

A.info

B.keyId

B.name
1

10

10

AAA

————————
第二条SQL的过程:

1、中间表 on条件: A.keyId = B.keyId nd B.name=’测试’ (条件不为真也会返回左表中的记录)

A.keyId

A.info

B.keyId

B.name
1

10

1

测试

—————————————
on where 关键字:
on关键字其表连接作用,where对生成后的表进行过滤。
left join :返回左表所有记录,将满足on条件的记录进行连接,返回左表全部字段,右表无连接字段时,返回右表null
right join :返回右表所有记录,将满足on条件的记录进行连接,返回右表全部字段,左表无连接字段时,返回左表null
inner join:同where 功能一致

mssql sqlserver offset fetch关键字同order by 关键字结合使用,进行分页数据获取


摘要:
下文讲述分页的另类方法,使用offset和fetch关键字分页数据的获取
实验环境:sqlserver 2012



一、offset 获取表中记录,跳过指定行数

例:表test按照keyId 倒序排列,并跳过前3条

  create table test(keyId int identity(1,1),info varchar(10))
  go
  insert into test(info)values('a'),('b'),('c'),('d'),('e'),('f')
  go
   select * from test order by keyId desc  offset 3 rows 
-------输出------
3  c 
2  b
1  a
------------------
drop table test 


二、offset fetch组合应用

offset fetch 组合使用,可达到跳过相应的记录,并返回指定的行数。
例:
offset n rows 跳出相应的行数
fetch next n rows only 返回相应的行数

  create table test(keyId int identity(1,1),info varchar(10))
  go
  insert into test(info)values('a'),('b'),('c'),('d'),('e'),('f')
  go 
  select * from test order by keyId desc 
   offset 3 rows
    fetch next 2 rows only  
    go
-------输出------
3  c 
2  b 
------------------
drop table test