사용하는 프로그램 : Oracle 11g 버전
첫 시작 윈도우 cmd 창의 sqlplus 실행하여 시작
cmd 창의 타이핑은 보기 어렵기 때문에 GUI 환경의 Oracle Developer 라는 프로그램이 있음
연습 계정은 기본으로 있는 SCOTT / tiger 으로 사용
Developer 에서 -- 표시가 주석 처리
emp 테이블에 들어있는 데이터 확인 방법
SELECT * FROM emp;
-- emp 테이블의 모든 열을 SELECT 하여 출력 하는 명령어
DISTINCT 명령어 : 출력 할 값 중 중복된 값 제거
SELECT 할 때 열의 이름에 별칭을 정할 수 있음, 너무 길면 가독성이 안좋아짐
ALIAS 라는 뜻의 AS 명령어
SELECT MAX(SAL) AS MAX_SAL -- 원하는 이름으로 열 이름 변경 가능
WHERE 명령어 : 불러오는 테이블에서 원하는 조건을 걸어 조건에 부합하는 데이터만 출력 가능
SELECT * FROM EMP WHERE SAL > 3000; -- 3000을 초과하는 값을 가진 행만 출력
Oracle 에서의 비교 연산자 사용 방법
A = B : A 와 B 가 같다
A != B, A <> B, A ^= B : A 와 B 가 같지 않다
OR 연산자 : OR 연산자를 통해 여러 개의 조건을 걸 수 있음, OR 은 조건 중 하나라도 해당하면 출력
SELECT * FROM EMP
WHERE JOB = 'ANALYST' OR JOB = 'SALESMAN';
-- JOB 의 값이 ANALYST 혹은 SALESMAN 인 값 출력
OR 연산자는 모든 조건을 다 적기 어렵기 때문에 IN 연산자를 사용
WHERE [열 이름] IN (조건1, 조건2, ...) : 여러 개의 조건을 괄호 안에 압축하여 정리, OR 연산자와 같은 역할
WHERE JOB IN ('ANALYST', 'SALESMAN', 'CLERK')
AND 연산자 : WHERE 절에 여러 조건에 모두 부합하는 데이터를 찾기 위해 사용
WHERE SAL < 2000 AND 1000 < SAL
-- SAL 값이 1,000 보다 크고 2,000 보다 작은 값을 조회 BETWEEN 연산자로 압축 가능
BETWEEN 연산자 : 지정된 열의 데이터 중 A 이상 B 이하 값에 해당하는 데이터만 출력
WHERE [열 이름] BETWEEN A AND B
WHERE SAL BETWEEN 1000 AND 2000
WHERE SAL >= 1000 AND SAL <= 2000
위의 예시와 같이 1,000 이상 2,000 이하 값 조회, 비교 연산자에서는 <=, >= 등과 같음
LIKE 연산자 : 데이터 중 원하는 값이 포함되어 있는지 확인 후 출력
WHERE ENAME LIKE 'S%' -- S 로 시작하는 ENAME 값 조회
WHERE ENAME LIKE '%S" -- S 로 끝나는 ENAME 값 조회
WHERE ENAME LIKE '_A%' -- ENAME 값 중 A 라는 글자가 두번째 글자인 값 조회, ex) JAMES
_ (UnderScore 가 글자 1 글자를 의미)
NOT 연산자 : 연산자 중 ~~ 가 아닌 것을 조회하고 싶을 때 사용
WHERE DEPTNO NOT IN (10,20) -- DEPTNO 가 10, 20 이 아닌 값 조회
WHERE ENAME NOT LIKE 'S%' -- ENAME 이 S 로 시작하지 않는 값 조회
SUM, AVG, MAX, MIN 명령어
SUM() : 괄호 안 열의 값을 모두 더하여 출력 -- 출력 시 한 행으로 해서 출력
SELECT SUM(SAL) FROM EMP -- EMP 테이블의 SAL 값을 모두 더하여 출력
AVG() : 괄호 안 열의 값의 평균을 구함
SELECT AVG(SAL) FROM EMP -- EMP 테이블 중 SAL 값의 평균을 구함
MAX(), MIN() : 괄호 안 열의 최댓값과 최솟값을 구함
SELECT MAX(SAL), MIN(SAL) FROM EMP -- EMP 테이블 중 SAL 값의 최댓값과 최솟값을 구함
COUNT() : 해당하는 행의 갯수를 카운트함
SELECT COUNT(*) FROM EMP -- EMP 테이블의 행 갯수 카운트하여 출력
SELECT ENAME, SUM(SAL) FROM EMP : EMP 테이블의 ENAME 값과 SAL 값을 모두 더하여 출력하는 명령어이나
ENAME 은 여러 행으로 출력, SUM(SAL) 은 한 행으로 출력되기 때문에 오류 발생
Oracle 의 자료형
VARCHAR2 - 가변형 문자열
NUMBER - 숫자
DATE - 날짜 형식
ALTER - 변경 명령어
CONN - Connect 명령어
SYS - DB 관리자, 슈퍼 유저, DB 생성과 삭제 가능
SYSTEM - DB 생성과 삭제 불가능
ORDER BY - 출력하는 데이터를 기준에 맞게 정렬
ORDER BY DEPTNO, ENAME : DEPTNO 기준으로 정렬 후 같은 DEPTNO 중에서 ENAME 으로 정렬
ORDER BY 명령어 뒤에 아무것도 적지 않거나 ASC 를 적으면 오름차순, DESC 를 적으면 내림차순으로 정렬
ROUND 연산자 : 원하는 위치에서 반올림, 기본은 소숫점 첫째자리에서 반올림하여 정수만 출력
SELECT ROUND(1234.5678, 3) FROM DUAL;
-- 1234.5678 중 소숫점 넷째자리에서 반올림하여 셋째자리 까지만 출력 ex) 1234.568
CEIL : 소숫점자리 올림 처리
SELECT CEIL(1234.123) FROM DUAL; -- 무조건 올림 처리하여 1235 출력
FLOOR : 소숫점자리 버림 처리
SELECT FLOOR(1234.999) FROM DUAL; -- 무조건 버림 처리하여 1234 출력
TRUNC : 원하는 위치 자리수까지 표현 후 나머지 버림
SELECT TRUNC(1234.5678, 2) FROM DUAL; -- 1234.56 출력 후 나머지 버림, 기본은 소숫점 전체 버림
MOD(숫자 1, 숫자 2) : 숫자 1을 숫자 2로 나눈 후 나머지 출력
SELECT MOD(11, 2) FROM DUAL; -- 11을 2로 나눈 나머지 1 출력
UPPER(column) : 데이터를 대문자로 변환하여 출력
SELECT UPPER('oracle') FROM DUAL; -- ORACLE 출력
LOWER(column) : 데이터를 소문자로 변환하여 출력
SELECT LOWER('ORACLE') FROM DUAL; -- oracle 출력
INITCAP(column) : 데이터의 첫 글자만 대문자, 나머지는 소문자로 변환하여 출력
SELECT INITCAP('ORACLE') FROM DUAL; -- Oracle 출력
LENGTH(column) : 데이터의 길이를 출력하는 명령어
ex) LENGTH('한글') - 괄호 안의 문자열 길이 출력
LENGTHB('한글') - 괄호 안의 문자열 바이트 수 출력
LENGTH('한글') -- 괄호 안의 문자열 길이 출력
LENGTHB('한글') -- 괄호 안의 문자열 바이트 수 출력
SELECT LENGTH('ORACLE'), LENGTH('oracle') FROM DUAL; -- 둘 다 6 출력
SELECT LENGTHB('ORACLE'), LENGTHB('oracle') FROM DUAL; -- 둘 다 6 출력
-- 한글은 글씨 속성에 따라 바이트가 달라짐
SELECT * FROM DUAL; : DUAL 이라고 하는 가상의 테이블을 생성하여 단일 결과를 확인할 때 사용
SELECT 1 + 1 FROM DUAL; -- 1 + 1 의 결과 출력
SYSDATE : 시스템의 날짜 출력, + 와 - 기호로 날짜 설정 가능
SELECT SYSDATE - 1 FROM DUAL;
-- 연산 명령어로 시스템 날짜에서 하루 빠진 전일 날짜 출력 가능. 단위는 일
ADD_MONTHS : DATE 에 원하는 달만큼 더하여 출력
SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL; -- 현재 날짜에 3달을 더하여 출력
MONTHS_BETWEEN : 날짜 간 얼마나 차이가 나는지 출력, 큰 날짜가 앞으로 와야 정수로 출력됨
SELECT MONTHS_BETWEEN('24/01/01', SYSDATE) FROM DUAL;
-- 24년 1월 1일과 시스템 날짜와의 차이 출력
날짜의 ROUND 처리 방법
ROUND(SYSDATE, 'CC;) -- 1세기 기준으로 반올림, 2051/01/01 기준으로 반올림 시 2101/01/01 출력, 이전은 2001/01/01 출력
ROUND(SYSDATE, 'YYYY') -- 해당 연도의 7월 1일 기준으로 반올림 처리
ROUND(SYSDATE, 'Q') -- 해당 분기의 두번째 달 16일 기준으로 반올림 처리
SELECT ROUND(SYSDATE, 'YYYY') FROM DUAL; -- 시스템 날짜를 기준으로 반올림하여 출력
자동 형 변환
SELECT EMPNO + '500' FROM EMP;
-- '500' 이라는 문자열을 EMPNO 에 더할 시 자동 형 변환을 통해 NUMBER로 변환
SELECT '1300' + '1500' FROM DUAL;
-- '1300', '1500' 문자열 2개를 더할 시 자동 숫자로 변환하여 2800 출력
TO_CHAR : 해당 값을 문자열 형식으로 변환하여 출력
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') FROM DUAL;
-- 시스템 시간을 연도/월/일 24시간 형식인 시간/분/초 의 문자열 형식으로 변환하여 출력
TO_DATE : 해당 값을 DATE 형식으로 변환
SELECT TO_DATE('2023-07-14', 'YYYY/MM/DD') FROM DUAL;
-- '2023-07-14' 문자열을 지정한 연도/월/일 DATE 형식으로 변환하여 출력
날짜끼리의 연산도 가능
SELECT TO_DATE('2023-12-25', YYYY-MM-DD) - SYSDATE FROM DUAL;
-- 현재 날짜에서 23년 크리스마스까지 남은 일 수 구하기
NULL 값 연산에 포함하기
NVL(NULL이 아닐 경우 출력할 값, NULL일 경우 출력할 값) : NULL 값일 경우와 아닐 경우 어떤 값을 지정할 지 정할 수 있음
SELECT NVL(COMM,0) FROM EMP;
-- COMM 값이 NULL 이 아닐 경우 기존 COMM 값 그대로 출력, NULL 일 경우 0 을 넣어 출력
NVL2(column, NULL일 경우 출력할 값, NULL 이 아닐 경우 출력할 값) : 확인 할 column을 지정하여 NULL 일 경우와 아닐 경우에 지정할 값을 넣어 출력할 수 있음
SELECT NVL2(COMM, SAL * 12 + COMM, SAL * 12) FROM EMP; -- 연봉 계산 예시
COMM 열의 값이 NULL 이 아닐 경우 SAL * 12 + COMM 출력
COMM 열의 값이 NULL 일 경우 SAL * 12 출력
GROUP BY : 중복되는 값을 기준으로 삼아 그룹 별 조건을 만족하는 값을 출력
SELECT DEPTNO, MAX(SAL) FROM EMP
GROUP BY DEPTNO; -- DEPTNO 를 기준으로 그룹 생성, 그룹 별 최대 SAL 값 출력
HAVING : GROUP BY 의 조건식, GROUP BY 의 결과값에 조건을 걸어 만족하는 결과만 출력 가능
SELECT DEPTNO, MAX(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING MAX(SAL) > 4000;
-- DEPTNO 를 기준으로 GROUP 을 나누어 최댓값이 4000 을 초과하는 행만 출력
WHERE 과 HAVING 의 차이점
SELECT DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) > 2000;
-- DEPTNO 그룹의 평균 값이 2,000 을 넘는 행만 출력
SELECT DEPTNO, AVG(SAL)
FROM EMP
WHERE SAL > 2000
GROUP BY DEPTNO;
-- 2,000 이 넘는 값만 골라 DEPTNO 그룹에 포함시켜 평균 구하기
WHERE 은 GROUP 을 나눌 때 그룹에 포함 할 행을 골라내는 작업
HAVING 은 GROUP 을 나눈 후 값이 조건에 맞을 경우 출력
'SQL' 카테고리의 다른 글
240202 리눅스 서버 만들어보기 (0) | 2024.02.02 |
---|---|
231129 Oracle (1) | 2023.11.29 |
231128 Oracle (0) | 2023.11.28 |
231127 Oracle (0) | 2023.11.27 |
국비지원학원 3, 4일 차 정리 / ORACLE (0) | 2023.11.26 |