SQL 마무리 시험

BUMSOO·2024년 7월 1일

필기 시험

이름 : 김범수 점수 :

  1. 다음 SELECT 문장에서 Column Header로 출력되는 것은? (3)

    SELECT employee_id, first_name||last_name "Employee Name"
    FROM employees;

① employee_id, employee name
② Employee_id, Employee Name
③ EMPLOYEE_ID, Employee Name
④ EMPLOYEE_ID, EMPLOYEE NAME

  1. 다음 QUERY의 결과는 몇개의 column인가? (1)

    SELECT 'a'||'b'||'C' "Result" FROM dual;

① 1
② 3

  1. 중복 행을 제거 할 때 사용하는 키워드는? (2)
    ① ALL
    ② DISTINCT
    ③ NVL
    ④ COALESCE

  2. SELECT문의 기능이 아닌 것은? (4)
    ① 프로젝션(PROJECTION)
    ② 선택(SELECTION)
    ③ 조인(JOIN)
    ④ 엔티티(ENTITY)

  3. SQL문 작성시 틀린 것은? (3)
    ① SQL문은 대소문자를 구분하지 않습니다. 하지만 성능을 생각하면 대소문자를 구분해서 작성하자
    ② 절은 일반적으로 서로 다른줄에 씁니다.
    ③ 키워드는 약어로 사용할 수 있습니다.
    ④ 들여쓰기를 사용하면 SQL문을 좀더 읽기 쉽게 작성할 수 있습니다.


  1. SELECT employee_id, last_name, department_id as dept_id
    FROM employees
    ORDER BY ( );
    이 SELECT문은 부서번호로 sort하기를 원한다. ( )에 사용하기에 적당한 것들은 (세 가지)? (2,3,6)

① employee_id
② department_id
③ dept_id
④ 2
⑤ "Dept_id"
⑥ 3

  1. 문자함수에 대한 설명이 틀린것은 ? (3)

① length : 문자 길이를 반환하는 함수
② upper : 대문자로 변환하는 함수
③ replace : 문자를 추출하는 함수
④ instr : 문자의 위치값을 반환하는 함수

  1. 다음 문장을 실행한 결과로 맞는 것은? (2)
    SELECT ROUND(45.926,2)
    FROM DUAL;
    ① 45.92
    ② 45.93
    ③ 45
    ④ 46

  2. 다음 중 어떤 함수가 IF-THEN-ELSE문장과 유사한가? (2)
    ① SQRT
    ② DECODE
    ③ NEW_LINE
    ④ NVL

  3. SELECT last_name, (salary + commission_pct ) * 12, NVL(hiredate, '2001-01-01')
    FROM employees;
    위의 문장을 실행할 때 last_name = 'King', salary = 1000, commission_pct = NULL, hiredate = NULL 인 경우 결과는? (3)

① King, 1000,
② King, 12000, 2001-01-01
③ King, , 2001-01-01
④ King, ,

  1. 다음 SQL 명령문에서 ERROR가 발생하는 행의 번호는? (2)
    ① SELECT e.employee_id,
    ② employees.last_name,
    ③ e.department_id,
    ④ d.department_id
    ⑤ FROM employees e, departments d
    ⑥ WHERE e.department_id = d.department_id ;

  2. 다음 SQL 명령문에서 ERROR가 발생하는 행의 번호는? (4)
    ① SELECT department_id, sum(salary) "Salary"
    ② FROM employees
    ③ GROUP BY department_id
    ④ WHERE sum(salary) > 10000;

  3. 모든 DATATYPE에 가능한 GROUP 함수들은 (세 가지)? (2,3,4)
    ① AVG
    ② MIN
    ③ MAX
    ④ COUNT
    ⑤ STDDEV
    ⑥ VARIANCE
    ⑦ SUM

  4. auto commit이 발생하는 경우는? (다섯개) (3,4,6,7,8)
    ① select from employees ;
    ② insert into test(id,name) values (1,'james');
    ③ create table x as select
    from employees;
    ④ SQL*PLUS의 종료 시(exit)
    ⑤ delete from emp;
    ⑥ revoke select on test_tbl from hr;
    ⑦ grant select on test_tbl to hr;
    ⑧ alter table test_tbl modify last_name not null;

  1. 날짜 계산의 결과가 틀린 것은? (4)
    ① DATE + NUMBER = DATE
    ② DATE - NUMBER = DATE
    ③ DATE - DATE = NUMBER
    ④ DATE + DATE = DATE

  2. 다음 문장을 실행하는 경우 서브쿼리내에 NULL값이 포함되어 있다면 메인쿼리의 실행결과는 어떻게 되겠는가? (1)

