2021. 7. 23. 20:01ㆍdummmy
--칼럼 값을 사용하여 계산식을 적용
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()
--여러개의 값을 받아서 하나의 결과값을 낸다.
'dummmy' 카테고리의 다른 글
2. 오라클 SQL FUNCTION 함수 (0) | 2021.07.27 |
---|---|
1. 오라클 SQL DBMS (0) | 2021.07.27 |
[java 자바] 인스턴스/ static 초기화 블럭 (0) | 2021.07.09 |
[java자바] 변수 선언 위치에 따른 구분 (0) | 2021.07.09 |
[java 자바] 숫자 문자열 입력받아, 각 자리 숫자의 합을 구하기 (substring() , charAt() 사용) (0) | 2021.07.08 |