day DBMS 02

JTH·2023년 2월 9일
0

gb_jth

목록 보기
37/56

SELECT * FROM EMPLOYEES e ;

SELECT EMPLOYEE_ID
, FIRST_NAME , EMAIL
, HIRE_DATE , JOB_ID
, LAST_NAME
FROM EMPLOYEES e
WHERE LAST_NAME = 'Smith'
AND FIRST_NAME = 'William'
;

/*

  • 문1.
  • employees 테이블에서 department_id가 100이고
  • job_id가 FI_MGR인 사람의 모든 데이터 조회
    */

SELECT *
FROM EMPLOYEES e
WHERE DEPARTMENT_ID = 100
AND JOB_ID = 'FI_MGR'
;

/*

  • 문2.
  • employees 테이블에서 first_name이 Guy인 사람의
  • employee_id, first_name, last_name, job_id 조회
    */
    SELECT EMPLOYEE_ID , FIRST_NAME
    , LAST_NAME , JOB_ID
    FROM EMPLOYEES e
    WHERE FIRST_NAME ='Guy'
    ;

/*

  • 문3.
  • employees 테이블에서 department_id가 50이고
  • managet_id가 121인 사람의
  • employee_id, first_name, last_name, job_id 조회
    */

SELECT EMPLOYEE_ID , FIRST_NAME
, LAST_NAME , JOB_ID
FROM EMPLOYEES e
WHERE DEPARTMENT_ID = 50
AND MANAGER_ID = 121
;

as : 별칭, 알리아스(e)

SELECT e.EMPLOYEE_ID AS "ID"
, SALARY
FROM EMPLOYEES e
;

distinct : 중복제거

SELECT DISTINCT JOB_ID
FROM EMPLOYEES e
;

or 조건

SELECT EMPLOYEE_ID , LAST_NAME
, MANAGER_ID , DEPARTMENT_ID
FROM EMPLOYEES e
WHERE DEPARTMENT_ID = 50
OR MANAGER_ID = 100
;

not 부정 DEPARTMENT_ID 가 50이 아닌사람찾기

SELECT FIRST_NAME , LAST_NAME
, DEPARTMENT_ID
FROM EMPLOYEES e
WHERE NOT (DEPARTMENT_ID = 50)
;

'<>' 이것도 not의 의미

SELECT FIRST_NAME , LAST_NAME
, DEPARTMENT_ID
FROM EMPLOYEES e
WHERE DEPARTMENT_ID <> 50
;

'!=' 이것도 not의 의미

SELECT FIRST_NAME , LAST_NAME
, DEPARTMENT_ID
FROM EMPLOYEES e
WHERE DEPARTMENT_ID != 50
;

범위 자바 기호와 동일

SELECT FIRST_NAME , LAST_NAME
, SALARY
FROM EMPLOYEES e
WHERE SALARY >= 4000
AND SALARY <= 8000
;

between a and b 범위

SELECT FIRST_NAME , LAST_NAME
, SALARY
FROM EMPLOYEES e
WHERE SALARY BETWEEN 4000 AND 8000
;

in절 : or 조건과 동일

SELECT *
FROM EMPLOYEES e
WHERE SALARY IN (6500,7700,13000)
;

/* 문1

  • employees 테이블에서
  • employee_id, first_name, last_anem, job_id를 출력하는데,
  • job_id가 ST_MAN이고, manager_id가 100이고, salary가 5000이상인 사람.
    */

SELECT EMPLOYEE_ID , FIRST_NAME
, LAST_NAME , JOB_ID
, SALARY
FROM EMPLOYEES e
WHERE JOB_ID = 'ST_MAN'
AND MANAGER_ID = 100
AND SALARY >= 5000
;

-- 문2.
-- EMPLOYEES 테이블에서 EMPLOYEE_ID, first_name, last_name, JOB_ID
-- MANAGER_ID, SALARY 를 조회
-- DEPARTMENT_ID가 10 또는 30 또는 100 또는 90에 속하고,
-- 급여(SALARY)가 5000에서 10000사이 이고
-- 매니저(MANAGER_ID)가 100이 아닌 사람을 조회

SELECT EMPLOYEE_ID , FIRST_NAME
, LAST_NAME , JOB_ID
, MANAGER_ID , SALARY
FROM EMPLOYEES e
WHERE DEPARTMENT_ID IN (10, 30, 100, 90)
AND SALARY BETWEEN 5000 AND 10000
AND MANAGER_ID != 100
;

