如何在 SQL 中编写连接查询
How to write join query in SQL
问题:
- 给定 Employee 和 AnnualReviews tables,向 return 所有从未接受过按 HireDate 排序的审核的员工编写查询。
- 编写一个查询来计算仍在为公司工作的最长和最短的终身雇员之间的差异(以天为单位)
- 给定上面的员工 table,编写一个查询来计算公司没有雇用或解雇任何人的最长期限(以天为单位)
这是我在问题1中的查询,请帮助更正并请帮助我编写问题2,3中的查询:
Select *,
annualreviews.reviewdate
From employees
Join annualreviews
On employees.ID = annualreviews.ID
Where reviewdate is null;
为此使用 LEFT JOIN
。
SELECT employees.*,
annualreviews.reviewdate
FROM employees
LEFT JOIN annualreviews
ON employees.ID = annualreviews.EmpID
WHERE reviewdate IS NULL;
你的加入条件也有误。您将 employees
ID 与 annualreviews
ID 进行了比较。但是,它应该是 annualreviews
的 EmpID
使用这个查询
它会显示所有从未接受过审核的员工,按 HireDate
排序
SELECT e.*,r.ReviewDate FROM Employee e
LEFT OUTER JOIN AnnualReview r ON e.ID = r.EmpID
Where r.ReviewDate is null Order By e.HireDate
您的错误 #1:您正在寻找没有日期的评论,而您应该寻找缺失的评论。我们通常使用 [NOT] IN
或 [NOT] EXISTS
检查是否存在,而不是连接。
您的错误 #2:您加入的 ID 有误。评论 ID 不是员工 ID,因此:employees.ID = annualreviews.ID
应该敲响警钟。
您要查找的简单查询:
select *
from employees
where id not in (select empid from annualreviews)
order by hiredate;
与 NOT EXISTS
相同:
select *
from employees e
where not exists (select null from annualreviews r where r.empid = e.id)
order by hiredate;
问题:
- 给定 Employee 和 AnnualReviews tables,向 return 所有从未接受过按 HireDate 排序的审核的员工编写查询。
- 编写一个查询来计算仍在为公司工作的最长和最短的终身雇员之间的差异(以天为单位)
- 给定上面的员工 table,编写一个查询来计算公司没有雇用或解雇任何人的最长期限(以天为单位)
这是我在问题1中的查询,请帮助更正并请帮助我编写问题2,3中的查询:
Select *,
annualreviews.reviewdate
From employees
Join annualreviews
On employees.ID = annualreviews.ID
Where reviewdate is null;
为此使用 LEFT JOIN
。
SELECT employees.*,
annualreviews.reviewdate
FROM employees
LEFT JOIN annualreviews
ON employees.ID = annualreviews.EmpID
WHERE reviewdate IS NULL;
你的加入条件也有误。您将 employees
ID 与 annualreviews
ID 进行了比较。但是,它应该是 annualreviews
的 EmpID
使用这个查询 它会显示所有从未接受过审核的员工,按 HireDate
排序SELECT e.*,r.ReviewDate FROM Employee e
LEFT OUTER JOIN AnnualReview r ON e.ID = r.EmpID
Where r.ReviewDate is null Order By e.HireDate
您的错误 #1:您正在寻找没有日期的评论,而您应该寻找缺失的评论。我们通常使用 [NOT] IN
或 [NOT] EXISTS
检查是否存在,而不是连接。
您的错误 #2:您加入的 ID 有误。评论 ID 不是员工 ID,因此:employees.ID = annualreviews.ID
应该敲响警钟。
您要查找的简单查询:
select *
from employees
where id not in (select empid from annualreviews)
order by hiredate;
与 NOT EXISTS
相同:
select *
from employees e
where not exists (select null from annualreviews r where r.empid = e.id)
order by hiredate;