msyqlleftjoinon后面多个条件(三)

2014-11-24 15:43:42 · 作者: · 浏览: 5
E b.id IS NULL;

你可以这样写:

1 SELECT a.* FROM product a LEFT JOIN product_details b
2 ON a.id=b.id
3 WHERE b.id is null OR b.weight=44 OR b.exist=1
01 mysql> SELECT a.* FROM product a LEFT JOIN product_details b
02 ON a.id=b.id
03 WHERE b.id is null OR b.weight=44 OR b.exist=1;
04 +----+--------+
05 | id | amount |
06 +----+--------+
07 | 1 | 100 |
08 | 3 | 300 |
09 | 4 | 400 |
10 +----+--------+
11 3 rows in set (0.00 sec)

你可以不这样写:

1 SELECT a.* FROM product a LEFT JOIN product_details b
2 ON a.id=b.id AND b.weight!=44 AND b.exist!=0
3 WHERE b.id IS NULL;

可以这样写:

1 SELECT a.* FROM product a LEFT JOIN product_details b
2 ON a.id=b.id
3 WHERE b.id is null OR b.weight=44 OR b.exist=0;
01 mysql> SELECT a.* FROM product a LEFT JOIN product_details b
02 ON a.id=b.id
03 WHERE b.id is null OR b.weight=44 OR b.exist=0;
04 +----+--------+
05 | id | amount |
06 +----+--------+
07 | 1 | 100 |
08 | 2 | 200 |
09 | 3 | 300 |
10 | 4 | 400 |
11 +----+--------+
12 4 rows in set (0.00 sec)

这些查询真的效果一样?

如果你只需要第一个表中的数据的话,这些查询会返回相同的结果集。有一种情况就是,如果你从 LEFT JOIN的表中检索数据时,查询的结果就不同了。

如前所属,WHERE 子句是在匹配阶段之后用来过滤的。

例如:

01 mysql> SELECT * FROM product a LEFT JOIN product_details b
02 ON a.id=b.id AND b.weight!=44 AND b.exist=1
03 WHERE b.id is null;
04 +----+--------+------+--------+-------+
05 | id | amount | id | weight | exist |
06 +----+--------+------+--------+-------+
07 | 1 | 100 | NULL | NULL | NULL |
08 | 2 | 200 | NULL | NULL | NULL |
09 | 3 | 300 | NULL | NULL | NULL |
10 | 4 | 400 | NULL | NULL | NULL |
11 +----+--------+------+--------+-------+
12 4 rows in set (0.00 sec)
13
14 mysql> SELECT * FROM product a LEFT JOIN product_details b
15 ON a.id=b.id
16 WHERE b.id IS NULL OR b.weight=44 OR b.exist=0;
17 +----+--------+------+--------+-------+
18 | id | amount | id | weight | exist |
19 +----+--------+------+--------+-------+
20 | 1 | 100 | NULL | NULL | NULL |
21 | 2 | 200 | 2 | 22 | 0 |
22 | 3 | 300 | NULL | NULL | NULL |
23 | 4 | 400 | 4 | 44 | 1 |
24 +----+--------+------+--------+-------+
25 4 rows in set (0.00 sec)

总附注:

如果你使用 LEFT JOIN 来寻找在一些表中不存在的记录,你需要做下面的测试:WHERE 部分的 col_name IS NULL(其中 col_name 列被定义为 NOT NULL),MYSQL 在查询到一条匹配 LEFT JOIN 条件后将停止搜索更多行(在一个特定的组合键下)。