SQL数据库— <3>高级查询、常用函数 --摘录网络
2015-06-02 22:17
591 查看
SQLServerT-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的。 Ø基本常用查询 --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; Ø嵌套子查询 子查询是一个嵌套在select、insert、update或delete语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也成为外部查询或外部选择。 #from(select…table)示例 将一个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; #in,notin子句查询示例 查询班级id大于小于的这些班级的学生信息 select*fromstudentwherecidin( selectidfromclasseswhereid>2andid<4 ); 查询不是班的学生信息 select*fromstudentwherecidnotin( selectidfromclasseswherename='2班' ) in、notin后面的子句返回的结果必须是一列,这一列的结果将会作为查询条件对应前面的条件。如cid对应子句的id; #exists和notexists子句查询示例 查询存在班级id为的学生信息 select*fromstudentwhereexists( select*fromclasseswhereid=student.cidandid=3 ); 查询没有分配班级的学生信息 select*fromstudentwherenotexists( select*fromclasseswhereid=student.cid ); exists和notexists查询需要内部查询和外部查询进行一个关联的条件,如果没有这个条件将是查询到的所有信息。如:id等于student.id; #some、any、all子句查询示例 查询班级的学生年龄大于班级的学生的年龄的信息 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汇总查询 对年龄大于的进行汇总 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); 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; 跳过相同递增 selects.id,s.name,cid,c.name,rank()over(orderbyc.name)asrank fromstudents,classescwherecid=c.id; #dense_rank函数 根据排序子句给出递增的序号,但是存在并列不跳空 不跳过,直接递增 selects.id,s.name,cid,c.name,dense_rank()over(orderbyc.name)asdense fromstudents,classescwherecid=c.id; #partitionby分组子句 可以完成对分组的数据进行增加排序,partitionby可以与以上三个函数联合使用。 利用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; #ntile平均排序函数 将要排序的数据进行平分,然后按照等分排序。ntile中的参数代表分成多少等分。 selects.id,s.name,cid,c.name, ntile(5)over(orderbyc.name)asntile fromstudents,classescwherecid=c.id; Ø集合运算 操作两组查询结果,进行交集、并集、减集运算 1、union和unionall进行并集运算 --union并集、不重复 selectid,namefromstudentwherenamelike'ja%' union selectid,namefromstudentwhereid=4; --并集、重复 select*fromstudentwherenamelike'ja%' unionall select*fromstudent; 2、intersect进行交集运算 --交集(相同部分) select*fromstudentwherenamelike'ja%' intersect select*fromstudent; 3、except进行减集运算 --减集(除相同部分) select*fromstudentwherenamelike'ja%' except select*fromstudentwherenamelike'jas%'; Ø公式表表达式 查询表的时候,有时候中间表需要重复使用,这些子查询被重复查询调用,不但效率低,而且可读性低,不利于理解。那么公式表表达式可以解决这个问题。 我们可以将公式表表达式(CET)视为临时结果集,在select、insert、update、delete或是createview语句的执行范围内进行定义。 --表达式 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; Ø连接查询 1、简化连接查询 --简化联接查询 selects.id,s.name,c.id,c.namefromstudents,classescwheres.cid=c.id; 2、leftjoin左连接 --左连接 selects.id,s.name,c.id,c.namefromstudentsleftjoinclassescons.cid=c.id; 3、rightjoin右连接 --右连接 selects.id,s.name,c.id,c.namefromstudentsrightjoinclassescons.cid=c.id; 4、innerjoin内连接 --内连接 selects.id,s.name,c.id,c.namefromstudentsinnerjoinclassescons.cid=c.id; --inner可以省略 selects.id,s.name,c.id,c.namefromstudentsjoinclassescons.cid=c.id; 5、crossjoin交叉连接 --交叉联接查询,结果是一个笛卡儿乘积 selects.id,s.name,c.id,c.namefromstudentscrossjoinclassesc --wheres.cid=c.id; 6、自连接(同一张表进行连接查询) --自连接 selectdistincts.*fromstudents,students1wheres.id<>s1.idands.sex=s1.sex; Ø函数 1、聚合函数 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; 2、日期时间函数 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日期 3、数学函数 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); 4、元数据 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'); 5、字符串函数 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'); 6、安全函数 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); 7、系统函数 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; 8、配置函数 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;--当前数据库版本信息 9、系统统计函数 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'); 10、用户自定义函数 #查看当前数据库所有函数 --查询所有已创建函数 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类型函数 --返回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);
代码内转载---地址
相关文章推荐
- android5.0网络之策略路由
- java.lang.ClassNotFoundException: org.apache.http.util.Args
- nginx强制使用https访问(http跳转到https)
- 第8章双路由双网段网络互通实验(初级篇)
- linux网络编程学习之一网络字节序
- HttpClient基础
- Java UDP网络编程 简单实例
- Android Volley完全解析(二),使用Volley加载网络图片
- 【Android】asynchronous http client
- Android-网络通信HTTP-Volley
- 菜鸟学Android笔记(十七):http协议概述
- android 使用post方式进行网络连接
- 网络编程
- Android之Http通信——2.详解Http的消息头与响应头
- Socket 网络编程
- 网络通信框架Volley的学习(一)
- 网络请求的步骤:
- Android之Http通信——1.初识Http协议
- Java Http GET POST发送请求
- HTTP 1.1状态代码及其含义