本文是个人学习笔记,学习素材参考《SQL必知必会(第5版)》,仅用于个人学习记录,非商用。样例数据、练习思路来自该书。
八.使用函数处理数据
8.1函数
SQL函数不可移植,意味着为特定SQL实现编写的代码在其他实现中可能不能用
| 函数 | 语法 |
| 提取字符串的组成部分 | DB2,Oracle,PostgreSQL,和SQLite使用SUBSTR() MariaDB,MYSQL和SQL Server使用SUBSTRING() |
| 数据类型转换 | Oracle使用多个函数,每种类型的转换有一种函数 DB2和PostgreSQL使用CAST() MariaDB,MYSQL和SQL Server使用CONVERT() |
| 取当前日期 | DB2和PostgreSQL使用CURRENT_DATA MariaDB和MYSQL使用CURDATE() Oracle使用SYSDATA SQL Server使用GETDATA() SQLite使用DATA() |
8.2使用函数
8.2.1文本处理函数
例:UPPER()将文本转换为大写
SELECT VEND_NAME,UPPER(VEND_NAME)AS VEND_NAME_UPCASE
FROM VENDORS
ORDER BY VEND_NAME;
| 函数 | 说明 |
| LEFT() | 返回字符串左边的字符 |
| LENGTH() | 返回字符串的长度 |
LOWER() | 将字符串转换为小写 |
| LTRIM() | 去掉字符串左边的空格 |
| RIGHT() | 返回字符串右边的字符 |
| RTRIM() | 去掉字符串右边的空格 |
| SUBSTR()或SUBSTRING() | 提取字符串的组成部分 |
| SOUNDEX() | 返回字符串的SOUNDEX值 |
| UPPER() | 将字符串转换为大写 |
SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法
例:有个顾客联系名输入错误成Michelle Green,正确的是Michael Green,在不知道错误输入的联系名的情况下如何找出
SELECT CUST_NAME,CUST_CONTACT
FROM CUSTOMERS
WHERESOUNDEX(CUST_CONTACT)=SOUNDEX('Michael Green');
8.2.2日期和时间处理函数
在SQL Server中用DATEPART(),这个函数有两个参数,分别是返回的成分和从中返回成分的日期
在PostgreSQL中用DATE_PART()
在Oracle中用EXTRACT()、BETWEEN
to_date()函数用来将两个字符串转换为日期
DB2,MYSQL,MariaDB用户可使用名为YEAR()的函数从日期中提取年份
SELECT ORDER_NUM
FROM ORDERS
WHEREYEAR(ORDER_DATE)= 2020;
8.2.3数值处理函数
| 函数 | 说明 |
| ABS() | 返回一个数的绝对值 |
| COS() | 返回一个角度的函数 |
| EXP() | 返回一个数的指数值 |
| PI() | 返回圆周率Π的值 |
| SIN() | 返回一个角度的正弦 |
| SQRT() | 返回一个数的平方根 |
| TAN() | 返回一个角度的正切 |
九.汇总数据
9.1聚集函数
聚集函数:对某些行运行的函数,计算并返回一个值
| 函数 | 说明 |
| AVG() | 返回某列的平均值 |
| COUNT() | 返回某列的行数 |
| MAX() | 返回某列的最大值 |
| MIN() | 返回某列的最小值 |
| SUM() | 返回某列值之和 |
9.1.1 AVG()函数
AVG()通过对表中行数计数并计算其列值之和,求得该列的平均值
例:返回Product表中所有产品的平均值
SELECTAVG(PROD_PRICE)AS AVG_PRICE
FROM PRODUCTS;
AVG()也可以用来确定特定列或行的平均值
SELECTAVG(PROD_PRICE)AS AVG_PRICE
FROM PRODUCTS
WHERE VEND_ID = 'DLL01';
注意:AVG()只用于单个列,想获得多个列的平均值必须使用多个AVG()函数,AVG()函数忽略列值为null的行
9.1.2 COUNT()函数
COUNT()确定表中行的数目或符合特定条件的行的数目
COUNT(*)对表中所有行的数目进行计数
COUNT(column)对特定列中具有值的行进行计数,忽略null值
例:返回customers表中顾客的总数
SELECTCOUNT(*)AS NUM_CUST
FROM CUSTOMERS;
例:只对具有电子邮件地址的客户计数
SELECTCOUNT(CUST_EMAIL)AS NUM_CUST
FROM CUSTOMERS;
如果指定列名,则COUNT()函数会忽略指定列的值为NULL的行
如果用的是COUNT(*)则不忽略
9.1.3 MAX()函数
MAX()返回指定列中的最大值,MAX()要求指定列名
SELECTMAX(PROD_PRICE)AS MAX_PRICE
FROM PRODUCTS;
提示:在用于非数值的文本数据时,MAX()返回按改列排序后的最后一行,
MAX()函数忽略列值为NULL的行
9.1.4 MIN()函数
MIN()返回指定列的最小值,要求指定列名
SELECTMIN(PROD_PRICE)AS MIN_PRICE
FROM PRODUCTS;
提示:在用于非数值的文本数据时,MIN()返回该列排序后最前面的行
MIN()函数忽略列值为NULL的行
9.1.5 SUN()函数
SUM()用来返回指定列值的和
SELECTSUM(QUANTITY)AS ITEM_ORDERED
FROM ORDERITEMS
WHERE ORDER_NUM = 20005;
提示:所有聚集函数都可用来执行多个列上的计算
SUM()函数忽略列值为NULL的行
9.2 聚集不同值
以上5个聚集函数都可以如下使用
- 对所有行执行计算,指定ALL参数或不指定参数(因为ALL是默认行为)
- 只包含不同值,指定DISTINCT参数
例:使用AVG()函数返回特定供应商提供的产品的平均价格
SELECT AVG(DISTINCTPROD_PRICE) AS AVG_PRICE
FROM PRODUCTS
WHERE VEND_ID = 'DLL01';
注意:DISTINCT不能用于COUNT(*),DISTINCT必须使用列名,不能用于计算或表达式
9.3 组合聚集函数
SELECT COUNT(*) AS NUM_ITEMS,
MIN(PROD_PRICE) AS PRICE_MIN,
MAX(PROD_PRICE) AS PRICE_MAX,
AVG(PROD_PRICE) AS PRICE_AVG
FROM PRODUCTS;#别忘了逗号,