SELECT last_name
FROM employees
WHERE emp.employee_id NOT IN
(SELECT manager_id
FROM employees);
① no rows selected
② 정상적 수행

  1. 서브쿼리의 결과 집합에 행이 있는지 여부를 검사하여 행이 있으면 TRUE를 반환하는 연산자는? (2)
    ① NOT IN
    ② EXISTS
    ③ NOT EXISTS
    ④ ALL

  2. 두 날짜 간의 달수를 반환하는 함수는? (1)
    ① MONTHS_BETWEEN
    ② ADD_MONTHS
    ③ NEXT_DAY
    ④ LAST_DAY

  1. 다음 문장이 하는 일은? (2)

ALTER TABLE emp MODIFY (title VARCHAR2(20));

① emp table에 title column을 추가한다.
② emp table에 title column의 TYPE과 SIZE를 변경한다.
③ emp table에 title column의 제약조건을 삭제한다.
④ emp table에 title column의 제약조건을 추가한다

  1. 다음의 SQL 명령문을 순서대로 실행했을 때 database에 영구적으로 반영되는 문장은? (4)
    1) INSERT INTO employees (employee_id, last_name, department_id) VALUES (9999, ‘Smith’, 10);
    2) SAVEPOINT a;
    3) DELETE employees WHERE employee_id = 100;
    4) SAVEPOINT b;
    5) UPDATE employees SET last_name = ‘Clark’;
    6) ROLLBACK TO SAVEPOINT a;
    7) INSERT INTO employees (employee_id, last_name, department_id) VALUES (8888, ‘Thomas’, 30);
    8) SAVEPOINT c;
    9) DELETE employees WHERE department_id = 20;
    10) COMMIT;

