标签:圆周率 左右 排序 customers sub mon 汇总 price trim
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没有意义。
组合聚集函数:
聚集函数可以组合使用。
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
ACG(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行数。
相关子查询:涉及外部查询的子查询。
任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。
标签:圆周率 左右 排序 customers sub mon 汇总 price trim
原文地址:https://www.cnblogs.com/cjj-ggboy/p/12535099.html