MySQL 4 数据处理函数、汇总数据、分组数据、子查询

1. 使用数据处理函数

SQL支持利用函数来处理数据。前一章使用的Trim()就是一个删除字符串左右空格的函数。

处理文本串、用于在数值数据上进行算术操作、用于处理日期和时间值、返回DBMS正使用的特殊信息。

文本处理函数:

Upper()函数:

  SELECT vend_name, Upper(vend_name) AS vend_name_upcase

  FROM vendors

  ORDER BY vend_name;

Upper()函数将文本转换为大写。

常用的文本处理函数:

函数  说明

Left()  返回串左边的字符

Length()  返回串的长度

Locate()  找出串的一个子串

Lower()  将串转换为小写

LTrim()  去掉串左边的空格

Right()  返回串右边的字符

RTrim()  去掉串右边的空格

Soundex()  返回串的SOUNDEX值

SubString()  返回子串的字符

Upper()  将串转换为大写

日期和时间处理函数:

采用特殊的格式存储,以便能够快速有效地排序或过滤,并且节省存储空间。

常用的日期和时间处理函数:

AddDate()  增加一个日期(天、周等)

AddTime()  增加一个时间(时、分等)

CurDate()  返回当前日期

CurTime()  返回当前时间

Date()  返回日期时间的日期部分

DateDiff()  计算两个日期之差

Date_Add()  高度灵活的日期运算函数

Date_Format()  返回一个格式化的日期或时间串

Day()  返回一个日期的天数部分

DayOfWeek()  对于一个日期,返回对应的星期几

Hour()  返回一个时间的小时部分

Minute()  返回一个时间的分钟部分

Month()  返回一个日期的月份部分

Now()  返回当前日期和时间

Second()  返回一个时间的秒部分

Time()  返回一个日期时间的时间部分

Year()  返回一个日期的年份部分

日期格式必须是yyyy-mm-dd

数值处理函数:

仅仅处理数值数据。一般用于代数、三角或几何运算。

Abs()  返回一个数的绝对值

Cos()  返回一个角度的余弦

Exp()  返回一个数的指数值

Mod()  返回除操作的余数

Pi()  返回圆周率

Rand()  返回一个随机数

Sin()  返回一个角度的正弦

Sqrt()  返回一个数的平方根

Tan()  返回一个角度的正切

2. 汇总数据

我们经常需要汇总数据而不用把它们检索出来。

确定表中行数(或者满足某条件的行数)、获得表中行组的和、找出表列的最大值、最小值和平均值。

聚集函数:运行在行组上,计算和返回单个值的函数。

AVG()  返回某列的平均值

COUNT()  返回某列的行数

MAX()  返回某列的最大值

MIN()  返回某列的最小值

SUM()  返回某列之和

AVG()函数:

对表中行数计数并计算特定列值之和,求得该列的平均值。AVG()可用来返回所有列的平均值,也可用来返回特定列或行的平均值。

  SELECT AVG(prod_price) AS avg_price

  FROM products;

只列出别名avg_price和它代表的列的平均值。

AVG()函数忽略列值为NULL的行。

COUNT()函数:

COUNT()函数进行计数。可用来确定表中行的数目或符合特定条件的行的数目。

COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值NULL还是非空值。

COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。

  SELECT COUNT(*) AS num_cust

  FROM customers;

MAX()函数:

返回指定列中的最大值。MAX()要求指定列名。

  SELECT MAX(prod_price) AS max_price

  FROM products;

这里返回了products表中最贵的物品的价格。

MAX()可用于非数值数据,按字典序排序的最大值,即A和Z两个时选择Z。

MAX()忽略列值为NULL的行。

MIN()函数:

返回指定列的最小值。也要求指定列名。

  SELECT MIN(prod_price) AS min_price

  FROM products;

MIN()也可用于非数值数据。忽略NULL值。

SUM()函数:

用来返回指定列值的和(总计)。

  SELECT SUM(quantity) AS items_ordered

  FROM orderitems

  WHERE order_num = 20005;

聚集函数的参数可用于算术运算的聚集,如:SUM(A*B) AS cjj。。统计列A*B的最大值。

聚集不同的值:

以上5个聚集函数都可以使用:对所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为);只包含不同的值,指定DISTINCT参数。

ALL是默认的。

  SELECT AVG(DISTINCT prod_price) AS avg_price

  FROM products

  WHERE vend_id = 1003;

DISTINCT不能用于COUNT。DISTINCT用于MAX和MIN没有意义。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;

3. 分组数据

涉及新的SELECT语句子句,分别是GROUP BY 子句和HAVING子句。

创建分组:

分组是在SELECT语句的GROUP BY子句中建立的。

  SELECT vend_id, COUNT(*) AS num_prods

  FROM products

  GROUP BY vend_id;

GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。

GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。

如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算。

GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名。

除了聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。

如果分组中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。

GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

过滤分组:

WHERE针对的是行记录,HAVING子句过滤分组。

  SELECT cust_id, COUNT(*) ASorders

  FROM orders

  GROUP BY cust_id

  HAVING COUNT(*) >= 2;

HAVINF针对的是该过程中的分组。其后跟着的条件是满足的。

HAVING和WHERE可以一起使用:

  SELECT vend_id, COUNT(*) AS num_prods

  FROM products

  WHERE prod_price >= 10

  GROUP BY vend_id

  HAVING COUNT(*) >= 2;

上述语句先在满足WHERE的条件下,再进行分组,并对分组进行过滤。

分组和排序:

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 BY ordertotal;

SELECT子句的顺序:

SELECT  要返回的列或表达式  必须使用

FROM  从中检索数据的表  仅在从表选择数据时使用

WHERE  行级过滤  不是必须使用

GROUP BY  分组说明  仅在按组计算聚集时使用

HAVING  分组过滤  不是必须使用

ORDER BY  输出排序顺序  不是必须使用

LIMIT  要检索的行数  不是必须使用

4. 使用子查询

查询:任何SQL语句都是查询。但此术语一般指SELECT语句。

SQL允许创建子查询,即嵌套在其它查询中的查询。

  SELECT cust_id

  FROM orders

  WHERE order_num IN (SELECT order_num

             FROM orderitems

             WHERE prod_id = 'TNT2');

在SELECT语句中,子查询总是从内向外处理。在处理上面的SELECT语句时,MySQL实际上执行了两个操作。

子查询可以有两级至多级。由于性能的限制,不能嵌套太多的子查询。

列必须匹配:在WHERE子句中使用子查询,应该保证SELECT语句具有WHERE子句中相同数目的列。

子查询一般与IN操作符结合使用,但也可用于测试等于(=)、不等于(<>)等。

作为计算字段使用子查询:

假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。从customers表中检索客户列表,对于检索出的每个客户,统计其在orders表中的订单数目。

  SELECT cust_name,

      cust_state,

      (SELECT COUNT(*)

       FROM orders

       WHERE orders.cust_id = customers.cust_id) AS orders

  FROM customers

  ORDER BY cust_name;

外层SELECT每次选择一行,对于每一行的cust_id进行一个内存查询,找出在另一个表中为该id的COUNT行数。

相关子查询:涉及外部查询的子查询。

任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。

原文地址:https://www.cnblogs.com/cjj-ggboy/p/12535099.html