您的位置:首页 > 数据库

SQL Server T-SQL高级查询

2011-07-18 19:40 344 查看

SQLServerT-SQL高级查询(转)

[code]--select


select*fromstudent;




--all查询所有


selectallsexfromstudent;




--distinct过滤重复


selectdistinctsexfromstudent;




--count统计


selectcount(*)fromstudent;


selectcount(sex)fromstudent;


selectcount(distinctsex)fromstudent;




--top取前N条记录


selecttop3*fromstudent;




--aliascolumnname列重命名


selectidas编号,name'名称',sex性别fromstudent;




--aliastablename表重命名


selectid,name,s.id,s.namefromstudents;




--column列运算


select(age+id)colfromstudent;


selects.name+'-'+c.namefromclassesc,studentswheres.cid=c.id;




--where条件


select*fromstudentwhereid=2;


select*fromstudentwhereid>7;


select*fromstudentwhereid<3;


select*fromstudentwhereid<>3;


select*fromstudentwhereid>=3;


select*fromstudentwhereid<=5;


select*fromstudentwhereid!>3;


select*fromstudentwhereid!<5;




--and并且


select*fromstudentwhereid>2andsex=1;




--or或者


select*fromstudentwhereid=2orsex=1;




--between...and...相当于并且


select*fromstudentwhereidbetween2and5;


select*fromstudentwhereidnotbetween2and5;




--like模糊查询


select*fromstudentwherenamelike'%a%';


select*fromstudentwherenamelike'%[a][o]%';


select*fromstudentwherenamenotlike'%a%';


select*fromstudentwherenamelike'ja%';


select*fromstudentwherenamenotlike'%[j,n]%';


select*fromstudentwherenamelike'%[j,n,a]%';


select*fromstudentwherenamelike'%[^ja,as,on]%';


select*fromstudentwherenamelike'%[ja_on]%';




--in子查询


select*fromstudentwhereidin(1,2);




--notin不在其中


select*fromstudentwhereidnotin(1,2);




--isnull是空


select*fromstudentwhereageisnull;




--isnotnull不为空


select*fromstudentwhereageisnotnull;




--orderby排序


select*fromstudentorderbyname;


select*fromstudentorderbynamedesc;


select*fromstudentorderbynameasc;




--groupby分组


按照年龄进行分组统计


selectcount(age),agefromstudentgroupbyage;


按照性别进行分组统计


selectcount(*),sexfromstudentgroupbysex;


按照年龄和性别组合分组统计,并排序


selectcount(*),sexfromstudentgroupbysex,ageorderbyage;


按照性别分组,并且是id大于2的记录最后按照性别排序


selectcount(*),sexfromstudentwhereid>2groupbysexorderbysex;


查询id大于2的数据,并完成运算后的结果进行分组和排序


selectcount(*),(sex*id)newfromstudentwhereid>2groupbysex*idorderbysex*id;




--groupbyall所有分组


按照年龄分组,是所有的年龄


selectcount(*),agefromstudentgroupbyallage;




--having分组过滤条件


按照年龄分组,过滤年龄为空的数据,并且统计分组的条数和现实年龄信息


selectcount(*),agefromstudentgroupbyagehavingageisnotnull;




按照年龄和cid组合分组,过滤条件是cid大于1的记录


selectcount(*),cid,sexfromstudentgroupbycid,sexhavingcid>1;




按照年龄分组,过滤条件是分组后的记录条数大于等于2


selectcount(*),agefromstudentgroupbyagehavingcount(age)>=2;




按照cid和性别组合分组,过滤条件是cid大于1,cid的最大值大于2


selectcount(*),cid,sexfromstudentgroupbycid,sexhavingcid>1andmax(cid)>2;

[/code]
[/code]
Ø嵌套子查询

子查询是一个嵌套在select、insert、update或delete语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也成为外部查询或外部选择。

#from(select…table)示例

[code]
[code]将一个table的查询结果当做一个新表进行查询


select*from(


selectid,namefromstudentwheresex=1


)twheret.id>2;

[/code]
[/code]
上面括号中的语句,就是子查询语句(内部查询)。在外面的是外部查询,其中外部查询可以包含以下语句:

1、包含常规选择列表组件的常规select查询

2、包含一个或多个表或视图名称的常规from语句

3、可选的where子句

4、可选的groupby子句

5、可选的having子句

#示例

[code]
[code]查询班级信息,统计班级学生人生


select*,(selectcount(*)fromstudentwherecid=classes.id)asnum


fromclassesorderbynum;

[/code]
[/code]

#in,notin子句查询示例

