在这两个 SQL 查询之间,其中一个是“正确的”吗? [复制]

Posted

技术标签:

【中文标题】在这两个 SQL 查询之间,其中一个是“正确的”吗? [复制]【英文标题】:Between these two SQL queries, is one of them 'correct'? [duplicate] 【发布时间】:2020-09-02 18:13:39 【问题描述】:

我正在自学 SQL 查询。我的问题来自 w3resource.com 的子查询问题集中的 sql 练习 6。总结这个问题,我们需要一个查询来显示在巴黎为客户服务的销售人员的佣金。下面是两个表,并给出了它们的列:


销售员(salesman_id、姓名、城市、佣金)

客户(customer_id、cust_name、city、grade、salesman_id)


以下是我编写的两个查询,它们以不同的方式实现了解决方案。我的问题是两者中是否有一个更“正确”的?考虑到性能、标准等的“正确”,或者两者都一样好?我问是因为我想当我继续进行更复杂的查询时,出于性能/多功能性的原因,我应该坚持使用一个吗? 谢谢

select commission from Salesman
where salesman_id IN
(select salesman_id from Customer
where city = 'Paris')
select commission from Salesman
join Customer on (Salesman.salesman_id = Customer.salesman_id)
where Customer.city = 'Paris'

【问题讨论】:

***.com/questions/1200295/sql-join-vs-in-performance 你也应该尝试为这两个查询解释计划,这样你就会知道 mysql 如何解释它们.. 查询产生不同的结果。如果有多个 Paris-customers 和同一个推销员,您将在第二个查询中多次获得该推销员的佣金。 【参考方案1】:

他们都很好。

就风格而言,两者各有优势,例如

使用 IN 子句可以简化主 SQL 查询(从可读性的角度来看),因为您不必进行连接。如果您有其他几个联接,最好尽可能减少它们以跟踪正在发生的事情。 如果您有一个复合键而不是单个 salesman_id,则需要使用 JOIN。

它们可能会根据您的数据库生成不同的查询计划,但与大多数代码一样,最好从编写可读性和可维护性开始,并仅优化您需要的部分。这种事情不会有任何区别。

【讨论】:

以上是关于在这两个 SQL 查询之间,其中一个是“正确的”吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何用SQL语句的查询实现两个表之间的查询连接

当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,sql怎么写

sql中查出两个日期之间的数据

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能

mysql与sqlserver的区别

SQL Server 可以根据用户或用户角色在两个架构之间进行仲裁吗?