728x90
반응형

테이블

STUDENT

 

SUBJECT

 

ENROL

 

EMP

 

DEPT

 

SALGRADE

 

 

1. 학생 테이블에서 2013년도에 입학한 사람의 레코드 출력

▶ ****년도에 입학한 것을 확인하기 위해 학번을 받아온다.

SELECT SUBSTR(STU_NO, 1,4) AS NO
FROM STUDENT;

 


▶ 코드

SELECT *
FROM STUDENT S
INNER JOIN(
    SELECT STU_NO, SUBSTR(STU_NO, 1,4) AS NO
    FROM STUDENT
) N ON S.STU_NO = N.STU_NO
WHERE N.NO = '2013'
ORDER BY S.STU_NO;
  • WHERE 절을 이용하여 받아온 학번이 2013일 값을 출력한다.

 

 

 


※ 학번(2015****), 이름, 학과 출력

SELECT RPAD(SUBSTR(STU_NO, 1,4),8,'*') AS 학번, STU_NAME AS 이름, STU_DEPT AS 학과
FROM STUDENT;

 

 

 

 

2. 학생 학번, 이름, 과목명, 점수 출력

▶ 코드

SELECT S.STU_NO AS 학번, S.STU_NAME AS 이름, SUB.SUB_NAME AS 과목명, E.ENR_GRADE
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
INNER JOIN SUBJECT SUB ON E.SUB_NO = SUB.SUB_NO
ORDER BY S.STU_NO;

 

 

 

 

3. 기계공작법 수업을 듣는 학생의 학번, 이름, 수업 출력

▶ 코드

SELECT S.STU_NO AS 학번, STU_NAME AS 이름, SUB.SUB_NAME AS 수업
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
INNER JOIN SUBJECT SUB ON E.SUB_NO = SUB.SUB_NO
WHERE SUB.SUB_NAME = '기계공작법'
ORDER BY S.STU_NO;

 

 

 

 

4. 옥한빛의 평균 점수보다 낮은 점수를 받은 학생들의 이름, 과목명, 점수 출력

▶ 옥한빛의 평균 점수

SELECT E.STU_NO, AVG(E.ENR_GRADE)
FROM ENROL E
INNER JOIN STUDENT S ON S.STU_NO = E.STU_NO
WHERE S.STU_NAME = '옥한빛'
GROUP BY E.STU_NO;

 

 


▶ 코드

SELECT S.STU_NAME AS 이름, SUB.SUB_DEPT AS 과목명,  E.ENR_GRADE AS 점수
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
INNER JOIN SUBJECT SUB ON E.SUB_NO = SUB.SUB_NO
WHERE E.ENR_GRADE < (
    SELECT AVG(E.ENR_GRADE)
    FROM ENROL E
    INNER JOIN STUDENT S ON S.STU_NO = E.STU_NO
    WHERE S.STU_NAME = '옥한빛'
)
AND S.STU_NAME <> '옥한빛' -- 옥한빛은 빼고 출력하기 위함
ORDER BY S.STU_NAME;

 

 

 

 

5. 각 부서별 급여 등급이 2등급 이상인 사람의 평균 급여 구하기

▶ 급여 등급이 2등급 이상인 사람과 등급 출력

SELECT E.ENAME, S.GRADE AS GRADE
FROM SALGRADE S 
INNER JOIN EMP E ON E.SAL BETWEEN S.LOSAL AND S.HISAL
WHERE GRADE >= 2;

 

 


▶ 급여 등급이 2등급 이상인 사람의 목록

SELECT *
FROM EMP E
INNER JOIN (
    SELECT E.ENAME, S.GRADE AS GRADE
    FROM SALGRADE S 
    INNER JOIN EMP E ON E.SAL BETWEEN S.LOSAL AND S.HISAL
    WHERE GRADE >= 2
) S ON E.ENAME = S.ENAME;

 

 


▶ 코드