[code]
[code]查询班级id大于小于的这些班级的学生信息


select*fromstudentwherecidin(


selectidfromclasseswhereid>2andid<4


);




查询不是班的学生信息


select*fromstudentwherecidnotin(


selectidfromclasseswherename='2班'


)

[/code]
[/code]
in、notin后面的子句返回的结果必须是一列,这一列的结果将会作为查询条件对应前面的条件。如cid对应子句的id;

#exists和notexists子句查询示例

[code]
[code]查询存在班级id为的学生信息


select*fromstudentwhereexists(


select*fromclasseswhereid=student.cidandid=3


);




查询没有分配班级的学生信息


select*fromstudentwherenotexists(


select*fromclasseswhereid=student.cid


);

[/code]
[/code]
exists和notexists查询需要内部查询和外部查询进行一个关联的条件,如果没有这个条件将是查询到的所有信息。如:id等于student.id;

#some、any、all子句查询示例

[code]
[code]查询班级的学生年龄大于班级的学生的年龄的信息


select*fromstudentwherecid=5andage>all(


selectagefromstudentwherecid=3


);




select*fromstudentwherecid=5andage>any(


selectagefromstudentwherecid=3


);




select*fromstudentwherecid=5andage>some(


selectagefromstudentwherecid=3


);

[/code]
[/code]

Ø聚合查询

1、distinct去掉重复数据


[code]
[code]selectdistinctsexfromstudent;


selectcount(sex),count(distinctsex)fromstudent;

[/code]
[/code]

2、compute和computeby汇总查询

[code]
[code]对年龄大于的进行汇总


selectagefromstudent


whereage>20orderbyagecomputesum(age)byage;




对年龄大于的按照性别进行分组汇总年龄信息


selectid,sex,agefromstudent


whereage>20orderbysex,agecomputesum(age)bysex;




按照年龄分组汇总


selectagefromstudent


whereage>20orderbyage,idcomputesum(age);




按照年龄分组,年龄汇总,id找最大值


selectid,agefromstudent


whereage>20orderbyagecomputesum(age),max(id);

[/code]
[/code]
compute进行汇总前面是查询的结果,后面一条结果集就是汇总的信息。compute子句中可以添加多个汇总表达式,可以添加的信息如下:

a、可选by关键字。它是每一列计算指定的行聚合

b、行聚合函数名称。包括sum、avg、min、max、count等

c、要对其执行聚合函数的列

computeby适合做先分组后汇总的业务。computeby后面的列一定要是orderby中出现的列。

3、cube汇总

cube汇总和compute效果类似,但语法较简洁,而且返回的是一个结果集。


[code]
[code]selectcount(*),sexfromstudentgroupbysexwithcube;


selectcount(*),age,sum(age)fromstudentwhereageisnotnullgroupbyagewithcube;

[/code]
[/code]
cube要结合groupby语句完成分组汇总

Ø排序函数

排序在很多地方需要用到,需要对查询结果进行排序并且给出序号。比如:

1、对某张表进行排序,序号需要递增不重复的

2、对学生的成绩进行排序,得出名次,名次可以并列,但名次的序号是连续递增的

3、在某些排序的情况下,需要跳空序号,虽然是并列

基本语法


[code]
[code]排序函数over([分组语句]排序子句[desc][asc])


排序子句orderby列名,列名


分组子句partitionby分组列,分组列

[/code]
[/code]

#row_number函数

根据排序子句给出递增连续序号

[code]
[code]按照名称排序的顺序递增


selects.id,s.name,cid,c.name,row_number()over(orderbyc.name)asnumber


fromstudents,classescwherecid=c.id;

[/code]
[/code]

#rank函数函数

根据排序子句给出递增的序号,但是存在并列并且跳空

[code]
[code]顺序递增


selectid,name,rank()over(orderbycid)asrankfromstudent;




跳过相同递增


selects.id,s.name,cid,c.name,rank()over(orderbyc.name)asrank


fromstudents,classescwherecid=c.id;

[/code]
[/code]

#dense_rank函数

根据排序子句给出递增的序号,但是存在并列不跳空

[code]
[code]不跳过,直接递增


selects.id,s.name,cid,c.name,dense_rank()over(orderbyc.name)asdense


fromstudents,classescwherecid=c.id;

[/code]
[/code]

#partitionby分组子句

可以完成对分组的数据进行增加排序,partitionby可以与以上三个函数联合使用。


[code]
[code]利用partitionby按照班级名称分组,学生id排序


selects.id,s.name,cid,c.name,row_number()over(partitionbyc.nameorderbys.id)asrank


fromstudents,classescwherecid=c.id;




