JGF*_*FMK 2 sql database performance
请考虑以下表格:
deptid (type:INT)
deptname (type: TEXT)
hours (type:INT)
active (type:BIT)
Run Code Online (Sandbox Code Playgroud)
empid (type:INT)
empname (type: TEXT)
deptid (type: INT)
designation (type: TEXT)
salary (type: INT)
Run Code Online (Sandbox Code Playgroud)
编写查询以返回属于头数为4或更多的部门的员工的列名empname和deptname.记录应按empname的字母顺序返回
这是我的看法:
SELECT e1.empname, d.deptname from employee AS e1
FULL JOIN department AS d on e1.deptid = d.deptid
WHERE e1.deptid IN(
SELECT deptid FROM(
SELECT e2.deptid, COUNT(e2.empid)
FROM employee AS e2
GROUP BY e2.deptid
HAVING COUNT(e2.empid) >= 4
)
)
ORDER BY empname;
Run Code Online (Sandbox Code Playgroud)
你会如何改进?
这个更短,也可能更快
SELECT e1.empname, d.deptname
from (
SELECT e2.deptid
FROM employee AS e2
GROUP BY e2.deptid
HAVING COUNT(e2.empid) >= 4
) G
inner join employee AS e1 on e1.deptid = G.deptid
INNER JOIN department AS d on d.deptid = G.deptid
ORDER BY e1.empname;
Run Code Online (Sandbox Code Playgroud)
从分组开始.内部查询不需要COUNT.然后,加入两个表只是为了获取名称.
使用INNER JOIN是因为一旦计数完成,我们就已经知道了