SELECT E.DEPTNO, AVG(E.SAL)
FROM EMP E
INNER JOIN (
    SELECT E.ENAME, S.GRADE AS GRADE
    FROM SALGRADE S 
    INNER JOIN EMP E ON E.SAL BETWEEN S.LOSAL AND S.HISAL
    WHERE GRADE >= 2
) S ON E.ENAME = S.ENAME
GROUP BY E.DEPTNO;

 

728x90
반응형
728x90
반응형

테이블

 

STUDENT

 

SUBJECT

 

ENROL

 

EMP

 

DEPT

 

SALGRADE

 



--1. 각 학생들의 학번, 이름, 학과, 수강과목 수 출력

SELECT STU_NO, COUNT(STU_NO) AS CNT
FROM ENROL
GROUP BY STU_NO;

 

 

 

SELECT S.STU_NO AS 학번, S.STU_NAME AS 이름, S.STU_DEPT AS 학과, E.CNT AS 수강과목수
FROM STUDENT S
INNER JOIN (
    SELECT STU_NO, COUNT(STU_NO) AS CNT
    FROM ENROL
    GROUP BY STU_NO
) E ON S.STU_NO = E.STU_NO
ORDER BY E.CNT, S.STU_DEPT;

 

수강과목이 없는 학생도 출력하고 싶다면 OUTER JOIN을 이용한다.

LEFT OUTER JOIN STUDENT 테이블의 모든 학번에 대해 조인한다.

 

SELECT S.STU_NO AS 학번, S.STU_NAME AS 이름, S.STU_DEPT AS 학과, E.CNT AS 수강과목수
FROM STUDENT S
LEFT OUTER JOIN (
    SELECT STU_NO, COUNT(STU_NO) AS CNT
    FROM ENROL
    GROUP BY STU_NO
) E ON S.STU_NO = E.STU_NO
ORDER BY E.CNT, S.STU_DEPT;

 

 


--1-1 : 각 학생들의 학번, 이름, 학과 출력. 단 1과목만 수강하는 학생들만 출력한다.

SELECT S.STU_NO AS 학번, S.STU_NAME AS 이름, S.STU_DEPT AS 학과, E.CNT AS 수강과목수
FROM STUDENT S
INNER JOIN (
    SELECT STU_NO, COUNT(STU_NO) AS CNT
    FROM ENROL
    GROUP BY STU_NO
) E ON S.STU_NO = E.STU_NO
WHERE E.CNT = 1
ORDER BY S.STU_NO;

 

 

 

 


--1-2 각 학과별 수강 과목 수 구하기

SELECT S.STU_DEPT, SUM(CNT)
FROM STUDENT S
INNER JOIN (
    SELECT STU_NO, COUNT(*) AS CNT
    FROM ENROL
    GROUP BY STU_NO
) E ON S.STU_NO = E.STU_NO
GROUP BY S.STU_DEPT
ORDER BY S.STU_DEPT;

 

 

 


--2. 기계과 학생들중 최고 점수의 학생보다 높은 점수를 받은 학생들의 학번, 이름, 학과, 점수 출력

 

SELECT S.STU_NO AS 학번, S.STU_NAME AS 이름, S.STU_DEPT AS 학과, E.ENR_GRADE AS 점수
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
WHERE E.ENR_GRADE > (
    SELECT MAX(ENR_GRADE)
    FROM ENROL E
    INNER JOIN STUDENT S ON S.STU_NO = E.STU_NO
    WHERE S.STU_DEPT = '기계'
);

 

 

 


--3. 각 부서별 급여 등급 평균 구하기

SELECT DEPTNO, ROUND(AVG(SAL),1)
FROM EMP E
INNER JOIN SALGRADE S ON (E.SAL BETWEEN S.LOSAL AND S.HISAL)
GROUP BY DEPTNO;

 

 


--3-1 각 부서명, 평균 등급 출력

