一、计算字段

1、计算字段

存储在数据库表中的数据一般不是应用程序所需要的格式,下面举几个例子。

(1).需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在不同的表列中。

(2).城市和邮政编码存储在不同的列中(应该这样),但邮件标签打印程序需要把它们作为一个有恰当格式的字段检索出来。

(3).列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。

(4).物品订单表存储物品的价格和数量,不存储每个物品的总价格(用价格乘以数量即可)。但为打印发票,需要物品的总价格。

(5).需要根据表数据进行诸如总数、平均数的计算。

在上述每个例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索 出数据,然后再在客户端应用程序中重新格式化。 这就是计算字段可以派上用场的地方了。计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创 建的。

字段(field) 基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用。 需要特别注意,只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户端(如应用程序)来看,计算字段的数据与其 他列的数据的返回方式相同。

提示:客户端与服务器的格式 在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在客户 端中完成要快得多。

2、拼接字段

例:Vendors表包含供应商名和地址信息。假如要生成一个供应商报表,需要在格式化的名称(位置)中列出供应商的位置。 此报表需要一个值,而表中数据存储在两个列vend_name和vend_country中。此外,需要用括号将vend_country括起来,这些东西都没有存储在 数据库表中。解决办法是把两个列拼接起来。在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。根据你所使用的DBMS,此操作符可用加 号(+)或两个竖杠(||)表示。在MySQL和MariaDB中,必须使用特殊的函数。

说明:是+还是||? Access和SQL Server使用+号。DB2、Oracle、PostgreSQL、SQLite和Open Office Base使用||

(1)操作符+

select rtrim(vend_name) + ' (' + rtrim(vend_country) + ')' as vend_title from vendors order by vend_name;

<1>上面的SELECT语句拼接以下元素:

存储在vend_name列中的名字;

包含一个空格和一个左圆括号的字符串;

存储在vend_country列中的国家;

包含一个右圆括号的字符串。SELECT语句返回包含上述四个元素的一个列(计算字段)。

<2>rtrim()函数去掉值右边的所有空格

<3>as关键字是用来赋予别名的

(2)操作符||

select rtrim(vend_name) || '(' || rtrim(vend_country) || ')' as vend_title from vendors order by vend_name;

与操作符+的功能是一样的

(3)函数concat()

select concat(vend_name,'(',vend_country,')') as vend_title from vendors order by vend_name;

与操作符+的功能是一样的

3、执行算术计算

例子:汇总物品的价格

select prod_id,quantity,item_price,quantity*item_price as expanded_price from orderitems where order_num=20008;

输出中显示的expanded_price列是一个计算字段,此计算为quantity*item_price。

SQL算术操作符:

二、使用数据处理函数

1、函数带来的问题

与几乎所有DBMS都等同地支持SQL语句(如SELECT)不同,每一个DBMS都有特定的函数。事实上,只有少数几个函数被所有主要的DBMS 等同地支持。

为了代码的可移植,许多SQL程序员不赞成使用特定于实现的功能。虽然这样做很有好处,但有的时候并不利于应用程序的性能。如果不使用 这些函数,编写某些应用程序代码会很艰难。必须利用其他方法来实现DBMS可以非常有效完成的工作。

如果你决定使用函数,应该保证做好代码注释,以 便以后你(或其他人)能确切地知道所编写的SQL代码的含义。

2、使用函数

大多数SQL实现支持以下类型的函数。

用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文本函数。

用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。

用于处理日期和时间值并从这些值中提取特定成分(如返回两个日期之差,检查日期有效性)的日期和时间函数。

返回DBMS正使用的特殊信息(如返回用户登录信息)的系统函数。

<1>文本处理函数

例:select vend_name,upper(vend_name) as vend_name_upcase from vendors order by vend_name;

说明:

soundex是一个将任何文本串转化为描述其语音表示的字母数字模式的算法,soundex考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。

例:select cust_name,cust_contact from customers where soundex(cust_contact) = soundex('Michael Green');

