DBEAVER

2021. 7. 23. 20:01dummmy

반응형

--칼럼 값을 사용하여 계산식을 적용
SELECT EMP_NAME "사원명",
(SALARY*12) "연봉",
BONUS "보너스",
(SALARY + (SALARY*BONUS))*12 "연봉총합"
FROM EMPLOYEE;

SELECT * FROM EMPLOYEE;
--BONUS에 NULL값이 생겨서 문제가 생김. 
--NVL() : 만약 현재 조회한 값이 NULL인 경우 별도로 설정한 값으로 변경한다.

SELECT EMP_NAME "사원명",
(SALARY*12) "연봉",
BONUS "보너스",
(SALARY + (SALARY*NVL(BONUS,0)))*12 "연봉총합" 
FROM EMPLOYEE;

SELECT * FROM EMPLOYEE;
--BONUS값이 NULL이면 0으로 가져올게


--컬럼에 일반값 사용하기 
-- 리터럴: 일반 컬럼의 값처럼 원하는 값을 직접 적어 반복적으로 사용하는 표현
-- 단위 컬럼에 원 넣기 

SELECT EMP_NAME, SALARY*12, '원' "단위"
FROM EMPLOYEE; 


--DISTICT 
-- 만약 해당하는 값이 컬럼에 여러개 존재할 경우 , 중복을 제거하고 한 개만 조회 (NULL도 포함)

SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE;

SELECT DISTINCT DEPT_CODE
FROM EMPLOYEE;

--실습1
--DEPARTMENT 테이블에서 
--부서가 '해외영업2부' 인 부서의 부서코드를 찾고,

--EMPLOYEE테이블에서
--해당 부서의 사원들 중 급여를 200만원 보다 많이 받는 직우너의 
--사번, 사원명, 급여를 조회하시요.
--1) '해외영업2부' 부서코드 찾기

 

SELECT *
FROM DEPARTMENT
WHERE DEPT_TITLE = '해외영업2부';
--부서코드는 D6 
-- 난 이걸 SELCT DEPT_CODE라고 해서 안됐음 

--2) 1에서 조회한 부서코드를 사용하여 사원들 중 200만원 보다 많이 받는 직우너 정보 조회 

SELECT EMP_ID 사번, EMP_NAME 사원명, SALARY 급여 
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6' AND SALARY >= 2000000;


-- 연산자

--연결 연산자 '||' 
--여러 칼럼의 결과나 값(리터럴)을 하나의 컬럼으로 묶을때 사용하는 연산자 

-- '사번'을 가진 사원의 이름은 'OOO'입니다. 
SELECT EMP_ID || '을 가진 사원의 이름은 ' || EMP_NAME || '입니다.'
FROM EMPLOYEE; 

SELECT EMP_ID || ',' || EMP_NAME || ',' || EMAIL
FROM EMPLOYEE;

--비교연산자 
-- <,>,<=, 크기를 나타내는 부등호 
-- =:같다
-- != 그리고 ^= 그리고 <> :같지 않다 

--EMPLOYEE테이블에서 부서 코드가 'D9'가 아닌 직원들의 모든 정보 조회 

SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE != 'D9' ;



--EMPLOYEE 테이블에서 급여가 350만원 이 상 550만원 이하인
--직원의 사번, 사우너명, 부서코드 ,직급코드, 급여정보 

SELECT EMP_ID, EMP_NAME, DEPT_CODE, JOB_CODE,SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3500000 AND 5500000
ORDER BY SALARY ASC; 
-- ORDER BY는 정렬 

--위와 똑같은 직우너 정보를 조회하는데 
--350만원 미만, 550만우너 초과인 직원 정보를 조회 

 SELECT EMP_ID, EMP_NAME, DEPT_CODE, JOB_CODE,SALARY
FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 3500000 AND 5500000;

-- LIKE : 입력한 숫자, 문자가 포함된 정보를 조회할때 사용하는 연산자 
-- '_' : 임의의 한 문자
-- '%" : 몇자리 문자든 관계없이 

--사원이름 가운데 '중'이 들어가는 사원 정보 조회하기

SELECT *
FROM EMPLOYEE 
WHERE EMP_NAME LIKE '_중_';
-- '_중'이라고 하면 아무것도 안나온다. 

--EMPLOYEE 테이블에서 
--주민등록번호 기준 여성인 사원의 정보만 조회 

SELECT EMP_NO FROM EMPLOYEE
WHERE EMP_NO LIKE '_______2%';

