函数没有SQL的可移植性强,能运行在多个系统上的代码称为可移植的(portable),相对来说,多数SQL语句是可移植的,在SQL实现之间有差异时,这些差异通常不那么难处理。而函数的可移植性却不强。
大多数SQL实现支持以下类型的函数:
SELECT vend_name,Upper(vend_name) AS vend_name_upcase
FROM vendors
ORDER BY vend_name
Upper()将文本转换为大写
常用的文本处理函数
SOUNDEX:将任何文本串转换为描述其语音表示的字母数字模式的算法,对串进行发音比较而不是字母比较
SELECT cust_name,cust_contact
FROM customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Y.Lie')
SELECT cust_id,order_num
FROM orders
WHERE order_date = '2005-09-01';
但有时表中给出的日期会精确到秒,故可以用Date函数
SELECT cust_id,order_num
FROM orders
WHERE Date(order_date) = '2005-09-01';
注:如果要的是日期,请使用Date()
BETWEEN操作符用来把2005-09-01和2005-09-30定义为一个要匹配的日期范围
SELECT cust_id,order_num
FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
Year()是一个从日期(或日期时间)中返回年份的函数。类似,Month()从日期中返回月份。
SELECT cust_id,order_num
FROM orders
WHERE YEAR(order_date) = 2005 AND Month(order_date) = 9;##检索出order_date为2005年9月的所有行
检索例子:
AVG()通过对表中行数计数并计算特定列值之和,求得该列的平均值。AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。
SELECT AVG(prod_price) AS avg_price
FROM products
注:
COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目
COUNT()函数有两种使用方式:
SELECT COUNT(*) AS num_cust
FROM customers
只对具有电子邮件地址的客户计数
SELECT COUNT(cust_email) AS num_cust
FROM customers
SELECT MAX(prod_price) AS max_price
FROM products
注:
SELECT MIN(prod_price) AS max_price
FROM products
注:
SUM()用来返回指定列值的和(总计)
SELECT SUM(item_price * quantity) AS total_price
FROM orderitems
WHERE order_num = 20005
注:
1.在多个列上进行计算:如本例所示,利用标准的算术操作符,所有聚集函数都可用来执行多个列上的计算
2.NULL值:SUM()函数忽略列值为NULL的行
以上5个聚集函数都可以如下使用:
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id= 1003;
注:
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;
返回供应商1003提供的产品数目
SELECT COUNT(*) AS num_prods
FROM products;
WHERE vend_id = 1003
那么如果返回每个供应商的产品数目怎么办?或者只提供单项产品的供应商所提供的的产品,或提供10个以上产品的供应商怎么办?引入创建分组
SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
在具体使用GROUP BY子句前,需要知道一些重要的规定:
SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id WITH ROLLUP;
注:可以显示出null的个数,如不加WITH ROLLUP,则看不到null的个数
where过滤行而having过滤分组,所有类型的where都可以利用having来代替,WHERE在数据
分组前进行过滤,HAVING在数据分组后进行过滤
SELECT cust_id,COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2
SELECT vend_id,COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;
SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id
HAVING COUNT(*) >= 2;
虽然GROUP BY和ORDER BY经常完成相同的工作,但它们是非常不同的
注:一般在使用GROUP BY子句时,应该也给
出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据
SELECT order_num,SUM(quantity * item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(order_num * quantity) >=50;
 AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(order_num * quantity) >=50
order by ordertotal;