MySQL基础03
1. 创建计算字段
1.1 计算字段
- 计算字段是运行时在SELECT语句内创建的。
1.2 拼接字段
-
拼接(concatenate) 将值联结到一起构成单个值。
-
在MySQL的SELECT语句中,可使用
Concat()
函数来拼接两个列。SELECT Concat(vend_name, ' (', vend_country, ')') FROM vendors ORDER BY vend_name;
Concat()
拼接串,即把多个串连接起来形成一个较长的串。Concat()
需要一个或多个指定的串,各个串之间用逗号分隔。
使用别名
别名(alias)是一个字段或值的替换名。别名用AS
关键字赋予。
SELECT Concat(vend_name, ' (', vend_country, ')') AS vend_title
FROM vendors
ORDER BY vend_name;
- 它指示SQL创建一个包含指定计算的名为vend_title的计算字段。
- 从输出中可以看到,结果与以前的相同,但现在列名为vend_title,任何客户机应用都可以按名引用这个列,就像它是一个实际的表列一样。
1.3 执行算术计算
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
- 输出中显示的expanded_price列为一个计算字段,此计算为quantity*item_price。
2. 数据处理函数
2.1 文本处理函数
函数 | 说明 |
---|---|
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个子串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉串左边的空格 |
Right() | 返回串右边的字符 |
RTrim() | 去掉串右边的空格 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 将串转换为大写 |
Soundex()
SOUNDEX
是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。
customers表中有一个顾客Coyote Inc.,其联系名为Y.Lee。但如果这是输入错误,此联系名实际应该是Y.Lie,怎么办?显然,按正确的联系名搜索不会返回数据,如下所示:
SELECT cust_name, cust_contact
FROM customers
WHERE cust_contact = 'Y. Lie';
现在试一下使用Soundex()函数进行搜索,它匹配所有发音类似于Y.Lie的联系名:
SELECT cust_name, cust_contact
FROM customers
WHERE Soundex(cust_contact) = Soundex('Y. Lie');
- 因为Y.Lee和 Y.Lie发音相似,所以它们的SOUNDEX值匹配,因此WHERE子句正确地过滤出了所需的数据。
2.2 日期和时间处理函数(略)
2.3 数据处理函数(略)
3. 聚集函数
聚集函数(aggregate function) 运行在行组上,计算和返回单个值的函数。
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列的之和 |
4. 分组
-
GROUP BY子句
-
HAVING子句
4.1 GROUP BY子句创建分组
分组是在SELECT语句的GROUP BY子句中建立的。
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
- 上面的SELECT语句指定了两个列,vend_id包含产品供应商的ID,num_prods为计算字段(用COUNT(*)函数建立)。
GROUP BY
子句指示MySQL按vend_id排序并分组数据。
4.2 HAVING子句过滤分组
HAVING
非常类似于WHERE,唯一的差别是WHERE过滤行,而HAVING
过滤分组。
HAVING支持所有WHERE操作符
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
- 这条SELECT语句的前3行类似于上面的语句。最后一行增加了
HAVING
子句,它过滤COUNT(*) >=2(两个以上的订单)的那些分组。
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING orders >= 2;
- 这个代码和上面的等价。
HAVING和WHERE的差别
- WHERE在数据分组前进行过滤,过滤的是行。
- HAVING在数据分组后进行过滤,过滤的是分组。
4.3 分组和排序
ORDER BY | GROUP BY |
---|---|
排序产生的输出 | 分组行,但输出可能不是分组的顺序 |
任意列都可以使用,甚至非选择的列也可以使用 | 只可能使用选择列或者表达列,而且必须使用每个选择列表达式 |
不一定需要 | 如果与聚集函数一起使用列或表达式,则必须使用 |
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50;
- 输出按照order_num排序。
为按总计订单价格排序输出,需要添加ORDER BY子句,如下所示:
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(ordertotal) >= 50
ORDER BY ordertotal;
- 按订单总价排序输出。
4.4 SELECT子句顺序
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
LIMIT | 要检索的行数 | 否 |
5. 小结
- Concat()拼接函数
- AS取别名
- 聚集行数AVG()、SUM()、 MAX()、 MIN()、 COUNT()
- 分组的GROUP BY子句和HAVING子句过滤组