2006年12月7日
#
刚刚想把自己(local)上的一个数据库删了,删的时候一直说正在使用中,删除失败
找了半天找不到是什么程序正在使用中,突然想起有个东东可以直接去掉连接,
右键找出“分离数据库”,再清除连接,哇卡卡~居然给我删掉了……
2006年12月2日
#
刚刚把服务器上的SQL server 2000重装了,但是用自己的机器连的时候打死连不上去,总是提示: 数据库不存在,但是别人能连上去
于是进行常规操作telnet 202.115.22.141 1433
发现端口封闭着,但是别人是怎么连上去的,百思不得其解中远程上服务器发现SQL服务端管理器上同时启用了TCP/IP协议方式与namepipe方式,其它人的估计都是用的namepipe的方
式连上的。
于是马上查看sql server版本,发现还是sp2,打上sp4补丁之后,再次telnet 1433端口,OK
看来以后装SQL的时候还是要把补丁打齐了的说
2006年11月22日
#
刚刚看了一下transaction,想起来用到一个存储过程中去
create proc tran_test
(
@book_ID int
)
as
begin transaction del_Books
go
delete from bookMain where book_ID=@book_ID
go
delete from bookLent where book_ID=@book_ID
go
commit transaction del_Books
go
发现一运行,提示@book_ID未声明,commit没有对应的begin
但是把有关事务的一段拿出来单独执行又正常。试着把那几个不知所云的go去掉(我直接看的书上),运行正常。
查了一下go 的用法,问题解决:
“查询分析器中随时可用
存储过程与触发器中不可用 ”
现在想起来以前写的存储过程中出现的变量不认识的情况,多数与之有关
2006年11月3日
#
T-SQl 语句中的select语句是可以嵌套使用的,这也使得其灵活性与可编程性大提高了,但是这两天在用的时候无意中发一个小问题,如下:
select A from (select * from tableB)
这个语句看起来不会有什么错,但是一运行就会报错:')'附近有错误。
解决办法是在后面加上一个表名,或者AS 表名
select A from (select * from tableB) as t1
这样才成功。请教牛人再自己研究之后发现原来select 用法为: select from [表名],后面要跟一个表名而不是表,嵌套之后必需要用指定一个别名,否则就会出错
2006年11月1日
#
今天est 问到一个问题:
表1
列 A B
1 2
2 7
3 5
表2
列 A C
1 3
3 4
表3
列 A D
2 5
1 9
要求合并成表4
列 A B C D
1 2 3 9
2 7 null 5
3 5 4 null
试了很久,开始一直用联合查询,后来又用视图,再后想到用游标了……做得我都无语的时候,突然看到一个null,然后就想到有个东西自动生成null滴,果然还是要用联合查询,不过要用到一个left join,其用法为
左连接:left join 或 left outer join
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
所以想到用这个来做一个联合查询
先用table1与table2 做查询然后再联全table3 做查询
select temp1.A,B,C,table3.D from(select table1.A,B,C from table1 left join table2 on table1.A=table2.A) as temp1
left join table3 on temp1.A=table3.A
注意里面一定给第一次联合查询的结果指定一个别名,不然会报错
看到还不错,发到这里来保存一下,有兴趣就看看嘛,呵呵~~
关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释,相信会对你有所启示。
--建表table1,table2:
create table table1(id int,name varchar(10))
create table table2(id int,score int)
insert into table1 select 1,'lee'
insert into table1 select 2,'zhang'
insert into table1 select 4,'wang'
insert into table2 select 1,90
insert into table2 select 2,100
insert into table2 select 3,70
如表
-------------------------------------------------
table1 | table2 |
-------------------------------------------------
id name |id score |
1 lee |1 90 |
2 zhang |2 100 |
4 wang |3 70 |
-------------------------------------------------
以下均在查询分析器中执行
一、外连接
1.概念:包括左向外联接、右向外联接或完整外部联接
2.左连接:left join 或 left outer join
(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
(2)sql语句
select * from table1 left join table2 on table1.id=table2.id
-------------结果-------------
id name id score
------------------------------
1 lee 1 90
2 zhang 2 100
4 wang NULL NULL
------------------------------
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
3.右连接:right join 或 right outer join
(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
(2)sql语句
select * from table1 right join table2 on table1.id=table2.id
-------------结果-------------
id name id score
------------------------------
1 lee 1 90
2 zhang 2 100
NULL NULL 3 70
------------------------------
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示
4.完整外部联接:full join 或 full outer join
(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
(2)sql语句
select * from table1 full join table2 on table1.id=table2.id
-------------结果-------------
id name id score
------------------------------
1 lee 1 90
2 zhang 2 100
4 wang NULL NULL
NULL NULL 3 70
------------------------------
注释:返回左右连接的和(见上左、右连接)
二、内连接
1.概念:内联接是用比较运算符比较要联接列的值的联接
2.内连接:join 或 inner join
3.sql语句
select * from table1 join table2 on table1.id=table2.id
-------------结果-------------
id name id score
------------------------------
1 lee 1 90
2 zhang 2 100
------------------------------
注释:只返回符合条件的table1和table2的列
4.等价(与下列执行效果相同)
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on)
三、交叉连接(完全)
1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)
2.交叉连接:cross join (不带条件where...)
3.sql语句
select * from table1 cross join table2
-------------结果-------------
id name id score
------------------------------
1 lee 1 90
2 zhang 1 90
4 wang 1 90
1 lee 2 100
2 zhang 2 100
4 wang 2 100
1 lee 3 70
2 zhang 3 70
4 wang 3 70
------------------------------
注释:返回3*3=9条记录,即笛卡尔积
4.等价(与下列执行效果相同)
A:select * from table1,table2
2006年10月30日
#
以前做asp.net的时候都是用gridview呀,repeater这些东东自带的分页,倒是挺简单的,不过当初老大要求用数据库分页,所以学的时候留意了下
最近学了sql游标,突然想起来用这个来分页,上网一找,果不其然,可以用游标来分页,不过有个更简单的方法,先说一下
create proc Paging
(
@pageIndex int,
@pageSize int
)
as
declare @startIndex int set @startIndex=(@pageIndex-1)*@pageSize+1
declare @temp int set @temp=@startIndex+@pageSize-1
exec('select * from (select top '+@pageSize+' * from (select top '+@temp+' *
from bookMain order by book_ID asc)t1 order by book_ID desc)t2 order by book_ID asc')
go
这个里面用到的就是order by 与select top两个东东,用两个标量获取pageIndex(页数)pageSize(每页显示条数),再计算出开始取的位置与结束位置(数学就简单了),再嵌套几个select语句就行了,先倒序取出从开始位置到最后的所有数据,再正序排序一下,取出pagesize个数据就OK了,这里要注意一点,由于select语句不能用变量,所以只能够造出select字符串再动态用exec来执行。这里面的t1与t2 两个字串我还没有弄懂是干什么的,但是只要没有就会出错,所以还是保留着,估计是个表的临时变量。
下面再说用游标的,自己写的,确实不如前一个,说起来也没什么优点,只用到一个东东,就是fetch absolute n,从第n条记录开始取,代码比较多,但是很直观
create procedure Paging
(
@pagesize int,
@pageIndex int
)
as
Declare @curIndex int set @curIndex=@pageIndex*@pagesize+1
Declare @LastIndex int set @LastIndex=@curIndex+@pagesize
declare @book_ID int
declare @book_Name varchar(50)
declare @book_Author varchar(30)
declare @book_PublishHouse varchar(50)
Declare @tempTable Table
(
book_ID int,
book_Name varchar(50),
book_Author varchar(30),
book_PublishHouse varchar(50)
)
Declare Pagecursor scroll cursor for
select book_ID,book_Name,book_Author,book_PublishHouse from bookMain order by book_ID
for read only
open Pagecursor
while (@curIndex<@LastIndex)
Begin
Fetch Absolute @curIndex from Pagecursor into @book_ID,@book_Name,@book_Author,@book_PublishHouse
print @book_Name+@book_Author+@book_PublishHouse
insert into @tempTable values(@book_ID,@book_Name,@book_Author,@book_PublishHouse)
set @curIndex=@curIndex+1
End
close Pagecursor
deallocate Pagecursor
select * from @tempTable
go
用一个临时表来保存取出的数据,最后再select * 就行了
从来没有过写blog的习惯,以前老是看est同学写着兴致勃勃,连饭都不吃,跑跑也不打了……总是不太明白
最近老是听到网上老大们说论坛,blog是程序员的标准,我倒是挺喜欢论坛的,但是blog总也提不起兴趣,因为以前一直以为blog是写日记的东西,最近才知道blog原来是个人技术专栏(火星了……),只是中国人没那么多技术上去写,于是渐渐变成了让人家偷窥的地方了……无语。
最近开始学sql编程,想写点东西,倒不是什么多高级的技术,只是为了能有个地方证明我的学习记录(呵呵,老大要看看滴……),留点心得在上面,因为实在不想在自己的机子上弄了。
这个blog也弄得我郁闷,记得以前进来的时候就是要求我们先把自己的blog改好先,我也改了,以前可以,没想到前几天突然想把他改得更好看点,结果那个css在本地看起来好好的,一拿上来就面目全非呀……头都大了,最后还是没法,用了一个好看点的。
est说写blog最好用英文,you see my English…… ^_^,我怕到时候写出来别人不认识,我也看不懂,而且我了没看见几个用English写blog的,还是中文好
写这么多就是想说,我从今天开始写blog了……呵呵,坚持……努力……加油