① 1, 3, 5, 7, 9번
② 1, 3, 5, 7번
③ 3, 5, 7, 9번
④ 1, 7, 9번

  1. 쿼리 문장중 오류 발생하지 않은 SQL문은? (3)
    ① SELECT department_id, avg(max(salary) FROM hr.employees GROUP BY department_id;
    ② SELECT department_id, job_id, sum(salary) FROM hr.employees GROUP BY department_id;
    ③ SELECT department_id, job_id, sum(salary) FROM hr.employees GROUP BY department_id, job_id;
    ④ SELECT department_id, job_id, sum(salary) FROM hr.employees GROUP BY 1,2;

  2. 서브쿼리 설명으로 틀린것은? (4)
    ① subquery는 괄호로 묶습니다.
    ② 가독성을 위해 비교 조건의 오른쪽에 subquery를 배치합니다. 그러나 subquery는 비교 연산자의 양쪽 어디에나 사용할 수 있습니다.
    ③ 단일 행 subquery는 서브쿼리에서 한 행만 반환하는 query입니다.
    ④ 다중 행 subquery는 단일행 연산자를 사용합니다.

  3. 집합연산자 설명으로 틀린것은? (2)
    ① 컬럼의 갯수 타입이 일치해야 한다.
    ② 모든 집합연산자는 중복을 제거합니다.
    ③ ORDER BY 절은 명령문의 맨 끝에만 올 수 있습니다
    ④ UNION ALL의 경우를 제외하고 출력은 기본적으로 오름차순으로 정렬됩니다.

  4. ANSI표준 조인 설명으로 틀린것은? (4)
    ① NATURAL JOIN 절은 이름이 같은 두 테이블의 모든 열을 기반으로 합니다.
    ② USING 절을 사용하면 Equijoin에 사용될 열만 지정할 수 있습니다.
    ③ ON절을 사용하여 조인 조건을 지정한다.
    ④ WHERE 절을 사용하여 조인 조건을 지정한다.
    ⑤ NATURAL JOIN, USING, 또는 ON 절을 사용하여 테이블을 조인하면 INNER JOIN이 생성됩니다
    ⑥ 일치하지 않는 행을 반환하려면 OUTER JOIN을 사용하면 됩니다.

  5. Cartesian Product 설명으로 틀린것은? (4)
    ① 조인 조건이 생략된 경우
    ② 조인 조건이 잘못된 경우
    ③ 첫번째 테이블의 모든 행이 두번째 테이블의 모든 행에 조인되는 경우
    ④ 최종 결과 건수는 첫번째 테이블 수와 두번째 테이블의 수를 더한 값이 나온다.

  6. Transaction은 첫번째 DML 문을 만나면 시작되고 다음 상황 중 하나가 발생하면 종료됩니다. 설명으로 틀린것은? (4)
    ① COMMIT 또는 ROLLBACK 문 실행
    ② DDL문 실행
    ③ DCL문 실행
    ④ SELECT문 실행

  1. 객체 설명으로 틀린것은? (2)
    ① 테이블 : 행과 열로 구성되어 있다.
    ② 뷰: 데이터를 저장한다.
    ③ 시퀀스: 자동일련번호를 생성합니다.
    ④ 동의어: 객체에 다른 이름을 부여합니다
  1. 테이블이름, 컬럼이름 생성시 틀린것은? (4)
    ① 문자로 시작해야 합니다.
    ② 길이는 1?30자 사이여야 합니다.
    ③ A-Z, a-z, 0-9, _, $, #만 포함할 수 있습니다.
    ④ 동일한 유저가 소유한 다른 객체의 이름과 중복될수 있다.

  2. 제약조건 설명으로 틀린것은? (2)
    ① NOT NULL 제약 조건은 열이 null 값을 포함하지 않도록 보장합니다
    ② UNIQUE 제약 조건은 중복값, NULL값 허용할 수 없다.
    ③ PRIMARY KEY 제약 조건은 중복값, NULL값 허용할 수 없다.
    ④ FOREIGN KEY 제약 조건 동일한 테이블이나 다른 테이블의 Primary key 또는 Unique key와의 관계를 설정합니다
    ⑤ CHECK 제약 조건은 각 행이 충족해야 하는 조건을 정의합니다.

  3. ALTER TABLE문을 사용하여 수행할 수 없는 것은? (4)
    ① 컬럼 추가, 삭제
    ② 컬럼의 타입, 사이즈를 변경
    ③ 컬럼 이름 바꾸기
    ④ 삭제된 테이블을 복원

  4. 단순 뷰의 설명으로 틀린것은? (4)
    ① 하나의 테이블에서만 데이터를 가져옵니다.
    ② 함수나 데이터 그룹을 포함하지 않습니다.
    ③ 뷰를 통해 DML 작업을 수행할 수 있습니다.
    ④ 조인 문장이 있다.

  5. SEQUENCE 설명으로 틀린것은? (2)
    ① 자동 일련번호를 생성하는 객체
    ② SEQUENCE생성 후에 START WITH를 수정할 수 있다.
    ③ NEXTVAL Pseudocolumn(가상컬럼)은 사용 가능한 다음 시퀀스 값을 반환합니다
    ④ CURRVAL Pseudocolumn(가상컬럼)은 현재 시퀀스 값을 반환합니다.

  1. 연산자 우선 설명으로 틀린것은? (4)
    ① 곱하기와 나누기는 더하기와 빼기보다 먼저 수행됩니다.
    ② 동일한 우선 순위를 갖는 연산자는 왼쪽에서 오른쪽으로 평가됩니다.
    ③ 괄호는 기본 우선 순위를 재정의하거나 표현식을 명확히 하기 위해 사용됩니다.
    ④ 더하기와 빼기는 곱하기와 나우기 보다 먼저 수행됩니다.
  1. NULL 설명으로 틀린것은? (2)
    ① Null은 사용할 수 없거나, 할당되지 않았거나, 알 수 없거나, 적용할 수 없는 값입니다.
    ② Null은 공백이다.
    ③ Null은 0아니다.
    ④ Null은 계산할 수 없다.
  1. 열 alias 설명으로 틀린것은? (1)
    ① 공백이나 특수 문자를 포함하거나 대소문자를 구분하는 경우 작은 따옴표('')를 사용해야 한다.
    ② 열 머리글의 이름을 바꿉니다.
    ③ 열 이름 바로 뒤에 나옵니다. 열 이름과 alias 사이에 선택 사항인 AS 키워드가 올 수도 있습니다.
    ④ 공백이나 특수 문자를 포함하거나 대소문자를 구분하는 경우 큰 따옴표("")를 사용해야 한다.

  2. 연결 연산자 설명으로 틀린것은? (4)
    ① 열이나 문자열을 다른 열에 연결합니다.
    ② 두 개의 세로선(||)으로 나타냅니다.
    ③ 결과 열로 문자식을 생성합니다.
    ④ 결과 열로 다양한 타입으로 생성합니다.

  3. WHERE절을 작성시 주의 사항이 아닌것은? (1)
    ① 문자열 및 날짜 값은 큰 따옴표로 묶습니다.
    ② 문자 값은 대소문자를 구분하고 날짜 값은 형식을 구분합니다.
    ③ 날짜 표시 형식 현재 접속하고 있는 지역과 언어에 종속되어 있다.
    ④ 문자열 및 날짜 값은 작은 따옴표로 묶습니다.

  4. LIKE 연산자 설명으로 틀린것은? (4)
    ① 모든 타입의 컬럼에 사용할수는 있지만 성능상에 관점으로는 꼭 문자 타입의 컬럼에 사용하자.
    ② LIKE 연산자를 사용하여 유효한 검색 문자열 값의 대체 문자 검색을 수행합니다.
    ③ 대체 문자 %는 0개 이상의 문자를 나타냅니다.
    ④ 대체 문자 _는 0개 이상의 문자를 나타냅니다.

  5. AND 진료표 표현식에서 틀린것은? (3)
    ① TRUE AND TRUE = TRUE
    ② TRUE AND FALSE = FALSE
    ③ TRUE AND NULL = FALSE
    ④ FALSE AND NULL = FALSE

  6. OR 진료표 표현식에서 틀린것은? (4)
    ① TRUE OR TRUE = TRUE
    ② TRUE OR FALSE = TRUE
    ③ TRUE OR NULL = TRUE
    ④ FALSE OR NULL = FALSE

  7. WHERE 조건절에 NOT 연산자 사용시 틀린문장은? (1)
    ① WHERE commission_pct NOT IS NULL
    ② WHERE salary NOT BETWEEN 10000 AND 15000
    ③ WHERE last_name NOT LIKE '%A%'
    ④ WHERE job_id NOT IN ('AC_ACCOUNT', 'AD_VP')

  1. ORDER BY절 설명으로 틀린것은? (4)
    ① ORDER BY 절을 사용하여 검색된 행을 정렬합니다.
    ② 기본값으로 오름차순(ASC) 정렬합니다. 내림차순 정렬할때는 DESC를 사용합니다.
    ③ ORDER BY 절에는 컬럼이름, 표현식, 열별칭, 위치표기법을 사용할 수 있습니다.
    ④ ORDER BY 절은 SELECT 문의 어느 위치에 와도 상관없습니다.

  2. 단일 행 함수의 기능 설명으로 틀린것은? (4)
    ① query에서 반환되는 각 행에서 실행합니다.
    ② 행당 하나의 결과 반환합니다.
    ③ 참조되는 유형이 아닌 다른 유형의 데이터 값을 반환할 수 있습니다.
    ④ WHERE절에만 사용해야 하며 중첩할 수 없습니다.

  3. 날짜 함수 설명으로 틀린것은? (1)
    ① LAST_DAY 날짜에 해당하는 날짜가 있는 월의 첫 날짜를 리턴하는 함수
    ② MONTHS_BETWEEN 두 날짜 간의 달 수를 계산하는 함수
    ③ ADD_MONTHS 날짜에 달을 더하는 함수
    ④ NEXT_DAY 날짜 다음에 오는 지정된 요일의 날짜를 리턴하는 함수

  4. 아래 화면의 결과 처럼 나오는 쿼리문장은? (1)

Today
2024-07-01 10:10:23.36623 오전

① SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS.SSSSS AM') "Today" FROM dual;
② SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS AM') "Today" FROM dual;
③ SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS PM') "Today" FROM dual;
④ SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS.XXXXX AM') "Today" FROM dual;

  1. 아래 화면의 결과 처럼 나오는 모든 쿼리문장? (1,2)
급여
₩8,000.00
₩7,400.00

① SELECT TO_CHAR(salary, 'l99,999.00') 급여 FROM employees WHERE last_name = 'Smith';
② SELECT TO_CHAR(salary, 'l99G999D00') 급여 FROM employees WHERE last_name = 'Smith';
③ SELECT TO_CHAR(salary, 'l99D999G00') 급여 FROM employees WHERE last_name = 'Smith';
④ SELECT TO_CHAR(salary, 'l99d999g00') 급여 FROM employees WHERE last_name = 'Smith';

  1. 그룹함수 사용시 설명으로 틀린것은? (4)
    ① SELECT 절에 그룹 함수에 포함되어 있지 않은 개별 컬럼들은 하나도 빠짐 없이 GROUP BY절에 포함해야 한다.
    ② WHERE 절을 사용하면 행을 그룹으로 나누기 전에 행을 제외할 수 있습니다.
    ③ GROUP BY 절에는 열별칭, 위치표기법 사용할 수 없다.
    ④ WHERE 절을 사용해서 그룹함수의 결과를 제한할 수 있다.

  2. 유저 세션의 날짜 정보를 리턴하는 함수가 아닌것은? (1)
    ① SYSTIMESTAMP
    ② CURRENT_DATE
    ③ CURRENT_TIMESTAMP
    ④ LOCALTIMESTAMP

  3. Correlated subquery 설명으로 틀린것은 ? (3)
    ① Correlated subquery는 행 단위 처리에 사용됩니다.
    ② Correlated subquery는 outer query의 모든 행에 대해 한 번씩 실행됩니다.
    ③ inner query가 먼저 실행되어 값을 찾습니다.
    ④ outer query가 먼저 실행되어 후보 행의 값을 사용하여 inner query를 실행합니다.

  4. EXISTS 연산자 설명이 틀린것은? (1)
    ① subquery의 결과 집합에 행이 없는지 테스트합니다.
    ② subquery의 결과 집합에 행이 있는지 테스트합니다.
    ③ subquery 행 값이 있을 경우 검색이 inner query에서 계속 수행되지 않으며 조건은 TRUE로 플래그가 지정됩니다.
    ④ subquery 행 값이 없을 경우 조건은 FALSE로 플래그가 지정됩니다.

  5. 설명으로 틀린것은? (4)
    ① DML(Data Manipulation Language) : 데이터베이스에 데이터를 입력, 수정, 삭제하는 명령어 , insert, update, delete, merge
    ② TCL(Transaction Control Language) : 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구시키기 위한 명령어, commit, rollback, savepoint
    ③ DDL(Data Definition Language) : 데이터베이스나 테이블등을 생성, 삭제하거나 그 구조를 변경하기 위한 명령어, create, alter, drop, rename, truncate, comment
    ④ DCL(Data Control Language) : 데이터베이스에 저장된 데이터를 조회하는 명령어, select


실기 시험

이름 : 김범수 점수 :

문제1. 입사한 월을 출력하고 월별 입사자 수를 1월부터 12월 까지 순서대로 출력하시오.

SELECT to_char(hire_date,'mm'), count(*) AS hire_cnt
FROM hr.employees
GROUP BY to_char(hire_date,'mm')
ORDER BY 1;

문제2. 근속연수가 가장 많은 10위까지 사원들의 employee_id, last_name, hire_date를 출력하세요.
단 연이은 순이를 구하세요)