like : 퍼스트네임이 d로 끝나는 사람

SELECT FIRST_NAME , LAST_NAME , EMPLOYEE_ID
FROM EMPLOYEES e
WHERE FIRST_NAME LIKE '%d' --앞에 어떤문자가와도 상관없다 '%'
;

like : _ _ a인 사람 앞에서 3번째 글짜가 a가 들어가는사람

SELECT FIRST_NAME , LAST_NAME , EMPLOYEE_ID
FROM EMPLOYEES e
WHERE FIRST_NAME LIKE '__a%'
;

is null

SELECT FIRST_NAME , LAST_NAME , EMPLOYEE_ID , COMMISSION_PCT
FROM EMPLOYEES e
WHERE COMMISSION_PCT IS NULL
;

is not NULL

SELECT FIRST_NAME , LAST_NAME , COMMISSION_PCT
FROM EMPLOYEES e
WHERE COMMISSION_PCT IS NOT NULL
;

order by ASC : 오름 차순 정렬 (ASC)는 생략가능 없어도 댐

SELECT FIRST_NAME , LAST_NAME , COMMISSION_PCT
FROM EMPLOYEES e
WHERE COMMISSION_PCT IS NOT NULL
ORDER BY FIRST_NAME ASC
;

order by desc : 내림차순

SELECT FIRST_NAME , LAST_NAME , COMMISSION_PCT
FROM EMPLOYEES e
WHERE COMMISSION_PCT IS NOT NULL
ORDER BY FIRST_NAME DESC
;

합계 sum

SELECT SUM(SALARY)
FROM EMPLOYEES e
;

count(*)

SELECT COUNT(*)
FROM EMPLOYEES e
;
SELECT COUNT(EMPLOYEE_ID) "cnt"
FROM EMPLOYEES e
;

SELECT count(DEPARTMENT_ID)
FROM EMPLOYEES e
;
SELECT count(COMMISSION_PCT)
FROM EMPLOYEES e
;

부서갯수, EMPLOYEES 테이블에서

SELECT COUNT(DISTINCT DEPARTMENT_ID)
FROM EMPLOYEES e
;

avg : 평균

SELECT AVG(SALARY)
FROM EMPLOYEES e
;

max : 최대값

SELECT MAX(SALARY)
FROM EMPLOYEES e
;

가장나중에 입사

SELECT MAX(HIRE_DATE)
FROM EMPLOYEES e
;

min : 최소값

SELECT MIN(SALARY)
FROM EMPLOYEES e
;

가장먼저 입사

SELECT MIN(HIRE_DATE)
FROM EMPLOYEES e
;

abs : 절대값 / dual : 아무의미없는 더미 테이블

SELECT ABS(-23)
FROM dual

round() : 반올림

SELECT ROUND(0.123), ROUND(0.5678)
FROM dual
;

TRUNC : 절사

SELECT TRUNC(1234.56789)
FROM dual
;
SELECT TRUNC(1234.56789, 2) --소수점뒤로 두자리까지 나타나게
FROM dual
;
SELECT TRUNC(1234.56789, -1) --첫번째 자리 를 0으로 처리 값 잘라내기
FROM dual
;

  1. 연봉이 12000 이상되는 직원들의 LAST_NAME 및 연봉을 조회한다.

단, 급여 오름차순으로 조회

SELECT LAST_NAME , SALARY
FROM EMPLOYEES e
WHERE SALARY >= 12000
ORDER BY SALARY ASC
;

-- 2. 사원번호가 176 인 사람의 LAST_NAME 과 부서 번호를 조회한다.

SELECT LAST_NAME , EMPLOYEE_ID
FROM EMPLOYEES e
WHERE EMPLOYEE_ID = 176
;

-- 3. 연봉이 5000 에서 12000의 범위 이외인 사람들의
-- LAST_NAME 및 연봉을 조회힌다.

SELECT LAST_NAME , SALARY
FROM EMPLOYEES e
WHERE NOT SALARY BETWEEN 5000 AND 12000
;

-- 4. 20 번 및 50 번 부서에서 근무하는 모든 사원들의
-- LAST_NAME 및 부서 번호를 알파벳순으로 조회한다.

