zoukankan      html  css  js  c++  java
  • 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 |
    	+------+----------+
    
    
    
  • 相关阅读:
    AWS Dynamodb aggregation的处理问题
    Java线程池的实现与应用
    机器学习笔记之基本框架:
    Azure machine learning series 1 Introduction
    AWS的安全机制
    模板
    矩阵快速幂总结
    中位数总结
    KMP算法
    动态规划----背包总结
  • 原文地址:https://www.cnblogs.com/luowen/p/2747306.html
Copyright © 2011-2022 走看看