SELECT empname,MAX (budget) AS higestbudget, MIN (budget) AS lowestbudget
FROM employee ,workson ,project
WHERE project.proid =workson.proid AND employee.empid=workson.empid
GROUPBY empname
image-20220424163244361
4.给出所有项目超过一个的员工的id和参加的项目个数(empid, num)
sql
select empid,count(proid) as num
from workson
havingcount(proid)>1groupby empid
image-20220424163912198
5.给出项目种类号为“c2”且预算最多的项目。(proid,projectname,budget)
sql
select proid,projectname,budget
from project
where budget>=all(select budget from project where catid ='c2') and catid='c2'
select empid,empname,age,sex,depid
from employee
where empid in(select empid from workson where proid=(select proid from project where projectname='产品推广') and job isnull)
select catid,count(workson.proid) as proNum
from project,workson
where empid=10102and project.proid=workson.proid
groupby catid
orderby catid
image-20220424172015697
但是随后发现这种方式并不能满足”若没有参加过某类项目,则参加项目总数显示为0“的要求。
修改如下:
sql
selectdistinct category.catid ,isnull(subtable.subNum) as proNum
from category leftjoin (select catid,count(workson.proid) as subNum
from project,workson
where empid=10211and project.proid=workson.proid
groupby catid) as subtable
on category.catid=subtable.catid
SELECT*FROM employee
WHERE sex ='女'ANDNOTEXISTS (
SELECT*FROM workson
WHERE empid = employee.empid
AND proid IN (
SELECT proid
FROM project
WHERE catid = (
SELECT catid
FROM category
WHERE catname ='软件类'
)
)
)
刚刚发现了格式化的功能。
image-20220424214552653
9.给出有30岁以上男性员工的省份名称和该省男员工最大年龄,结果按最大年龄升序排序
sql
SELECT location, MAX(age)
FROM department, employee
WHERE department.depid = employee.depid
AND sex ='男'GROUPBY location
HAVINGMAX(age) >30ORDERBYMAX(age)
SELECT employee.empid, empname, count(workson.proid) AS procnt
FROM project, employee, workson, department
WHERE location ='广州'AND projectname ='产品推广'AND department.depid = employee.depid
AND workson.proid = project.proid
AND employee.empid = workson.empid
GROUPBY employee.empid
select empname,avg(budget)
from employee naturaljoin workson naturaljoin project
where empid in (select empid from workson where job='职员')
groupby empname
havingavg(budget)>110000;
image-20231012212759491
典型错误:
sql
select empname,avg(budget)
from employee naturaljoin workson naturaljoin project
where job='职员'groupby empname
havingavg(budget)>110000;
select catname,projectname,budget from project p1 join category c on p1.catid=c.catid
where2>(selectcount(distinct p2.budget)
from project p2
where p1.budget<p2.budget and p1.catid=p2.catid)
select catname,projectname,budget,
dense_rank() over(partitionby c.catid orderby budget desc)
from category c join project p on c.catid=p.catid
image-20231014142403857
最终得到可行SQL语句:
sql
select t.catname,t.projectname,t.budget from
(select catname,projectname,budget,
dense_rank() over(partitionby c.catid orderby budget desc) as rk
from category c join project p on c.catid=p.catid) t
where t.rk<=2
select
catname,projectname,budget,
row_number() over(partitionby catid orderby budget) as rk,
count(proid) over(partitionby catid) as n
from category c naturaljoin project p
select catname,projectname,budget
from
(select
catname,projectname,budget,
row_number() over(partitionby catid orderby budget) as rk,
count(proid) over(partitionby catid) as n
from category c naturaljoin project p
)t
where rk>=n/2and rk<=n/2+1
select catname,projectname
from project x naturaljoin category c
where budget >=(selectavg(budget)
from project y
where y.catid =x.catid
groupby y.catid )
image-20231014153658251
参与过所有项目的员工的姓名(empname)。
sql
select empname from employee
wherenotexists(select*from project
wherenotexists (select*from workson
where empid=employee.empid and proid=project.proid))