오늘은 오라클 설치와 기본적인 작동방식을 배웠다.
/* SELECT (DML 또는 DQL)
-- [작성법]
-- SELECT 컬럼명 FROM 테이블명;
--> 어떤 테이블의 특정 컬럼을 조회하겠다.
SELECT FROM EMPLOYEE;
-- '' : ALL, 모든 전부
--> EMPLOYEE 테이블의 모든 컬럼을 조회하겠다.
-- 사번, 직원이름, 휴대전화번호 조회
SELECT EMP_ID, EMP_NAME, PHONE FROM EMPLOYEE;
-- <컬럼 값 산술연산>
-- 컬럼 값 : 테이블 내 한 칸 ( == 한 셀) 에 작성된 값 (DATA)
-- EMPLOYEE 테이블에서 모든 사원의 사번, 이름, 급여, 연봉 조회
SELECT EMP_ID, EMP_NAME, SALARY, SALARY * 12 FROM EMPLOYEE;
SELECT EMP_NAME + 10 FROM EMPLOYEE;
-- ORA-01722 : 수치가 부적합합니다.
-- 산술연산은 숫자(NUMBER 타입)만 가능하다!
SELECT '같음'
FROM DUAL
WHERE 1 = '1';
-- 날짜(DATE) 타입 조회
-- EMPLOYEE 테이블에서 이름, 입사일, 오늘 날짜 조회
SELECT EMP_NAME, HIRE_DATE, SYSDATE FROM EMPLOYEE;
-- 2023-08-03 12:05:35.000
-- SYSDATE : 시스템상의 현재 시간(날짜)를 나타내는 정수
SELECT SYSDATE FROM DUAL;
-- DUAL(DUmy tAbLe); 테이블 : 가짜 테이블(임시조회용 테이블)
-- 날짜 + 산술연산 (+,-)
SELECT SYSDATE -1, SYSDATE, SYSDATE +1
FROM DUAL;
-- 날짜에 +/- 연산 시 일 단위로 계산이 진행됨
-- <컬럼 별칭 지정>
/* 컬럼명 AS 별칭 : 별칭 띄어쓰기 X, 특수문자 X, 문자만 O
SELECT SYSDATE -1 "하루 전", SYSDATE AS 현재시간, SYSDATE +1 내일
FROM DUAL;
-- JAVA 리터럴 : 값 자체를 의미
-- DB 리터럴 : 임의로 지정한 값을 기존 테이블에 존재하는 값처럼 사용하는 것
--> (필수) DB의 리터럴 표기법은 '' 홀따옴표
SELECT EMP_NAME, SALARY, '원 입니다' FROM EMPLOYEE;
-- DISTINCT : 조회 시 컬럼에 포함된 중복 값을 한 번만 표기
-- 주의사항 1) DISTINCT 구문은 SELECT 마다 딱 한번씩만 작성 가능
-- 주의사항 2) DISTINCT 구문은 SELECT 제일 앞에 작성되어야 한다.
SELECT DISTINCT DEPT_CODE, JOB_CODE FROM EMPLOYEE;
-- 3. SELECT 절 : SELECT 컬럼명
-- 1. FROM 절 : FROM 테이블명
-- 2. WHERE 절(조건절): WHERE 컬럼명 연산자 값;
-- 4. ORDER BY 컬렴명 | 별칭 | 컬럼 순서 [ASC | DESC][NULLS FIRST | LAST]
-- EMPLOYEE 테이블에서 급여가 3백만원 초과인 사원의
-- 사원, 이름, 급여, 부서코드를 조회
SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- 비교 연산자 : > , < , >= , <= , = (같다), !=, <> (같지 않다)
-- 대입 연산자 : :=
-- EMPLOYEE 테이블에서 부서코드가 'D9' 인 사원의
-- 사번 이름, 부서코드, 직급코드를 조회
SELECT EMP_NAME, DEPT_CODE, JOB_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';
-- 논리 연산자 (AND, OR)
-- EMPLOYEE 테이블에서 급여가 300만 미만 또는 500만 이상인 사원의
-- 사번, 이름, 급여, 전화번호 조회
SELECT EMP_ID , EMP_NAME , SALARY , PHONE
FROM EMPLOYEE
WHERE SALARY < 3000000 OR SALARY >= 5000000;
-- EMPLOYEE 테이블에서 급여가 300만 이상 또는 500만미만 이상인 사원의
-- 사번, 이름, 급여, 전화번호 조회
SELECT EMP_ID , EMP_NAME , SALARY , PHONE
FROM EMPLOYEE
WHERE SALARY >= 3000000 AND SALARY < 5000000;
-- BETWEEN A AND B : A 이상 B 이하
-- 300만 이상, 600 이하
SELECT EMP_ID , EMP_NAME , SALARY , PHONE
FROM EMPLOYEE
WHERE SALARY BETWEEN 3000000 AND 6000000;
-- NOT 연산자 사용 가능!
SELECT EMP_ID , EMP_NAME , SALARY , PHONE
FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 3000000 AND 6000000;
-- 날짜 (DATE) 에 BETWEEN 이용하기
-- EMPLOYEE 테이블에서 입사일이 1990-01-01~1999-12-31 사이인 직원의
-- 이름, 입사일 조회
SELECT EMP_NAME , HIRE_DATE
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '1990-01-01' AND '1999-12-31';
-- LIKE : ~처럼, ~같이
-- 비교하려는 값이 특정한 패턴을 만족 시키면 조회하는 연산자
-- [작성법]
-- WHERE 컬럼명 LIKE '패턴이 적용된 값'
-- LIKE의 패턴을 나타내는 문자(와일드 카드)
--> '%' : 포함
--> '_' : 글자수
-- '%' 예시
-- 'A%' : A로 시작하는 문자열
-- '%A' : A로 끝나는 문자열
-- '%A%' : A를 포함하는 문자열
-- '' 예시
-- 'A' : A로 시작하는 두 글자 문자열
-- '__A' : A로 끝나는 다섯글자 문자열
-- 'A' : 세번째 문자가 A인 다섯글자 문자열
-- '___' : 다섯글자 문자열
-- EMPLOYEE 테이블에서 성이 '전'씨인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';
-- EMPLOYEE 테이블에서 전화번호가 010으로 시작하지 않는 사원
-- 사번, 이름, 전화번호
SELECT EMP_ID ,EMP_NAME ,PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';
-- EMPLOYEE 테이블에서 EMAIL의 _앞에 글자가 세글자인 사원만 조회
-- 이름, 이메일
SELECT EMP_NAME ,EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '__#%' ESCAPE '#';
-- ESCAPE
-- ESCAPE문자 뒤에 작성된 _ 는 일반 문자로 탈출한다는 뜻
-- #, ^를 많이 씀
-- 연습문제
-- 이메일 '_' 앞이 4글자이면서
-- 부서코드가 'D9' OR 'D6' 이고 -> AND가 OR보다 우선순위가 높다, () 사용가능
-- 입사일이 1990-01-01 ~ 2000-12-31 이고
-- 급여가 270만 이상인사원의
-- 사번, 이름 , 이메일, 부서코드, 입사일, 급여 조회
SELECT EMPID, EMP_NAME, EMAIL,DEPT_CODE, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE EMAIL LIKE '____#%' ESCAPE '#'
AND (DEPT_CODE = 'D9' OR DEPT_CODE = 'D6')
AND HIRE_DATE BETWEEN '1990-01-01' AND '2000-12-31'
AND SALARY >= 2700000;
-- 연산자 우선순위
/*
/* IN 연산자
OR 컬럼명 = '값2'
OR 컬럼명 = '값3'
-- EMPLOYEE 테이블에서
-- 부서코드가 D1, D6, D9 인 사원의
-- 사번, 이름, 부서코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IN('D1', 'D6', 'D9');
-- NOT IN
SELECT EMP_ID, EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE NOT IN('D1', 'D6', 'D9')
OR DEPT_CODE IS NULL; -- 부서코드 없는 2명 포함 14명
-- IS NULL
-- IS NOT NULL
/*
--- EMPLOYEE 테이블에서 보너스가 있는 사원의 이름, 보너스 조회
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL; -- 9행
-- EMPLOYEE 테이블에서 보너스가 없는 사원의 이름, 보너스 조회
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL; -- 14행
/* ORDER BY 절
-- EMPLOYEE 테이블 급여 오름차순으로
-- 사번, 이름, 급여 조회
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY ; -- ASC가 기본값 [ASC : DESC]
-- 급여 200만 이상인 사원의
-- 사번, 이름, 급여 조회
-- 단, 급여 내림 차순으로 조회
SELECT EMP_ID, EMP_NAME ,SALARY
FROM EMPLOYEE
WHERE SALARY >= 2000000
ORDER BY SALARY DESC ;
-- 입사일 순서대로 이름, 입사일 조회(별칭 사용)
SELECT EMP_NAME 이름 , HIRE_DATE 입사일
FROM EMPLOYEE
ORDER BY 입사일;
-- 정렬 중첩
SELECT EMP_NAME ,DEPT_CODE , SALARY
FROM EMPLOYEE
ORDER BY DEPT_CODE , SALARY DESC ;
이것저것 연습해봤는데 이것도 더 해봐야 익을것같다.
-- 함수 : 컬럼의 값을 읽어서 연산한 결과를 반환
-- 단일 행 함수 : N개의 값을 읽어서 N개의 결과를 반환
-- 그룹 함수 : N개의 값을 읽어서 1개의 결과를 반환(합계, 평균, 최대, 최소)
-- 함수는 SELECT문의
-- SELECT절, WHERE절, ORDER BY절, GROUP BY절, HAVING 절 사용 가능
------------단일 행 함수 -------------
-- LENGTH(컬럼명 : 문자열 ) : 길이 반환
SELECT EMAIL, LENGTH(EMAIL)
FROM EMPLOYEE;
-- INSTER(컬럼명 | 문자열, '찾을문자열' [, 찾기 시작할 위치 [, 순번] ] )
-- 지정한 위치부터 지정한 순번째로 검색되는 문자의 위치를 반환
-- 문자열을 앞에서부터 검색하여 첫번재 B위치 조회
-- AABAACAABBAA
SELECT INSTR('AABAACAABBAA', 'B') FROM DUAL; --3
-- 문자열을 5번째 문자 부터 검색하여 첫번째 B DNLCL WHGHL
SELECT INSTR('AABAACAABBAA', 'B', 5) FROM DUAL; --9
-- 문자열을 5번째 문자부터 검색하여 두번째 B의 위치 조회
SELECT INSTR('AABAACAABBAA', 'B',5, 2) FROM DUAL; --10
-- EMPLOYEE 테이블에서 사원명, 이메일, 이메일 중 '@' 위치 조회
SELECT EMP_NAME , EMAIL , INSTR(EMAIL, '@')
FROM EMPLOYEE;
-- SUBSTR('문자열' | 컬럼명, 잘라내기 시작할 위치 [, 잘라낼 길이])
-- 컬럼이나 문자열에서 지정한 위치부터 지정된 길이만큼 문자열을 잘라내서 반환
--> 잘라낼 길이 생략 시 끝까지 잘라냄
-- EMPLOYEE TABLE 에서 사원명, 이메일 중 아이디만 조회
SELECT EMP_NAME , EMAIL, SUBSTR(EMAIL, 1, INSTR(EMAIL, '@' ) -1 ) ID
FROM EMPLOYEE;
-- TRIM( [[옵션] '문자열' | 컬럼명 FROM ] '문자열' | 컬럼명)
-- 주어진 컬럼이나 문자열의 앞, 뒤, 양쪽에 있는 지정된 문자를 제거
--> 양쪽 공백 제거에 많이 사용한다.
-- 옵션 : LEADING(앞쪽), TRAILING(뒤쪽), BOTH(양쪽, 기본값)
SELECT TRIM(' H E L L O ')
FROM DUAL; -- 양쪽 공백 제거
SELECT TRIM(BOTH '#' FROM '#####안녕#####')
FROM DUAL;
/ 숫자 관련 함수 /
-- ABS(숫자 | 컬럼명); 절대값 ABSOLUT
SELECT ABS(10), ABS(-10 ) FROM DUAL;
SELECT '절대값 같음' FROM DUAL
WHERE ABS(10) = ABS(-10); --WHERE 절 함수 작성 가능
-- MOD(숫자 | 컬럼명, 숫자 | 컬럼명)
-- EMPLOYEE 테이블에서 사원의 월급을 100만으로 나눴을 때 나머지 조회
SELECT EMP_NAME, SALARY, MOD(SALARY, 1000000)
FROM EMPLOYEE;
-- EMPLOYEE 테이블에서 사번이 짝수인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME MOD
FROM EMPLOYEE
WHERE MOD (EMP_ID, 2) = 0;
-- EMPLOYEE 테이블에서 사번이 홀수인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME MOD
FROM EMPLOYEE
WHERE MOD (EMP_ID, 2) <> 0;
-- ROUND( 숫자 | 컬럼명 [, 소숫점 위치] ) : 반올림
SELECT ROUND(123.456) FROM DUAL; -- 123 , 소수점 첫 번째 자리에서 반올림
SELECT ROUND(123.456 , 1) FROM DUAL; -- 123.5 , 소수점 두 번째 자리에서 반올림
SELECT ROUND(123.678) FROM DUAL; -- 124
-- CEIL(숫자 | 컬럼명) : 올림
-- FLOOR(숫자 | 컬럼명) : 내림
--> 둘다 소수점 첫째 자리에서 올림/내림 처리
SELECT CEIL (123.1), FLOOR(123.9) FROM DUAL; --124 123
-- TRUNC(숫자 | 컬럼명 [,위치]) : 특정 위치 아래를 버림(첨삭)
SELECT TRUNC(123.456 ) FROM DUAL; -- 123, 소수점 아래를 버림
SELECT TRUNC(123.456, 1 ) FROM DUAL; -- 123.4, 소수점 첫째자리 아래 버림
SELECT TRUNC(123.456 ,-1) FROM DUAL; -- 120, 10의자리 아래 버림
/ 버림, 내림 차이점 /
SELECT FLOOR(-123.5), TRUNC(-123.5) FROM DUAL;