欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL创建计算字段、使用函数处理数据讲解

程序员文章站 2022-07-07 22:32:50
七、创建计算字段 计算字段并不实际存在于数据库中。计算字段是运行时在SELECT语句内创建的。 字段(field):基本上与列的意思相同,经常互换使用,不过数据库列一般称为列,...

七、创建计算字段

计算字段并不实际存在于数据库中。计算字段是运行时在SELECT语句内创建的。

字段(field):基本上与列的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用。(只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。)

举个实际的例子:一个一个报表需要一个值,表中有vend_name和vend_country两列,同时需要用括号将vend_country括起来,但是这些东西并没有存储在表中,那么该如何返回呢?

解决就是把两个列拼接起来。在SQL的SELECT语句中可以用一个特殊的操作符来拼接两个列。加号或者两个竖。

拼接:将值连接到一起(将一个值附加到另一个值)构成单个值。例如:

SELECT vend_name + ‘(’ + vend_country + ‘)’ FROM Vendors ORDER BY vend_name;

或:

SELECT vend_name || ‘(’ || vend_country || ‘)’ FROM Vendors ORDER BY vend_name;

根据以上写法返回的值会有空格的产生,但是很多时候我们并不需要这些空格,因此可以使用RTRIM()函数来完成。

SELECT vend_name || ‘(’ || RERIM(vend_country) || ‘)’ FROM Vendors ORDER BY vend_name;

RTRIM()会去掉值右边的空格。

小技巧:RTRIM()回去掉右侧的空格,LTRIM()会去掉左侧的空格,而TRIM()则会去掉左右两侧的空格。

由上边的例子可以知道,SELECT语句可以很好的拼接地址字段,但是也可以看出他并没有名字,那么该如何使用呢?不要慌,SQL支持别名。也就是一个字段或值的替换名。用AS关键字赋予。例如:

SELECT vend_name || ‘(’ || RERIM(vend_country) || ‘)’ AS vend_title FROM Vendors ORDER BY vend_name;

此时这个生成的新值他的字段名就是vend_title。(注:别名可以是一个单词也可以是一个字符串,如果是字符串的话应该括在一个括号里,但是通常不建议这么做,而是命名为一个单词比较好。)

计算字段的另一常见用途是对检索出的数据进行算数计算。举个例子,Orders表包含收到的所有订单,OrderItems表包含每个订单中的各项物品。下面的SQL语句检索订单号20008中的所有物品:

SELECT prod_id, quantity, item_price FROM OrderItems WHERE order_num = 20008;

item_price列包含订单中每项物品的单价。再乘以采购的数量的话,就可以按照下面方式写出。

SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM OrderItems WHERE order_num = 20008;

SQL中支持基本运算法则:+ - * /

小提示:如何测试计算?

SELECT语句为测试、检验函数和计算提供了很好的方法。虽然SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地访问和处理表达式,例如”SELECT 3\2;“将返回6;”SELECT Trim(‘abc’);“将返回abc;”SELECT Now();*”使用Now()函数将返回当前的日期和时间。

八、使用函数处理数据

文本处理函数:

函数 说明
LEFT() 返回字符串左边的字符
RIGHT() 返回字符串右边的字符
LENGTH() 返回字符串长度
LOWER() 将字符串转为小写
UPPER() 将字符串转为大写
LTRIM() 去掉字符串左边的空格
RTRIM() 去掉字符串右边的空格

日期和时间处理函数:

例如:检索2012年所有的订单:

SELECT order_num FROM Orders WHERE DATEPART(yy, order_date) = 2012;

在SQLite中有个小技巧:

SELECT order_num FROM Orders WHERE strftime(‘%Y’,order_date) = ‘2012’;

数值处理函数:

函数 说明
ABS() 返回一个数的绝对值
COS() 返回一个角度的余弦
EXP() 返回一个数的指数值
PI() 返回圆周率
SIN() 返回一个角度的正弦
SQRT() 返回一个数的平方
TAN() 返回一个角度的正切

具体的函数支持请参阅所使用DBMS的相关文档。

九、汇总数据

以实际使用函数为主。相对于数据处理函数来说,聚集函数得到了相当一致的支持。

聚集函数列表如下:

函数 说明
AVG() 返回某列的平均值
COUNT() 返回某列的行数
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和

因为这五个函数用法大致一样,因此之举AVG()一个例子:

SELECT AVG(prod_price) AS avg_price FROM Products WHERE vend_id = ‘DLL01’;

注意:AVG()只用于单个列,忽略列值为NULL的行。

聚集不同值:个人理解就是将要用于函数的列,只取其内部的不同值。例如:

SELECT AVG(DISTINCT prod_price) AS avg_price FROM Products WHERE vend_id = ‘DLL01’;

注意:DISTINCT不能用于count()。如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT()。类似的,DISTINCT必须使用列名,不能用于计算或表达式。同样,DISTINCT用于MAX()或MIN()是没有意义的。

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

SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS prod_max, AVG(prod_price) AS price_avg FROM Products;

SQL支持5个聚集函数,它们很高效一般比你在自己的客户端中计算的要快得多。