WITH
temp_01 as(
SELECT employee_id, last_name, hire_date, dense_rank() over (order by hire_date asc) as hire_rank 
FROM hr.employees
)
SELECT * 
FROM temp_01
WHERE hire_rank <= 10;

문제3. 아래화면과 같이 급여의 도수분포표를 생성하세요.

계급도수
2000~500049
5001~1000043
10001~1500012
15001~200002
20001~1
SELECT *
FROM(
SELECT SUM(case when salary between 2000 and 5000 then 1 end) as "2000~5000",
        SUM(case when salary between 5001 and 10000 then 1 end) as "5001~10000",
        SUM(case when salary between 10001 and 15000 then 1 end) as "10001~15000",
        SUM(case when salary between 15001 and 20000 then 1 end) as "150001~20000",
        SUM(case when salary >= 20001 then 1 end) as "20001~"
FROM hr.employees)
UNPIVOT(도수 FOR 계급 IN ("2000~5000","5001~10000","10001~15000","150001~20000","20001~"));

문제4. 15000 이상 급여를 받는 관리자 이름, 급여, 급여등급을 출력하세요.

SELECT first_name ||' ' || last_name as name, salary ,
    (SELECT grade_level
        FROM hr.job_grades
        WHERE a.salary between lowest_sal and highest_sal) as 급여등급
