# MySQL基础03

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子句过滤组
TO BE CONTINUED...
posted @ 2020-09-25 20:11  Haloya  阅读(77)  评论(0编辑  收藏  举报