SELECT LAST_NAME , DEPARTMENT_ID
FROM EMPLOYEES e
WHERE DEPARTMENT_ID IN (20, 50)
ORDER BY LAST_NAME ASC
;

-- 5. 20 번 및 50 번 부서에 근무하며,
-- 연봉이 5000 ~ 12,000 사이인 사원들의
-- LAST_NAME 및 연봉을 조회한다.

SELECT LAST_NAME , SALARY
FROM EMPLOYEES e
WHERE DEPARTMENT_ID IN (20,50)
AND SALARY BETWEEN 5000 AND 12000
;

-- 6. LAST_NAME 첫 글자가 A 인 사원들의 LAST_NAME 을 조회한다.

SELECT LAST_NAME
FROM EMPLOYEES e
WHERE LAST_NAME LIKE ('A%')
;

-- 7. 매니저가 없는 사람들의 LAST_NAME 및 JOB_ID 를 조회한다.

SELECT LAST_NAME , JOB_ID
FROM EMPLOYEES e
WHERE MANAGER_ID IS NULL
;

-- 8. 커미션을 버는 모든 사원들의 LAST_ANME,
-- 연봉 및 커미션을 조회한다.
-- 단,연봉 역순 정렬한다.

SELECT SALARY , COMMISSION_PCT , LAST_NAME
FROM EMPLOYEES e
WHERE COMMISSION_PCT IS NOT NULL
ORDER BY SALARY DESC
;

concat : 문자열 연결 콘캣 캣캣고양이캣캣고캣고

SELECT CONCAT('Hello', 'Bye')
, concat('Good', 'bad')
, 'good' || 'bad' --위와 똑같은 효과
FROM dual
;

initcap : 첫글자를 대문자로

SELECT INITCAP('good morning')
FROM dual
;

대/소문자

SELECT LOWER('GOOD')
, UPPER('good')
FROM dual
;

lpad l은 레프트의 l

SELECT LPAD('good', 6) -- 아무것도입력안하면 왼쪽부터 공백으로 채운다.
, LPAD('good', 7, '#') -- 7자까지 왼쪽부터 남은칸은 샵으로채운다.
, LPAD('good', 8, 'L') -- 8자까지 왼쪽부터 남은칸은 L로 채운다.
FROM dual
;

rpad

SELECT RPAD('good', 6) -- 아무것도입력안하면 오른쪽부터 공백으로 채운다.
, RPAD('good', 7, '#') -- 7자까지 오른쪽부터 남은칸은 샵으로채운다.
, RPAD('good', 8, 'L') -- 8자까지 오른쪽부터 남은칸은 L로 채운다.
FROM dual
;

LTRIM 자바에선 trim 이 공백제거용이였음

SELECT LTRIM('goodbye' , 'g') --왼쪽을 기점으로 정해진 글씨를 지움
, LTRIM('goodbye' , 'o') -- 겹치는게 있다면 다지우나 맨 왼쪾에 o가없어서 안지워짐
, LTRIM('goodbye' , 'go')
FROM dual
;

RTRIM

SELECT RTRIM('ggggoodbye' , 'g') --오른쪽을 기점으로 정해진 글씨를 지움
, RTRIM('goodbye' , 'e')
, RTRIM('goodbye' , 'ye') -- 겹치는게 있다면 다지우나 맨 오른쪽에 부터
FROM dual
;

substr (i번째부터, j자리번까지 출력)

SELECT SUBSTR('good morning john', 1, 4)
FROM dual
;
SELECT SUBSTR('good morning john', 8, 4)
FROM dual
;
SELECT SUBSTR('good morning john', 4)
FROM dual
;
SELECT SUBSTR('good morning john', -4) -- (-)뒤에서부터 4번째까지
FROM dual
;

replace 앞문장을 뒤에로 대체

SELECT REPLACE ('good morning tom', 'morning', 'evenning')
FROM dual
;

현재시각

SELECT SYSDATE
FROM dual
;

7개월 더한다.

SELECT ADD_MONTHS(SYSDATE, 7)
FROM dual
;

현재 달의 마지막 날짜

SELECT LAST_DAY(SYSDATE)
FROM dual
;

to_char

