Posts Tagged ‘ left join

mysql关联left join条件on和where条件的区别

想了解一下 left join 后面 on  where 能不能同时 使用 ,找到了下面的这篇文章,觉得

能让我很好的理解这个问题。

现有两个表,商品表(products)和sales_detail(销售记录表)。如下图:

products:
pid pname pcode
1   商品1   AC90
2   商品2 DE78
3   商品3    XXXX

sales_detail:
aid pcode saletime
1   AC90 2008-09-22
2   DE78 2008-09-22
3   AC90 2008-09-23
4   AC90 2008-09-24

按商品在某个时间段内的销售量来排行,比如我想统计23-24号这两天的销售数量并排行。(注:DE78这个商品在这两天没有销售,但是也要显示出来,只是数量为0)。

– 表的结构 `products`

CREATE TABLE `products` (
`pid` int(3) NOT NULL auto_increment,
`pname` varchar(20) NOT NULL,
`pcode` varchar(20) NOT NULL,
PRIMARY KEY   (`pid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

– 导出表中的数据 `products`

INSERT INTO `products` (`pid`, `pname`, `pcode`) VALUES (1, ‘商品1′, ‘AC90′),
(2, ‘商品2′, ‘DE78′),
(3, ‘商品3′. ‘XXXX’);
– ——————————————————–

– 表的结构 `sales_detail`

CREATE TABLE `sales_detail` (
`aid` int(3) NOT NULL auto_increment,
`pcode` varchar(20) NOT NULL,
`saletime` date NOT NULL,
PRIMARY KEY   (`aid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

– 导出表中的数据 `sales_detail`

INSERT INTO `sales_detail` (`aid`, `pcode`, `saletime`) VALUES (1, ‘AC90′, ’2008-09-22′),
(2, ‘DE78′, ’2008-09-22′),
(3, ‘AC90′, ’2008-09-23′),
(4, ‘AC90′, ’2008-09-24′);

区别两条sql语句:
阅读全文

MYSQl left join 联合查询

MYSQl left join 联合查询效率分析

user表:

代码:
id | name
———
1 | libk
2 | zyfon
3 | daodao

user_action表:

代码:
user_id | action
—————
1 | jump
1 | kick
1 | jump
2 | run
4 | swim

sql:

代码:
select id, name, action from user as u
left join user_action a on u.id = a.user_id

result:

代码:
id | name | action
——————————–
1 | libk | jump ①
1 | libk | kick ②
1 | libk | jump ③
2 | zyfon | run ④
3 | daodao | null ⑤

分析:
注意到user_action中还有一个user_id=4, action=swim的纪录,但是没有在结果中出现,
而user表中的id=3, name=daodao的用户在user_action中没有相应的纪录,但是却出现在了结果集中
因为现在是left join,所有的工作以left为准.
结果1,2,3,4都是既在左表又在右表的纪录,5是只在左表,不在右表的纪录
结论:
我们可以想象left join 是这样工作的
从左表读出一条,选出所有与on匹配的右表纪录(n条)进行连接,形成n条纪录(包括重复的行,如:结果1和结果3),
如果右边没有与on条件匹配的表,那连接的字段都是null.
然后继续读下一条。
引申:
我们可以用右表没有on匹配则显示null的规律, 来找出所有在左表,不在右表的纪录, 注意用来判断的那列必须声明为not null的。
如:

sql:

代码:
select id, name, action from user as u
left join user_action a on u.id = a.user_id
where a.user_id is NULL

(注意:1.列值为null应该用is null 而不能用=NULL
2.这里a.user_id 列必须声明为 NOT NULL 的)

代码:
result:
id | name | action
————————–
3 | daodao | NULL
——————————————————————————–

Tips:
1. on a.c1 = b.c1 等同于 using(c1)
2. INNER JOIN 和 , (逗号) 在语义上是等同的
3. 当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。
如果 EXPLAIN 显示 MySQL 使用了可能的索引列表中错误的索引,这个特性将是很有用的。
通过指定 USE INDEX (key_list),你可以告诉 MySQL 使用可能的索引中最合适的一个索引在表中查找记录行。
可选的二选一句法 IGNORE INDEX (key_list) 可被用于告诉 MySQL 不使用特定的索引。
4. 一些例子: