ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SQL必知必会 8-9

SQL必知必会 8-9

本文是个人学习笔记,学习素材参考《SQL必知必会(第5版)》,仅用于个人学习记录,非商用。样例数据、练习思路来自该书。

八.使用函数处理数据

8.1函数

SQL函数不可移植,意味着为特定SQL实现编写的代码在其他实现中可能不能用

DBMS函数的差异
函数语法
提取字符串的组成部分

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聚集函数

聚集函数:对某些行运行的函数,计算并返回一个值

SQL聚集函数
函数说明
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;#别忘了逗号,

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进