SELECT E.DEPTNO, D.DNAME, ROUND(AVG(S.GRADE),1)
FROM DEPT D
INNER JOIN EMP E ON D.DEPTNO = E.DEPTNO
INNER JOIN SALGRADE S ON (E.SAL BETWEEN S.LOSAL AND S.HISAL)
GROUP BY E.DEPTNO, D.DNAME
ORDER BY E.DNAME, D.DNAME;

D.DEPTNO, D.DNAME를 같이 묶어줘야 PRIMARY KET라고 할 수 있다.

 

 

 


--4. 각 부서별 급여 등급이 3등급 이상인 사람의 수 구하기

SELECT E.DEPTNO, D.DNAME, COUNT(S.GRADE)
FROM EMP E
INNER JOIN DEPT D ON D.DEPTNO = E.DEPTNO
INNER JOIN SALGRADE S ON (E.SAL BETWEEN S.LOSAL AND S.HISAL)
WHERE S.GRADE >= 3
GROUP BY E.DEPTNO, D.DNAME
ORDER BY E.DEPTNO, D.DNAME;

 

 


--4-1. 각 부서별 급여가 2500 이상인 사람의 수 구하기 -> 부서명을 출력하세요

SELECT E.DEPTNO, D.DNAME AS 부서명, COUNT(SAL)
FROM EMP E
INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO
WHERE SAL > 2500
GROUP BY E.DEPTNO, D.DNAME
ORDER BY E.DEPTNO, D.DNAME;

 

 

 


--5. 평균급여 등급이 가장 높은 부서와 낮은 부서와의 등급 차이 구하기

SELECT MAX(NUM) AS MAX, MIN(NUM) AS MIN, MAX(NUM)-MIN(NUM) AS DIFFERENCE
FROM (
    SELECT DEPTNO, ROUND(AVG(GRADE), 1) AS NUM
    FROM EMP E
    INNER JOIN SALGRADE S ON E.SAL BETWEEN S.LOSAL AND S.HISAL
    GROUP BY DEPTNO
);

 

 

 


--6. 각 학과의 학생들의 평균 점수를 구해서 가장 큰 평균 값에서 가장 작은 평균 값 빼기

SELECT MAX(SCORE) AS MAX, MIN(SCORE) AS MIN, MAX(SCORE)-MIN(SCORE) AS DIFFERENCE
FROM (
    SELECT S.STU_DEPT, ROUND(AVG(ENR_GRADE), 1) AS SCORE
    FROM ENROL E
    INNER JOIN STUDENT S ON S.STU_NO = E.STU_NO
    GROUP BY S.STU_DEPT
);

 

 

728x90
반응형

'HRD_훈련 > 실습' 카테고리의 다른 글

[SQL] JOIN 실습 4 (22일차)  (0) 2023.06.15
[SQL] 시간 함수 실습 (21일차)  (0) 2023.06.14
[SQL] JOIN 실습 1 (20일차)  (0) 2023.06.13
[SQL] SQL 함수 실습 (19일차)  (0) 2023.06.12
[SQL] 심화 문제 (19일차)  (0) 2023.06.12
728x90
반응형

테이블

STUDENT

 

SUBJECT

 

ENROL

 

EMP

 

DEPT

 

SALGRADE

 

 

 

1. 김인중 학생이 듣는 수업의 과목명과 교수 이름을 출력

▶ 김인중 학생이 듣는 수업을 찾는다.

SELECT STU_DEPT, STU_GRADE
FROM STUDENT
WHERE STU_NAME = '김인중';

  • 김인중은 과목 점수가 1인 컴퓨터 정보과 수업을 듣는다.

 

▶ 코드

SELECT SUB.SUB_DEPT AS 과목명, SUB.SUB_PROF AS 교수
FROM SUBJECT SUB
INNER JOIN (
    SELECT STU_DEPT, STU_GRADE
    FROM STUDENT
    WHERE STU_NAME = '김인중'
)STU ON SUB.SUB_DEPT = STU.STU_DEPT
    AND SUB.SUB_GRADE = STU.STU_GRADE