分析:在这个例子中,WHERE子句使用SOUNDEX()函数把cust_contact列值和搜索字符串转换为它们的SOUNDEX值。因为Michael Green和Michelle Green发音相似,所以它们的SOUNDEX值匹配,因此WHERE子句正确地过滤出了所需的数据。

<2>日期和时间处理函数(这里只针对mysql)

例:检索出年份是2012年的数据

select order_num,order_date from orders where year(order_date)=2012;

<3>数值处理函数

处用的数值处理函数如下:

三、聚集函数

1、聚集函数

我们经常需要汇总数据而不用把它们实际检索出来,为此SQL提供了专门的函数。使用这些函数,SQL查询可用于检索数据,以便分析和报表 生成。这种类型的检索例子有:

确定表中行数(或者满足某个条件或包含某个特定值的行数);

获得表中某些行的和;

找出表列(或所有行或某些特定的行)的最大值、最小值、平均值。

上述例子都需要汇总表中的数据,而不需要实际数据本身。

<1>AVG()函数

AVG()通过对表中行数计数并计算其列值之和,求得该列的平均值。AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。

例1:使用AVG()返回Products表中所有产品的平均价格:

例2:AVG()也可以用来确定特定列或行的平均值。下面的例子返回特定供应商所提供产品的平均价格:

警告:只用于单个列 AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。

说明:NULL值 AVG()函数忽略列值为NULL的行。

<2>count()函数

count()函数进行计数,可利用count()确定表中行的数目或符合特定条件的行的数目

count()函数有两种用法:

其一:使用count(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值

其二:使用count(column)对特定列中具有值的行进行计数,忽略NULL值

说明:NULL值

如果指定列名,则COUNT()函数会忽略指定列的值为空的行,但如果COUNT()函数中用的是星号(*),则不忽略。

<3>MAX()函数

MAX()返回指定列中的最大值。MAX()要求指定列名

注意:

对非数值数据使用max()。

虽然MAX()一般用来找出最大的数值或日期值,但许多(并非所有)DBMS允许将它用来返回任意列中的最大值,包括返回文本列中的最大 值。在用于文本数据时,MAX()返回按该列排序后的最后一行。

示例如下图:

说明:max()函数忽略列值为NULL的行

<4>min()函数

返回指定列的最小值,与max()一样,min()要求指定列名

<5>sum()函数

SUM()用来返回指定列值的和(总计)。下面举一个例子,OrderItems包含订单中实际的物品,每个物品有相应的数量。可如下检索所订购物品 的总数(所有quantity值之和):

SUM()也可以用来合计计算值。在下面的例子中,合计每项物品的item_price*quantity,得出总的订单金额:

提示:在多个列上进行计算 如本例所示,利用标准的算术操作符,所有聚集函数都可用来执行多个列上的计算。

说明:NULL值 SUM()函数忽略列值为NULL的行。

2、聚集不同值

以上5个聚集函数都可以如下使用:

(1)对多有行执行运算,指定ALL参数或不指定参数(因为ALL是默认行为)

(2)只包含不同的值,指定DISTINCT函数

提示:ALL为默认 ALL参数不需要指定,因为它是默认行为。如果不指定DISTINCT,则假定为ALL。

说明:不要在Access中使用 Microsoft Access在聚集函数中不支持DISTINCT,因此下面的例子不适合于Access。要在Access得到类似的结果,需要使用子查询 把DISTINCT数据返回到外部SELECT COUNT(*)语句。

可以看到,在使用了DISTINCT后,此例子中的avg_price比较高,因为有多个物品具有相同的较低价格。排除它们提升了平均价格。

警告:DISTINCT不能用于COUNT(*) 如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*)。类似地,DISTINCT必须使用列名,不能用于计算或表达式。

提示:将DISTINCT用于MIN()和MAX() 虽然DISTINCT从技术上可用于MIN()和MAX(),但这样做实际上没有价值。一个列中的最小值和最大值不管是否只考虑不同值,结果都是相同 的。

3、组合聚集函数

目前为止的所有聚集函数例子都只涉及单个函数。但实际上,SELECT语句可根据需要包含多个聚集函数。举例如下:

