繁体   English   中英

我可以在给定的SQL查询中使用where子句代替AND吗? 如果是,两者有什么区别?

[英]Can I use where clause instead of AND in given SQL query? If yes, whats the difference in both?

在线查询此查询的某些位置,解释了内部连接的条件(奖励> 3k)。只是想知道是否可以在SQL下面使用where子句代替“ AND”,如果可以,两者的输出差异是什么?

SELECT FIRST_NAME,
       INCENTIVE_AMOUNT
FROM employee a
     INNER JOIN incentives B ON A.EMPLOYEE_ID = B.EMPLOYEE_REF_ID
                                AND INCENTIVE_AMOUNT > 3000;

是的,你可以试试这个

Select FIRST_NAME,INCENTIVE_AMOUNT from employee
     inner join incentives B on A.EMPLOYEE_ID=B.EMPLOYEE_REF_ID 
where INCENTIVE_AMOUNT >3000

我想你可以用

Select FIRST_NAME,INCENTIVE_AMOUNT from 
employee inner join incentives B on 
A.EMPLOYEE_ID=B.EMPLOYEE_REF_ID 
where INCENTIVE_AMOUNT >3000

我不了解Oracle,但至少对于INNER JOIN ,MySQL将WHERE条件与INNER JOIN条件相同。 它会计算所有要放入结果集中的行,并尽快检查所有可以检查的内容。

这两个查询产生相同的结果集(而afaik MySQL以相同的方式处理它们):

SELECT FIRST_NAME, INCENTIVE_AMOUNT
FROM employee a
  INNER JOIN incentives B 
     ON A.EMPLOYEE_ID = B.EMPLOYEE_REF_ID AND INCENTIVE_AMOUNT > 3000

SELECT FIRST_NAME, INCENTIVE_AMOUNT
FROM employee a
  INNER JOIN incentives B 
WHERE A.EMPLOYEE_ID = B.EMPLOYEE_REF_ID AND INCENTIVE_AMOUNT > 3000

INNER JOIN的输出没有差异,但是如果您在LEFT/RIGHT JOINWHERE子句中移动INNER JOIN条件,则会得到不同的结果集。

查询:

SELECT FIRST_NAME, INCENTIVE_AMOUNT
FROM employee a
  LEFT JOIN incentives B 
     ON A.EMPLOYEE_ID = B.EMPLOYEE_REF_ID AND INCENTIVE_AMOUNT > 3000

在结果集中包括表employee所有行,并与充满NULL s的行匹配,表b不匹配(在连接条件下)的行。

但是这个查询:

SELECT FIRST_NAME, INCENTIVE_AMOUNT
FROM employee a
  LEFT JOIN incentives B 
WHERE A.EMPLOYEE_ID = B.EMPLOYEE_REF_ID AND INCENTIVE_AMOUNT > 3000

将表a的所有行与表b所有行组合在一起,然后WHERE子句仅保留两个表中匹配的行。 其输出与上面的两个INNER JOIN查询相同。

他们碰到同样的事情。

然而,人们普遍认为很好的做法,使用join的条款中只对指定联接,并保持过滤谓词where条款,因此:

select first_name, incentive_amount
from   employee e
       join incentives i
            on  i.employee_ref_id = e.employee_id
where  i.incentive_amount > 3000

(请注意, innerouter关键字是可选的,并且在我看来是多余的,所以我从不使用它们。)

对于外部连接( left join ,或者,如果绝对需要,则为left outer join ),分离过滤谓词并将其放置在where子句中的整个想法不在窗口之内,因为(例如)如果存在如果没有incentive行,那么i.incentive_amount将为null,因此任何谓词都会排除该行。 有人说这就是为什么ANSI连接语法是垃圾的,而连接谓词和过滤谓词之间的区别是人为的和毫无意义的,而另一些人则将其视为对其他有用语法的怪癖。

select first_name, incentive_amount
from   employee e
       left join incentives i
            on  i.employee_ref_id = e.employee_id
            and i.incentive_amount > 3000

您仍然可以在同一查询中遵循内部联接的约定,例如:

select first_name, incentive_amount
from   employee e
       join departments d
            on d.department_id = e.department_id
       left join incentives i
            on  i.employee_ref_id = e.employee_id
            and i.incentive_amount > 3000
where  d.name = 'Philology'

补充一点,我同意乔纳森·刘易斯的观点, abemployeeincentives可怕别名。 (顺便说一句,为什么不采用employeesincentive ?)在我的版本中,我使用了肯定更具可读性的ei

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM