응_비 2022. 11. 24. 18:56

데이터베이스 성적 92 나왓다.
싹다 SQL 문제였는데, 1년전 대비 엄청 늘었구나!

CamScanner 12-04-2022 20.56
2.91MB


1. 'John Smith' 사원의 생일과 주소를 검색하시오.

더보기

SELECT Bdate, Address

FROM Employee

WHERE Fname = “John” and Lname = "Smith"


2. 'Research' 부서에 근무하는 모든 사원의 이름과 주소를 검색하시오. (Case 3)

더보기

1. - New SQL -

SELECT E.Fname, E.Lname, E.Address
FROM Employee E
WHERE E.Dno=(SELECT D.Dnumber
FROM Department D
WHERE D.Dname="Research");

2.(정답)

select E.Fname, E.Lname, E.Address

from employee E, department D

where D.dname = 'Research' and D.dnumber = E.dno

3.(정답)

select Fname, Lname, Address

from (Employee inner join department

on employee.Dno = department.Dnumber)

where Dname = 'Research'

(오답)

Select E.Fname, E.Lname, E.Address
From Employee E, Department D
Where D.Mgr_ID = E.ID and Dname = 'Research'


3. 'Stafford'에서 진행되는 프로젝트에 대해 프로젝트 번호, 그 프로젝트를 담당하는 부서번호, 그 부서의 관리자의 이름, 주소, 생년월일을 검색하시오. (숨겨진 Department)

더보기

(정답)

Select P.Pnumber, P.Dnum, E.Lname, E.Address, E.Bdate
From Department D, Project P, Employee E
Where P.Dnum = D.Dnumber and
D.Mgr_ID = E.ID and
P.Plocation = 'Stafford'

SELECT P.Pnumber, D.Dnumber, E.Fname, E.Lname, E.Address, E.Bdate
FROM Project P, Department D, Employee E
WHERE Plocation = 'Stafford' and
P.Dnum = D.Dnumber and
D.Mgr_ID = E.ID

(오답) - 숨겨진 Department

Select P.Pnumber, P.Dnum, E.Lname, E.Address, E.Bdate
From Project P, Employee E
Where P.Plocation = "Stafford" and P.Dnum = E.Dno

(오답) - (Department 부서번호 연동 안함, "D.Dnumber = P.Dnum") -

SELECT A.Pnumber, A.Dnum, B.Fname, B.Lname, B.Address, B.Bdate

FROM Project as A, Employee as B

WHERE A.Plocation = “Stafford”


4. 각 사원의 이름과 그리고 그 사원의 직속 상사(supervisor)의 이름을 검색하시오.

더보기

(정답)

SELECT E.Fname, E.Lname, S.Fname, S.Lname

FROM Employee E, Employee S

Where E.Super_ID = S.ID

Select A.Fname, A.Lname, B.Fname, B.Lname
From Employee A, Employee B
Where A.Super_ID = B.ID

(오답)

SELECT E.Fname, E.Lname, S.Fname, S.Lname

FROM Employee E, Employee S

Where E.ID = S.Super_ID (둘이 바뀜)


5. 모든 사원의 ID를 검색하시오.

더보기

SELECT ID

FROM Employee


6. 사원의 ID와 부서의 이름의 가능한 모든 조합을 검색하시오.

더보기

SELECT ID, Dname

FROM Employee, Department


7. 부서번호 5에 근무하는 모든 사원의 모든 속성 정보를 검색하시오.

더보기

(정답)

SELECT *

FROM Employee

Where Dno = 5;

(오답) - 조건 = 부서번호 5에 근무 -

SELECT *

FROM Employee a, Department b

WHERE a.Dno = b.Dnumber


8. 사원의 모든 급여(중복 포함) 정보를 검색하시오.

더보기

SELECT all Salary

FROM Employee

(기존 답)

SELECT Salary

FROM Employee


9. 사원의 모든 급여(중복 제거) 정보를 검색하시오.

더보기

