SQL基础语句(数据库函数,时间函数,Union,Case,索引)

--SQL 版本
select @@version
--与表无关的数据
select newid() as TGUID
--聚合函数,对查询结果进行聚合求值
select count(*) from 
select max(Salary) from
select min(Salary) from
select Avg(Salary) from
select sum(salary) from 
--排序
order by Age DESC, Salary ASC
--通配符匹配(半角),模糊匹配
where EmpName like '_N' or '%n%'
--NULL:不知道
select NULL+1
where EmpName is NULL
--in: 多值匹配
-- 范围
select * from EmpLoyee where Age between  20 and 30
--把结果分组 Group By
SELECT [newsID],count(*) from [news] group by [newsID]
SELECT [newsID],max([classID]),count(*) from [news] group by [newsID]
--对分组后的结果进行筛选,Having 字段必须在Select 中,而Where是对原始数据进行过滤
SELECT [newsID],max([classID]),count(*) from [news] group by [newsID] having max([classID])>2
--常用函数
select ABS(-1)  --求绝对值
select CEILING(-3.8)  --天花板 取大于这个数字的最大整数
select FLOOR(5.3)     --地板   取小鱼这个数字的最大整数
select ROUND(3.1415,2)--四舍五入 取离这个数字最近的数,2 是精确的位数
select len('ni hao')  --字符串长度
select LOWER('HELlo') --转小写
select UPPER('helLO') --转大写
select LTRIM('  kong')--去左空格
select RTRIM('kong  ')--去右空格
select LTRIM(RTRIM('    kong  ')) --去两边空格
select substring('nihao',2,3)--从二个位子截取三个字符
--日期函数
select dateadd(dd,3,getdate())
select dateadd(mm,-3,getdate())
select dateadd(hh,3,getdate())
select datediff(day,getdate(),'20120203') --后面减去前面
select datepart(day,getdate())  --选出时间中特定的部分
--员工工龄以及对应的人数
select datediff(year,InDate,getdate()),count(*) From Employee 
group by datediff(year,InDate,getdate())
--每一年入职人数
select datepart(year,InDate),count(*) From Employee 
group by datepart(year,InDate)
--数据类型转换
select cast('1' as int)
select convert(int,'1')
select convert(datetime,'20120203')
select convert(varchar(10),123)
--TOP 选出Top3到5 限制结果集
select top 3 * from [news] where ClassID not in 
(select top 2 ClassID from [news] order by ClassID desc)
order by ClassID desc
--按照ClassID升序,并给选出的每一行记录进行排序
select newsID,NewsName, row_number() over(order by ClassID )as rows from [news] 
--DISTINCT 消除完全重复的行
select distinct NewsName from [NEWS]
--UNION,会把重复数据合并
SELECT [newsID],[newsName] FROM [SchoolNews].[dbo].[news]
UNION
SELECT [classID],'CLASSNAME' FROM [SchoolNews].[dbo].[newsClass]
--把两张表选出的内容合并
SELECT '最大NEWSID',max(newsID)   FROM [SchoolNews].[dbo].[news]
UNION
SELECT '最大CLASSNAME',max([classID])  FROM [SchoolNews].[dbo].[newsClass]
--统计查询结果
select [newsID],ClassID FROM [SchoolNews].[dbo].[news]
UNION
select '评论总数',Sum(ClassID) FROM [SchoolNews].[dbo].[news]
--当月
select datediff(month,'2012-12-10',getdate())
--ISNULL
select ISNULL(EmpName,'佚名') as 姓名 from Employee
--case:就是对查询的结果进行判断、分类、转化(其他数据或者多行)
select EmpName, 
(
case Sex
when 'M' then 'man'
when 'F' then 'woman'
else '性别错误'
END
) as 性别 From Employee
 --case 支持范围
select EmpNo,
(
case 
when datediff(year,InDate,getdate())<2 then '一年'
when datediff(year,InDate,getdate())>=2 and datediff(year,InDate,getdate())<3 then '两年'
else '两年以上'
END
) AS 工龄 from Employee 
--Case 选择两列中比较大的一列的值,把值按照某种条件分成两列
select 
(
case
when a>b then a
else b
END
) as 第一列,
(
case
when b>c then b
else c
END
) as 第二列 from
--收入,支出 分开显示
select FNumber,
(
case
when FAmount>0 then FAmount
else 0
END
) as 收入,
(
case
when FAmount<0 then ABS(FAmount)
else 0
END
) as 支出 from T_TEST
--球队胜负积分:先把胜负逐条分开再进行分组
select FName 
SUM(
case Score
when N'' then 1
else 0
END
) as 胜
SUM(
case Score
when N'' then 1
else 0
END
) as 平
SUM(
case score
when N'' then 1
else 0
END
) asfrom T_Test
group by FName  --以名字进行分组
--电话号码的设计要为varchar 类型
--Index 索引,直接在字段右键添加索引:提高查询效率 对于经常检索的字段建立索引
--插入,删除,更新数据的时候速度变慢 占用空间
--Like,函数(ABS),类型转换(CAST)等依旧需要全表扫描

 

 

 

 

posted @ 2012-12-10 23:31  sirili  阅读(730)  评论(2编辑  收藏  举报