SQL必知必会-读书笔记(10-13章)
十、创建计算字段
字段(field ):与列的意思相同,经常可以互换。
1.拼接:
concat()需要1个或多个制定的串,各个串之间用逗号分隔。
拼接后命名:AS
SELECT Concat(Rtrim(vend_name),'(',Rtrim(vend_country),')') AS
vend_title
FROM vendors
ORDER BY vend_name;
***Rtrim()去掉右边空格,Ltrim()去掉左边空格,Trim去掉离两边空格
2.算术计算
支持使用的操作符:+ - * / (加减乘除)
SELECT prod_id,quantity,item_price,quantity*item_price AS enpanded_price
FROM orderitems
WHERE order_num=20005;
十一、使用数据处理函数
**不同DBMS支持的函数差异很大
**多数SQL支持处理:文本(删除或增加填充值,大小写转换),算术计算(返回绝对值,代数运算),时间函数(返回日期之差),返回DBMS正在使用的特殊信息(返回用户登录信息,检查版本细节等)。
1.文本处理函数
![aba38a01305ce6f9c7364c76d2b9d266.png](https://i-blog.csdnimg.cn/blog_migrate/077b4e79bf810c6d87c266db0e9e34c0.png)
Soundex()函数,能够匹配虽有发音类似的词
SELECT cust_name,cust_contact
FROM custormers
WHERE Soundex(cust_contact)=Soundex('Y Lie');
2.日期和时间处理函数
![ebedd103b2c12ffa9bf9d6a9c2398080.png](https://i-blog.csdnimg.cn/blog_migrate/96d3515da336ed6dc14664ed3693a9ff.jpeg)
SELECT cust_id,order_num
From orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
SELECT cust_id,order_num
From orders
WHERE Year(order_date)=2005 AND Month(order_date)=9;
3.数值处理函数
一般用于代数、三角函数、几何运算,使用并不频繁
![178809e94d543e954b3bdd193c3b4530.png](https://i-blog.csdnimg.cn/blog_migrate/f2dec816e3b47001c6a3a443991303b0.png)
十二、汇总数据
1.聚集函数
![8afb3f386ab0c40142a100360b9c42d3.png](https://i-blog.csdnimg.cn/blog_migrate/44302ed274848bcc1117809ba3087f8b.png)
SELECT AVG(prod_price) AS avg_price
FROM products;
AVG()只能用于单列
COUNT(*)对所有列进行计数
COUNT(column)对特定列进行计数,忽略NULL值
MAX(column) MIN(column) ,忽略NULL值
SUM() 括号内支持进行算术计算
SELECT SUM(item_price*quantity) AS total_price
FROM orderitems
WHERE order_num =20005;
2.聚集不同值
DISTINCT参数,使用后只计算那些取值不同的聚集值
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM product
WHERE vend_id=1003;
3.组合聚集函数
即在一个SELECT语句中可以同时使用多种聚集函数
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;
十三、分组数据
1.创建分组【GROUP BY】
SELECT vend_id,COUNT(*) AS num_prod
FROM products
GROUP BY vend_id;
#如果在SELECT中使用表达式,必须在GROUP BY子句中使用相同的表达式。不能用别名
#除聚集计算语句外,SELECT语句中的而每个列都必须在GROUP BY 子句中给出
#如果分组列中有NULL值,则NULL将作为一个分组返回。
#GROUP BY子句必须在WHERE之后,ORDER BY 子句之前。
2.过滤分组【HAVING】
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*)>=2;
#HAVING 和 WHERE的区别:
1.HAVING在分组后,WHERE分组前
2.HAVING过滤分组,WHERE过滤行
3.分组和排序
![f37317f8fbab38b159c8622a09b137e8.png](https://i-blog.csdnimg.cn/blog_migrate/0a1c5730d1f2fd659a0485720c0208d2.png)
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price)>=50
ORDER BY ordertotal;
4.SELECT子句顺序
![abed1b46e328279a21f30dc7e96bf5b8.png](https://i-blog.csdnimg.cn/blog_migrate/0205f5d7ee80f271d8d3b2d547ba8db5.png)