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 |

	+------+----------+





 

你可能感兴趣的:(mysql)