SQL 의 역사
SQL 의 정의
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 | 절차적 언어에서 사용하는 트랜젝션 컨트롤 언어 |
{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}
{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}
{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}
{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}
{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}