selects.id,s.name,cid,c.name,rank()over(partitionbyc.nameorderbys.id)asrank


fromstudents,classescwherecid=c.id;




selects.id,s.name,cid,c.name,dense_rank()over(partitionbyc.nameorderbys.id)asrank


fromstudents,classescwherecid=c.id;

[/code]
[/code]

#ntile平均排序函数

将要排序的数据进行平分,然后按照等分排序。ntile中的参数代表分成多少等分。


[code]
[code]selects.id,s.name,cid,c.name,


ntile(5)over(orderbyc.name)asntile


fromstudents,classescwherecid=c.id;

[/code]
[/code]

Ø集合运算

操作两组查询结果,进行交集、并集、减集运算

1、union和unionall进行并集运算


[code]
[code]--union并集、不重复


selectid,namefromstudentwherenamelike'ja%'


union


selectid,namefromstudentwhereid=4;




--并集、重复


select*fromstudentwherenamelike'ja%'


unionall


select*fromstudent;

[/code]
[/code]

2、intersect进行交集运算

[code]
[code]--交集(相同部分)


select*fromstudentwherenamelike'ja%'


intersect


select*fromstudent;

[/code]
[/code]

3、except进行减集运算

[code]
[code]--减集(除相同部分)


select*fromstudentwherenamelike'ja%'


except


select*fromstudentwherenamelike'jas%';

[/code]
[/code]

Ø公式表表达式

查询表的时候,有时候中间表需要重复使用,这些子查询被重复查询调用,不但效率低,而且可读性低,不利于理解。那么公式表表达式可以解决这个问题。

我们可以将公式表表达式(CET)视为临时结果集,在select、insert、update、delete或是createview语句的执行范围内进行定义。

[code]
[code]--表达式


withstatNum(id,num)as


(


selectcid,count(*)


fromstudent


whereid>0


groupbycid


)


selectid,numfromstatNumorderbyid;




withstatNum(id,num)as


(


selectcid,count(*)


fromstudent


whereid>0


groupbycid


)


selectmax(id),avg(num)fromstatNum;

[/code]
[/code]

Ø连接查询

1、简化连接查询

[code]
[code]--简化联接查询


selects.id,s.name,c.id,c.namefromstudents,classescwheres.cid=c.id;

[/code]
[/code]

2、leftjoin左连接

[code]
[code]--左连接


selects.id,s.name,c.id,c.namefromstudentsleftjoinclassescons.cid=c.id;

[/code]
[/code]

3、rightjoin右连接

[code]
[code]--右连接


selects.id,s.name,c.id,c.namefromstudentsrightjoinclassescons.cid=c.id;

[/code]
[/code]

4、innerjoin内连接

[code]
[code]--内连接


selects.id,s.name,c.id,c.namefromstudentsinnerjoinclassescons.cid=c.id;




--inner可以省略


selects.id,s.name,c.id,c.namefromstudentsjoinclassescons.cid=c.id;

[/code]
[/code]

5、crossjoin交叉连接

[code]
[code]--交叉联接查询,结果是一个笛卡儿乘积


selects.id,s.name,c.id,c.namefromstudentscrossjoinclassesc


--wheres.cid=c.id;

[/code]
[/code]

6、自连接(同一张表进行连接查询)

[code]
[code]--自连接


selectdistincts.*fromstudents,students1wheres.id<>s1.idands.sex=s1.sex;

[/code]
[/code]

Ø函数

1、聚合函数

max最大值、min最小值、count统计、avg平均值、sum求和、var求方差


[code]
[code]select


max(age)max_age,


min(age)min_age,


count(age)count_age,


avg(age)avg_age,


sum(age)sum_age,


var(age)var_age


fromstudent;

[/code]
[/code]

2、日期时间函数


[code]
[code]selectdateAdd(day,3,getDate());--加天


selectdateAdd(year,3,getDate());--加年


selectdateAdd(hour,3,getDate());--加小时


--返回跨两个指定日期的日期边界数和时间边界数


selectdateDiff(day,'2011-06-20',getDate());


--相差秒数


selectdateDiff(second,'2011-06-2211:00:00',getDate());


--相差小时数


selectdateDiff(hour,'2011-06-2210:00:00',getDate());


selectdateName(month,getDate());--当前月份


selectdateName(minute,getDate());--当前分钟


selectdateName(weekday,getDate());--当前星期


selectdatePart(month,getDate());--当前月份


selectdatePart(weekday,getDate());--当前星期


selectdatePart(second,getDate());--当前秒数


selectday(getDate());--返回当前日期天数


