第十章到第十四章
第十章
拼接字段, 用Concat()函数来拼接两个列
SELECT Concat(vend_name, ' (', vend_country, ')')
FROM vendors
ORDER BY vend_name;
输出如下类型
ACME (USA)
Anvils R US (USA)
通过RTrim()函数来删除数据右侧多余的空格来整理数据
SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')')
FROM vendors
ORDER BY vend_name;
LTrim()用来删除左侧空格, Trim()删除两侧空格。
使用别名,AS关键词
SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title
FROM vendors
ORDER BY vend_name;
算术计算
SELECT prod_id,
quantity,
item_price,
quantity * item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
第十一章
文本处理函数,Upper()函数
SELECT vend_name, Upper(vend_name) AS vend_name_upcase
FROM vendors
ORDER BY vend_name;
Soundex()函数匹配发音类似Y.Lie的联系名
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';
如果order_date里包含具体时间的话,用Data()函数来取其中的日期进行比较
SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) = '2005-09-01';
匹配某一月所有日期,两种方法
SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
SELECT cust_id, order_num
FROM orders
WHERE Year(order_date) = 2005 AND Month(order_date) = 9;
后者不需要操心每月有多少天。
第十二章
AVG()函数
SELECT AVG(prod_price) AS avg_price
FROM products;
返回特定供应商提供产品的平均价格
SELECT AVG(prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;
COUNT()函数
COUNT(*)对所有行进行计数,包括NULL值
COUNT(column)对特定列具有值的行进行计数
SELECT COUNT(*) AS num_cust
FROM customers;
SELECT COUNT(cust_email) AS num_cust
FROM customers;
MAX()函数,对于非数据列,MAX()函数返回最后一行,且忽略NULL值
SELECT MAX(prod_price) AS max_price
FROM products;
MIN()函数,对于非数据列,MIN()函数返回最前面一行,且忽略NULL值
SELECT MIN(prod_price) AS min_price
FROM products;
SUM()函数
SELECT SUM(quantity) AS items_ordered
FROM orderitems
WHERE order_num = 20005;
SELECT SUM(quantity*item_price) AS total_price
FROM orderitems
WHERE order_num = 20005;
聚集不同的值,DISTINCT
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;
使用了DISTINCT之后,平均值只考虑各个不同的价格
DISTINCT必须使用列名,不能用于COUNT(*),即COUNT(DISTINCT)是错误的
组合聚集函数
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;
第十三章
创建分组
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
这里对每个vend_id而不是整个列表计算num_prod一次
过滤分组
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
先过滤掉prod_price < 10的产品,在进行分组
SELECT vend_id, COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;
不能仅依赖GROUP BY的排序,使用ORDER BY
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50
ORDER BY ordertotal;
若没有最后一句,结果会按照order_num升序排列,若加上最后一句话,结果按ordertotal升序排列
SLELCT子句顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
第十四章
子查询
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';
根据查询到的order_num进一步查询
SELECT cust_id
FROM orders
WHERE order_num IN (20005, 20007);
根据查询到的cust_id进一步查询
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (10001, 10004);
这三次查询可以整合
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orderts
WHERE order_num IN (SELECT order_num
FROM order_items
WHERE prod_id = 'TNT2'));
由于性能限制,不能嵌套太多的子查询。
对客户10001的订单进行计数
SELECT COUNT(*) AS orders
FROM orders
WHERE cust_id = 10001;
对每个客户执行COUNT(*),将此作为一个子查询
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;
在此子查询中
customers中cust_id有10001, 10002, 10003, 10004, 10005
而orders中cust_id有10001, 10001, 10003, 10004, 10005
因此对于每个customers中的cust_id, COUNT(*)返回该cust_id在orders中的数量。