数字函数
ABS() :求绝对值。
CEILING():舍入到最大整数 。3.33将被舍入为4、2.89将被舍入为3、-3.61将被舍入为-3。 Ceiling→天花板
FLOOR():舍入到最小整数。3.33将被舍入为3、2.89将被舍入为2、-3.61将被舍入为-4。 Floor→地板。
ROUND():四舍五入。舍入到“离我半径最近的
数” 。Round→“半径”。Round(3.1425,2)。
字符串函数
LEN() :计算字符串长度
LOWER() 、UPPER () :转小写、大写
LTRIM():字符串左侧的空格去掉,RTRIM () :字符串右侧的空格去掉,LTRIM(RTRIM(' bb '))字符串两侧的空格都去掉
SUBSTRING(string,start_position,length)参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length为子字符串的最大长度。SELECT SUBSTRING('abcdef111',2,3)
日期函数
GETDATE() :取得当前日期时间
DATEADD (datepart , number, date ),计算增加以后的日期。参数date为待计算的日期;参数number为增量;参数datepart为计量单位,可选值如下表:
DATEADD(DAY, 3,date)为计算日期date的3天后的日期,
DATEADD(MONTH ,-8,date)为计算日期date的8个月之前的日期
3. DATEDIFF ( datepart , startdate , enddate ) :计算两个日期之间的差额。 datepart 为计量单位,可取值参考DateAdd。
统计不同工龄的员工的个数:
select DateDiff(year,FInDate,getdate()),count(*) from T_Employee
group by DateDiff(year,FInDate,getdate());
4. DATEPART (datepart,date):返回一个日期的特定部分
统计员工的入职年份个数:
select DatePart(year,FInDate),count(*)from T_Employee group by DatePart(year,FInDate)
类型转换函数
CAST ( expression AS data_type)
CONVERT ( data_type, expression)
例1:Select cast(‘123’ as int),
cast(‘2012-12-12’ as datetime),
convert(datatime,’2011-11-11’),
convert(varchar(20),’123’)
例2:SELECT FIdNumber,RIGHT(FIdNumber,3) as 后三位,
CAST(RIGHT(FIdNumber,3) AS INTEGER) as 后三位的整数形式,
CAST(RIGHT(FIdNumber,3) AS INTEGER)+1 as 后三位加1,
CONVERT(INTEGER,RIGHT(FIdNumber,3))/2 as 后三位除以2
FROM T_Person
空值处理函数
ISNULL(expression,value) :如果expression不为空则返回expression,否则返回value。
例:SELECT ISNULL(FName,’佚名’) as 姓名 FROM T_Employee
CASE函数用法1
单值判断,相当于switch case
语法:CASE expression
WHEN value1 THEN returnvalue1
WHEN value2 THEN returnvalue2
WHEN value3 THEN returnvalue3
ELSE defaultreturnvalue
END
例子:
SELECT FName,
(CASE FLevel
WHEN 1 THEN ‘VIP客户’
WHEN 2 THEN ‘高级客户’
WHEN 3 THEN ‘普通客户’
ELSE ‘客户类型错误’
END) as FLevelName
FROM T_Customer
CASE函数用法2
语法:
CASE
WHEN condition1 THEN returnvalue1
WHEN condition2 THEN returnvalue2
WHEN condition3 THEN returnvalue3
ELSE defaultreturnvalue
END
相当于if…else…else….
2. 例子:
SELECT FName, FWeight,
(CASE
WHEN FWeight<40 THEN ‘瘦瘦’
WHEN FWeight>50 THEN ‘肥肥’
ELSE 'ok'
END) as isnormal
FROM T_Person
索引Index
使用索引能提高查询效率,但是索引也是占据空间的,而且添加、更新、删除数据的时候也需要同步更新索引,因此会降低Insert、Update、Delete的速度。只在经常检索的字段上(Where)创建索引。
表连接Join
Join语法:
select o.BillNo,c.Name,c.Age
from T_Orders as o
join T_Customers as c on o.CustomerId=c.Id
inner join(等值连接) 只返回两个表中满足关系(联结字段相等)的行,简写为join
left join(左联接) 返回左表中的所有记录和右表中满足关系的记录
right join(右联接) 返回右表中的所有记录和左表中满足关系的记录
子查询
1. 单值做为子查询:
SELECT 1 AS f1,2,(SELECT MIN(FYearPublished) FROM T_Book),
(SELECT MAX(FYearPublished) FROM T_Book) AS f4
只有返回且仅返回一行、一列数据的子查询才能当成单值子查询。
下面的是错误的:
SELECT 1 AS f1,2,(SELECT FYearPublished FROM T_Book)
2. 如果子查询是多行单列的子查询,这样的子查询的结果集其实是一个集合。
SELECT * FROM T_Reader WHERE FYearOfJoin IN
(
select FYearPublished FROM T_Book
)
3. 限制结果集。返回第3行到第5行的数据( ROW_NUMBER 不能用在where子句中,所以将带行号的执行结果作为子查询,就可以将结果当成表一样用了):
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) AS rownum,
FNumber,FName,FSalary,FAge FROM T_Employee
) AS a
WHERE a.rownum>=3 AND a.rownum<=5