Database
: data를 저장해 놓은 것
Database Table
: Database에 data를 저장하는 기본 단위
기본 문법
▶ 주석
/*
여러 줄 주석
*/
--한 줄 주석
▶ SELECT
: 검색 명령어
▷ SELECT (속성) from (테이블);
: 테이블의 속성에 속한 데이터를 모두 검색
: 속성이 여러 개일 경우 ,(comma)로 구분
: 모든 속성을 선택할 경우 * 사용 (비추천)
→ 시스템 성능 저하, 가독성 X
SELECT ENAME FROM EMP;
출력 결과
ENAME ---------- SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER
▷ SELECT (속성) from (테이블) WHERE (조건절);
: 조건에 부합하는 속성의 값을 테이블에서 검색
: 조건절 - (조건 속성) (조건 연산자) (값)
→ 조건 연산자 : >(초과), <(미만), >=(이상), <=(미만), <>(다름), !=(다름), ^=(다름), =(같음)
→ 숫자 비교 뿐 아니라 문자 비교도 가능 (ASCII Code 값 비교)
SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO FROM EMP WHERE EMPNO < 7782;
SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO FROM EMP WHERE ENAME > 'SCOTT';
출력 결과
EMPNO ENAME JOB HIREDATE SAL DEPTNO ---------- ---------- --------- -------- ---------- ---------- 7369 SMITH CLERK 80/12/17 800 20 7499 ALLEN SALESMAN 81/02/20 1600 30 7521 WARD SALESMAN 81/02/22 1250 30 7566 JONES MANAGER 81/04/02 2975 20 7654 MARTIN SALESMAN 81/09/28 1250 30 7698 BLAKE MANAGER 81/05/01 2850 30
EMPNO ENAME JOB HIREDATE SAL DEPTNO ---------- ---------- --------- -------- ---------- ---------- 7369 SMITH CLERK 80/12/17 800 20 7521 WARD SALESMAN 81/02/22 1250 30 7844 TURNER SALESMAN 81/09/08 1500 30
▷ SELECT (속성) from (테이블) WHERE (조건절 1) AND / OR (조건절 2);
: AND - true and true
→ 두 조건절을 모두 부합하는 결과 검색
: OR - true or ture
→ 각각의 조건절에 부합하는 모든 결과 검색
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE DEPTNO = 30 AND JOB = 'SALESMAN';
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE DEPTNO = 30 OR JOB = 'MANAGER';
출력 결과
EMPNO ENAME JOB DEPTNO ---------- ---------- --------- ---------- 7499 ALLEN SALESMAN 30 7521 WARD SALESMAN 30 7654 MARTIN SALESMAN 30 7844 TURNER SALESMAN 30
EMPNO ENAME JOB DEPTNO ---------- ---------- --------- ---------- 7499 ALLEN SALESMAN 30 7521 WARD SALESMAN 30 7566 JONES MANAGER 20 7654 MARTIN SALESMAN 30 7698 BLAKE MANAGER 30 7782 CLARK MANAGER 10 7844 TURNER SALESMAN 30 7900 JAMES CLERK 30
▷ SELECT (속성) from (테이블) WHERE (조건 속성) BETWEEN (값 1) AND (값 2);
: 조건 속성의 범위에 해당하는 결과 검색
SELECT * FROM EMP WHERE ENAME BETWEEN 'H' AND 'R';
출력 결과
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7839 KING PRESIDENT 81/11/17 5000 10 7900 JAMES CLERK 7698 81/12/03 950 30 7934 MILLER CLERK 7782 82/01/23 1300 10
▷ SELECT (속성) from (테이블) WHERE (조건 속성) (NOT) IN (값 1, 값 2, 값 3 ...);
: 조건 속성 중 지정된 값이 포함된 결과 검색
→ (조건 속성) = (값 1) OR (조건 속성) = (값 2) OR (조건 속성) = (값 3) 과 동일
: NOT의 경우, 지정된 값이 제외된 결과 검색
→ (조건 속성) != (값 1) AND (조건 속성) = (값 2) AND (조건 속성) = (값 3) 과 동일
SELECT * FROM EMP WHERE SAL IN (800, 1600, 2450);
SELECT * FROM EMP WHERE SAL NOT IN (800, 1600, 2450);
출력 결과
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80/12/17 800 20 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7782 CLARK MANAGER 7839 81/06/09 2450 10
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7788 SCOTT ANALYST 7566 82/12/09 3000 20 7839 KING PRESIDENT 81/11/17 5000 10 7844 TURNER SALESMAN 7698 81/09/08 1500 30 7876 ADAMS CLERK 7788 83/01/12 1100 20 7900 JAMES CLERK 7698 81/12/03 950 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7934 MILLER CLERK 7782 82/01/23 1300 10
▷ SELECT (속성) from (테이블) ORDER BY (정렬 속성) (ASC / DESC);
: 테이블의 속성에 속한 데이터를 ASC(오름차순) 혹은 DESC(내림차순)으로 정렬 검색
→ 기본적으로는 오름차순 정렬 / NULL의 경우 ASC일 때 최하단, DESC일 때 최상단
: 정렬할 속성이 여러 개일 경우 ,(comma)로 구분
→ 작성된 순서로 정렬 후, 그 안에서 다음에 오는 속성으로 정렬
SELECT * FROM EMP ORDER BY DEPTNO DESC;
출력 결과
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7844 TURNER SALESMAN 7698 81/09/08 1500 30 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7900 JAMES CLERK 7698 81/12/03 950 30 7788 SCOTT ANALYST 7566 82/12/09 3000 20 7566 JONES MANAGER 7839 81/04/02 2975 20 7369 SMITH CLERK 7902 80/12/17 800 20 7876 ADAMS CLERK 7788 83/01/12 1100 20 7902 FORD ANALYST 7566 81/12/03 3000 20 7839 KING PRESIDENT 81/11/17 5000 10 7934 MILLER CLERK 7782 82/01/23 1300 10 7782 CLARK MANAGER 7839 81/06/09 2450 10
▷ SELECT (속성) from (테이블) WHERE (조건 속성) LIKE (조건 값, % or _와 함께 작성);
: LIKE - 유사한 데이터 검색
: % - 모든 글자를 의미(글자 수와 무관)
→ 'A%', A로 시작하는 모든 문자열 / '%L%', 중간에 L이 들어가는 모든 문자열 / '%T', T로 끝나는 모든 문자열
: _ - 한 글자를 의미
→'_L%', 이름 두 번째 자리에 L이 들어가는 모든 문자열 / '__A__', 이름이 다섯 글자이고 세 번째 자리에 A가 들어가는 모든 문자열
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE ENAME LIKE 'J%';
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE ENAME LIKE '%S';
SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE ENAME LIKE '__A__';
출력 결과
EMPNO ENAME JOB DEPTNO ---------- ---------- --------- ---------- 7566 JONES MANAGER 20 7900 JAMES CLERK 30
EMPNO ENAME JOB DEPTNO ---------- ---------- --------- ---------- 7566 JONES MANAGER 20 7876 ADAMS CLERK 20 7900 JAMES CLERK 30
EMPNO ENAME JOB DEPTNO ---------- ---------- --------- ---------- 7698 BLAKE MANAGER 30 7782 CLARK MANAGER 10 7876 ADAMS CLERK 20
▷ SELECT DISTINCT (속성) from (테이블);
: DISTINCT - 중복 제거 표현
SELECT DISTINCT JOB FROM EMP;
출력 결과
JOB --------- CLERK SALESMAN MANAGER ANALYST PRESIDENT
▷ SELECT COUNT(속성) from (테이블);
: COUNT(속성) - () 안에 있는 속성의 개수
→ () 안에 (DISTINCT 속성) 이 들어가면 중복이 제거된 속성의 개수
SELECT COUNT(DISTINCT JOB) FROM EMP;
출력 결과
COUNT(DISTINCTJOB) ------------------ 5
▷ SELECT (사칙 연산) from DUAL;
: SELECT 절에서 사칙 연산 가능
: DUAL - 오라클에서 제공하는 일종의 가상 테이블
SELECT ENAME, JOB, SAL, SAL * 12, DEPTNO FROM EMP;
SELECT 7 + 8 FROM DUAL;
출력 결과
ENAME JOB SAL SAL*12 DEPTNO ---------- --------- ---------- ---------- ---------- SMITH CLERK 800 9600 20 ALLEN SALESMAN 1600 19200 30 WARD SALESMAN 1250 15000 30 JONES MANAGER 2975 35700 20 MARTIN SALESMAN 1250 15000 30 BLAKE MANAGER 2850 34200 30 CLARK MANAGER 2450 29400 10 SCOTT ANALYST 3000 36000 20 KING PRESIDENT 5000 60000 10 TURNER SALESMAN 1500 18000 30 ADAMS CLERK 1100 13200 20 JAMES CLERK 950 11400 30 FORD ANALYST 3000 36000 20 MILLER CLERK 1300 15600 10
7+8 ---------- 15
▷ SELECT (속성) as "가명" from (테이블);
: Alias - 속성에 가명
→ 기본적으로 as가 원칙이지만 생략 가능
→ ""(큰 따옴표) 사용 / 생략 가능 (하지만 가명에 공백이 있을 경우 "" 필수)
SELECT ENAME, JOB, SAL, SAL * 12 AS "연봉", DEPTNO FROM EMP;
출력 결과
ENAME JOB SAL 연봉 DEPTNO ---------- --------- ---------- ---------- ---------- SMITH CLERK 800 9600 20 ALLEN SALESMAN 1600 19200 30 WARD SALESMAN 1250 15000 30 JONES MANAGER 2975 35700 20 MARTIN SALESMAN 1250 15000 30 BLAKE MANAGER 2850 34200 30 CLARK MANAGER 2450 29400 10 SCOTT ANALYST 3000 36000 20 KING PRESIDENT 5000 60000 10 TURNER SALESMAN 1500 18000 30 ADAMS CLERK 1100 13200 20 JAMES CLERK 950 11400 30 FORD ANALYST 3000 36000 20 MILLER CLERK 1300 15600 10
▷ SELECT (속성) from (테이블) "가명";
: Alias - 테이블에 가명
→ ""(큰 따옴표) 사용 / 생략 가능 (하지만 가명에 공백이 있을 경우 "" 필수)
→ 속성과 달리 as 사용 X
▷ SELECT (테이블.속성) from (테이블);
▷ SELECT (테이블가명.속성) from (테이블) "테이블가명";
: 테이블.속성 혹은 테이블가명.속성이 가능
: 속성 가명은 불가능
SELECT EMP.ENAME, EMP.JOB, EMP.SAL, EMP.DEPTNO from EMP;
SELECT ETAB.ENAME, ETAB.JOB, ETAB.SAL, ETAB.DEPTNO from EMP "ETAB";
▷ SELECT (속성) from (테이블) WHERE (속성) IS (NOT) NULL;
: NULL - 없음. 0이나 공백 X
→ NULL과 연산한 결과는 NULL
: 특정 속성이 NULL인 데이터 검색 / NULL이 아닌 데이터 검색
SELECT ENAME, JOB, SAL, SAL * 12 + COMM AS "연봉" FROM EMP;
출력 결과
ENAME JOB SAL 연봉 ---------- --------- ---------- ---------- SMITH CLERK 800 ALLEN SALESMAN 1600 19500 WARD SALESMAN 1250 15500 JONES MANAGER 2975 MARTIN SALESMAN 1250 16400 BLAKE MANAGER 2850 CLARK MANAGER 2450 SCOTT ANALYST 3000 KING PRESIDENT 5000 TURNER SALESMAN 1500 ADAMS CLERK 1100 JAMES CLERK 950 FORD ANALYST 3000 MILLER CLERK 1300
▷▷ NVL(NULL 속성, A)
: NULL 속성을 A 값으로 변환
: 해당 함수를 통해 NULL값과의 연산 가능
SELECT ENAME, JOB, SAL, SAL * 12 + NVL(COMM, 0) AS "연봉" FROM EMP;
출력 결과
ENAME JOB SAL 연봉 ---------- --------- ---------- ---------- SMITH CLERK 800 9600 ALLEN SALESMAN 1600 19500 WARD SALESMAN 1250 15500 JONES MANAGER 2975 35700 MARTIN SALESMAN 1250 16400 BLAKE MANAGER 2850 34200 CLARK MANAGER 2450 29400 SCOTT ANALYST 3000 36000 KING PRESIDENT 5000 60000 TURNER SALESMAN 1500 18000 ADAMS CLERK 1100 13200 JAMES CLERK 950 11400 FORD ANALYST 3000 36000 MILLER CLERK 1300 15600
※ 주의
: SQL 명령어, 속성, 테이블 이름에서는 대소문자를 가리지 않음
→ 테이블에 저장된 문자 데이터는 예외
: 오라클에서 문자열은 ''(작은 따옴표) 안에 작성
UNION / UNION ALL / INTERSECT / MINUS
※ 공통 주의 사항
: SELECT문 결과의 개수가 동일해야 함
: SELECT문 결과의 data type이 동일해야 함
▶ UNION
: 둘 이상의 SELECT문 결과를 합치는 명령어
: 합집합, 중복 data 자동 제거
▷ 문법
SELECT (속성) from (테이블)
UNION
SELECT (속성) from (테이블);
SELECT * FROM EMP WHERE DEPTNO = 30
UNION
SELECT * FROM EMP WHERE JOB = 'MANAGER';
출력 결과
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7844 TURNER SALESMAN 7698 81/09/08 1500 30 7900 JAMES CLERK 7698 81/12/03 950 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7782 CLARK MANAGER 7839 81/06/09 2450 10
▶ UNION ALL
: 둘 이상의 SELECT문 결과를 합치는 명령어
: 합집합, 중복 data 제거 X
▷ 문법
SELECT (속성) from (테이블)
UNION ALL
SELECT (속성) from (테이블);
SELECT * FROM EMP WHERE DEPTNO = 30
UNION ALL
SELECT * FROM EMP WHERE JOB = 'MANAGER';
출력 결과
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7844 TURNER SALESMAN 7698 81/09/08 1500 30 7900 JAMES CLERK 7698 81/12/03 950 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10
▶ INTERSECT
: 둘 이상의 SELECT문 결과 중에서 공통 부분만 출력하는 명령어
: 교집합, 중복 data 자동 제거
▷ 문법
SELECT (속성) from (테이블)
INTERSECT
SELECT (속성) from (테이블);
SELECT * FROM EMP WHERE DEPTNO = 30
INTERSECT
SELECT * FROM EMP WHERE JOB = 'MANAGER';
출력 결과
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7698 BLAKE MANAGER 7839 81/05/01 2850 30
▶ MINUS
: 상단의 SELECT문의 결과에서 하단의 SELECT문의 결과를 뺌
▷ 문법
SELECT (속성) from (테이블)
MINUS
SELECT (속성) from (테이블);
SELECT * FROM EMP WHERE DEPTNO = 30
MINUS
SELECT * FROM EMP WHERE JOB = 'MANAGER';
출력 결과
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7844 TURNER SALESMAN 7698 81/09/08 1500 30 7900 JAMES CLERK 7698 81/12/03 950 30
-- QUIZ --
--1. emp 사원 이름, 급여, 입사일 출력
SELECT ENAME, SAL, HIREDATE from EMP;
--2. emp에서 별명 부여 : deptno > 부서번호
SELECT DEPTNO AS "부서번호" from EMP;
--3. emp에서 job을 중복 제거 출력
SELECT DISTINCT JOB from EMP;
--4. emp에서 급여가 1500이하인 직원의 사번, 이름, 직무, 급여, 부서번호 출력
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO from EMP WHERE SAL <= 1500;
--5. emp에서 이름이 MARTIN인 직원 정보 출력
SELECT * from EMP WHERE ENAME = 'MARTIN';
--6. emp에서 급여가 950 또는 1250 또는 2975인 직원 정보 출력
SELECT * from EMP WHERE SAL IN (950, 1250, 2975);
--7. emp에서 급여가 950 또는 1250 또는 2975가 아닌 직원 정보 출력
SELECT * from EMP WHERE SAL NOT IN (950, 1250, 2975);
--8. emp에서 이름이 S로 끝나는 직원 정보 출력
SELECT * from EMP WHERE ENAME LIKE '%S';
--9. emp에서 MGR이 NULL인 직원 정보 출력
SELECT * from EMP WHERE MGR IS NULL;
--10. emp에서 모든 직원의 사번, 이름, 직무, 입사일, 부서번호를 입사일 최근 순으로 출력
SELECT EMPNO, ENAME, JOB, HIREDATE, DEPTNO from EMP ORDER BY HIREDATE DESC;
--11. emp에서 모든 직원의 사번, 이름, 직무, 입사일, 부서번호를 입사일이 오래된 순으로 출력
SELECT EMPNO, ENAME, JOB, HIREDATE, DEPTNO from EMP ORDER BY HIREDATE;