多表查询
一、多表合并
①会员累计销售额与总体销售表
1 select '总体销售额' as toall,sum(order_money) 2 from hy_order_20170410 3 union 4 select member_id,order_money 5 from hy_order_20170410
结果:

二、多表连接
1、笛卡尔连接
- 连接后的表行为m*n,列为a+b
- 运用此连接时,要加过滤条件,否则占用内存很大
1 -- 笛卡尔积 2 select * 3 from hy_order_20170410,hy_member_20170410 ;
结果:

2、内连接(inner join)
- 默认等值连接,保留连接表中的相同属性
1 select * 2 from hy_order_20170410 a 3 join hy_member_20170410 b on a.member_id=b.id
结果:

①通过内连接查找姓名、性别、年龄及消费金额的顾客(降序)
1 select a.name 2 ,a.sex 3 ,a.age 4 ,sum(b.order_money) 5 from hy_member_20170410 a 6 inner join hy_order_20170410 b on a.id=b.member_id 7 group by a.name 8 order by sum(b.order_money) desc
结果:

3、外连接
- 左关联(left join)
- 左表的数值全部留下,右表留下与左表相同属性值的行
- 右表没有与左表具有相同属性值时,右表表则为空行
1 select a.name 2 ,a.sex 3 ,a.age 4 ,b.order_money 5 from hy_member_20170410 a 6 left join hy_order_20170410 b on a.id=b.member_id
结果:
①通过外连接左关联查找姓名、性别、年龄及消费金额的顾客(降序)
1 -- 通过内连接查找姓名、性别、年龄及消费金额的顾客(降序) 2 select a.name 3 ,a.sex 4 ,a.age 5 ,sum(b.order_money) 6 from hy_member_20170410 a 7 left join hy_order_20170410 b on a.id=b.member_id 8 group by a.name 9 order by sum(b.order_money) desc
结果:

- 右关联(left join)
- 右表的数值全部留下,左表留下与右表相同属性值的行
- 左表没有与右表具有相同属性值时,左表则为空行
1 select a.name 2 ,a.sex 3 ,a.age 4 ,b.order_money 5 from hy_member_20170410 a 6 right join hy_order_20170410 b on a.id=b.member_id
结果:

①通过内连接查找姓名、性别、年龄及消费金额的顾客(降序)
1 select a.name 2 ,a.sex 3 ,a.age 4 ,sum(b.order_money) 5 from hy_member_20170410 a 6 right join hy_order_20170410 b on a.id=b.member_id 7 group by a.name 8 order by sum(b.order_money) desc
结果:

4、三表连接
- 如果左关联时,一般将要统计的数据表放在左边
①统计hy_orderitem_20170410中id的订单金额
1 select a.id 2 ,sum(b.order_money) 3 from hy_orderitem_20170410 a 4 left join hy_order_20170410 b on a.order_id = b.id 5 left join hy_member_20170410 c on c.id = b.member_id 6 group by a.id
结果:

三个表的基本字段

浙公网安备 33010602011771号