C#基础之SQL笔记4

数据分组:

1.查询的字段只能是所要分的[组的属性](如聚合函数 avg()某一组的平均值 max()某一组的最大值等,也可以是属于某一组的某个特殊成员属性等),以及要用来分组的字段,即某一组的过滤信息,且不可缺少。

2.聚合函数不能出现在 where 子句中,但可以出现在 having 子句中,且 having 子句中只能包含分组的字段和聚合函数,即having也只能存放某一组的过滤信息。

3.having是对分组后的信息的过滤用的列和select中能用的列是一样的,having无法代替where

 

限制结果集的范围:

例: select top 3 * from T_Employee (只取前3条数据)

 

去掉重复数据:

例:select distinct FDepartment,FSubCompany from T_Tmployee;

 

联合(Union):

联合的查询语句中的查询的字段数目要一致

select FName,FAge,'工资' from T_TempEmployee

union

select FName,FAge,FSalary from T_Employee

 

select FName,FName,FAge,FDepartment from T_Employee

union

select FIdCardNumber,FName,FAge,'临时工,无部门' from T_TempEmployee

 

union会自动去除重复行,用union all可以去除重复行

select FName from T_Employee

union all

select FName from T_TempEmployee

 

 

流控制函数:

ISNULL()函数判断是否为空

SELECT ISNULL(FName,'佚名') as 姓名 FROM T_Employee;

 

CASE expression

WHEN value1 THEN returnvalue1

WHEN value2 THEN returnvalue2

WHEN value3 THEN returnvalue3

ELSE defaultreturnvalue

END

 

例:

select FName,

(

case FLevel

when 1 then '普通客户'

when 2 then '会员'

when 2 then 'VIP'

else '未知客户类型'

end

) as 客户类型

from T_Customer

-----------------------------------------

select FName

(

case

when FSalary<2000 then '低收入'

when FSalary>=2000 then '中等收入'

else '高收入'

end

) as 收入水平

from T_Employee

-----------------------------------------

select FNumber

(

case

when FSalary<2000 then FAmount

else 0

end

) as 收入,

(

case

when FAmount<0 then ABS(FAmount)

else 0

end

) as 支出

from T_Test1

-----------------------------------------

把下表:

Name Score

拜仁 胜

奇才 胜

湖人 胜

拜仁 负

拜仁 负

奇才 胜

按下面格式输出:

Name 胜 负

拜仁 1 2

奇才 1 0

湖人 2 0

**************

select Name,

Sum(

case Score

when N'胜' then 1

else 0

end

) as,

Sum(

case Score

when N'负' then 1

else 0

end

)as

from T_Scores

group by Name

 

 

join表的连接:

例:

select o.BillNo,c.Name,c.Age

from T_Orders as o join T_Customs as c on o.CustomerId=c.Id

where c.Age>15

 

子查询:

例:

select * from

(

select * from T_Orders

) as o1

 

    1.单值子查询

select 1 as f1,2,(select min(FYearPublicshed) from T_Book),

(select max(FYeayPublished) from T_Book) as f4

 

select 1 as f1,(select min(FYearPublished),max(FYearPublished) from T_Book)

 

2.单列多值子查询

select * from T_Reader

where FYearOfJoin in

(select distinct FYearPublished from T_Book)

 

select * from

(

select row_number() over(order by Fsalary desc) as rownum,

FNumber,FName,FSalary,FAge from T_empoyee

) as e1

where e1.rownum>=3 and e1.rownum<=5;

 

posted @ 2011-09-15 13:32  维唯为为  阅读(253)  评论(0编辑  收藏  举报