selectday('2011-06-30');--返回当前日期天数


selectmonth(getDate());--返回当前日期月份


selectmonth('2011-11-10');


selectyear(getDate());--返回当前日期年份


selectyear('2010-11-10');


selectgetDate();--当前系统日期


selectgetUTCDate();--utc日期

[/code]
[/code]

3、数学函数


[code]
[code]selectpi();--PI函数


selectrand(100),rand(50),rand(),rand();--随机数


selectround(rand(),3),round(rand(100),5);--精确小数位


--精确位数,负数表示小数点前


selectround(123.456,2),round(254.124,-2);


selectround(123.4567,1,2);

[/code]
[/code]

4、元数据


[code]
[code]selectcol_name(object_id('student'),1);--返回列名


selectcol_name(object_id('student'),2);


--该列数据类型长度


selectcol_length('student',col_name(object_id('student'),2));


--该列数据类型长度


selectcol_length('student',col_name(object_id('student'),1));


--返回类型名称、类型id


selecttype_name(type_id('varchar')),type_id('varchar');


--返回列类型长度


selectcolumnProperty(object_id('student'),'name','PRECISION');


--返回列所在索引位置


selectcolumnProperty(object_id('student'),'sex','ColumnId');

[/code]
[/code]

5、字符串函数


[code]
[code]selectascii('a');--字符转换ascii值


selectascii('A');


selectchar(97);--ascii值转换字符


selectchar(65);


selectnchar(65);


selectnchar(45231);


selectnchar(32993);--unicode转换字符


selectunicode('A'),unicode('中');--返回unicode编码值


selectsoundex('hello'),soundex('world'),soundex('word');


selectpatindex('%a','ta'),patindex('%ac%','jack'),patindex('dex%','dexjack');--匹配字符索引


select'a'+space(2)+'b','c'+space(5)+'d';--输出空格


selectcharIndex('o','helloworld');--查找索引


selectcharIndex('o','helloworld',6);--查找索引


selectquoteName('abc[]def'),quoteName('123]45');


--精确数字


selectstr(123.456,2),str(123.456,3),str(123.456,4);


selectstr(123.456,9,2),str(123.456,9,3),str(123.456,6,1),str(123.456,9,6);


selectdifference('hello','helloWorld');--比较字符串相同


selectdifference('hello','world');


selectdifference('hello','llo');


selectdifference('hello','hel');


selectdifference('hello','hello');


selectreplace('abcedef','e','E');--替换字符串


selectstuff('helloworld',3,4,'ABC');--指定位置替换字符串


selectreplicate('abc#',3);--重复字符串


selectsubString('abc',1,1),subString('abc',1,2),subString('helloWrold',7,5);--截取字符串


selectlen('abc');--返回长度


selectreverse('sqlServer');--反转字符串




selectleft('leftString',4);--取左边字符串


selectleft('leftString',7);


selectright('leftString',6);--取右边字符串


selectright('leftString',3);


selectlower('aBc'),lower('ABC');--小写


selectupper('aBc'),upper('abc');--大写


--去掉左边空格


selectltrim('abc'),ltrim('#abc#'),ltrim('abc');


--去掉右边空格


selectrtrim('abc'),rtrim('#abc#'),rtrim('abc');

[/code]
[/code]

6、安全函数


[code]
[code]selectcurrent_user;


selectuser;


selectuser_id(),user_id('dbo'),user_id('public'),user_id('guest');


selectuser_name(),user_name(1),user_name(0),user_name(2);


selectsession_user;


selectsuser_id('sa');


selectsuser_sid(),suser_sid('sa'),suser_sid('sysadmin'),suser_sid('serveradmin');


selectis_member('dbo'),is_member('public');


selectsuser_name(),suser_name(1),suser_name(2),suser_name(3);


selectsuser_sname(),suser_sname(0x01),suser_sname(0x02),suser_sname(0x03);


selectis_srvRoleMember('sysadmin'),is_srvRoleMember('serveradmin');


selectpermissions(object_id('student'));


selectsystem_user;


selectschema_id(),schema_id('dbo'),schema_id('guest');


selectschema_name(),schema_name(1),schema_name(2),schema_name(3);

[/code]
[/code]

7、系统函数


[code]
[code]selectapp_name();--当前会话的应用程序名称


selectcast(2011asdatetime),cast('10'asmoney),cast('0'asvarbinary);--类型转换


selectconvert(datetime,'2011');--类型转换


selectcoalesce(null,'a'),coalesce('123','a');--返回其参数中第一个非空表达式


selectcollationProperty('Traditional_Spanish_CS_AS_KS_WS','CodePage');