SELECT SYSDATE
, TO_CHAR(SYSDATE , 'yyyy/mm/dd') "yyyy/mm/dd"
, TO_CHAR(SYSDATE , 'yyyymmdd') "yyyymmdd"
, TO_CHAR(SYSDATE , 'yyyy-mm-dd') "yyyy-mm-dd"
, TO_CHAR(SYSDATE , 'yyyy-mm-dd HH24:MI:SS') "yyyy-mm-dd HH24:MI:SS"
FROM dual
;

to_date

SELECT TO_DATE('2023-02-09', 'yyyy-mm-dd')
FROM dual
;

nvl() : 널값을 다른데이터로 변경하는 함수

SELECT FIRST_NAME , LAST_NAME
, NVL(COMMISSION_PCT, 0) COMMISSION
FROM EMPLOYEES e
;

decode() : switch 구문과 비슷하다 자바의

SELECT * FROM DEPARTMENTS d ;
SELECT DEPARTMENT_ID
, DECODE(DEPARTMENT_ID, 20, 'MA', 60, 'IT', 90, 'EX', 'ETC') de -- de는 아래 출력 탭이름이길어서 줄임
FROM DEPARTMENTS d
;

case when 조건문 then '' 으로 변경

SELECT FIRST_NAME , DEPARTMENT_ID
, CASE WHEN DEPARTMENT_ID = 20 THEN 'MA' --20은 ma
WHEN DEPARTMENT_ID = 60 THEN 'IT' --60은 it
WHEN DEPARTMENT_ID = 90 THEN 'EX' --90은 ex
ELSE '' --나머진 대충
END DEPARTMENt
FROM EMPLOYEES e
;

/
문제1) EMPLOYEES 테이블에서 King의 정보를 소문자로 검색하고
사원번호,성명, 담당업무(소문자로),부서번호를 출력하라.
/

SELECT EMPLOYEE_ID , LAST_NAME ,LOWER(JOB_ID) , DEPARTMENT_ID
FROM EMPLOYEES e
WHERE LOWER(LAST_NAME) = 'king'
;

/
문제2) EMPLOYEES 테이블에서 King의 정보를 대문자로 검색하고 사원번호,
성명, 담당업무(대문자로),부서번호를 출력하라.
/

SELECT EMPLOYEE_ID , FIRST_NAME , LAST_NAME , UPPER(JOB_ID) , DEPARTMENT_ID
FROM EMPLOYEES e
WHERE UPPER(LAST_NAME) = 'KING'
;

/
문제3) DEPARTMENTS 테이블에서 부서번호와 부서이름, 위치번호를
합하여 출력하도록 하라.(||사용)
/

SELECT DEPARTMENT_ID || DEPARTMENT_NAME || LOCATION_ID
FROM DEPARTMENTS d
;

/
문제4) EMPLOYEES 테이블에서 30번 부서 중 사원번호 이름과
담당 아이디를 연결하여 출력하여라. (concat 사용)
/

SELECT CONCAT(EMPLOYEE_ID , CONCAT(LAST_NAME, MANAGER_ID))
FROM EMPLOYEES e
WHERE DEPARTMENT_ID = 30
;

/*

  • 문제 5. SALARY+SALARYnvl(COMMISSION_PCT ,0) 이 10000이상이면, 'good' 5000 이상이면, 'average', 1이상 5000미만이면 'bad'
    0이면 no good 로 평가하고
    EMPLOYEE_ID ,FIRST_NAME , SALARY ,COMMISSION_PCT,
    SALARY+SALARY
    nvl(COMMISSION_PCT ,0) 평가를 출력해라.
  • */

SELECT EMPLOYEE_ID , FIRST_NAME , SALARY ,COMMISSION_PCT,
SALARY+SALARYnvl(COMMISSION_PCT ,0) AS sal
, CASE WHEN SALARY+SALARY
nvl(COMMISSION_PCT ,0) >= 10000 THEN 'good'
WHEN SALARY+SALARYnvl(COMMISSION_PCT ,0) >= 5000 THEN 'average'
WHEN SALARY+SALARY
nvl(COMMISSION_PCT ,0) BETWEEN 1 AND 5000 THEN 'bad'
WHEN SALARY+SALARY*nvl(COMMISSION_PCT ,0) = 0 THEN 'no good'
END AS grade
FROM EMPLOYEES e
ORDER BY sal
;

profile
//

0개의 댓글