본문 바로가기

.etc/연습문제

[210924] SUBQUERY 연습문제

 JOIN 을 사용하지 않고 SUBQUERY 를 사용한다. (사실 JOIN 권장, 성능이 더 좋다)

 

SELECT * FROM EMPLOYEES--EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE

                         --,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

SELECT * FROM DEPARTMENTS--DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID

SELECT * FROM JOBS--JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY

SELECT * FROM COUNTRIES--COUNTRY_ID, COUNTRY_NAME, REGION_ID

SELECT * FROM REGIONS--REGION_ID, REGION_NAME(유럽,아메리카)

SELECT * FROM LOCATIONS;  --LOCATION_ID,STREET_ADDRESS,POSTAL_CODE,CITY(로마,베니스),STATE_PROVINCE,COUNTRY_ID



-- 모든 사원의 부서명과 직무명이 코드가 아닌 이름(명칭)으로 조회되도록 한다.

 

-- 모든 부서의 소재지를 조회하도록 한다.

 

-- 모든 사원의 급여가 직무에 정해진 범위에 맞게 받고 있는지 조회하도록 한다. (2가지 방법)

 

-- 부서의 매니저(관리자, 사원의 담당 매니저 아님)로 지정된 사원이 누구인지 알 수 있도록 조회한다. (2가지 방법 = 부서이름, 부서 ID)

 

-- 개별 사원의 담당 매니저가 누구인지 알 수 있도록 조회한다. 

 

 

--INSERT ALL

/*

별도의 두개의 테이블을 만들어서 각각의 테이블에 사원번호, 이름, 급여, 커미션퍼센트 정보가 저장될 수 있게 한다.

단, 커미션이 없는 사원용 테이블에는 커미션퍼센트를 만들지 않는다.

*/

 

 

 

 

 

 

 

SELECT EMPLOYEE_ID
     , FIRST_NAME
     , LAST_NAME
     , DEPARTMENT_ID
     , JOB_ID
     , (SELECT DEPARTMENT_NAME FROM DEPARTMENTS B WHERE DEPARTMENT_ID = A.DEPARTMENT_IDAS 부서명
     , (SELECT JOB_TITLE FROM JOBS C WHERE JOB_ID = A.JOB_IDAS 직무명
  FROM EMPLOYEES A;

-- 테이블 별칭으로 컬럼 구별 해 주어야 한다.
SELECT DEPARTMENT_NAME
     , (SELECT STATE_PROVINCE || ' ' || CITY || ' ' || STREET_ADDRESS
          FROM LOCATIONS B WHERE B.LOCATION_ID = A.LOCATION_IDAS 소재지
  FROM DEPARTMENTS A;
SELECT A.EMPLOYEE_ID
     , A.FIRST_NAME
     , A.LAST_NAME
     , A.SALARY
     , DECODE((SELECT COUNT(*) FROM JOBS B       -- 1개 나오면 적합한 급여(카운트), 0 과 1 값을 디코드로 변환
         WHERE B.JOB_ID = A.JOB_ID   
           AND A.SALARY BETWEEN B.MIN_SALARY AND B.MAX_SALARY), 1'적합''부적합'AS "적합/부적합"
     -- 표현식이 1이면 적합 아니면 부적합, DECODE(표현식, 조건1, 결과1, 조건2, 결과2...)

  FROM EMPLOYEES A;

--내가
SELECT EMPLOYEE_ID
      , FIRST_NAME || LAST_NAME AS 이름
      , SALARY
      , CASE WHEN SALARY BETWEEN (SELECT MIN_SALARY FROM JOBS B WHERE A.JOB_ID = B.JOB_ID)
                            AND (SELECT MAX_SALARY FROM JOBS B WHERE A.JOB_ID = B.JOB_ID
            THEN '적정한 급여'
            ELSE '부적정 급여'
        END AS 급여평가
  FROM EMPLOYEES A;

SELECT DEPARTMENT_NAME
     , (SELECT FIRST_NAME || ' ' || LAST_NAME FROM EMPLOYEES B WHERE A.MANAGER_ID = B.EMPLOYEE_ID)
  FROM DEPARTMENTS A;

SELECT DEPARTMENT_ID
     , FIRST_NAME || ' ' || LAST_NAME
  FROM EMPLOYEES
 WHERE EMPLOYEE_ID IN (SELECT MANAGER_ID FROM DEPARTMENTS WHERE MANAGER_ID IS NOT NULL);
SELECT EMPLOYEE_ID
     , FIRST_NAME || ' ' || LAST_NAME AS 사원이름
     , MANAGER_ID
     , (SELECT FIRST_NAME || ' ' || LAST_NAME FROM EMPLOYEES B WHERE B.EMPLOYEE_ID = A.MANAGER_IDAS 매니저이름
  FROM EMPLOYEES A;
INSERT ALL
  WHEN 커미션퍼센트 IS NOT NULL THEN
      INTO 커미션이있는사원 VALUES(사원번호, 이름, 급여, 커미션퍼센트)
  WHEN 커미션퍼센트 IS NULL THEN
      INTO 커미션이없는사원 VALUES(사원번호, 이름, 급여)
SELECT EMPLOYEE_ID AS 사원번호
     , FIRST_NAME || ' ' || LAST_NAME AS 이름
     , SALARY AS 급여
     , COMMISSION_PCT AS 커미션퍼센트
  FROM EMPLOYEES;

-- 다 별칭이라 헷갈린다면 보기
INSERT ALL
  WHEN COMMISSION_PCT IS NOT NULL THEN
      INTO 커미션이있는사원 VALUES(EMPLOYEE_ID, 이름, SALARYCOMMISSION_PCT)
  WHEN COMMISSION_PCT IS NULL THEN
      INTO 커미션이없는사원 VALUES(EMPLOYEE_ID, 이름, SALARY)
SELECT EMPLOYEE_ID
     , FIRST_NAME || ' ' || LAST_NAME AS 이름
     , SALARY
     , COMMISSION_PCT
  FROM EMPLOYEES;

 

'.etc > 연습문제' 카테고리의 다른 글

[210929] 쿼리 연습문제 응용  (0) 2021.09.29
[210924] JOIN 연습 문제  (0) 2021.09.24