1. '정남일' 선수가 소속된 팀의 선수들에 대한 정보를 출력하시오
SELECT PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버
FROM PLAYER
WHERE TEAM_ID = (SELECT TEAM_ID
FROM PLAYER
WHERE PLAYER_NAME = '정남일')
2. 선수들 중에서 키가 평균 이하인 선수들의 정보를 출력하시오
SELECT PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버
FROM PLAYER
WHERE HEIGHT <= (SELECT AVG(HEIGHT)
FROM PLAYER) ORDER BY PLAYER_NAME;
3. 각 부서별 급여 평균보다 더 많이 받는 사원의 사원번호, 이름, 급여를 출력하세요.
SELECT empno,ename,sal
FROM EMP
WHERE sal > all (SELECT AVG(sal)
FROM EMP
GROUP BY deptno)
4. CHICAGO 지역에 근무하는 사원들 중 BLAKE이 직속상관인 사원들의 사원번호, 이름, 직무를 출력하세요.
SELECT e.empno, e.ename, e.job
FROM EMP e, DEPT d
WHERE e.DEPTNO = d.DEPTNO
AND e.mgr = (SELECT empno
FROM EMP
WHERE ename = 'BLAKE')
AND d.loc = 'CHICAGO';
5. 각 부서별로 최고급여를 받는 직원의 Dept_id, ID, Last_name, Salary를 출력하시오.
SQL> SELECT dept_id, id, last_name, salary
FROM s_emp
WHERE (dept_id,salary) IN (SELECT dept_id, max(salary)
FROM s_emp
GROUP BY dept_id);
6. '20120501' 부터 '20120502' 사이에 경기가 있는 경기장을 출력하시오
SELECT STADIUM_ID ID, STADIUM_NAME 경기장명
FROM STADIUM A
WHERE EXISTS (SELECT 1
FROM SCHEDULE X
WHERE X.STADIUM_ID = A.STADIUM_ID
AND X.SCHE_DATE BETWEEN '20120501' AND '20120502')
7. 소속팀별 키가 가장 작은 사람들의 정보를 출력하시오
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, MIN(HEIGHT)
FROM PLAYER
GROUP BY TEAM_ID)
ORDER BY TEAM_ID, PLAYER_NAME;
8. 각 부서별로 최고급여를 받는 직원의 Dept_id, ID, Last_name, Salary를 출력하시오.
SELECT dept_id, id, last_name, salary
FROM s_emp
WHERE (dept_id,salary) IN (SELECT dept_id, max(salary)
FROM s_emp
GROUP BY dept_id);
9. K-리그 선수들 중에서 포지션이 미드필더(MF)인 선수들의 소속팀명 및 선수 정보를 출력하시오
SELECT T.TEAM_NAME 팀명, P.PLAYER_NAME 선수명, P.BACK_NO 백넘버
FROM (SELECT TEAM_ID, PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE POSITION = 'MF') P, TEAM T
WHERE P.TEAM_ID = T.TEAM_ID ORDER BY 선수명;
10. K리그 선수 중 가장 키가 큰 선수 5명을 출력하시오
SELECT PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM (SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE HEIGHT IS NOT NULL
ORDER BY HEIGHT DESC)
WHERE ROWNUM <= 5;
11. 최근 입사한 5명의 사원을 출력하시오
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM (SELECT *
FROM EMP
ORDER BY HIREDATE DESC)
WHERE ROWNUM <= 5;
12. 사원의 급여를 내림차순으로 모든 정보를 출력하시오
SELECT * FROM EMP ORDER BY SAL DESC
13. 사원이름과 급여를 최고 높은 순으로 정렬하여 출력하고 순위를 표시하는 컬럼을 생성하여 출력하시오
SELECT ROWNUM RNUM, ENAME, SAL
FROM (SELECT * FROM EMP ORDER BY SAL DESC)
14. 급여를 많이 받는 6 ~ 10번째 사원을 출력
SELECT RNUM, ENAME, SAL
FROM (SELECT ROWNUM RNUM, ENAME, SAL -- FROM 절의 INLINE VIEW ROWNUM에 대해 별칭 부여
FROM (SELECT *
FROM EMP
ORDER BY SAL DESC))
WHERE RNUM BETWEEN 6 AND 10;
15. 삼성블루윙즈팀(K02)의 평균키보다 작은 팀의 이름과 해당 팀의 평균키를 출력하시오
SELECT P.TEAM_ID 팀코드, T.TEAM_NAME 팀명, AVG(P.HEIGHT) 평균키
FROM PLAYER P, TEAM T
WHERE P.TEAM_ID = T.TEAM_ID
GROUP BY P.TEAM_ID, T.TEAM_NAME
HAVING AVG(P.HEIGHT) < (SELECT AVG(HEIGHT)
FROM PLAYER WHERE TEAM_ID ='K02')
16. 사원이 속해있는 부서번호와 부서이름을 출력하시오, 단, 중복 값은 허용하지 않는다
위의 예처럼 emp 테이블을 통해 사원들이 속한 부서번호의 정보만 조회하는 경우
추출하고자 하는 대상은 dept 테이블이지만 emp 테이블과 조인하여 부서번호를 체크해야 한다.
두 테이블의 관계가 1 : M 이므로 불필요하게 EMP 테이블을 모두 액세스하고 DISTINCT로 중복 제거를 한다.
SELECT DISTINCT d.deptno, d.dname
FROM dept d, emp e
WHERE d.deptno = e.deptno;
-- EXISTS를 사용하는 Subquery로 변경
-- 추출하고자 하는 테이블인 dept d을 FROM절에 놓고 emp테이블은 체크만 하기위해 EXISTS절에 위치시켰으며
이로 인해 수행속도가 대폭 감소하게 된다.
SELECT d.deptno, d.dname
FROM dept d
WHERE EXISTS (SELECT 1
FROM emp e
WHERE e.deptno = d.deptno);
'IT_Web > Oracle' 카테고리의 다른 글
Oracle DB인덱스 종류 및 개념 (0) | 2020.02.26 |
---|---|
Oracle DB 인덱스 활용법 (0) | 2020.02.26 |
Oracle 비교 연산자 & 논리연산자 & SQL 연산자 활용 문제 (0) | 2020.02.26 |
Oracle 비교, 논리, 산술, 합성연산자 문법 (0) | 2020.02.26 |
Oracle GROUP BY & HAVING 절 활용 문제 (0) | 2020.02.26 |