关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒
创新互联于2013年创立,是专业互联网技术服务公司,拥有项目网站设计制作、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元东安做网站,已为上家服务,为东安各地企业和个人服务,联系电话:18982081108
ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行,即使on中包含有A表中的列的限制条件,也不会过滤A的任何数据(A的数据只会通过where过滤)。
如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据
在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。
让我们看一个 LFET JOIN 示例:
01
mysql CREATE TABLE `product`
(
02
`id` int(10)
unsigned NOT NULL auto_increment,
03
`amount` int(10)
unsigned default NULL,
04
PRIMARY KEY (`id`)
05
)
ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
06
07
mysql CREATE TABLE `product_details`
(
08
`id` int(10)
unsigned NOT NULL,
09
`weight` int(10)
unsigned default NULL,
10
`exist` int(10)
unsigned default NULL,
11
PRIMARY KEY (`id`)
12
)
ENGINE=MyISAM DEFAULT CHARSET=latin1
13
14
mysql INSERT INTO product
(id,amount)
15
VALUES (1,100),(2,200),(3,300),(4,400);
16
Query
OK, 4 rows affected
(0.00 sec)
17
Records:
4 Duplicates: 0 Warnings: 0
18
19
mysql INSERT INTO product_details
(id,weight,exist)
20
VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);
21
Query
OK, 4 rows affected
(0.00 sec)
22
Records:
4 Duplicates: 0 Warnings: 0
23
24
mysql SELECT * FROM product;
25
+----+--------+
26
|
id | amount |
27
+----+--------+
28
|
1 | 100 |
29
|
2 | 200 |
30
|
3 | 300 |
31
|
4 | 400 |
32
+----+--------+
33
4 rows in set (0.00
sec)
34
35
mysql SELECT * FROM product_details;
36
+----+--------+-------+
37
|
id | weight | exist |
38
+----+--------+-------+
39
|
2 | 22 | 0 |
40
|
4 | 44 | 1 |
41
|
5 | 55 | 0 |
42
|
6 | 66 | 1 |
43
+----+--------+-------+
44
4 rows in set (0.00
sec)
45
46
mysql SELECT * FROM product LEFT JOIN product_details
47
ON (product.id
= product_details.id);
48
+----+--------+------+--------+-------+
49
|
id | amount | id | weight | exist |
50
+----+--------+------+--------+-------+
51
|
1 | 100 | NULL | NULL | NULL |
52
|
2 | 200 | 2 | 22 | 0 |
53
|
3 | 300 | NULL | NULL | NULL |
54
|
4 | 400 | 4 | 44 | 1 |
55
+----+--------+------+--------+-------+
56
4 rows in set (0.00
sec)
ON 子句和 WHERE 子句有什么不同?
一个问题:下面两个查询的结果集有什么不同么?
1
1. SELECT * FROM product LEFT JOIN product_details
2
ON (product.id
= product_details.id)
3
AND product_details.id=2;
4
2. SELECT * FROM product LEFT JOIN product_details
5
ON (product.id
= product_details.id)
6
WHERE product_details.id=2;
用例子来理解最好不过了:
01
mysql SELECT * FROM product LEFT JOIN product_details
02
ON (product.id
= product_details.id)
03
AND product_details.id=2;
04
+----+--------+------+--------+-------+
05
|
id | amount | id | weight | exist |
06
+----+--------+------+--------+-------+
07
|
1 | 100 | NULL | NULL | NULL |
08
|
2 | 200 | 2 | 22 | 0 |
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 LEFT JOIN product_details
15
ON (product.id
= product_details.id)
16
WHERE product_details.id=2;
17
+----+--------+----+--------+-------+
18
|
id | amount | id | weight | exist |
19
+----+--------+----+--------+-------+
20
|
2 | 200 | 2 | 22 | 0 |
21
+----+--------+----+--------+-------+
22
1
row in set (0.01
sec)
第一条查询使用 ON 条件决定了从 LEFT JOIN的 product_details表中检索符合的所有数据行。
第二条查询做了简单的LEFT JOIN,然后使用 WHERE 子句从 LEFT JOIN的数据中过滤掉不符合条件的数据行。
再来看一些示例:
01
mysql
02
mysql SELECT * FROM product LEFT JOIN product_details
03
ON product.id
= product_details.id
04
AND product.amount=100;
05
+----+--------+------+--------+-------+
06
|
id | amount | id | weight | exist |
07
+----+--------+------+--------+-------+
08
|
1 | 100 | NULL | NULL | NULL |
09
|
2 | 200 | NULL | NULL | NULL |
10
|
3 | 300 | NULL | NULL | NULL |
11
|
4 | 400 | NULL | NULL | NULL |
12
+----+--------+------+--------+-------+
13
4 rows in set (0.00
sec)
所有来自product表的数据行都被检索到了,但没有在product_details表中匹配到记录(product.id = product_details.id AND product.amount=100 条件并没有匹配到任何数据)
01
mysql SELECT * FROM product LEFT JOIN product_details
02
ON (product.id
= product_details.id)
03
AND product.amount=200;
04
+----+--------+------+--------+-------+
05
|
id | amount | id | weight | exist |
06
+----+--------+------+--------+-------+
07
|
1 | 100 | NULL | NULL | NULL |
08
|
2 | 200 | 2 | 22 | 0 |
09
|
3 | 300 | NULL | NULL | NULL |
10
|
4 | 400 | NULL | NULL | NULL |
11
+----+--------+------+--------+-------+
12
4 rows in set (0.01
sec)
同样,所有来自product表的数据行都被检索到了,有一条数据匹配到了。
join 经常用来做关联查询,可以把两张或者多张表用通过关联条件关联起来做数据查询
在使用join查询的时候要区分主表和附表,jion ...on .....and
on: 表之间的关联条件
and:对附表做筛选
内连接,两个关联的表都为主表,所以他们的做条件筛选的顺序是:先连接,后筛选。此时 join ...on ... and =join...on... where ....
左连接,这时候左边的表就是主表,所以,主表的数据会全部展示出来,右边的表为附表,此时on连接后在通过and进行筛选的条件对主表不起作用,只对附表起作用。先筛选再连接
右连接,右边的表为主表,左边表变成附表,如果on后面又and 做筛选条件的话,和left join一样 也是先筛选后连接。
Where查询条件,on内外连接时候用,as作为别名,in查询某值是否在某条件里