FROM hr.employees a
WHERE EXISTS(SELECT 1
            FROM hr.employees
            WHERE manager_id = a.employee_id)
AND salary >= 15000;

문제5. 년도 분기별 급여 총액을 출력하세요.

SELECT  to_char(hire_date,'yyyy')as year,to_char(hire_date,'q') as quater, sum(salary) as sum_sal
FROM hr.employees
GROUP BY to_char(hire_date,'yyyy'),to_char(hire_date,'q')
order by 1,2;

문제6. 같은 부서에서 last_name이 같은 사원들을 찾아주세요.

WITH
temp_01 as (
SELECT last_name ,count(*)
FROM hr.employees
GROUP BY last_name
HAVING count(*) > 1
)
SELECT *
FROM hr.employees a
WHERE EXISTS (SELECT 1
            FROM temp_01
            WHERE last_name = a.last_name)
ORDER BY 3;

문제7 . 사원수가 3명 미만인 부서번호,부서이름,인원수를 출력해주세요.

WITH
temp_01 as(
SELECT department_id , count(*) as cnt
FROM hr.employees
GROUP BY department_id
HAVING count(*) < 3 
)
SELECT a.department_id, a.department_name, b.cnt
FROM hr.departments a
    join temp_01 b on a.department_id = b.department_id
