SELECT FAge,COUNT(*) AS 人数FROM T_Employee
GROUP BY FAge
HAVING COUNT(*)>1
2、注意Having中不能使用未参与分组的列,Having不能替代where。作用不一样,Having是对组进行过滤。
3、顺序:先where,后group by,再having.
十六、限制结果集行数
1、SELECT top 5 * FROM T_Employee order by FSalary Desc
2、(*)检索按照工资从高到低排序检索从第六名开始一共三个人的信息 :
SELECT top 3 * FROM T_Employee
WHERE FNumber NOT IN (SELECT TOP 5 FNumber FROM T_Employee ORDER BY FSalary DESC)
ORDER BY FSalary DESC
3、SQLServer2005后增加了Row_Number函数简化实现,后面会讲。
十七、DISTINCT:去掉数据重复
1、执行备注中的SQL语句,Alter和Insert单独执行
SELECT FDepartment FROM T_Employee
SELECT DISTINCT FDepartment FROM T_Employee
2、DISTINCT是对整个结果集进行数据重复处理的,而不是针对每一个列,因此下面的语句并不会只保留Fdepartment进行重复值处理:
SELECT DISTINCT FDepartment,FSubCompany
FROM T_Employee
十八、UNION:联合结果集
1、执行备注中的代码
2、简单的结果集联合:
3、SELECT FNumber,FName,FAge FROM T_Employee UNION SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
4、基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容。
SELECT FNumber,FName,FAge,FDepartment FROM T_Employee UNION SELECT FIdCardNumber,FName,FAge,‘临时工,无部门' FROM T_TempEmployee
十九、UNION ALL
SELECT FName FROM T_Employee UNION
SELECT FName FROM T_TempEmployee
1.UNION合并两个查询结果集,并且将其中完全重复的数据行合并为一条
SELECT FName FROM T_Employee
UNION ALL
SELECT FName FROM T_TempEmployee
2.Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL
案例:
1)要求查询员工的最低年龄和最高年龄,临时工和正式员工要分别查询
SELECT '正式员工最高年龄',MAX(FAge) FROM T_Employee UNION ALL
SELECT '正式员工最低年龄',MIN(FAge) FROM T_Employee UNION ALL
SELECT '临时工最高年龄',MAX(FAge) FROM T_TempEmployee UNION ALL
SELECT '临时工最低年龄',MIN(FAge) FROM T_TempEmployee UNION ALL
2)查询每位正式员工的信息,包括工号、工资,并且在最后一行加上所有员工工资额合计。
SELECT FNumber,FSalary FROM T_Employee UNION ALL SELECT '工资合计',SUM(FSalary) FROM T_Employee
二十、数字函数:
执行备注中的代码:
1、ABS() :求绝对值。
2、CEILING():舍入到最大整数 。3.33将被舍入为4、2.89将被舍入为3、-3.61将被舍入为-3。Ceiling→天花板
3、FLOOR():舍入到最小整数。3.33将被舍入为3、2.89将被舍入为2、-3.61将被舍入为-4。Floor→地板。
4、ROUND():四舍五入。舍入到“离我半径最近的数” 。Round→“半径”。Round(3.1425,2)。
二十一、字符串函数:
1、LEN() :计算字符串长度
2、LOWER() 、UPPER () :转小写、大写
3、LTRIM():字符串左侧的空格去掉
4、RTRIM () :字符串右侧的空格去掉
LTRIM(RTRIM(' bb '))
5、SUBSTRING(string,start_position,length)
参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length为子字符串的最大长度。
SELECT SUBSTRING('abcdef111',2,3)
二十二、日期函数:
1、GETDATE() :取得当前日期时间
2、DATEADD (datepart , number, date ),计算增加以后的日期。参数date为待计算的日期;参数number为增量;参数datepart为计量单位,可选值见备注。DATEADD(DAY, 3,date)为计算日期date3天后的日期,而DATEADD(MONTH ,-8,date)为计算日期date8个月之前的日期
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)
二十三、类型转换函数:
1、CAST ( expression AS data_type)
2、CONVERT ( data_type, expression)
3、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
二十四:空值处理函数:
1、执行备注中的代码
2、ISNULL(expression,value) :
如果expression不为空则返回expression,否则返