[英]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 JOIN
的WHERE
子句中移动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
(请注意, inner
和outer
关键字是可选的,并且在我看来是多余的,所以我从不使用它们。)
对于外部连接( 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'
补充一点,我同意乔纳森·刘易斯的观点, a
和b
是employee
和incentives
可怕别名。 (顺便说一句,为什么不采用employees
或incentive
?)在我的版本中,我使用了肯定更具可读性的e
和i
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.