--사원 중 이메일 아이디가 5글자를 초과하는 사우너의 사원명, 사번, 이메일 정보 조회 
SELECT EMP_NAME, EMP_ID, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '______%@%';
--언더바 6개 이후  몇개가 오든 상관없다 

--사원 중 이메일 4번째가 '_'인 사원의 정보 조회
--ESCAPE 문자를 선언하여 뒤에 오는 문자를 특수 문자가 아닌 일반 문자로 선언할 수 있다.


SELECT EMAIL 
FROM EMPLOYEE
WHERE EMAIL LIKE '___#_%@%'ESCAPE '#';

--ESCAPE 하려는 기호는 #이든 !이든 뭐든지 상관없다. 

-- IN 연산자
-- IN (값1, 값2, 값3, 값4)
-- 괄호 안에 있는 값 중 하나라도 일치하는 경우 해당 값을 조회 

--부서코드가 D1이거나 D6인 부서 직원 정보를 조회 

SELECT *
FROM EMPLOYEE 
WHERE DEPT_CODE IN('D1', 'D6');


--D1, D6아닌것 조회-> IN 앞에 NOT 

SELECT *
FROM EMPLOYEE 
WHERE DEPT_CODE NOT IN('D1', 'D6');

--연산자의 우선 순위 
--0. ()
--1. 산술연산자. + - * /
--2. 연결 연산자 
--3. 비교 연산자
--4. IS NULL/ IS NOT NULL, LIKE, IN/ NOT INSERT 
--5.BETWEEN A AND B
--6. NOT 
--7. AND 
--8. OR 


-- FUNCTION 함수 --
--문자 관련 함수 

--LENGTH / LENGTHB 


SELECT LENGTH('hello'),
LENGTHB('hello')
FROM DUAL;
--DUAL 은 임시, 가상의 테이블 

SELECT LENGTH('이길동'),
LENGTHB('이길동')
FROM DUAL;
--B는 바이트 크기이다. 오라클에는 한글은 3바이트이므로 
--LENGTH는 3, LENGTHB는 9가 나온다. 

--INSTR : 주어진 값에서 원하는 문자가 몇번째인지 찾아 반환하는 함수 
SELECT INSTR ('ABCD' , 'A') 
FROM DUAL; 
--ABCD에서 A가 몇번째인지? 결과:1 
--찾으려는 결과가 없으면 0이 나온다. 

--SUBSTR : 주어진 문자열에서 특정 부분만 꺼내어 오는 함수 

SELECT 'Hello World',
SUBSTR('Hello World', 1, 5),
SUBSTR('Hello World', 7)
FROM DUAL;
-- INDEX, 1~5번째 숫자인 Hello가 출력된다. 
-- 두번째 값은 7부터 끝까지, World가 출력된다. 

--실습2
--EMPLOYEE테이블에서 
--사원들의 이름과, 이메일 조회 
-- 이메일은 아이디 부분만 조회 
--조회 결과가 
-- 홍길동 hgd_gd 이런식으로 나오도록

--1.
SELECT EMP_NAME, EMAIL FROM EMPLOYEE;

--2. @위치 찾기 
SELECT INSTR(EMAIL, '@') FROM EMPLOYEE;

--3.
SELECT EMP_NAME,
SUBSTR(EMAIL, 1,INSTR(EMAIL,'@')-1)
FROM EMPLOYEE;

-- LPAD / RPAD
-- 빈칸을 지정한 문자로 채우는 함수 

SELECT LPAD(EMAIL, 20, '#') 
-- 20칸짜리에 EMAIL을 넣고 나머지 공백에는 #으로 채우기
FROM EMPLOYEE;

SELECT RPAD(EMAIL, 20, '-') 
FROM EMPLOYEE;


--L은 왼쪽(앞) R은 오른쪽(뒤)


--LTRIM / RTRIM
-- 컬럼 값이나 특정 값으로부터 특정 문자를 찾아 지워주는 함수

--찾을 문자를 지정하지 않으면 빈칸을 지운다. 

SELECT LTRIM('       Hello')
FROM DUAL;

SELECT RTRIM('Hello      ')
FROM DUAL;


SELECT LTRIM('012345', '0'),
LTRIM('111234','1'),
LTRIM('54321','1'),
--왼쪽부터 탐색하는데 1이 없으니까 1이 안지워진다. 54321 그대로출력.
RTRIM('54321','1')
FROM DUAL;
-- 012345에서 0을 지운다. 


--TRIM
--주어진 문자열에서 양끝을 기준으로 특정 문자를 지워주는 함수 