SELECT DISTINCT Salary

FROM Employee


10. ‘Smith’라는 사원이 직접 참여하고 있는 프로젝트 번호 또는 관리자로 일하는 부서에서 진행하고 있는 프로젝트의 번호를 검색하시오. (숨겨진 Department, Works_On)

더보기

(정답)

(Select Distinct P.Pnumber
From Project P, Department D, Employee E
Where P.Dnum = D.Dnumber and
D.Mgr_ID = E.ID and
E.lname = 'Smith')


UNION

(Select Distinct P.Pnumber
From Project P, Works_On W, Employee E
Where P.Pnumber = W.Pno and
W.EmpID = E.ID and
E.lname = 'smith')

(정답 2)

SELECT P.Pnumber
FROM Project P, Works_On W, Employee E
Where P.Pnumber = W.Pno and
W.EmpID = E.ID and
E.Lname = 'Smith'

UNION

SELECT P.Pnumber
FROM Project P, Department D, Employee E
Where P.Dnum = D.Dnumber and
D.Mgr_ID = E.ID and
E.Lname = 'Smith'

(오답)

Select Distinct P.Pnumber
From Project P, Department D, Employee E
Where P.Dnum = E.Dno and D.Dname = "Research" and E.Lname = "Smith"

Union

Select Distinct P.Pnumber
From Project P, Employee E, Works_on W
Where P.Dnum = E.Dno and W.pno = P.Pnumber and E.Lname = "Smith"

(오답)

SELECT Pnumber

FROM Project

