1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > mysql join not in_MySQL 使用左连接替换not in

mysql join not in_MySQL 使用左连接替换not in

时间:2019-07-31 11:10:42

相关推荐

mysql join not in_MySQL 使用左连接替换not in

众所周知,左连接和右连接的含义是以哪一张表为准。

左连接就是以左表为准,查出的结果中包含左表所有的记录,如果右表中没有与其对应的记录,那么那一行记录中B表部分的内容就全是NULL。

现在有两个表,一个category表和goods表:

mysql> select * from category;

+----+---------+

| id | cate |

+----+---------+

| 1 | food |

| 2 | clothes |

| 3 | book |

| 4 | sport |

| 5 | music |

| 6 | video |

+----+---------+

6 rows in set (0.01 sec)

mysql> select * from goods;

+----+---------+-------------------+

| id | cate_id | name |

+----+---------+-------------------+

| 0 | 5 | You Are Not Alone |

| 1 | 2 | T-shirt |

| 2 | 1 | water |

| 3 | 1 | rice |

| 4 | 3 | C++ primer |

| 5 | 4 | basketbal |

+----+---------+-------------------+

6 rows in set (0.00 sec)

现在要查出每一种分类下的商品,那么可以很简单的使用左连接了:

mysql> select * from category

-> left join goods

-> on category.id = goods.cate_id

-> order by category.id;

+----+---------+------+---------+-------------------+

| id | cate | id | cate_id | name |

+----+---------+------+---------+-------------------+

| 1 | food | 2 | 1 | water |

| 1 | food | 3 | 1 | rice |

| 2 | clothes | 1 | 2 | T-shirt |

| 3 | book | 4 | 3 | C++ primer |

| 4 | sport | 5 | 4 | basketbal |

| 5 | music | 0 | 5 | You Are Not Alone |

| 6 | video | NULL | NULL | NULL |

+----+---------+------+---------+-------------------+

7 rows in set (0.01 sec)

从上面的结果中很全就能看到video分类中没有商品。

需求:只查询哪一种分类下面没有商品

这个很好实现,可以用下面几个方法:

1、使用not in

mysql> select * from category where id not in ( select cate_id from goods);

+----+-------+

| id | cate |

+----+-------+

| 6 | video |

+----+-------+

1 row in set (0.01 sec)

2、仍旧使用左连接,只不过对于结果加一个where筛选

mysql> select * from category

-> left join goods

-> on category.id = goods.cate_id

-> where goods.id is NULL;

+----+-------+------+---------+------+

| id | cate | id | cate_id | name |

+----+-------+------+---------+------+

| 6 | video | NULL | NULL | NULL |

+----+-------+------+---------+------+

1 row in set (0.00 sec)

至于为什么不适用not in,这是因为他不使用索引,如果数据量大的时候,效率并不高。

同样,如果要显示和总表中匹配了记录,隐藏左表没有匹配到的记录,可以将后面的where goods.id is not NULL;

同样,对于右连接来说也是一样的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。