ORDER BY 1;

문제8 . 사원 수가 가장 많은 부서정보, 도시, 인원수를 출력해주세요.

with
temp_01 as(
SELECT department_id , count(*) as cnt, rank() over (order by count(*) desc) as rnum
FROM hr.employees
GROUP BY department_id
)
SELECT a.*, c.city, b.cnt
FROM hr.departments a
    join temp_01 b on a.department_id = b.department_id
    join hr.locations c on a.location_id = c.LOCATION_ID
WHERE rnum = 1;

문제9. 요일별 입사한 인원수를 출력해주세요.

SELECT 요일, CNT
FROM(
SELECT to_char(hire_date,'day') AS 요일 ,to_char(hire_date-1,'d') as d ,COUNT(*) AS CNT
FROM hr.employees
GROUP BY to_char(hire_date,'day') ,to_char(hire_date-1,'d')
order by to_char(hire_date-1,'d'));

문제10. 부서별 최고 급여자들을 출력해주세요

with
temp_01 as(
SELECT a.*,
    row_number() over (partition by department_id order by salary desc) as rnum
FROM hr.employees a
)
SELECT *
FROM temp_01
WHERE rnum = 1;

문제11. 년도 분기별 총액을 구하세요. 행의 합과 열의 합도 구하세요.

년도1분기2분기3분기4분기
20011700017000
200236808210081100068816
2003350008000350046500
20044070014300170001400086000
200586900168006080033400197900
200669400204001420017100121100
2007366002020025003560094900
2008469001230059200
297500155808123508114600691416
SELECT NVL(년도,' ') as 년도,NVL(to_char("1분기"),' ') as "1분기", NVL(to_char("2분기"),' ') as "2분기",NVL(to_char("3분기"),' ') as "3분기",NVL(to_char("4분기"),' ') as "4분기",NVL(to_char("합"),' ') asFROM(   
SELECT to_char(hire_date, 'yyyy') AS 년도, nvl(to_char(hire_date,'q'),0) AS 분기,sum(salary) AS sum_sal
FROM hr.employees
GROUP BY cube(to_char(hire_date, 'yyyy'), to_char(hire_date,'q'))
)
PIVOT(MAX(sum_sal) FOR 분기 IN (1 "1분기",2 "2분기" ,3 "3분기",4 "4분기", 0 "합")) 
ORDER BY (case when NVL(년도,' ')         = '2001' then 1 
              when NVL(년도,' ') = '2002' then 2
              when NVL(년도,' ') = '2003' then 3
              when NVL(년도,' ') = '2004' then 4
              when NVL(년도,' ') = '2005' then 5
              when NVL(년도,' ') = '2006' then 6
              when NVL(년도,' ') = '2007' then 7
              when NVL(년도,' ') = '2008' then 8
              when NVL(년도,' ') = ' ' then 9 end);

