5.1.8 小结及多表连接的操作方法
2020年4月1日
12:52
内连接：inner join 如果表中至少有一个匹配，就返回行
左连接：会从左表中返回所有的值，即使右表中没有匹配
右连接：会从右表中返回所有的值，即使左表中没有匹配
拿到一个需求时，先学会分析：
（1）我要查询哪些数据？ Select 字段名1,字段名2,……
（2）从哪几个表中查？ From 表  或 XXX join连接表 ON 连接条件
（3）假设存在多张表查询，慢慢来，先查询两张表，再慢慢增加
例1：把销售表中的店名V过来，把商品名称V过来，要求表头是：
日期，店号，店名，商品编码，商品名称，销售数量，销售成本，销售金额，毛利额
第一步：先把销售表和店铺表做连接，把店名先V来过
 SELECT 日期,a.店号,店名,销售数量
 FROM 销售表 a 
 LEFT JOIN 店铺表 b
 ON a.店号=b.店号
第二步：再连接商品表，可以使用商品表中的商品名称、进价、售价
SELECT 日期,a.店号,店名,a.商品编码,商品名称,销售数量,销售数量*进价 AS 销售成本,销售数量*售价 AS 销售金额,销售数量*(售价-进价) AS 毛利额
FROM 销售表 a 
LEFT JOIN 店铺表 b
ON a.店号=b.店号
LEFT JOIN 商品表 c
ON a.商品编码=c.商品编码
例2：在例1的基础上，我想筛选时间为2020.01.01至2020.01.03
SELECT 日期,a.店号,店名,a.商品编码,商品名称,销售数量,销售数量*进价 AS 销售成本,销售数量*售价 AS 销售金额,销售数量*(售价-进价) AS 毛利额
FROM 销售表 a 
LEFT JOIN 店铺表 b
ON a.店号=b.店号
LEFT JOIN 商品表 c
ON a.商品编码=c.商品编码
WHERE 日期 BETWEEN '2020-01-01' AND '2020-01-03'
例3：在例2的基础上，假设我有100多家店铺，我只想看其中3家店铺的数据，查询1，3，7三家店铺的数据
SELECT 日期,a.店号,店名,a.商品编码,商品名称,销售数量,销售数量*进价 AS 销售成本,销售数量*售价 AS 销售金额,销售数量*(售价-进价) AS 毛利额
FROM 销售表 a 
LEFT JOIN 店铺表 b
ON a.店号=b.店号
LEFT JOIN 商品表 c
ON a.商品编码=c.商品编码
WHERE a.店号 IN (1,3,7) AND 日期 BETWEEN '2020-01-01' AND '2020-01-03'
例4：我现在不想要零散的日数据，我想要这三天，每家店铺的 总销售数量，总销售金额，总毛利额
SELECT a.店号,店名,sum(销售数量) AS 总销售,sum(销售数量*进价) AS 总成本,sum(销售数量*售价) AS 总金额,sum(销售数量*(售价-进价)) AS 毛利额
FROM 销售表 a 
LEFT JOIN 店铺表 b
ON a.店号=b.店号
LEFT JOIN 商品表 c
ON a.商品编码=c.商品编码
WHERE a.店号 IN (1,3,7) AND 日期 BETWEEN '2020-01-01' AND '2020-01-03'
GROUP BY a.店号