MySQL 《必知必会》 源码 二

0## 5. 计算字段, 函数, 分组

---------------------计算字段-------------------------

## 拼接字段: Concat() + 别名
## Concat可以把多个指定的串拼接成一个较长的串
SELECT Concat( vend_name, '(', vend_country, ')') 
AS vend_title 
FROM vendors 
ORDER BY vend_name;

----------------------处理函数-------------------------

## https://blog.csdn.net/sinat_38899493/article/details/78710482

----------------------汇总数据-------------------------
## 聚集函数: 运行在行组上, 计算和返回单个值的函数
## 1. AVG(): 返回平均值
SELECT AVG(prod_price) AS '平均值' 
FROM products;

## 2. COUNT(): 确定符合条件的行的数目
## 用法1: COUNT(*): 对表中行的数目进行统计, 包含NULL值行
SELECT COUNT(*)  
FROM products; ## 统计表中记录总数
## 用法2: COUNT(column): 对特定表进行统计行数
SELECT COUNT(prod_price)  
FROM products; ## 统计prod_price的记录数 

## 3. MAX(): 求最大值; MIN(): 求最小值; SUM(): 求总和

---------------------分组数据---------------------------

## 使用GROUP BY 和 HAVING进行数据分组
## 1. 根据vend_id分组, 查询出每个制造商的商品数, with rollup表示最后再加个总记录数
SELECT vend_id, COUNT(*) AS num_prod 
FROM products 
GROUP BY vend_id 
WITH ROLLUP;

## 2. 查询出订单数>=2的客户, HAVING过滤条件
SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*)>1;

## 3. 检索出商品数 >= 2, 价格>= 10 De 商品信息, HAVING + WHERE的组合过滤
SELECT vend_id, prod_price, COUNT(*) AS num_prods 
FROM products 
WHERE prod_price>=10 
GROUP BY vend_id 
HAVING COUNT(*) >= 2;

6. 子查询和联合查询

------------------------子查询----------------------------------

## 1. 最后一个字句返回产品id = TNT2的订单
##    倒数第二个 返回这两个订单的客户id
##    第一个 返回这个客户id对应的客户信息
SELECT cust_name, cust_contact 
FROM customers 
WHERE cust_id IN
(SELECT cust_id 
FROM orders 
WHERE order_num IN 
(SELECT order_num 
FROM orderitems 
WHERE prod_id = 'TNT2'));

## 2. 计算字段作为子查询
SELECT cust_name, 
cust_state, 
( SELECT COUNT(*) 
FROM orders 
WHERE orders.cust_id = customers.cust_id ) AS orders 
FROM customers
ORDER BY cust_name;

## 3. 使用联结进行查询
## 外键: 是某个表中包含另一个表主键值的一列, 定义了两个表的关系

## 建议使用 INNER JOIN来联结左右两个表, 因为ON确保不会遗忘连接条件 
SELECT vend_name, prod_name, prod_price 
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;

## 内部联结: INNER JOIN ... ON
## 外部联结: OUTER JOIN ... ON, 外部联结需要 LEFT 或 RIGHT 来制定左联结还是右联结
## LEFT表示选取左边表的所有行, RIGHT表示选取右边表的所有行

## 使用AND联结多个表: 
SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num
AND prod_id = 'TNT2'; 

-----------------------------高级联结----------------------------
## 使用表别名缩短SQL语句
SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = 'TNT2';

## 不同的连接: 
## COUNT()函数的联结: 检索所有客户以及每个客户的订单数
SELECT c.cust_name, c.cust_id, COUNT(o.order_num) AS num_ord
FROM customers AS c INNER JOIN orders AS o 
ON c.cust_id = o.cust_id
GROUP BY c.cust_id; 

7. 组合查询

## 使用UNION来将多条SELECT组合成一个结果

## 语句1 : 检索出价格小于等于5的记录
SELECT * 
FROM products 
WHERE prod_price <=5;

## 语句2 : 检索出10011002生产的商品
SELECT * 
FROM products 
WHERE vend_id IN(1001,1002);

## 使用UNION整合: 
SELECT * 
FROM products 
WHERE prod_price <=5
UNION
SELECT * 
FROM products 
WHERE vend_id IN(1001,1002);

## UNION规则: UNION会自动取消重复记录, 如果需要, 使用UNION ALL来包含所有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值