mysql left join用法分析
left join这个命令我们会常用到了,LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行,下面我们来看看关于它的一些用法与其它命令配合使用的问题.
先看它的语法:
LEFT JOIN 关键字会从左表(table_name1)那里返回所有的行,即使在右表.
(table_name2) 中没有匹配的行.
LEFT JOIN 关键字语法,代码如下:
- SELECTcolumn_name(s)
- FROMtable_name1
- LEFTJOINtable_name2
- ONtable_name1.column_name=table_name2.column_name
给个通俗的解释吧.
- 例表a
- aidadate
- 1a1
- 2a2
- 3a3
- 表b
- bidbdate
- 1b1
- 2b2
- 4b4
两个表a,b相连接,要取出id相同的字段,代码如下:
select * from a inner join b on a.aid = b.bid
这是仅取出匹配的数据,此时的取出的是"
1 a1 b1
2 a2 b2
那么left join 指:select * from a left join b on a.aid = b.bid
首先取出a表中所有数据,然后再加上与a,b匹配的的数据,此时的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字符
同样的也有right join,指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据 ,此时的取出的是:
1 a1 b1
2 a2 b2
4 空字符 b4
在left join中on 与where的分析.
•ON 子句与 WHERE 子句的不同
•一种更好地理解带有 WHERE ... IS NULL 子句的复杂匹配条件的简单方法
ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行.
如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据,在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤.
让我们看一个 LFET JOIN 示例,代码如下:
- mysql>CREATETABLE`product`(
- `id`int(10)unsignedNOTNULLauto_increment,
- `amount`int(10)unsigneddefaultNULL,
- PRIMARYKEY(`id`)
- )ENGINE=MyISAMAUTO_INCREMENT=5DEFAULTCHARSET=latin1
- mysql>CREATETABLE`product_details`(
- `id`int(10)unsignedNOTNULL,
- `weight`int(10)unsigneddefaultNULL,
- `exist`int(10)unsigneddefaultNULL,
- PRIMARYKEY(`id`)
- )ENGINE=MyISAMDEFAULTCHARSET=latin1
- mysql>INSERTINTOproduct(id,amount)
- VALUES(1,100),(2,200),(3,300),(4,400);
- QueryOK,4rowsaffected(0.00sec)
- Records:4Duplicates:0Warnings:0
- mysql>INSERTINTOproduct_details(id,weight,exist)
- VALUES(2,22,0),(4,44,1),(5,55,0),(6,66,1);
- QueryOK,4rowsaffected(0.00sec)
- Records:4Duplicates:0Warnings:0
- mysql>SELECT*FROMproduct;
- +----+--------+
- |id|amount|
- +----+--------+
- |1|100|
- |2|200|
- |3|300|
- |4|400|
- +----+--------+
- 4rowsinset(0.00sec)
- mysql>SELECT*FROMproduct_details;
- +----+--------+-------+
- |id|weight|exist|
- +----+--------+-------+
- |2|22|0|
- |4|44|1|
- |5|55|0|
- |6|66|1|
- +----+--------+-------+
- 4rowsinset(0.00sec)
- --phpfensi.com
- mysql>SELECT*FROMproductLEFTJOINproduct_details
- ON(product.id=product_details.id);
- +----+--------+------+--------+-------+
- |id|amount|id|weight|exist|
- +----+--------+------+--------+-------+
- |1|100|NULL|NULL|NULL|
- |2|200|2|22|0|
- |3|300|NULL|NULL|NULL|
- |4|400|4|44|1|
- +----+--------+------+--------+-------+
- 4rowsinset(0.00sec)
ON 子句和 WHERE 子句有什么不同?
一个问题:下面两个查询的结果集有什么不同么?代码如下:
- 1.SELECT*FROMproductLEFTJOINproduct_details
- ON(product.id=product_details.id)
- ANDproduct_details.id=2;
- 2.SELECT*FROMproductLEFTJOINproduct_details
- ON(product.id=product_details.id)
- WHEREproduct_details.id=2;
用例子来理解最好不过了,代码如下:
- mysql>SELECT*FROMproductLEFTJOINproduct_details
- ON(product.id=product_details.id)
- ANDproduct_details.id=2;
- +----+--------+------+--------+-------+
- |id|amount|id|weight|exist|
- +----+--------+------+--------+-------+
- |1|100|NULL|NULL|NULL|
- |2|200|2|22|0|
- |3|300|NULL|NULL|NULL|
- |4|400|NULL|NULL|NULL|
- +----+--------+------+--------+-------+
- 4rowsinset(0.00sec)
- mysql>SELECT*FROMproductLEFTJOINproduct_details
- ON(product.id=product_details.id)
- WHEREproduct_details.id=2;
- +----+--------+----+--------+-------+
- |id|amount|id|weight|exist|
- +----+--------+----+--------+-------+
- |2|200|2|22|0|
- +----+--------+----+--------+-------+
- 1rowinset(0.01sec)
第一条查询使用 ON 条件决定了从 LEFT JOIN的 product_details表中检索符合的所有数据行.
第二条查询做了简单的LEFT JOIN,然后使用 WHERE 子句从 LEFT JOIN的数据中过滤掉不符合条件的数据行.
热门评论