[英]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.