1. SQL 개요

SQL 의 역사

  • 1970년에 코드(E.F.CODE)박사에 의해 SEQUEL(시퀄, Structured English Query Language)로 처음 발표.
  • 이후 IBM에서 코드 박사의 모델을 이용하여 데이터베이스와 통신하는 언어를 개발하여 SQL 이라 정의.
  • 이를 ANSI/ISO 표중기관에서 관계형 데이터베이스 시스템의 표준언어로 채택하여 정리.
  • 현재 DBMS에서 사용하고 있는 SQL들은 코어(Core)라고 알려진 SQL-99와 SQL-92를 이용하고,
  • SQL-99는 SQL2라고 하는 SQL-92로부터 발전했다.

SQL 의 정의

  • SQL(Structured Query Language, 구조적 질의어)
  • 관계형 데이터베이스에 접근(생성, 변경, 삭제, 조회)하기 위한 비절처적 표준 언어다.

SQL 문장의 분류(오라클 분류 방법)

1. DML데이터 조작어 (Data Manipulation Language)
2. DDL데이터 정의어 (Data Definition Language)
3. 트랜젝션 컨트롤트랜젝션 조작어 (Transaction Control Language)
4. 세션 컨트롤세션 조작어 (Session Control Language)
5. 시스템 컨트롤시스템 조작어 (System Control Language)
6. 임베디드 SQL절차적 언어에서 사용하는 트랜젝션 컨트롤 언어

2. SQL 구문별 상세설명 - DML

  • DML은 데이터베이스 오브젝트(테이블, 뷰 등)의 데이터를 조회, 입력, 수정, 삭제하는 SQL 문장이다.

데이터를 조회하는 SELECT 문

{section}
{column:width=20}

SELECT 문장의 구성


SELECT [DISTINCT | ALL] { *
                            | { [schema.]{table | view | snapshot}.* | expr } [ [AS] c_alias ]
                           [, { [schema.]{table | view | snapshot}.* | expr } [ [AS] c_alias ] ] ... }
  FROM [schema.]{table | view | snapshot}[@dblink] [t_alias]
    [, [schema.]{table | view | snapshot}[@dblink] [t_alias] ] ...
[WHERE condition]
[ [START WITH condition] CONNECT BY condition]
[GROUP BY expr [, expr] ... [HAVING condition] ]
[{UNION | UNION ALL | INTERSECT | MINUS} SELECT command]
[ORDER BY {expr | position} [ASC | DESC]
       [, {expr | position} [ASC | DESC]] ... ]
[FOR UPDATE [OF [[schema.]{table | view}.]column
             [, [[schema.]{table | view}.]column] ...] [NOWATE] ]

(기호없음-반드시 존재, []-선택, |-OR관계, {}-한개필수, ()-한개이상필수, ...-연속)

{column}
{column:width=80}
{column}
{section}

{section}
{column:width=20}

SELECT 문장의 처리 순서


⑤ --- SELECT
① --- FROM
② --- WHERE
③ --- GROUP BY
④ --- HAVING
⑥ --- ORDER BY

{column}
{column:width=80}
{column}
{section}

SELECT 문장의 종류
  • 1. 단순 SELECT : 한 개의 테이블에서 데이터 출력
  • 2. 조인 SELECT : 여러 개의 테이블에서 데이터 출력
  • 3. 그룹 SELECT : 그룸화하여 계산한 데이터 출력
  • 4. 다중 SELECT : SELECT 문장내에 또다른 SELECT 문장이 존재하여 데이터 출력
  • 5. 집합연산 SELECT : 두개 이상의 SELECT 문장이 실행된 결과값이 조합되어 데이터 출력

{section}
{column:width=20}

■ 단순 SELECT


① 테이블 전체 내용 조회
   -- '*' 로 모든 컬럼 조회 
   SELECT * FROM emp;
   -- 컬럼 이름으로 특정 컬럼들만 조회
   SELECT empno, ename, job FROM emp;
② 컬럼이름 변경
   -- AS를 사용
   SELECT empno AS 사원번호, ename AS 사원명, job AS 직책 FROM emp;
   -- 공백 이용
   SELECT empno 사원번호, ename 사원명, job 직책 FROM emp;
③ 컬럼에 문자열 삽입
   SELECT '오라클클럽(주)' 회사명, empno, ename, job FROM emp;
④ NULL값(값이 할당되지 않은) 판단
   SELECT * FROM emp WHERE job IS NULL;
⑤ DISTINCT 중복제거
   SELECT DISTINCT job FROM emp;
⑥ LIKE/SUBSTR 문자열의 일부분만 비교
   -- LIKE 사용
   SELECT * FROM emp WHERE ename LIKE '이%';
   -- SUBSTR 사용
   SELECT * FROM emp WHERE SUBSTR(ename, 1, 1) = '이';
⑦ BETWEEN 범위검색
   SELECT * FROM emp WHERE sal BETWEEN 2000 AND 3000;
⑧ IN/OR 다중조건
   -- IN 사용
   SELECT * FROM emp WHERE job IN ('점원', '관리자', '총무');
   -- OR 사용
   SELECT * FROM emp WHERE job = '점원' OR job = '관리자' OR job = '총무';