;

 

 

 

 

2. 컴퓨터개론 수업을 듣는 학생의 학번, 이름 출력

▶ 컴퓨터 개론의 SUB_NO을 받아온다. SUB_NO의 값이 기본키이기 때문이다. 

SELECT SUB_NO
FROM SUBJECT
WHERE SUB_NAME = '컴퓨터개론';

  • SUB_NO이 101인 학생들은 컴퓨터 개론 수업을 듣는다.

 

▶ 코드

SELECT STU.STU_NO AS 학번, STU.STU_NAME AS 이름
FROM ENROL E
INNER JOIN (
    SELECT SUB_NO
    FROM SUBJECT
    WHERE SUB_NAME = '컴퓨터개론'
) SUB ON E.SUB_NO = SUB.SUB_NO
INNER JOIN STUDENT STU ON E.STU_NO = STU.STU_NO;

 





 

3. 기계공작법, 기초전자실험 수업을 듣는 학생의 학번, 이름, 수업명 출력

▶ 기계공작법, 기초전자실험 수업을 듣는 넘버를 받아온다.

SELECT SUB_NO
FROM SUBJECT
WHERE SUB_NAME IN('기계공작법','기초전자실험');

  • 기계공작법, 기초전자실험 수업을 듣는 학생의 NO은 102,103이다.

 

▶ 코드

SELECT STU.STU_NO AS 학번, STU.STU_NAME AS 이름, SUB.SUB_NAME AS 수업명
FROM ENROL E
INNER JOIN (
    SELECT SUB_NO, SUB_NAME
    FROM SUBJECT
    WHERE SUB_NAME IN('기계공작법','기초전자실험')
) SUB ON E.SUB_NO = SUB.SUB_NO
INNER JOIN STUDENT STU ON E.STU_NO = STU.STU_NO;

 

 

 

 

4. 여자이면서 구봉규 교수의 수업을 듣는 학생의 학번, 이름, 학과, 수업명, 과목 점수 출력

▶구봉규 교수가 수업하는 과목의 넘버를 받아온다.

SELECT SUB_NO
FROM SUBJECT
WHERE SUB_PROF ='구봉규';

  • 구봉규 교수가 수업하는 과목의 넘버는 107이다.

 

 

▶ 과목의 넘버를 이용해 구봉규 교수의 수업을 듣는 학생을 구한다.

SELECT STU.STU_NO, STU.STU_NAME, STU.STU_DEPT, SUB.SUB_NAME, STU.STU_GRADE
FROM ENROL E
INNER JOIN(
    SELECT SUB_NO, SUB_NAME
    FROM SUBJECT
    WHERE SUB_PROF ='구봉규'
) SUB ON E.SUB_NO = SUB.SUB_NO 
INNER JOIN STUDENT STU ON E.STU_NO =STU.STU_NO
    AND STU.STU_GENDER = 'F'
;

 

 


▶ 이너 조인 두 번 쓰는 방법

SELECT S.STU_NO, STU_NAME, STU_DEPT, SUB_NAME
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
INNER JOIN SUBJECT SUB ON SUB.SUB_NO = E.SUB_NO
WHERE S.STU_GENDER = 'F' AND SUB.SUB_PROF = '구봉규';

 

 

 

 

 

5. 김인중의 평균 점수보다 낮은 점수를 받은 학생들의 이름, 과목명, 점수 출력

▶ 김인중의 학번을 구한다.

SELECT STU_NO
FROM STUDENT
WHERE STU_NAME='김인중';

 


▶ 학번 20151062의 평균 점수

SELECT AVG(ENR_GRADE)
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
WHERE STU_NAME = '김인중';

 


▶ 김인중의 평균 점수보다 낮은 점수를 받은 학생들을 구하는 코드

