3.1 创建计算字段
计算字段
拼接字段
SELECT语句 中可以使用Contact()函数来连接两个列。
SELECT Contact(name, '(', country, ')')
FROM vendors
ORDER BY name
Rtrim可以删除数据右侧多余的空格
Ltrim左侧
Trim删除
两边的空格
SELECT Contact(Rtrim(name), '(', Rtrim(country), ')')
FROM vendors
ORDER BY name
使用别名
SELECT Contact(Rtrim(name),
'(', Rtrim(country), ')') AS title
FROM vendors
ORDER BY name
SQL创建 了一个包含一个包含指定计算的名为title的计算字段
执行算术计算
SELECT id, quantity, price,
quatity*price AS expanded_price
FROM orderitems
WHERE order_num=2005
3.2 使用数据处理函数
文本处理函数
SELECT name, Upper(name)
AS name_upcase
FROM vendors
ORDER BY name
日期和时间处理函数
SELECT id, num
FROM orders
WHERE Data(order_date)='2008-08-01';
如果要的是日期,请使用Date()
同样的,时间:Time();
某一日期内的订单
SELECT id, num
FROM orders
WHERE Data(order_date) BETWEEN '2008-08-01' AND '2009-08-01';
3.3 汇总数据
聚集函数
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
AVG()
SELECT AVG(price) AS avg_price
FROM orderitems
WHERE id=2005
AVG()忽略列值为NULL的行
COUNT()
- COUNT(*) 对表中行的数目 进行计算,不管为NULL或者非NULL
- COUNT(column) 对特定列中的具有值 的行进行计算,忽略NULL值
MAX()
SELECT MAX(price) AS max_price
FROM orderitems
MIN()
SUM()
聚集不同值
ALL为默认
只包含不同的值,指定DISTINCT参数
COUNT(DISTINCT pro_price)
组合聚集函数
3.4 分组数据
GROUP BY
HAVING
创建分组
SELECT id, COUNT(*) AS num_ic
FROM goods
GROUP BY id;
GROUP BY要在WHERE之后,ORDER BY之前
过滤分组
WHERE是过滤行
HAVING是过滤分组
GROUP BY 后接HAVING
SELECT id, COUNT(*) AS orders
FROM goods
GROUP BY id
HAVING COUNT(*) >=2
下面是列出具有2个以上的、价格为10(含)以上的产品:
SELECT id, COUNT(*) AS num
FROM goods
WHERE price >= 10
GROUP BY id
HAVING COUNT(*) >=2
分组和排序
ORDER BY | GROUP BY |
---|---|
排序产生的顺序 | 分组行,但输出可能还是分组的顺序 |
任意列均能使用 | 仅可能 使用选择列或表达式列 |
不一定需要 | 如果与聚集函数一起使用,则必须使用 |
想要顺序一定要用ORDER BY
SELECT子句顺序
SELECT—>FROM—>WHERE—>GROUP BY—>HAVING—>ORDER BY—>LIMIT
3.5 使用子查询
利用子查询进行过滤
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order _num
FROM orderitems
WHERE pros_id='TNT2'));
实际使用时由于性能 的限制,不能嵌套太多的子查询
作为计算字段使用子查询
1.从customers表中检索客户的列表
2.对于 检索出的每个客户,统计其在order表中的订单数目
SELECT cust_name,
cust_state
((SELECT COUNT(*)
FROM orders
WHERE order.cust_id=customer.cust_id) AS orders
FROM customers
ORDER BY cust_name;