{column}
{column:width=80}
{column}
{section}

{section}
{column:width=20}

■ 조인 SELECT


① 카테시안 조인
   SELECT dname, ename FROM dept, emp;
② 내부조인
   SELECT d.dname, e.ename
     FROM dept d, emp e
    WHERE d.deptno = e.deptno
   ;
③ 외부조인
   SELECT d.dname, e.ename
     FROM dept d, emp e
    WHERE d.deptno = e.deptno(+)
   ;

{column}
{column:width=80}
{column}
{section}

{section}
{column:width=20}

■ 그룹 SELECT


① COUNT
   -- '*' 사용
   SELECT COUNT(*) FROM emp;
   -- 일반 상수 사용
   SELECT COUNT(1) FROM emp;
   -- 컬럼 사용
   SELECT COUNT(empno) cnt1, COUNT(comm) cnt2 FROM emp;
         CNT1       CNT2
   ---------- ----------
           14          4
② SUM
   SELECT SUM(sal) FROM emp;
   SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
③ AVG
   SELECT AVG(sal) FROM emp;
   SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;
④ MIN
   SELECT MIN(sal) FROM emp;
   SELECT deptno, MIN(sal) FROM emp GROUP BY deptno;
⑤ MAX
   SELECT MAX(sal) FROM emp;
   SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;
⑥ 기타
   CORR, COVAR_POP, COVAR_SAMP, GROUPING, REGR_, STDDEV,
   STDDEV_POP, STDDEV_SAMP, VAR_POP, VAR_SAMP, VARIANCE

{column}
{column:width=80}
{column}
{section}

■ 다중 SELECT
(1) Nested Sub Query : Where 절이나 Having 절에서 사용되는 서브쿼리
{section}
{column:width=20}
{code:sql
title=단일값 비교}
① 네스티드 서브쿼리
SELECT empno, ename, sal
FROM emp
WHERE deptno = (SELECT deptno FROM dept WHERE dname = '생산부')
;
② 조인 쿼리
SELECT e.empno, e.ename, e.sal
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND d.dname = '생산부'
;
{code}
{column}
{column:width=80}
{column}
{section}
{section}
{column:width=20}
{code:sql
title=다중값 비교}
① 네스티드 서브쿼리
SELECT deptno, dname
FROM dept
WHERE deptno IN (SELECT deptno FROM emp WHERE job = '과장')
;
② 조인 쿼리
SELECT DISTINCT deptno, dname
FROM dept d, emp e
WHERE d.deptno = e.deptno
AND e.job = '과장'
;
{code}
{column}
{column:width=80}
{column}
{section}
{section}
{column:width=20}
{code:sql
title=EXISTS/NOT EXISTS 존재여부 확인}
① 직원이 존재하지 않는 부서
SELECT deptno, dname
FROM dept d
WHERE NOT EXISTS (SELECT deptno FROM emp e WHERE e.deptno = d.deptno)
;
② 과장이 존재하는 부서
SELECT deptno, dname
FROM dept d
WHERE EXISTS (SELECT 1 FROM emp e WHERE e.deptno = d.deptno AND e.job = '과장')
;
{code}
{column}
{column:width=80}
{column}
{section}
(2) 인라인뷰 : FROM 절에서 사용되는 서브쿼리
{section}
{column:width=20}
{code:sql
title=10, 20, 30번 부서에 동일한 직책 중복제거 출력}
① 인라인뷰
SELECT DISTINCT a.job
FROM (SELECT job FROM emp WHERE deptno = 10) a
, (SELECT job FROM emp WHERE deptno = 20) b
, (SELECT job FROM emp WHERE deptno = 30) c
WHERE a.job = b.job
AND b.job = c.job
;
② 조인 쿼리
SELECT DISTINCT a.job
FROM emp a, emp b, emp c
WHERE a.job = b.job
AND b.job = c.job
AND a.deptno = 10
AND b.deptno = 20
AND c.deptno = 30
;
③ 네스티드 서브쿼리
SELECT DISTINCT a.job
FROM emp a
WHERE a.deptno = 10
AND EXISTS (SELECT 'x' FROM emp b WHERE a.job = b.job AND b.deptno = 20)
AND EXISTS (SELECT 'x' FROM emp c WHERE a.job = c.job AND c.deptno = 30)
;
{code}
{column}
{column:width=80}
{column}
{section}

{section}
{column:width=20}

■ 집합연산 SELECT 문


SQL> CREATE TABLE i_order
  2  AS
  3  SELECT 1001 orderno, '기민용' ordernm FROM dual
  4  UNION ALL SELECT 1002, '이현석' FROM dual
  5  UNION ALL SELECT 1003, '이창헌' FROM dual
  6  UNION ALL SELECT 1004, '이재현' FROM dual
  7  ;

테이블이 생성되었습니다.

SQL> CREATE TABLE c_order
  2  AS
  3  SELECT 1001 orderno, '이가혜' ordernm FROM dual
  4  UNION ALL SELECT 1002, '기민용' FROM dual
  5  UNION ALL SELECT 1003, '기민용' FROM dual
  6  ;

