Mysql中的左右连接union操作

<?php
/*
燕十八 公益PHP培训 
课堂地址:YY频道88354001 
学习社区:www.zixue.it 



<1>:Mysql中的左连接.

	select 字段1,字段2,字段3 from tableA left join tableB on tableA.字段1=tableB.字段1;

	将表A 和表B 两张表连接起来 查询两张表中所有的字段 当两张表中的字段同时都有的时候,前面加上表的名称如:table.字段来区别;

	实例1:
	a:goods表
	+--------+---------------------+------------+
	| cat_id | goods_name          | shop_price |
	+--------+---------------------+------------+
	|      4 | KD876               |    1388.00 |
	|      8 | 诺基亚N85原装充电器  |      58.00 |
	|      8 | 诺基亚原装5800耳机  |      68.00 |
	|     11 | 索爱原装M2卡读卡器   |      20.00 |
	|     11 | 胜创KINGMAX内存卡   |      42.00 |
	+--------+---------------------+------------+
	b:category表
	+--------+-------------------+
	| cat_id | cat_name          |
	+--------+-------------------+
	|      1 | 手机类型          |
	|      2 | CDMA手机             |
	|      3 | GSM手机              |
	|      4 | 3G手机               |
	|      5 | 双模手机               |
	|      6 | 手机配件                 |
	|      7 | 充电器                  |
	|      8 | 耳机                  |
	|      9 | 电池                  |
	|     11 | 读卡器和内存卡               |
	|     12 | 充值卡                 |
	|     13 | 小灵通/固话充值卡             |
	|     14 | 移动手机充值卡        |
	|     15 | 联通手机充值卡   |
	+--------+-------------------+

	根据cat_id 取到商品的所属分类 结果如下

	+--------+---------------------+----------------+
	| cat_id | goods_name          | cat_name       |
	+--------+---------------------+----------------+
	|      4 | KD876               | 3G手机            |
	|      8 | 诺基亚N85原装充电器              | 耳机               |
	|      8 | 诺基亚原装5800耳机             | 耳机               |
	|     11 | 索爱原装M2卡读卡器                | 读卡器和内存卡            |
	|     11 | 胜创KINGMAX内存卡         | 读卡器和内存卡            |
	+--------+---------------------+----------------+
	
	实现语句为:
	select goods.cat_id,goods_name,cat_name from goods left join category ongoods.cat_id=category.cat_id;


<2>:Mysql中的有连接.

	select 字段1,字段2,字段3 from tableA right join tableB on tableA.字段1=tableB.字段1;

	原理和左连接完全相同,不同的是参照标准不同,左连接,是以左边的表为标准,然后连接表逐一与之匹配而有链接则是以右表为标准,左边与之相配.

	tableA left join tableB <==> tableB right join tableA;//两条语句等价.

	同<1> 右连接实现语句:
	select goods.cat_id,goods_name,cat_name from category right join goods ongoods.cat_id=category.cat_id;

<3>Mysql中的union
	
	(select 字段1,字段2,字段3 from tableA)
	union
	(select 字段4,字段5,字段6 from tableB);

	union是将两张表的结果联合起来合并.结果集的字段以第一条语句的字段为准.

	union的结果集是去重复的,如果结果集不需要去重复,可以选用union all.

	实例:
	A表:
	+------+------+
	| id   | num  |
	+------+------+
	| a    |    5 |
	| b    |   10 |
	| c    |   15 |
	| d    |   10 |
	+------+------+

	B表:
	+------+------+
	| id   | num  |
	+------+------+
	| b    |    5 |
	| c    |   15 |
	| d    |   20 |
	| e    |   99 |
	+------+------+
	要求结果:
	要求查询出以下效果:
	+------+----------+
	| id   | sum(num) |
	+------+----------+
	| a    |        5 |
	| b    |       15 |
	| c    |       30 |
	| d    |       30 |
	| e    |       99 |
	+------+----------+

	解释:就是将a表里的数据如id为a的值5 与b表里的id为a的值相加,如果b表没有id为a的数据,则就以a表里的数据为准.

	思路:先将两张表连起来.

	(select * from a) union (select * from b);

	+------+------+
	| id   | num  |
	+------+------+
	| a    |    5 |
	| d    |   10 |
	| c    |   15 |
	| b    |   10 |
	| d    |   20 |
	| e    |   99 |
	| b    |    5 |
	+------+------+


	在将数据分组即可:
	 select id,sum(num) from ((select * from a) union (select * from b))as temp group by id;

	+------+----------+
	| id   | sum(num) |
	+------+----------+
	| a    |        5 |
	| b    |       15 |
	| c    |       15 |
	| d    |       30 |
	| e    |       99 |
	+------+----------+

	发现结果不对,是因为联合的时候去掉重复的了为了不去重复:可以用union all;

	 select id,sum(num) from ((select * from a) union all (select * from b))as temp group by id;
	
	结果:
	+------+----------+
	| id   | sum(num) |
	+------+----------+
	| a    |        5 |
	| b    |       15 |
	| c    |       30 |
	| d    |       30 |
	| e    |       99 |
	+------+----------+


 

转载于:https://www.cnblogs.com/luowen/archive/2012/10/31/2747306.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值