selectcurrent_timestamp;--当前时间戳


selectcurrent_user;


selectisDate(getDate()),isDate('abc'),isNumeric(1),isNumeric('a');


selectdataLength('abc');


selecthost_id();


selecthost_name();


selectdb_name();


selectident_current('student'),ident_current('classes');--返回主键id的最大值


selectident_incr('student'),ident_incr('classes');--id的增量值


selectident_seed('student'),ident_seed('classes');


select@@identity;--最后一次自增的值


selectidentity(int,1,1)asidintotabfromstudent;--将studeng表的烈属,以/1自增形式创建一个tab


select*fromtab;


select@@rowcount;--影响行数


select@@cursor_rows;--返回连接上打开的游标的当前限定行的数目


select@@error;--T-SQL的错误号


select@@procid;

[/code]
[/code]

8、配置函数


[code]
[code]setdatefirst7;--设置每周的第一天,表示周日


select@@datefirstas'星期的第一天',datepart(dw,getDate())AS'今天是星期';


select@@dbts;--返回当前数据库唯一时间戳


setlanguage'Italian';


select@@langIdas'LanguageID';--返回语言id


select@@languageas'LanguageName';--返回当前语言名称


select@@lock_timeout;--返回当前会话的当前锁定超时设置(毫秒)


select@@max_connections;--返回SQLServer实例允许同时进行的最大用户连接数


select@@MAX_PRECISIONAS'MaxPrecision';--返回decimal和numeric数据类型所用的精度级别


select@@SERVERNAME;--SQLServer的本地服务器的名称


select@@SERVICENAME;--服务名


select@@SPID;--当前会话进程id


select@@textSize;


select@@version;--当前数据库版本信息

[/code]
[/code]

9、系统统计函数


[code]
[code]select@@CONNECTIONS;--连接数


select@@PACK_RECEIVED;


select@@CPU_BUSY;


select@@PACK_SENT;


select@@TIMETICKS;


select@@IDLE;


select@@TOTAL_ERRORS;


select@@IO_BUSY;


select@@TOTAL_READ;--读取磁盘次数


select@@PACKET_ERRORS;--发生的网络数据包错误数


select@@TOTAL_WRITE;--sqlserver执行的磁盘写入次数


selectpatIndex('%soft%','microsoftSqlServer');


selectpatIndex('soft%','softwareSqlServer');


selectpatIndex('%soft','SqlServermicrosoft');


selectpatIndex('%so_gr%','Jsonisprogram');

[/code]
[/code]

10、用户自定义函数

#查看当前数据库所有函数

[code]
[code]--查询所有已创建函数


selectdefinition,*fromsys.sql_modulesmjoinsys.objectsoonm.object_id=o.object_id


andtypein('fn','if','tf');

[/code]
[/code]

#创建函数


[code]
[code]if(object_id('fun_add','fn')isnotnull)


dropfunctionfun_add


go


createfunctionfun_add(@num1int,@num2int)


returnsint


withexecuteascaller


as


begin


declare@resultint;


if(@num1isnull)


set@num1=0;


if(@num2isnull)


set@num2=0;


set@result=@num1+@num2;


return@result;


end


go


调用函数


selectdbo.fun_add(id,age)fromstudent;




--自定义函数,字符串连接


if(object_id('fun_append','fn')isnotnull)


dropfunctionfun_append


go


createfunctionfun_append(@argsnvarchar(1024),@args2nvarchar(1024))


returnsnvarchar(2048)


as


begin


return@args+@args2;


end


go




selectdbo.fun_append(name,'abc')fromstudent;

[/code]
[/code]

#修改函数


[code]
[code]alterfunctionfun_append(@argsnvarchar(1024),@args2nvarchar(1024))


returnsnvarchar(1024)


as


begin


declare@resultvarchar(1024);


--coalesce返回第一个不为null的值


set@args=coalesce(@args,'');


set@args2=coalesce(@args2,'');;


set@result=@args+@args2;


return@result;


end


go




selectdbo.fun_append(name,'#abc')fromstudent;

[/code]
[/code]

#返回table类型函数

[code]
[code]--返回table对象函数


selectname,object_id,typefromsys.objectswheretypein('fn','if','tf')ortypelike'%f%';




if(exists(select*fromsys.objectswheretypein('fn','if','tf')andname='fun_find_stuRecord'))


dropfunctionfun_find_stuRecord


go


createfunctionfun_find_stuRecord(@idint)


returnstable


as


return(select*fromstudentwhereid=@id);


go




select*fromdbo.fun_find_stuRecord(2);

[/code]
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: