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

七、创建计算字段

计算字段并不实际存在于数据库中。计算字段是运行时在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个聚集函数,它们很高效一般比你在自己的客户端中计算的要快得多。

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