??xml version="1.0" encoding="utf-8" standalone="yes"?>
set @ct = getdate()
---
--sql 语句
---
select datediff(ms, @ct ,getdate()) as '查询旉Q毫U)'
]]>Connect By子句递归查询一般用于一个表l护树Şl构的应用?br />
创徏CZ表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);
插入试数据Q?br />
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
从Root往树末梢递归
select * from TBL_TEST
start with id=1
connect by prior id = pid
从末梢往树ROOT递归
select * from TBL_TEST
start with id=5
connect by prior pid = id
=====
对于oracleq行单树查询(递归查询)
DEPTID PAREDEPTID NAME
NUMBER NUMBER CHAR (40 Byte)
部门id 爉门id(所属部门id) 部门名称
通过子节点向根节点追?
Sql代码
1.select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
Sql代码
1.select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
通过根节炚w历子节点.
Sql代码
1.select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
Sql代码
1.select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
可通过level 关键字查询所在层?
Sql代码
1.select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid
Sql代码
1.select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid
select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid
再次复习一?start with connect by 的用法, start with 后面所跟的是是递归的种子?nbsp;
递归的种子也是递归开始的地方 connect by 后面?prior" 如果~省Q则只能查询到符合条件的起始行,q不q行递归查询Q?nbsp;
connect by prior 后面所攄字段是有关系的,它指明了查询的方向?nbsp;
l习Q?nbsp;通过子节点获得顶节点
Sql代码
1.select FIRST_VALUE(deptid) OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid from persons.dept start with deptid=76 connect by prior paredeptid=deptid
====q种Ҏ只是当表里就有一颗树,多棵树怎么办?
.声明QJavaEye文章版权属于作者,受法律保护。没有作者书面许可不得{载?nbsp;
]]>
/* q回字符表达式中最左侧字符的ASCII代码?nbsp;*/
select Ascii(‘a‘) --a:97,A:65
/* 整数ASCII代码转换为字W?nbsp;*/
select Char(97)--97:a,65:A
/* q回表达式中指定字符的开始位|?nbsp;*/
select Charindex(‘b‘,‘abcdefg‘,5)
/* 以整数返回两个字W表辑ּ的SOUNDEXg?nbsp;*/
select Difference(‘bet‘,‘bit‘)--3
/* q回字符表达式最左侧指定数目的字W?nbsp;*/
select Left(‘abcdefg‘,3)--abc
/* q回l定字符串表辄字符?nbsp;*/
select Len(‘abcdefg‘)--7
/* q回大写字W{换ؓ字W的字符表达?nbsp;*/
select Lower(‘ABCDEFG‘)--abcdefg
/* q回删除了前导空g后字W表辑ּ */
select Ltrim(‘ abcdefg‘)--abcdefg
/* q回hl定的整C码的UNICODE字符 */
select Nchar(65)--A
/* q回指定表达式中模式W一ơ出现的开始位|?nbsp;*/
select Patindex(‘%_cd%‘,‘abcdefg‘)--2
/* q回为成为有效的SQL SERVER分隔标识W而添加了分隔W的UNICODE字符?nbsp;*/
select Quotename(‘create table‘)
/* 用第三个表达式替换第一个表辑ּ中出现的W二个表辑ּ */
select Replace(‘abcdefg‘,‘cd‘,‘xxx‘)--abxxxefg
/* 按指定次数重复表辑ּ */
select Replicate(‘abc|‘,4)--abc|abc|abc|abc|
/* q回字符表达式的逆向表达?nbsp;*/
select Reverse(‘abc‘)--cba
/* q回字符表达式右侧指定数目的字符 */
select Right(‘abcd‘,3)--bcd
/* q回截断了所有尾随空g后的字符表达?nbsp;*/
select Rtrim(‘abcd ‘)--abcd
/* q回由四个字W表辄SOUNDEX代码 */
select Soundex(‘abcd‘)--A120
/* q回由重复空格组成的字符?nbsp;*/
select Space(10)--[ ]
/* q回从默认表达{换而来的字W串 */
select Str(100)--[ 100]
/* */
select Str(100,3)--[100]
/* */
select Str(14.4444,5,4)--[14.44]
/* 删除指定长度的字W?q在指定的v点处插入另一l字W?nbsp;*/
select Stuff(‘abcdefg‘,2,4,‘xxx‘)--axxxfg
/* q回字符表达?二进?文本表达式或囑փ表达的一部分 */
select Substring(‘abcdefg‘,2,3)--bcd
/* q回表达W一个字W的UNICODE整数?nbsp;*/
select Unicode(‘a‘)--97
/* q回小写字W{换ؓ大写字符的字W表辑ּ */
select Upper(‘a‘)--‘A‘
]]>
]]>
select count(*) from TSPRO_SALESROOM_STOCKIN_MAIN where CREATE_DATE>'2011-02-01' and CREATE_DATE<='2011-02-28' and pro_type=2
SELECT pro_type,
[1] AS JAN,
[2] AS FEB,
[3] AS MAR,
[4] AS APR
from (
select pro_type,DATEPART(MM,create_date) AS MON
from TSPRO_SALESROOM_STOCKIN_MAIN where CREATE_DATE>'2011-01-20' and CREATE_DATE<='2011-03-09'
)s
PIVOT
(
COUNT(MON) FOR MON IN ([1],[2],[3],[4])
)AS p
]]>
]]>
对于SQL Server 2005 数据库而言Q函C存储q程在语法方面是有很大的相同点,
最大的不同是函数有返回|直接使用returns ,而存储过E则使用output来声明输出变?br />
一、下面先说明下,如何创徏函数
1、创建没有返回g没有参数的函?br />
CREATE FUNCTION my_function()
AS
BEGIN
DECLARE @variable varchar(255) --声明字符型变?/span>
DECLARE @variable int --声明整Ş型变?/span>
(do something)
SET @variable = '12345' --对变量variable赋?/span>
END
2、创建没有返回值有参数的函?br />
CREATE FUNCTION my_function(@user_Name varchar(128),@password int(6))
AS
BEGIN
DECLARE @variable_1 varchar(255) --声明字符型变?/span>
(do something)
SET @variable_1 = @user_Name + convert(varchar(255),@password) --变量@user_Name与@passwordq接赋给@variable_1Q其中convert()函数是将int型{为varchar?/span>
END
3、创建有q回g有参数的函数
CREATE FUNCTION my_function(@user_Name varchar(128),@password int(6))
returns varchar(255)--讄q回|C是returns 而不是return
AS
BEGIN
DECLARE @result varchar(5)
DECLARE @fagle varchar(5)
SET @result = select users.user_Name from USERS as users where users.user_Name = @user_Name and users.password = @password
IF @result = ''
BEGIN
SET @fagle = 'NO'
END
ELSE
BEGIN
SET @falge = 'YES'
END
return @result --q回l果
END
二、删除一个函数语?br />
DROP FUNCTION my_function
三、执行一个函数语?br />
select dbo.my_function() --Ҏ有没参数来处?/span>
go
--注:在SQL Server 2005 中,有内部函C外部函数Q数据库pȝ自带函数Q如sum()Qcount(){等Q这些称为内部函敎ͼ而我们自定义的函数称为外部函数?/span>
--在执行函数语法中Q也有些区别Q如执行内部函数Qselect sum(total) from Q那么执行外部函数则需要在函数名前加dbo. + 自定义函数名Q如
--select dbo.my_function()
--go
四、下面提供二个例?br />
1、日期判断,判断传进来的日期是否在上个月日到本月日之?br />
--h意convert()函数的用?/span>
create function isNewContract(@date varchar(32))
returns varchar(32)
AS
begin
declare @begin_time varchar(32)
declare @end_time varchar(32)
declare @temp varchar(4)
declare @result varchar(32)
declare @month varchar(2)
set @begin_time=convert(varchar,DATEPART(year, getdate())) + '-'
set @end_time=convert(varchar,DATEPART(year, getdate())) + convert(varchar, DATEPART(month, getdate())) + convert(varchar, '14')
set @temp=convert(varchar(2),(month(getDate())-1 ))
if(@temp < 10 )
begin
set @begin_time = @begin_time + convert(varchar(1),'0') + @temp + '-' + convert(varchar, '15')
end
if(@date >= @begin_time and @date <= @end_time)
begin
set @result = '?/span>'
end
else
begin
set @result = @begin_time
end
return @result
end
2、查询多条记录合q成一条记录返回,q写入EXECL表中Q进行分行换行显C,其中使用游标q行循环处理
--在数据库中,EXECL默认换行WACSII码ؓ'10',在合q字W串之前Q需要先转ؓEXECL识别的换行符Q具体用chat()内部函数处理
create function getExportReportCollect(@projectId int ,@month varchar(64))
returns varchar(4096) --讄q回?/span>
AS
begin
declare @num varchar(2)
declare @end varchar(10)
declare @Result varchar(4096) --用于q回查询l果
declare city_cursor cursor for --声明游标变量
select reported.id
from dbo.Investment_Budget_Reported as reported
left join dbo.Investment_Budget_Contract as con
on reported.contractId = con.id
where reported.[month] = @month and reported.projectId = @projectId
set @Result=''
set @num = '1'
set @end = '10' --导入EXECL表中Q换行符的ACSII?/span>
declare @Field int --声明临时存放CityID的变?/span>
open city_cursor --打开游标
fetch next from city_cursor into @Field --实际ID赋给变量
while(@@fetch_status = 0) --循环开?/span>
begin
if((select [content] from dbo.Investment_Budget_Reported where id = @Field )is not null)
BEGIN
if(@Result = '')
select @Result = @Result + @num + '?/span>' + [content] from dbo.Investment_Budget_Reported where id = @Field
else
select @Result = @Result + @num + '?/span>' + [content] from dbo.Investment_Budget_Reported where id = @Field
set @Result = @Result + char(@end) --让换行符转ؓEXECL认识的换行符
set @num = @num + 1
END
fetch next from city_cursor into @Field --下一个reportId
end
close city_cursor --关闭游标
deallocate city_cursor --释放游标引用
return @Result
end
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/zhdd1234/archive/2009/10/27/4734789.aspx
]]>
]]>
with temp as
( select row_number() over(order by cityID) as rownum,cityName from city )
select * from temp where rownum between 10 and 20
go
解释:
1 此方法把括号里的查询l果攑ֈ变量:temp 里面( 我也不确定是不是变量), q用row_number() 函数q行一个行可t? 再用over 函数q行一个列的排序规? 是这必须?, q指定列名ؓ'rownum'
2 紧接着在下面的语句可以?nbsp;'rownum' q行一个指定行L查询
3 此批语句执行完毕? 变量:temp 释放
Ҏ2:
select identity(int,1,1) as rownum, cityName into #temp from city
select * from #temp where rownum between 10 and 20
go
解释:
此方法跟上面的差不多的意? 只不q把 row_number() 函数换成?nbsp;identity() 函数
q把l果集放在一个时表里面, 当批语句执行完毕, 此时表q可以?nbsp;
]]>
1?/span>select power(10,3)得到1000
2?/span>select cast(1000+33 as varcharQ?nbsp;?000转换cd
3?/span>select right(100033,3) 从右边取3个字W得?33 ?格式化同?nbsp;select right(cast(power(10,3) as varchar)+33,3)
]]>
select a.[id],a.mark from
(
select [page].[id],100 as mark from [page] where [page].[url] like '%baidu%'
union
select [page].[id],50 as mark from [page] where [page].[title] like '%baidu%'
union
select [page].[id],10 as mark from [page] where [page].[body] like '%baidu%'
) as a order by mark desc
用union 实现联合查询Q在每个查询语句中定义一个时变量mark q给mark赋|在最后的输出旉用mark来排序,q样实现Q非常简单,我感觉这题更多考研我们的编E思想?
]]>
]]>
]]>
select * from tablename where t_id=(select trunc(dbms_random.value(min(条g),max(条g))) from tablename;
select * from dept where did=(select trunc(dbms_random.value(min(rownum),max(rownum))) from dept);
--查询N条随录上?/strong>
select * frmo (select * from tablename order by sys_guid()) where rownum<N
select * from (select * from dept order by sys_guid()) where rownum < 5;
--查询中X条中从N到M条特定记录上来(分页查询Q?/strong>
select * from (select rownum r,t.* from tablename t where rownum<X) ss where ss.r>N and ss.r <=M
select * from (select rownum r, t.* from dept t where rownum<6) ss where ss.r > 2 and ss.r <= 10
]]>