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