sqlServer2008技术内幕笔记总结(实用的sql方法总结)

over函数的使用:

1.可以实现基于什么求和,省去group by:  

select xingming,xingbie,COUNT(*) over() as '总人数' from jbxx_xueshengxinxi

2.over()括号里的参数是基于什么汇总,为空则是对所有记录汇总,例如:

select jiqiID,xiaofeizheID,sum(xiaofeijine) over (partition by xiaofeizheID) as '消费者消费总额',sum(xiaofeijine) over() as '总消费金额汇总' from jbxx_xiaofei           /** partition 分割,区分 **/

:row_number的使用等

1.实现行号的自动生成,一般要配合over一起使用可以实现条件排序。

行号条件生成:

select row_number() over(order by xueshengID) as '行号',xueshengID,xingming,xingbie from jbxx_xueshengxinxi;

2.当遇到有相同环境下的数据需要给予相同排名的时候,需要使用rank()

rank():select xueshengID,xingming,xingbie,rank() over(order by xueshengID) as '排名' from jbxx_xueshengxinxi; 

3.dense_rank()密集排名

dense_rank():select xueshengID,xingming,xingbie,dense_rank() over(order by xueshengID) as '排名' from jbxx_xueshengxinxi;

4.按某一条件,分组,ntile(*)

例如三个一组:

select xueshengID,xingming,xingbie,ntile(3) over(order by xueshengID) as 'ntile分组',dense_rank() over(order by xueshengID) as '密集排名' from jbxx_xueshengxinxi order by xueshengID

5. select a,b,(row_number)/rank() over(partition by a order by b ) nmb from test   分组中排序方式。

between...and...包含边界值;in()查找括号里符合条件的数据;like ‘%x%’通配符模糊查询使用;

case when...then...else...end...函数的使用:

1./**  这里sum可以结合over使用sum() over(partition by country),后面就可以省略group by子句。

    在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。 

**/

SELECT country,

       SUM( CASE WHEN sex = '1' THEN 

                      population ELSE 0 END) as '男性人口',

       SUM( CASE WHEN sex = '2' THEN 

                      population ELSE 0 END) as '女性人口'

FROM  Table_A

GROUP BY country;

2.利用case when函数变更数据表主键

UPDATE SomeTable

SET p_key = CASE WHEN p_key = 'a'

THEN 'b'

WHEN p_key = 'b'

THEN 'a'

ELSE p_key END

WHERE p_key IN ('a', 'b');

  

3.利用in和exists对数据操作

 1 SELECT keyCol,
 2 
 3 CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )
 4 
 5 THEN 'Matched'
 6 
 7 ELSE 'Unmatched' END Label
 8 
 9 FROM tbl_A;
10 
11 --使用EXISTS的时候
12 
13 SELECT keyCol,
14 
15 CASE WHEN EXISTS ( SELECT * FROM tbl_B
16 
17 WHERE tbl_A.keyCol = tbl_B.keyCol )
18 
19 THEN 'Matched'
20 
21 ELSE 'Unmatched' END Label
22 
23 FROM tbl_A;

4.字符串处理函数解析:substring(“字符串”,起始位置,截取长度)

 1 //注意:sql里下标都是从一开始的
 2 
 3 select xingming,shenfenID,substring("shenfenID",7,8) from jbxx_xueshengxinxi;
 4 
 5 
 6 
 7 //left表示从左边截取(从左往右数),right表示从右边截取(从右往左数)
 8 
 9 select xingming,left("shenfenID",9) as xx from jbxx_xueshengxinxi    //right也是同理的
10 
11 
12 
13 //len可以返回字符串中的字符数,忽略空格;datalength返回字符串实际长度,包括空格
14 
15 select isnull(len(shenfenID),0) as sfz from jbxx_xueshengxinxi
16 
17 
18 
19 //charIndex(" ",xingming) as '出现空格的位置'   可以查询出空格的索引位置。
20 
21 //replace(xingming,'xsxm','学生姓名') 可以将字段xingming中的xsxm替换成‘学生姓名’。
22 
23 //stuff(shenfenID,6,'2','===')表示,从shenfenID的索引6开始,后面两个字符替换成===
24 
25 //upper(),lower()可以进行大小写转换
26 
27 //sql去除空格ltrim(rtrim(**)),ltrim从左面去除空格,rtrim从右面去除空格。
28 
29 
30 
31 //代替表示语句:
32 
33 select *,case when xingming='xx' then '同一个地方' when xingming='rr' then '未知区域' else '其他区域' end '区域级别' from jbxx_xueshengxinxi where xingming='xx'

5.日期和时间数据处理

 1 -- cast 可以将20160820这种格式转换成日期格式的数据
 2 
 3 select * from jbxx_xueshengxinxi where addtime>=cast('20160820' as datetime)
 4 
 5 
 6 
 7 -- datepart截取日期字符
 8 
 9 select datepart(year,getdate()) as '',datepart(month,getdate()) as 'yue',......