WHERE Dnum = (SELECT A.Dno, C.Dnumber FROM A.Employee, C.Department

WHERE (A.Lname = “Smith” OR C.Dname = “Administration”)


11. ‘Houston’에 사는 사원들의 이름을 검색하시오. (address)

더보기

(정답)

Select Fname, Lname

From Employee

Where address like '*Houston'

(오답)

SELECT A.Fname, A.Lname

FROM Dept_Locations B, Employee A

WHERE B.Dlocation = “Houston”


12. ‘Houston’에 살지 않는 사원들의 이름을 검색하시오. (address)

더보기

(정답)

Select Fname, Lname

From Employee

Where address not like '*Houston'

(오답)

SELECT A.Fname, A.Lname

FROM B.Dept_Locations, A.Employee

WHERE B.Dlocation <> “Houston”


13. 1950년대에 태어난 사원의 이름과 생일을 검색하시오.

더보기

(정답)

Select Fname, Lname

From Employee

Where Bdate like '195*'

SELECT Fname, Lname, Bdate

FROM Employee

WHERE Year(Bdate) Between "1950" and "1959"


14. 1970년 이전에 태어난 사원의 이름과 생일을 검색하시오.

더보기

SELECT Fname, Lname, Bdate

FROM Employee

WHERE Year(Bdate) < "1970"


15. 1965년부터 1975년 사이에 태어난 사원의 이름과 생일을 검색하시오.

더보기

SELECT Fname, Lname, Bdate

FROM Employee

WHERE Year(Bdate) Between "1965" and "1975"


16. ‘ProductX’ 프로젝트참여하는 사원의 이름과, 급여를 10% 증액하여 제시하라.
(숨겨진 Works_on)

더보기

(정답)

Select Fname, Lname, 1.1*salary as Increased_sal
From Employee E, Works_on W, Project P
Where E.ID = W.EmpID and
W.pno = P.pnumber and
P.pname = 'ProductX'

(오답)

SELECT Fname, Lname, (1.1)*Salary

FROM Employee

WHERE Dno = (SELECT Dnum FROM Project

WHERE B.Pname = “ProductX”)


17. 소속부서가 5번이고 급여가 30000에서 40000 사이인 사원의 이름과 급여, 그리고 생년월일 정보를 검색하시오.

더보기

SELECT Fname, Lname, Salary, Bdate

FROM Employee

WHERE Dno = 5 and (Salary between 3000 and 4000)


18. 부서 이름, 사원 이름, 프로젝트 이름의 리스트를 각 부서의 이름순으로 그리고 같은 부서에서는 이름(Lname, Fname) 순으로 검색하시오. (숨겨진 Works_on(W.Pno) = 프로젝트(Project.Pnumber))

더보기

(정답)

Select D.Dname, E.Lname, E.Fname, P.Pname

From Department D, Employee E, Works_on W, Project P

Where D.dnumber = E.dno and

E.Id = W.EmpID and

W.pno = P.pnumber

order by D.Dname DESC, E.Lname, E.Fname

(오답)

SELECT B.Dname, A.Fname, A.Lname, C.Pname

FROM B.Department, A.Employee, C.Project

ORDER BY C.Pname, A.Lname, A.Fname


19. 직속 상사가 없는 사원의 이름을 검색하시오.

더보기

SELECT Fname, Lname

FROM Employee

WHERE Super_ID IS NULL


20. 부서번호 5에 근무하는 모든 사원보다 급여가 많은 사원의 이름을 검색하시오.

더보기

SELECT Fname, Lname

FROM Employee

WHERE Salary > all (Select Salary From Employee Where Dno = “5”)


21. 사원의 Fname과 같은 이름을 갖고 성별이 같은 부양가족을 가진 사원의 이름을 검색하시오.
(Case 3)

더보기

SELECT E.Fname, E.Lname

FROM Employee E, Dependent D

WHERE E.ID = D.EmpID and

E.Fname = D.DepName and

E.Sex = D.Sex;

(정답1)

Select E.Fname, E.Lname

From Employee E

Where E.ID in (Select D.EmpID

From Dependent D

Where E.Fname = D.Depname and

E.Sex = D.Sex

(정답2)

Select Fname, Lname

From Employee E

Where Exists (Select *

From Dependent

Where ID = empID and

E.sex = sex and

E.Fname = depName)


22. 부양가족이 없는 사원의 이름을 검색하시오.

더보기

SELECT Fname, Lname

FROM Employee A

WHERE NOT EXISTS

(SELECT * FROM Dependent B

WHERE A.ID = B.EmpID)

Select E.Fname, E.Lname
From Employee E
Where Not Exists (Select * From Dependent D Where E.ID = D.EmpID )


23. 부양가족이 한 명이라도 있는 관리자의 이름을 검색하시오. (Case 2)

더보기

SELECT Fname, Lname

FROM Employee

WHERE EXISTS (SELECT *

FROM Dependent

WHERE ID = EmpID) and

EXISTS (SELECT *

FROM Department

WHERE ID = Mgr_ID);

(정답1)

Select E.Fname, E.Lname

From Employee E

Where E.ID In (Select Distinct D.EmpID

From Dependent D, Department T

Where D.EmpID = T.Mgr_ID);


24. 프로젝트 번호 1, 2, 3에 참여하고 있는 모든 사원의 ID를 검색하시오.

더보기

(최근)

SELECT Distinct EmpID

FROM Works_On

WHERE PNO IN (1, 2, 3);

(기존)

SELECT EmpID

FROM Works_On

WHERE PNO IN (1, 2, 3);


25. 모든 사원에 대해서 직속 상관의 이름을 함께 검색하여 제시하시오. 만일 직속 상관이
없는 경우에는 사원의 이름과 직속 상관 이름 부분은 NULL로 표현

더보기

SELECT A.Fname, A.Lname, B.Fname, B.Lname

FROM Employee A

LEFT Outer JOIN Employee B

WHERE A.Super_ID = B.ID


26. 전체 사원의 급여 합, 최대 급여, 최소 급여, 평균 급여를 검색하시오.

더보기

SELECT Sum(Salary), MAX(Salary), MIN(Salary), AVG(Salary)

FROM Employee


27. ‘Research’ 부서 사원의 급여 합, 최대 급여, 최소 급여, 평균 급여를 검색하시오.

더보기

(정답)

SELECT Sum(Salary), MAX(Salary), MIN(Salary), AVG(Salary)

FROM (Employee E INNER JOIN Department D

ON E.Dno = D.Dnumber)

WHERE D.Dname = 'Research'

Select Sum(Salary), Max(Salary), Min(Salary), Avg(Salary)
From (Employee E INNER JOIN Department D ON E.Dno = D.Dnumber)
Where D.Dname = "Research"

- New SQL -

SELECT Sum(Salary), MAX(Salary), MIN(Salary), AVG(Salary)
FROM Employee E, Department D
WHERE E.Dno = D.Dnumber and D.Dname = 'Research'


28. 전체 사원의 수를 검색하시오.

더보기

SELECT COUNT(*)

FROM Employee


29. ‘Research’ 부서의 사원 수를 검색하시오.

더보기

(정답)

SELECT COUNT(*)

FROM Employee E, Department D

WHERE E.Dno = D.Dnumber and D.Dname = 'Research'

- New SQL -

SELECT COUNT(*)
FROM (Employee E INNER JOIN Department D ON E.Dno = D.Dnumber)
WHERE D.Dname = 'Research'

(오답)

SELECT COUNT(*)

FROM Employee

JOIN Department ON Dno = Dnumber

WHERE Dname = “Research”


30. 소속부서별로 부서번호, 사원의 수, 평균 급여를 검색하시오.

더보기

SELECT A.Dno, Count(*), AVG(Salary)

FROM Employee A

GROUP BY A.Dno;


31.프로젝트별 (프로젝트 번호, 프로젝트 이름), 그리고 참여 사원의 수를 검색하시오. (숨겨진 Works_on)

더보기

(정답)

SELECT P.Pnumber, P.Pname, Count(*)

FROM Project P, Works_On W

WHERE P.Pnumber = W.Pno

GROUP BY Pnumber, Pname

(오답)

SELECT P.Pnumber, P.Pname, Count(*)
FROM Project P, Works_On W, Employee E
Where P.Pnumber = W.Pno and
W.EmpID = E.ID
Group by P.Pnumber, P.Pname

SELECT P.Pnumber, P.Pname, COUNT(*)
FROM Project P
GROUP BY Pnumber, Pname

SELECT P.Pname, P.Pnumber, Count(W.Pno)

FROM Project P, Works_On W

WHERE P.Pname = W.Pno

GROUP BY P.Pnumber


32. 2명 이상의 사원이 참여하는 프로젝트에 대해서 프로젝트 번호, 프로젝트 이름 그리고
참여 사원의 수를 검색하시오.

더보기

SELECT Pname, Pnumber, Count(*)

FROM Project, Works_On

WHERE Pnumber = Pno

GROUP BY Pnumber, Pname

HAVING Count(*) > 2:


33. 각 프로젝트에 대해서 프로젝트 번호, 프로젝트 이름 그리고 부서번호 5번에서 참여하는
사원의 수를 검색하시오.

더보기

SELECT W.Pno, P.Pname, Count(*)

FROM Employee E, Works_on W, Project P

WHERE E.dno = 5 and W.EmpID = E.ID and P.Pnumber = W.Pno

GROUP BY W.Pno, P.Pname;


34. (부서별로 급여가 30000 이상인 사원의 수를) 부서번호와 그런 조건을 만족하는 사원의 를 검색하시오.

더보기

(정답)

SELECT Dno, Count(*)

FROM Employee

Where Salary >= 30000

GROUP BY Dno;

(오답) - Where절에 들어가야하는 문항이 Having절에 들어감

SELECT E.Dno, Count(*)

FROM Employee E

GROUP BY Dno;

HAVING Sum(Salary) >= 30000

SELECT D.Dnumber, Count(*)
FROM Department AS D, Employee AS E
WHERE (E.Salary)>=30000
GROUP BY D.Dnumber;


35. (부서별로 급여가 30000 이상인 사원을 2명 이상 갖고 있는) 부서번호와 그런 사원의 수를 검색하시오.

더보기

(정답)

SELECT Dno, Count(*)

FROM Employee

Where Salary >= 30000

GROUP BY Dno

HAVING Count(*) >= 2

(오답) - Where절에 들어가야하는 문항이 Having절에 들어감

SELECT Dno, Count(*)

FROM Employee

WHERE Count(*) >= 2

GROUP BY Dno;

(HAVING Sum(Salary) >= 30000)


36. (사원의 수가 2명을 초과하는 부서에 대해서) 그 부서에서 (부서별로) 급여가 30000 이상인 사원의
수를 검색하시오. (어려움)

더보기

(정답)

Select Dno, Count(*)

From Employee

Where Salary >= 30000 and

Dno in (Select dno

From Employee

Group by Dno

Having Count(*) > 2)

Group By Dno;

(오답) Where절에는 집계함수 사용 불가

Select Dno, Count(*)
From Employee
Where Salary >= 30000 and
Dno in (Select dno From Employee Where Count(*) >= 2)
Group by Dno;

(오답)

SELECT Count(*)

FROM Employee

WHERE Count(*) > 2

GROUP BY Dno;

HAVING Sum(Salary) >= 30000


37. (사원의 수가 2명을 초과하는 부서에 대해서) (부서번호, 부서이름(별로)), 그리고 그 부서에서
여가 30000 이상인 사원의 수를 검색하시오. (어려움)

더보기

(정답)

Select Dnumber, Dname, Count(*)

From Department, Employee

Where Dnumber = Dno and

Salary >= 30000 and

Dno in (Select dno

From Employee

Group by Dno

Having Count(*) > 2)

Group by Dnumber, Dname

Select D.Dnumber, D.Dname, Count(*)
From Employee E, Department D
Where E.Salary >= 30000 and D.Dnumber = E.Dno and
Dno in (Select dno From Employee Group by Dno Having Count(*) >= 2)
Group by Dno;

SELECT D.DNUMBER, D.DNAME, COUNT(*)
FROM EMPLOYEE E, DEPARTMENT D
WHERE D.DNUMBER = E.DNO AND
E.SALARY >= 30000 AND
E.DNO IN (SELECT E.DNO FROM EMPLOYEE E GROUP BY E.DNO HAVING COUNT(*) > 2)
GROUP BY DNUMBER, DNAME

(오답)

Select D.Dnumber, D.Dname, Count(*)
From Employee E, Department D
Where E.Salary >= 30000 and D.Dnumber = E.Dno and
Dno in (Select dno From Employee Group by Dno Having Count(*) > 2)
Group by Dno;

(오답)

Select D.Dnumber, D.Dname, Count(*)
From Employee E, Department D
Where E.Salary >= 30000 and D.number = E.Dno
Exists (Select dno From Employee Group by Dno Having Count(*) > 2)
Group by Dno;

(오답)

SELECT A.Dno, B.Dname, Count(*)

FROM Employee A, Department B

WHERE Count(*) > 2 AND A.Dno = B.Dnumber

GROUP BY Dno;

HAVING Sum(Salary) >= 30000


38. (자신이 속한 부서의 사원들의 평균 급여보다) 많은 급여를 받는 사원들의 이름, 부서번호,
급여를 검색하시오.

더보기

(정답)

SELECT Fname, Lname, Dno, Salary

FROM Employee E

WHERE Salary > (SELECT AVG(A.Salary)

FROM Employee A

Where E.Dno = A.Dno)

(오답) E.Dno = A.Dno (계속 잊어버림)

SELECT Fname, Lname, Dno, Salary
FROM EMPLOYEE A
Where Salary > (SELECT AVG(Salary) From Employee B GROUP BY Dno)

SELECT Fname, Lname, Dno, Salary

FROM Employee

WHERE Salary > (SELECT AVG(Salary)

FROM Employee

GROUP BY Dno;

HAVING AVG(Salary) >= 30000)