SELECT TRIM('    트림   ') 
FROM DUAL;


SELECT TRIM('0' FROM '00123000')
FROM DUAL;

-- '00110022000' 하면 110022가 출력된다. 앞에서가다가 0이나오면 멈추고 뒤에서도 0이나오면 멈춰버려서

SELECT TRIM(LEADING '0' FROM '001023000')
FROM DUAL;
SELECT TRIM(TRAILING '0' FROM '001023000')
FROM DULA;
SELECT TRIM(BOTH '0' FROM '001023000')
FROM DULA;
--순서대로 LTRIM, RTRIM, TRIM 값이랑 똑같음 



-- LOWER / UPPER / INITCAP

SELECT LOWER ('NICE TO MEET YOU'),
 UPPER ('nice to meet you'),
INITCAP ('nice to meet you')
FROM DUAL;
 
--INITCAP은 Nice To Meet You 단어의 첫 글자만 대문자로 

--CONCAT : 여러 문자열을 하나로 합치는 함수 
SELECT CONCAT('오라클','너무 재밌어요:)')
FROM DUAL;

--연결 연산자를 해도 동일한 결과 
SELECT '오라클' || '너무 재밌어요:)' 
FROM DUAL;

--REPLACE : 주어진 문자열에서 특정 문자를 변경할 때 사용하는 함수 
-- 1문자열에서, 2를 3으로 바꾼다.
SELECT REPLACE('HELLO WORLD', 'HELLO','BYE')
FROM DUAL;


--실습3
--EMPLOYEE 테이블에서
--사원의 주민 번호를 확인하여
--생년 월일 생일을 각각 조회하시오
--이름 | 생년 |생월| 생일
--홍길 | 00년| 00월| 00일
 
SELECT EMP_NAME||SUBSTR(EMP_NO, 1, 2) || '년' || SUBSTR(EMP_NO,3,2) || '월' || SUBSTR(EMP_NO, 5,2) || '일'
FROM EMPLOYEE ;

-- (3,4) (5,6) 이 아니라 (3,2) (5,2) !! 

SELECT EMP_NAME "이름",
CONCAT (SUBSTR(EMP_NO,1,2),'년' ) "생년",
CONCAT (SUBSTR(EMP_NO,3,2),'월') "생월",
CONCAT (SUBSTR(EMP_NO,5,2),'일') "생일"
FROM EMPLOYEE;
--이렇게 다른 테이블로 


 SELECT EMP_NAME "이름",
CONCAT (SUBSTR(HIRE_DATE,1,2),'년') "입사년도",
CONCAT (SUBSTR(HIRE_DATE,4,2),'월') "입사월",
CONCAT (SUBSTR(HIRE_DATE,7,2),'일') "입사일"
FROM EMPLOYEE;

--실습4
--EMPLOYEE 테이블에서
--모든 사원의 사번, 사원명, 이메일, 주민번호를 조회하자
--이때 이메일은 '@' 전까지, 주민 번호는 7번째 자리 이후 '*'로 처리

 

SELECT EMP_ID "사번",
EMP_NAME "사원명",
SUBSTR(EMAIL, 1, INSTR(EMAIL,'@')-1) "이메일",
RPAD(SUBSTR(EMP_NO,1,8), LENGTH(EMP_NO),'*')"주민번호"
FROM EMPLOYEE
ORDER BY 사번;




-- 잘 모르겠는 것: 이메일의 길이를 모르는데 15자리에 뭐가 들어감(주소다같길래 어림잡아 넣었지만 아이디길이 다다름)
-- 아 LENGTH(EMAIL)로 해결했음~~


--실습5 
--EMPLOYEE 테이블에서 현재 근무하는
--여성 사원의 사번, 사원명, 직급코드, 퇴사여부를 조회 .
-- ENT_YN : 현재 근무 여부 파악하는 컬럼 (퇴사여부)
--퇴사 Y 재직 N
--WHERE 절에서도 함수 사용 가능. (여성인지 2 확인)
 
SELECT EMP_ID 사번, EMP_NAME 사원명, JOB_CODE 직급코드, ENT_YN 퇴사여부
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO , 8, 1) = '2'
AND ENT_YN = 'N';

--단일행 함수 (SINGLE ROW FUNCTION)


--다중행 함수 (MULTIPLE ROW FINCTION)
--그룹함수(GROUP FUNCTION)
--SUM(), AVG(), MAX(), MIN(), COUNT() 
--여러개의 값을 받아서 하나의 결과값을 낸다.

반응형