SQL Server T-SQL高级查询、函数
2015-04-12 00:34
417 查看
高级查询在数据库中用得是最频繁的,也是应用最广泛、最普遍的。
Ø基本常用查询
Ø嵌套子查询
子查询是一个嵌套在select、insert、update或delete语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也成为外部查询或外部选择。
上面括号中的语句,就是子查询语句(内部查询)。在外面的是外部查询,其中外部查询可以包含以下语句:
1、包含常规选择列表组件的常规select查询
2、包含一个或多个表或视图名称的常规from语句
3、可选的where子句
4、可选的groupby子句
5、可选的having子句
Ø聚合查询
1、distinct去掉重复数据
2、compute和computeby汇总查询
compute进行汇总,前面是查询的结果,后面一条结果集就是汇总的信息。compute子句中可以添加多个汇总表达式,可以添加的信息如下:
a、可选by关键字。它是每一列计算指定的行聚合
b、行聚合函数名称。包括sum、avg、min、max、count等
c、要对其执行聚合函数的列
computeby适合做先分组后汇总的业务。computeby后面的列一定要是orderby中出现的列。
3、cube汇总
cube汇总和compute效果类似,但语法较简洁,而且返回的是一个结果集。
cube要结合groupby语句完成分组汇总
Ø排序函数
排序在很多地方需要用到,需要对查询结果进行排序并且给出序号。比如:
1、对某张表进行排序,序号需要递增不重复的
2、对学生的成绩进行排序,得出名次,名次可以并列,但名次的序号是连续递增的
3、在某些排序的情况下,需要跳空序号,虽然是并列
Ø集合运算
操作两组查询结果,进行交集、并集、减集运算
Ø公式表表达式
查询表的时候,有时候中间表需要重复使用,这些子查询被重复查询调用,不但效率低,而且可读性低,不利于理解。那么公式表表达式可以解决这个问题。
我们可以将公式表表达式(CET)视为临时结果集,在select、insert、update、delete或是createview语句的执行范围内进行定义。
Ø表的联合查询
Ø函数
select*
fromdbo.fun_find_stuRecord(2);
http://www.cnblogs.com/SkySoot/archive/2012/04/10/2441022.html
Ø基本常用查询
--all查询所有,几乎从来不用all关键字,因为是默认关键字
selectallsexfromstudent;
--distinct过滤重复(常用语检查一列数据是否有异常值)
selectdistinctsexfromstudent;
--count统计
selectcount(distinctsex)fromstudent;
--top取前N条记录
selecttop3*fromstudent;
--column列运算
select(age+id)colfromstudent;
selects.name+'-'+c.namefromclassesc,studentswheres.cid=c.id;
--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;
Ø嵌套子查询
子查询是一个嵌套在select、insert、update或delete语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也成为外部查询或外部选择。
--将一个table的查询结果当做一个新表进行查询
select*from(
selectid,namefromstudentwheresex=1
)twheret.id>2;
上面括号中的语句,就是子查询语句(内部查询)。在外面的是外部查询,其中外部查询可以包含以下语句:
1、包含常规选择列表组件的常规select查询
2、包含一个或多个表或视图名称的常规from语句
3、可选的where子句
4、可选的groupby子句
5、可选的having子句
--查询班级信息,统计班级学生人生
select*,(selectcount(*)fromstudentwherecid=classes.id)asnum
fromclassesorderbynum;
--查询班级id大于小于X的这些班级的学生信息
select*fromstudentwherecidin(
selectidfromclasseswhereid>2andid<4
);
--查询不是X班的学生信息
select*fromstudentwherecidnotin(
selectidfromclasseswherename='2班'
)
--all,any,some
select*fromstudentwherecid=5andage>all(
selectagefromstudentwherecid=3
);
select*fromstudentwherecid=5andage>any(
selectagefromstudentwherecid=3
);
select*fromstudentwherecid=5andage>some(
selectagefromstudentwherecid=3
);
Ø聚合查询
1、distinct去掉重复数据
selectdistinctsexfromstudent;
selectcount(sex),count(distinctsex)fromstudent;
2、compute和computeby汇总查询
--对年龄大于20的进行汇总
selectagefromstudentwhereage>20orderbyagecomputesum(age)byage;
--对年龄大于20的按照性别进行分组汇总年龄信息
selectid,sex,agefromstudentwhereage>20orderbysex,agecomputesum(age)bysex;
--按照年龄分组汇总
selectagefromstudentwhereage>20orderbyage,idcomputesum(age);
--按照年龄分组,年龄汇总,id找最大值
selectid,agefromstudentwhereage>20orderbyagecomputesum(age),max(id);
compute进行汇总,前面是查询的结果,后面一条结果集就是汇总的信息。compute子句中可以添加多个汇总表达式,可以添加的信息如下:
a、可选by关键字。它是每一列计算指定的行聚合
b、行聚合函数名称。包括sum、avg、min、max、count等
c、要对其执行聚合函数的列
computeby适合做先分组后汇总的业务。computeby后面的列一定要是orderby中出现的列。
3、cube汇总
cube汇总和compute效果类似,但语法较简洁,而且返回的是一个结果集。
selectcount(*),sexfromstudentgroupbysexwithcube;
selectcount(*),age,sum(age)fromstudentwhereageisnotnullgroupbyagewithcube;
cube要结合groupby语句完成分组汇总
Ø排序函数
排序在很多地方需要用到,需要对查询结果进行排序并且给出序号。比如:
1、对某张表进行排序,序号需要递增不重复的
2、对学生的成绩进行排序,得出名次,名次可以并列,但名次的序号是连续递增的
3、在某些排序的情况下,需要跳空序号,虽然是并列
--基本语法
--排序函数over([分组语句]排序子句[desc][asc])
--排序子句orderby列名,列名
--分组子句partitionby分组列,分组列
--row_number函数
--根据排序子句给出递增连续序号,按照名称排序的顺序递增
selects.id,s.name,cid,c.name,row_number()over(orderbyc.name)asnumber
fromstudents,classescwherecid=c.id;
--rank函数函数
--根据排序子句给出递增的序号,但是存在并列并且跳空
--顺序递增
selectid,name,rank()over(orderbycid)asrankfromstudent;
--dense_rank函数
--根据排序子句给出递增的序号,但是存在并列不跳空
selects.id,s.name,cid,c.name,dense_rank()over(orderbyc.name)asdense
fromstudents,classescwherecid=c.id;
--partitionby分组子句
--可以完成对分组的数据进行增加排序,partitionby可以与以上三个函数联合使用。
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;
--ntile平均排序函数
--将要排序的数据进行平分,然后按照等分排序。ntile中的参数代表分成多少等分。
selects.id,s.name,cid,c.name,ntile(5)over(orderbyc.name)asntile
fromstudents,classescwherecid=c.id;
Ø集合运算
操作两组查询结果,进行交集、并集、减集运算
--union并集、不重复
selectid,namefromstudentwherenamelike'ja%'
unionselectid,namefromstudentwhereid=4;
--unionall并集、重复
select*fromstudentwherenamelike'ja%'
unionallselect*fromstudent;
--交集(相同部分)
select*fromstudentwherenamelike'ja%'
intersectselect*fromstudent;
--减集(除相同部分)
select*fromstudentwherenamelike'ja%'
exceptselect*fromstudentwherenamelike'jas%';
Ø公式表表达式
查询表的时候,有时候中间表需要重复使用,这些子查询被重复查询调用,不但效率低,而且可读性低,不利于理解。那么公式表表达式可以解决这个问题。
我们可以将公式表表达式(CET)视为临时结果集,在select、insert、update、delete或是createview语句的执行范围内进行定义。
withstatNum(id,num)as
(
selectcid,count(*)fromstudentwhereid>0groupbycid
)
selectid,numfromstatNumorderbyid;
withstatNum(id,num)as
(
selectcid,count(*)fromstudentwhereid>0groupbycid
)
selectmax(id),avg(num)fromstatNum;
Ø表的联合查询
--简化联接查询
selects.id,s.name,c.id,c.namefromstudents,classescwheres.cid=c.id;
--左连接(左为基表)
selects.id,s.name,c.id,c.namefromstudentsleftjoinclassescons.cid=c.id;
--右连接(右为基表)
selects.id,s.name,c.id,c.namefromstudentsrightjoinclassescons.cid=c.id;
--内连接(等值联合)
selects.id,s.name,c.id,c.namefromstudentsinnerjoinclassescons.cid=c.id;
--交叉联接查询,结果是一个笛卡儿乘积
selects.id,s.name,c.id,c.namefromstudents,classesc
--自连接
selectdistincts.*fromstudents,students1wheres.id<>s1.idands.sex=s1.sex;
Ø函数
--聚合函数(max最大值、min最小值、count统计、avg平均值、sum求和、var求方差)
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;
--日期时间函数
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();
--数学函数
selectpi();
selectrand(100),rand(50),rand();
selectround(rand(),3),round(rand(100),5);
selectround(123.456,2),round(254.124,-2);
selectround(123.4567,1,2);
--元数据
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');
--字符串函数
selectascii('a');
selectascii('A');
selectchar(97);
selectchar(65);
selectnchar(65);
selectnchar(45231);
selectnchar(32993);
selectunicode('A'),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');
--安全函数
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);
--系统函数
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;//最后一次自增的值
select@@rowcount;//影响行数
select@@cursor_rows;//返回连接上打开的游标的当前限定行的数目
select@@error;//T-SQL的错误号
select@@procid;
--配置函数
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;//当前数据库版本信息
--系统统计函数
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;
selectpatIndex('%soft%','microsoftSqlServer');
selectpatIndex('soft%','softwareSqlServer');
selectpatIndex('%soft','SqlServermicrosoft');
selectpatIndex('%so_gr%','Jsonisprogram');
--查询所有已创建函数
selectdefinition,*fromsys.sql_modulesmjoinsys.objectsoonm.object_id=o.object_id
andtypein('fn','if','tf');
--创建函数
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;
--修改函数
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;
--返回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);
相关文章推荐
- SQL Server T-SQL高级查询、函数
- SQL Server SQL高级查询语句小结
- SQL Server T-SQL高级查询
- SQL Server T-SQL高级查询
- SQL Server SQL高级查询语句小结
- SQL Server T-SQL高级查询
- SQL Server T-SQL高级查询
- SQL Server T-SQL高级查询
- SQL Server T-SQL高级查询
- SQL Server SQL高级查询语句小结
- SQL Server T-SQL高级查询
- SQL-Server中数据检索(高级查询)
- SQL Server T-SQL高级查询
- SQL Server T-SQL高级查询
- SQL Server SQL高级查询语句小结
- SQL Server T-SQL高级查询
- SQL Server SQL高级查询语句小结
- SQL Server T-SQL高级查询
- SQL Server T-SQL高级查询
- MS SQLServer 高级查询总结