SQL语句之语法汇总(二)
继
前一篇介绍SQL的简单语法后,本片将主要介绍实际应用中常用的语法,如数据排序order by、通配符Like过滤、空值处理、数据分组group by、限制结果集行数top 5*、去掉数据重复distinct、联合结果集union/union all、数字函数、字符串函数、日期函数、类型转换函数cast /convert、索引、表连接join等,其中会结合具体代码及例子予以说明。
为方便查看示例select语句,文章最后会附上需要创建的table表:
一.数据分组group by(聚合函数)
1.1代码: www.2cto.com
1.group by简单语句
--统计每个年龄段的人数
1). select FAge,count(*)as 人数 from T_Employee group by FAge; --right
2). select FAge,FSalary,count(*) from T_Employee group by FAge; --error
--程序报错:选择列表中的列 'T_Employee.FSalary' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
--分析:按照age分组,同一个age可能有好几个工资水平,计算机无法确定显示哪个而报错!
3). select FAge,max(FSalary)as 最高工资,count(*) as 人数 from T_Employee group by FAge; --right!
--分析:显示出age每组的最高工资即可
2.group by与where、having1). select FAge,count(*) from T_Employee where count(*)>1 group by FAge;--error:
2). select FAge,count(*) from T_Employee group by FAge having count(*)>1 --right:
1.2分析:
1)group by是按照某一个字段来对table中信息进行整合分组,在代码"group by简单语句"中,1、3正确,而2错误,可以做如下分析:
我们以FAge进行分组,即将每个年龄段的信息进行整合,获取到的结果可能是23岁的有abc三个人,工资为100、200、300,那么只能取其中某一个工资水平显示,如
max(FSalary),而不能直接写FSalary,否则计算机必然无法确定显示哪个而报错!参考下图,为“3)”的显示结果:
2)聚合语句不能出现在 WHERE 子句中,除非有having ,因而语句"1)"错误,而语句"2)"出现having,正确,分析:having对获取到的每组信息,再进行过滤,取得人数超过1的组(结果显示:25岁 3人等)
3)既然存在上述情况,那是不是having可以取代where语句呢?答案是否定的,参考代码:
a). select FAge, count(*) from T_Employee where FSalary>2000 group by FAge; --right
b). select FAge, count(*) from T_Employee group by FAge having FSalary>2000; --error: www.2cto.com
c). select FAge, count(*) from T_Employee group by FAge having FAge>25; --right
分析:"a)"中使用where,可以实现对分组前的数据进行过滤;即如果25岁组中有3人(3000,2000,4000),那么使用where语句后,结果为25 2人。
而having只能对获得的组信息进行过滤,即对"select FAge, count(*) from T_Employee group by FAge"的结果进行过滤,此时无法再对FSalary去筛选,无法实现where实现的功能,因而"b)"错误;
但如果对年龄刷选having FAge>25就正确,因为select结果中包含FAge字段,可以进行简单where对年龄的筛选,即"c)"正确!
二.数据排序
2.1代码:
1). 单字段排序:
select * from T_Employee order by FAge ASC; --对年龄进行排序
2). 多字段排序
select * from T_Employee order by FAge ASC ,Fsalary ASC; --进一步排序(年龄相同的,按照工资排序)!前面的优先级高!
3). 对过滤后结果进行排序:
select * from T_Employee where FAge>24 order by FAge DESC;
2.2 分析
1)排序条件可以有多个,但越前优先级越高;
2)ASC升序(default)、 DESC降序,平时使用排序时,ASC方式虽为默认,但最好不要省略,增强代码可读性
三.通配符
3.1代码
1). 通配符_,单个字符:
select * from T_Employee where FName LIKE '_erry';
2). 通配符%,零或多个字符:
select * from T_Employee where FName like '%n%'; --FName中含有字母n的
select * from T_Employee where FNumber like 'DEV%'; --FNumber中以DEV开始的
3.2分析
注意区分Like中 单字符 不定字符用法的区别!
四. 空值处理 www.2cto.com
4.1代码:
--空值处理:
select 'abc'+'123' --结果:abc123
select ''+'123' --结果:123
select null+'123' --结果:NULL
select * from T_Employee where FName=null; --error 没有结果,可以尝试null <>null均无结果!
select * from T_Employee where FName is null; --right 查询到name为null的结果!
select * from T_Employee where FName is not null; --error 查询到所有name不为null的结果!
4.2分析:
1)
数据库中,一个列如果没有指定值,那么值就是null,此处的null与
c#中的null不同,
数据库中表示“不知道”,而不是“没有”
2)可以尝试FName!=null、FName=null、FName=<>null均无结果!
附:创建的几个table
www.2cto.com
Table T_Employee
--创建表
create table T_Employee(FNumber varchar(20),FName varchar(20),FAge int,FSalary numeric(10,2),PR