簡體   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