SELECT *
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
WHERE ENR_GRADE < (
    SELECT AVG(ENR_GRADE)
    FROM STUDENT S
    INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
    WHERE STU_NAME = '김인중'
);

 

 

 

 

6. 기계과의 최고 점수보다 높은 점수를 받은 학생 출력

1) 기계과에서 가장 높은 점수 출력

SELECT MAX(E.ENR_GRADE)
FROM SUBJECT SUB
INNER JOIN ENROL E ON SUB.SUB_NO = E.SUB_NO
WHERE SUB_DEPT = '기계';

 

 

2) 학생들과 점수 목록

SELECT *
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO;

 

 

3) 기계과의 최고점수

SELECT MAX(ENR_GRADE)
FROM ENROL E
INNER JOIN STUDENT S ON S.STU_NO = E.STU_NO
WHERE S.STU_DEPT = '기계';

 



4) 기계과의 최고 점수보다 높은 점수를 받은 학생 출력

SELECT S.STU_NO, S.STU_NAME, E.ENR_GRADE
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
WHERE E.ENR_GRADE > (
    SELECT MAX(ENR_GRADE)
    FROM ENROL E
    INNER JOIN STUDENT S ON S.STU_NO = E.STU_NO
    WHERE S.STU_DEPT = '기계'
);

 

 

 

 

 

7. 2개 이상의 과목을 들은 학생들의 목록 출력

▶ 2개 이상의 과목을 듣는 학생의 학번

SELECT STU_NO, COUNT(STU_NO) AS CNT
FROM ENROL
GROUP BY STU_NO
HAVING COUNT(*) > 1;

 

▶ 해당 학번의 학생 목록 출력

SELECT *
FROM STUDENT S
INNER JOIN (
    SELECT STU_NO
    FROM ENROL
    GROUP BY STU_NO
    HAVING COUNT(*) > 1
) E ON S.STU_NO = E.STU_NO;

 

 

▶ INNER JOIN이 아닌 WHERE 절으로 표현이 가능하다.

SELECT *
FROM STUDENT S
WHERE STU_NO IN(
    SELECT STU_NO
    FROM ENROL
    GROUP BY STU_NO
    HAVING COUNT(*) > 1
);

 

 

▶ 코드-- HAVING 절을 사용하지 않고 CNT 값을 구할 수 있다.

SELECT *
FROM (
    SELECT STU_NO, COUNT(*) AS CNT
    FROM ENROL
    GROUP BY STU_NO
)
WHERE CNT > 1;

 

 

 

 

 

8. 전기전자과의 평균 점수보다 높은 점수를 받은 학생들의 목록 출력

▶ 전기전자과의 평균 점수

SELECT AVG(ENR_GRADE)
FROM ENROL E
INNER JOIN SUBJECT SUB ON E.SUB_NO = SUB.SUB_NO
WHERE SUB.SUB_DEPT = '전기전자';

 

▶ 전기전자과의 평균 점수보다 높은 점수를 받은 학생 출력

SELECT *
FROM STUDENT S
INNER JOIN ENROL E ON S.STU_NO = E.STU_NO
WHERE E.ENR_GRADE > (
    SELECT AVG(ENR_GRADE)
    FROM ENROL E
    INNER JOIN SUBJECT SUB ON E.SUB_NO = SUB.SUB_NO
    WHERE SUB.SUB_DEPT = '전기전자'
);

 

728x90
반응형

'HRD_훈련 > 실습' 카테고리의 다른 글

[SQL] 시간 함수 실습 (21일차)  (0) 2023.06.14
[SQL] JOIN 실습 2 (20일차)  (0) 2023.06.13
[SQL] SQL 함수 실습 (19일차)  (0) 2023.06.12
[SQL] 심화 문제 (19일차)  (0) 2023.06.12
[SQL] UPDATE 실습 (19일차)  (0) 2023.06.12

+ Recent posts