SQL LEFT JOIN与IN使用案例说明

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL LEFT JOIN与IN使用案例说明相关的知识,希望对你有一定的参考价值。

问题描述

​
为什么第一个query不正确?
求sales person:
query 1:
select SalesPerson.name
from Orders
inner join Company on Company.com_id = Orders.com_id
inner join SalesPerson on SalesPerson.sales_id = Orders.sales_id
where Company.name<>'RED';

query 2:
select name
from salesperson
where sales_id not in (select orders.sales_id
from orders inner join company on company.com_id=orders.com_id
where company.name='RED')

注:原需求是输出salesperson表中没有向公司RED 销售任何东西的销售员

​

数据补充

--- 有如下表、结构及数据,计用SQL编写出
-- 输出salesperson表中没有向公司RED 销售任何东西的销售员

DROP TABLE IF EXISTS `company`;
CREATE TABLE `company`  (
  `com_id` int(11) NULL DEFAULT NULL,
  `NAME` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `city` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4;


INSERT INTO `company` VALUES (1, 'RED', 'Boston');
INSERT INTO `company` VALUES (2, 'ORANGE', 'New York');
INSERT INTO `company` VALUES (3, 'YELLOW', 'Boston');
INSERT INTO `company` VALUES (4, 'GREEN', 'Austin');

DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders`  (
  `order_id` int(11) NULL DEFAULT NULL,
  `order_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `com_id` int(11) NULL DEFAULT NULL,
  `sales_id` int(11) NULL DEFAULT NULL,
  `amount` int(11) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4;

INSERT INTO `orders` VALUES (1, '1/1/2014', 3, 4, 100000);
INSERT INTO `orders` VALUES (2, '2/1/2014', 4, 5, 5000);
INSERT INTO `orders` VALUES (3, '3/1/2014', 1, 1, 50000);
INSERT INTO `orders` VALUES (4, '4/1/2014', 1, 4, 25000);

CREATE TABLE `salesperson`  (
  `sales_id` int(11) NULL DEFAULT NULL,
  `NAME` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `salary` int(11) NULL DEFAULT NULL,
  `commission_rate` int(11) NULL DEFAULT NULL,
  `hire_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4;

INSERT INTO `salesperson` VALUES (1, ' John ', 100000, 6, ' 4/1/2006');
INSERT INTO `salesperson` VALUES (2, ' Amy ', 120000, 5, ' 5/1/2010 ');
INSERT INTO `salesperson` VALUES (3, ' Mark ', 65000, 12, ' 12/25/2008');
INSERT INTO `salesperson` VALUES (4, ' Pam ', 25000, 25, ' 1/1/2005 ');
INSERT INTO `salesperson` VALUES (5, ' Alex ', 50000, 10, ' 2/3/2007 ');

解决方法

#2 解决方法:
-- way1用LEFT JOIN结合IFNULL。
-- 解释1 这里要取得销售人员名在salesperson,所以它是主表。
-- 解释2 通过LEFT JOIN WHERE IS NULL达到NOT IN的效果。
	SELECT A.name,D.sales_id
FROM salesperson as A
LEFT JOIN  
	(
		SELECT C.sales_id 
		FROM orders as C
		JOIN company as B
		ON B.com_id = C.com_id
		WHERE B.name= "RED"
	)	D
ON A.sales_id = D.sales_id
WHERE D.sales_id IS NULL
-- way2 用NOT IN
select name
from salesperson
where sales_id not in (select orders.sales_id
from orders inner join company on company.com_id=orders.com_id
where company.name='RED')

问题分析

-- Query1的解释:
/*
Query1 用的是INNER JOIN结果不对
1 首先记录上不对,LEFT JOIN和INNER JOIN的结果不同
2 像 Pam既销售给了“RED”又销售给了“YELLOW”但INNER JOIN的where company.name<>'RED'又给“找回来”了是不对的。
*/

以上是关于SQL LEFT JOIN与IN使用案例说明的主要内容,如果未能解决你的问题,请参考以下文章

SQL LEFT JOIN与IN使用案例说明

clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化(代码

sql: left join vs. not in

sql中in和exist语句的区别?(补充了left join和right join)

sql中 INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN 中 ON与Where的区别

sql中 INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN 中 ON与Where的区别