테이블이 생성되었습니다.

SQL> SELECT ordernm FROM i_order
  2   UNION
  3  SELECT ordernm FROM c_order
  4  ;

ORDERN
------
기민용
이가혜
이재현
이창헌
이현석

SQL> SELECT ordernm FROM i_order
  2   UNION ALL
  3  SELECT ordernm FROM c_order
  4  ;

ORDERN
------
기민용
이현석
이창헌
이재현
이가혜
기민용
기민용

7 개의 행이 선택되었습니다.

SQL> SELECT ordernm FROM i_order
  2  INTERSECT
  3  SELECT ordernm FROM c_order
  4  ;

ORDERN
------
기민용

SQL> SELECT ordernm FROM i_order
  2   MINUS
  3  SELECT ordernm FROM c_order
  4  ;

ORDERN
------
이재현
이창헌
이현석

SQL>

{column}
{column:width=80}
{column}
{section}

데이터를 입력하는 INSERT 문

{section}
{column:width=20}

INSERT 문장의 구성


INSERT INTO [schema.]{table | view}[@dblink]
            [ (column [, column] ...) ]
{VALUES (expr [, expr] ...) | SubQuery}

(기호없음-반드시 존재, []-선택, |-OR관계, {}-한개필수, ()-한개이상필수, ...-연속)

{column}
{column:width=80}
{column}
{section}

{section}
{column:width=20}

■ INSERT 문장 유형에 따른 예제


(1) 단건 INSERT
  ① 테이블 컬럼 지정
    INSERT INTO item (itemcd, itemnm, qty, price, color, madedate)
    VALUES ('1003', '팔찌-XG', 50, 20000, '청색', '20020405');
  ② 테이블 컬럼을 지정하지 않음
    INSERT INTO item
    VALUES ('1003', '팔찌-XG', 50, 20000, '청색', TO_DATE('20020405', 'yyyymmdd'));
(2) NULL INSERT
  ① 테이블에 컬럼을 지정하고 컬럼값에 '' 지정
    INSERT INTO item (itemcd, itemnm, qty, price, color, madedate)
    VALUES ('1004', '목걸이-FR', 100, '', '은색', TO_DATE('20020501', 'yyyymmdd'));
  ② 테이블 컬럼을 지정하지 않고 컬럼값에 '' 지정
    INSERT INTO item
    VALUES ('1004', '목걸이-FR', 100, '', '은색', TO_DATE('20020501', 'yyyymmdd'));
  ③ 테이블 컬럼에 Null 대상 컬럼을 제외하고 컬럼값에 '' 지정
    INSERT INTO item (itemcd, itemnm, qty, color, madedate)
    VALUES ('1004', '목걸이-FR', 100, '은색', TO_DATE('20020501', 'yyyymmdd'));
(3) 다건 INSERT
  ① 두 테이블의 컬럼 지정
    INSERT INTO item_t (itemcd, itemnm, qty, price, color, madedate)
    SELECT itemcd, itemnm, qty, price, color, madedate FROM item;
  ② 두 테이블의 컬럼을 지정하지 않음
    INSERT INTO item_t
    SELECT * FROM item;
  ③ 입력 테이블의 컬럼을 지정하지 않음
    INSERT INTO item_t
    SELECT itemcd, itemnm, qty, price, color, madedate FROM item;
  ④ 읽는 테이블의 컬럼을 지정하지 않음
    INSERT INTO item_t (itemcd, itemnm, qty, price, color, madedate)
    SELECT * FROM item;

{column}
{column:width=80}
{column}
{section}

데이터를 수정하는 UPDATE 문

{section}
{column:width=20}

UPDATE 문장의 구성


UPDATE [schema.]{table | view}[@dblink] [alias]
SET { (column [, column] ...) = (SubQuery) | column = {expr | (SubQuery)} }
 [, { (column [, column] ...) = (SubQuery) | column = {expr | (SubQuery)} } ] ...
[WHERE condition]

(기호없음-반드시 존재, []-선택, |-OR관계, {}-한개필수, ()-한개이상필수, ...-연속)

{column}
{column:width=80}
{column}
{section}

{section}
{column:width=20}

■ UPDATE 문장 유형에 따른 예제


(1) 조건에 따른 UPDATE
    UPDATE item
       SET qty = 500
     WHERE itemcd = '1001';
(2) 테이블 전체 UPDATE
    UPDATE item
       SET price = price - (price * (30/100));

{column}
{column:width=80}
{column}
{section}

데이터를 삭제하는 DELETE 문

{section}
{column:width=20}

DELETE 문장의 구성


DELETE [FROM] [schema.]{table | view}[@dblink] [alias]
[WHERE condition]

(기호없음-반드시 존재, []-선택, |-OR관계, {}-한개필수, ()-한개이상필수, ...-연속)

{column}
{column:width=80}
{column}
{section}

{section}
{column:width=20}

■ DELETE 문장 유형에 따른 예제


(1) 조건에 따른 DELETE
    DELETE item
     WHERE itemcd = '1001';
(2) 테이블 전체 DELETE
    DELETE FROM item;

{column}
{column:width=80}
{column}
{section}