SQL算术运算、函数相关推荐

  1. Hive3入门至精通(基础、部署、理论、SQL、函数、运算以及性能优化)15-28章

    Hive3入门至精通(基础.部署.理论.SQL.函数.运算以及性能优化)15-28章 [Hive3入门至精通(基础.部署.理论.SQL.函数.运算以及性能优化)1-14章](https://blog. ...

  2. sql avg函数使用格式_SQL AVG-SQL平均函数用语法示例解释

    sql avg函数使用格式 什么是SQL平均(AVG)函数? (What is the SQL Average (AVG) Function?) "Average" is an A ...

  3. sql isnull函数的使用(转载)

    sql isnull函数的使用 ISNULL 使用指定的替换值替换 NULL. 语法 ISNULL ( check_expression , replacement_value ) 参数 check_ ...

  4. php sql count函数,SQL COUNT() 函数

    SQL COUNT() 函数 COUNT() 函数返回匹配指定条件的行数. SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL ...

  5. Sql Server函数全解三数据类型转换函数和文本图像函数

    原文:Sql Server函数全解<三>数据类型转换函数和文本图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近 ...

  6. MSSQL Sql加密函数 hashbytes 用法简介

    原文:MSSQL Sql加密函数 hashbytes 用法简介 转自:http://www.maomao365.com/?p=4732 一.mssql sql hashbytes 函数简介 hashb ...

  7. ylb:SQL 常用函数

    ylbtech-SQL Server: SQL Server-SQL 常用函数 1,数学函数 2,日期和时间函数 3,字符串函数 4,转换函数 1,ylb:SQL 常用函数返回顶部 1,数学函数 2, ...

  8. SQL COUNT() 函数

    SQL COUNT() 函数 COUNT() 函数返回匹配指定条件的行数. SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL ...

  9. MS SQL自定义函数IsPositiveInteger MS SQL自定义函数IsNumeric 水晶报表使用IEnumerableT数据源...

    MS SQL自定义函数IsPositiveInteger 判断字符串是否为正整数,0开始的的数字不算. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ...

  10. SQL 聚合函数一定要跟group by以及NULL的关系的案例精讲

    SQL 聚合函数与GROUP BY NULL的关系及ALL的使用说明 需求说明 有如下一道SQL题,网友咨询: 1 为啥正确答案是第二项? 2 聚合函数是否一定要跟GROUP BY PARTITION ...

最新文章

  1. asp实现UNIX时间戳功能
  2. 如何为某些HTML标记存储任意数据
  3. sublime text3 jshint 安装
  4. html文件执行顺序,网页的加载和执行顺序?
  5. pytoch word_language_model 代码阅读
  6. Ubuntu系统---C++之Eclipse 开始工程项目
  7. mysql 第几周 时间戳_php时间戳函数实现计算第几周,以及当天所在周的具体日期范围...
  8. python解决列表IndexError: list index out of range
  9. SSH ALL-IN-ONE
  10. Idea搭建一个JavaWeb项目(一)
  11. FormData对象提交表单及上传图片/文件
  12. HTMl5 的新特性
  13. FastReport.Net使用:[18]形状(Shape)控件用法
  14. 电脑桌面计算机被隐藏怎么恢复,电脑隐藏图标怎么恢复_电脑隐藏的怎么恢复...
  15. 名词用作动词举例_古语名词使动用法解析
  16. 蓝桥杯摔手机测试次数
  17. UnityWebRequest加载音频
  18. Kubernetes部署失败的10个最常见原因
  19. 一个因为兴趣而走上前端开发的程序员
  20. SATA SSD需要NCQ开启吗?

热门文章

  1. 用Word输入汉字偏旁部首 比想像中容易(转)
  2. switch语句如何用字符串?
  3. Apache HTTP 过滤器filter、开源WAF(ModSecurity)、Apache 模块开发
  4. 10.18 小米笔试小记
  5. (附源码)基于PHP的酒店住宿管理系统 毕业设计261455
  6. webgl通过shader实现逼真水面
  7. Unity3D简单的水面shader实现
  8. 【图片压缩】三个方法压缩图片体积
  9. 【计算机】数据结构-严蔚敏/清华大学P3
  10. WinServer2012配置AD域