MySQL 使用左连接替换not in
2023-09-14 08:56:53 时间
众所周知,左连接和右连接的含义是以哪一张表为准。
左连接就是以左表为准,查出的结果中包含左表所有的记录,如果右表中没有与其对应的记录,那么那一行记录中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;
同样,对于右连接来说也是一样的。
相关文章
- 安装mysql-python
- 【MySQL】mysql optimize table
- 【Mysql】初识MySQL
- 在 linux 中连接 mysql 数据库
- Linux下远程连接MySQL数据库
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
- MYSQL错误解决:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- MySql主主(主从)同步配置详解
- [转]分析MySQL数据类型的长度【mysql数据字段 中length和decimals的作用!熟悉mysql必看】
- Java数据类型和MySql数据类型对应一览
- Mysql:Error Code 1235,This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
- C#-连接mysql数据库和C#展示数据表
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)--续
- MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别
- Starting MySQL. ERROR! The server quit without updating PID file (/data/mysql/mysql.pid).
- paip.python连接mysql最佳实践o4
- 我的ef连接mysql之旅
- [手游新项目历程]-54-c,MySQL如何复制表中的一条记录并插入
- 整理spring + mysql + redis + 测试 的配置格式 和源码
- Error connecting to MySQL: Too many connections(code 1040)的错误解决方法
- mysql的内连接,外连接(左外连接,右外连接)巩固
- mysql连接查询
- Mysql----在持续集成(CI)的流程测试环境对应的Mysql数据库报无法连接错误问题的解决办法
- 常用命令之mysql命令
- GinVueAdmin源码分析3-整合MySQL
- 【Qbot】4.连接mysql/限制使用次数