<?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 | +------+----------+