Access和SQLServer数据库之Select语句深度讲解需要的

  Access和SQLServer数据库之Select语句深度讲解,需要的就收藏吧

  SQL语言中的Select命令用于从数据库中查询并返回数据行。如果以中文表述,其语法结构如下:

  由于这个语句仅仅使用了一个字符串表达式我是用来测试的,且没有指定列名,因此,返回的查询结果中就由数据库随机分配了一个列名。很显然,随机的列名不方便后期的数据处理,如要给其加上固定的列名,可以在表达式后面使用as标志来进行重命名。例如:

  这是因为,当没有指定来源表时,由于仅设置了一个字符串表达式的列,因此返回的结果只有一行,该行的内容就是这个字符串表达式的值;当指定了来源表时,其返回的行数由来源表决定。由于订单表存在864条记录,因此这里就变成了864行;由于列值是用一个固定的字符串表示的,因此每行的值也都一样。

  这里的第1列是A1列,它是固定的字符串;第2列是B1列,用的是22+33的算术表达式,因此该列返回值都是55;第3列使用的是列名表达式产品id,这是在来源表中本身就存在的列,因此返回值取决于来源表;第4列同样使用的列名表达式客户id,只不过给它起了一个别名;第5列是通过多个列名组成的表达式,由于没有使用别名,因此返回的列名是随机的Expr1004。

  凡是select中没有出现在group by子句里的所有列表达式,都必须使用聚合函数。换言之,凡是出现在select子句中且没有使用聚合函数的列表达式,都必须包含在group by中。例如,下面语句中的数量列既没有使用聚合函数,也没有用在分组中,因此,该语句在执行时将出错:

  请注意,这样得到的统计结果和count(*)得到的结果可能并非完全一致:count(*)仅统计数据记录的行数,不会读取列中的任何数据,因此执行效率非常高;而count(客户ID)在统计时会判断该列中的值,一旦出现空值就会剔除该行。也就是说,count(客户ID)统计的记录数是不会包括指定列内容为空的记录行的。

  由于year(日期)获取的数据是整数,如果要在它后面加上其它字符,就必须先将其转为字符串形式,这里的CStr就是Access中用于将其它类型数据转为字符的函数,SQLServer使用的则是convert。

  当一个select语句中既有where又有group by时,where必须写在前面,group by写在后面,这种顺序是有严格要求的,不能搞错!而当需要使用聚合函数作为查询条件时,必须使用having代替where。例如,下面的SQL语句预览窗口:

  其中,第一个语句仅仅只是使用group by进行分组,生成的结果中没有任何额外的小计行;第二个语句在分组后面加上了with rollup,生成的结果就会自动按最高级的分组排序,同时加上小计和最后一行的总计;第三个语句在分组后面加上了with cube,则生成的结果在rollup的基础上更进一步,额外又添加了二级分组的小计值。

  排序中所用到的表达式未必一定要出现在select子句中。如上图,即使将select中的总量列去掉依然可以正常执行。再如,下面的语句尽管在select子句中没有数量列,但仍可得到需要的查询结果:

  除此之外,还要注意where、group by和order by三者的顺序:当它们同时出现在SQL语句中时,where必须排在第一位,group by其次,order by放在最后。而且,当在select子句中用到top谓词时,最好是和order by一起配合使用,这是因为:只有对排序以后的数据取前N行的值时才有意义。

  而当top和order by组合使用时,又会出现一种特殊的情况:如果指定范围内的最后一条记录有多个相同值,那么这些值对应的记录也会被返回,也就是说,最后返回的记录数可能会大于指定的数量。如下图,尽管指定的数量是4个,但最终的返回记录数却是5。原因就在于,用于排序的列产品ID的最后一行有相同的两个值:

相关阅读