10 
11 
12 
13 特殊:select datepart(dayofyear,getdate()) as N'一年中的第几天',datepart(weekday,getdate()) as N'一星期中第几天',datepart(week,getdate()) as N'今年的第几周'
14 
15 
16 
17 日期计算加减:select DATEADD(DAY,9,GETDATE()),DATEDIFF(YEAR,'19950422',GETDATE()) as '现在多大了'
18 
19 
20 
21 -- convert()可以指定转换类型,cast直接转换
22 
23 select convert(nvarchar,getdate(),102) as 'ss'
24 
25 --- CONVERT(data_type(length),data_to_be_converted,style)使用的规范,(数据类型,需要转换的数据项,需要转换成的日期格式)

6.sqlserver的表连接

 1 --->交叉连接(cross join),即笛卡尔积:查询出满足两张表的所有记录数,比如,tb_a有6条记录,tb_b有5条记录,交叉连接就是a*b有30条记录。
 2 
 3 select * from tb_a;  select * from tb_b;      --->select * from tb_a a cross join tb_b b;  
 4 
 5 
 6 
 7 --->内连接(inner join),必须两边同时满足某一条件的组合
 8 
 9 我们要查询某些产品属于哪个工厂生产的,我们需要将产品明细表和工厂信息表进行内连接。
10 
11 
12 
13 --->左连接(left join)、右连接(right join),左连接查询左边都存在,右边数据如果不符合连接条件则不符合项为null;right join正好相反。

7.嵌套查询,相关子查询,聚合等

1 子查询:select * from jbxx_xueshengxinxi where addtime=(select MAX(addtime) as '最晚录入时间' from jbxx_xueshengxinxi)
2 
3 select zztuijianren,COUNT(*) as '个人总招数' from jbxx_xueshengxinxi where zztuijianren is not null group by zztuijianren order by zztuijianren

8.派生表、CTE\递归CTE

 1 --->派生表示例:select * from (select addtime,count(*) over(partition by addperson) as zz from jbxx_xueshengxinxi) t
 2 
 3 --->CTE示例:
 4 
 5 with tb_table1 as (select * from jbxx_xueshengxinxi)
 6 
 7 select * from tb_table1           /** 注意,这里的tb_table1查询过一次之后就失效了 **/
 8 
 9 --->有参数的CTE可以多次使用:
10 
11 declare @country nvarchar(300);
12 
13 set @country='USA';
14 
15 with tb_table2('公司名称','国家名称') as (select company,country from jbxx_guojia where country=@country)
16 
17 select * from tb_table2
18 
19 --->递归CTE:
20 
21 declare @id int;
22 
23 set @id='6';
24 
25 with tb_ss as 
26 
27 (
28 
29 select empID,name,mgrID from employees where mgrID=@id
30 
31 UNION ALL
32 
33 select e.empID,e.name,e.mgrID from employees e 
34 
35 inner join tb_ss s
36 
37 on e.mgrID=s.empID
38 
39 )
40 
41 select * from tb_ss;

9.视图、集合操作

/** 创建视图 **/

--->create view v_tb

as

(select * from jbxx_xueshengxinxi where xingbie='女');

--->union\union all

可以将两个表合集,union是去重后的结果,而union all没有去重。

--->intersect交集,也是去重后的结果

--->except差集,取出一个表在另一个表不存在的数据

10.透视(pivot) 

实现行转列、列转行   

11.约束(主键、唯一、非空、检查、外键约束)

 1 create table tb_st(
 2 
 3 stuid int identity(100,1),  //编号
 4 
 5 stuname nvarchar(30) not null,
 6 
 7 gender nvarchar(1) not null, //非空约束
 8 
 9 constraint ck_gender check(gender in ('',‘女’)),    //检查约束
10 
11 constraint un_name unique(stuname),    //唯一约束
12 
13 constraint pk_id primary key (stuid)   //主键约束
14 
15 )

12.事物

1 begin transaction;
2 
3 delete * from jbxx_uesheng where id='123';
4 
5 delete * from jbxx_use where id='231';
6 
7 roolback;或者是直接提交--->commit

13.T-SQL编程

 1 实例:declare @sum nvarchar(100)
 2 
 3 select @sum=COUNT(*) from jbxx_xueshengxinxi
 4 
 5 print @sum
 6 
 7 --->
 8 
 9 declare @a int
10 
11 declare @b int
12 
13 set @a=0
14 
15 set @b=0
16 
17 while @a<=100
18 
19 begin
20 
21  set @a=@a+1
22 
23  set @b=@a+@b
24 
25 end
26 
27 print @b

14.存储过程

 1 ----->基本用法实例:
 2 
 3 CREATE PROCEDURE table_1
 4 
 5 (
 6 
 7 @num ss
 8 
 9 )
10 
11 as
12 
13 update db.tb_1
14 
15 set kb = kb + @num;
16 
17 exec table_1 @num;
18 
19 ----->存储过程传出参数实例:
20 
21 CREATE PROCEDURE table_2
22 
23 (
24 
25 @sc int output
26 
27 )
28 
29 as
30 
31 declare @num int
32 
33 select @num=count(*) from jbxx_ls
34 
35 --传出参数
36 
37 set @sc=@num
38 
39 go
40 
41 --创建一个来存储传出参数的变量
42 
43 declare @rc int
44 
45 --运行
46 
47 exec table_2 @sc=@rc output;
48 
49 print @rc;

猜你喜欢

转载自www.cnblogs.com/zhchbest/p/10420457.html