문제12. 유저를 생성해주세요.
유저이름 : robin
비밀번호 : oracle
default tablespace : users
temporary tablespace : temp
users tablespace 사용량 : 1m

CREATE USER robin
IDENTIFIED BY oracle
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 1M ON users;

문제13. ROBIN 유저에게 create session, create table 시스템 권한을 부여해 주세요.

GRANT create session , create table TO robin;

문제14. HR유저 employees 테이블의 select 권한을 ROBIN 유저에게 부여 하세요.

GRANT SELECT ON hr.employees TO robin;

문제15. ROBIN 유저는 HR유저의 employees 테이블을 동일한 이름으로 복제 해주세요.

CREATE TABLE robin.employees
AS
SELECT * FROM hr.employees;

문제16. ROBIN 유저는 mgr 테이블 생성 해주세요.
컬럼 데이터타입
--- ---------
id number(3)
name varchar2(20)
day date

CREATE TABLE robin.mgr
    (id number(3),
    name varchar2(20),
    day date);

문제17. HR 유저 employees 테이블에서 관리자들의 employee_id, last_name, hire_date를 ROBIN 유저의 mgr 테이블에 insert 해주세요.

INSERT INTO robin.mgr
SELECT employee_id, last_name, hire_date
FROM hr.employees a
WHERE EXISTS (SELECT 1
                FROM hr.employees
                WHERE manager_id = a.employee_id);

문제18. employees 테이블에 데이터 중에 근무연수가 15년 이상 이면서 급여는 10000이상 급여를 받는 사원들은
emp_1테이블에 사번, 이름(last_name), 입사일, 근무연수, 급여 정보를 입력하고
근무연수가 15년 이상 이면서 급여는 10000미만 급여를 받는 사원들은
emp_2테이블에 사번, 이름(last_name), 입사일, 근무연수, 급여 정보를 입력하세요.

create table emp_1(id number, name varchar2(30), day date, years number, sal number);
create table emp_2(id number, name varchar2(30), day date, years number, sal number);

INSERT ALL
WHEN work_day >=15 and salary >=10000 then
    INTO emp_1 VALUES(employee_id,last_name,hire_date,work_day,salary)
WHEN work_day >=15 and salary < 10000 then
    INTO emp_2 VALUES(employee_id,last_name,hire_date,work_day,salary)
SELECT employee_id, last_name, hire_date , salary ,trunc(months_between(sysdate,hire_date)/12) AS work_day
FROM hr.employees;

문제19. emp_copy 테이블에 있는 departmetn_name값을 departments테이블에 있는 department_name값을 이용해서 수정해주세요.

CREATE TABLE hr.emp_copy
AS 
SELECT * FROM hr.employees;

ALTER TABLE hr.emp_copy ADD department_name varchar2(30);

UPDATE hr.emp_copy a
SET department_name = (select department_name
                        from hr.departments
                        where department_id = a.department_id);

문제20. Table Instance 정보를 이용해서 테이블을 생성해주세요.

CREATE TABLE hr.emp(
    id number(5) CONSTRAINT EMP_ID_PK PRIMARY KEY,
    name varchar2(50) CONSTRAINT emp_name_nn NOT NULL,
    hire_date date CONSTRAINT emp_date_nn NOT NULL,
    sal number(8,2)CONSTRAINT emp_sal_ck CHECK(sal > 100) ,
    mgr number(5) CONSTRAINT emp_mgr_fk REFERENCES hr.emp(id),
    dept_id number(3) CONSTRAINT emp_dept_id_fk REFERENCES hr.dept(dept_id)
    );

CREATE TABLE hr.dept(
    dept_id number(3) CONSTRAINT dept_pk PRIMARY KEY,
    dept_name varchar2(50) CONSTRAINT dept_nn NOT NULL
                            CONSTRAINT dept_uk UNIQUE,
    mgr number(5));

0개의 댓글