DDL,DML,DCL등등

김석진·2022년 4월 21일
0

Oracle SQL

목록 보기
1/10

DDL(Data Definition Language)-CREATE,DROP,ALTER

데이터베이스 객체(테이블,뷰,인덱스,...)의 구조를 정의

DML(Data Manipulation Language)-INSERT,DELETE,UPDATE

데이터의 삽입,삭제,갱신등을 처리

DCL(Data Control Language)-GRANT,REVOKE

데이터의 삽입,수정,삭제

INSERT문법

INSERT INTO table_name(column1,colum2,...)
VALUES(데이터,'데이터',...);

INSERT INTO table_name(column1,column2,...)
SELECT column1,column2,....
FROM table_name
WHERE 조건
  • 실제 데이터는 VALUES괄호()안에 입력하고 문자열은 단일 따옴표('')로 둘러싼다
  • 각각의 데이터 구분은 ","로 한다
  • 테이블 이름 옆에 ()생략시 자동으로 모든 컬럼을 VALUES()안에 입력시킴

INSERT 예제

--모든 데이터를 입력할 경우
SQL> INSERT INTO emp
   VALUES(7369,'SMITH','CLERK',7902,TO_DATE('80/12/17'),800,NULL,20);

--- 원하는 데이터만 입력할 경우
SQL> INSERT INTO dep (deptno,dname)
 	 VALUES(10,'ACCOUNTING');
     
-- SELECT 문장을 이용한 INSERT
SQL> INSERT INTO dept2
	SELECT * FROM dept;
 

UPDATE

테이블안의 데이터를 수정함

UPDATE table_name
SET column1 =값(고칠내용), column2=값,...
WHERE 조건
---사원수가 7902번인 사원의 부서번호를 30으로 수정
SQL> UPDATE emp
	SET deptno=30
    WHERE empno=7902;
    
--- 부서번호가 20의 사원들의 급여가 10%인상
SQL> UPDATE emp
	 SET sal=sal*1.1
     WHERE deptno=20;
     
---모든 사원의 입사일을 오늘로 수정
SQL> UPDATE emp
	 SET hiredate= SYSDATE

DELETE

사용하지 않는 데이터를 삭제함

DELTE FROM table_name WHERE 조건;
---사원번호가 7902번인 사원의 데이터를 삭제
SQL>DELETE FROM emp
	WHERE empno=7902;

---평균급여보다 적게 받는 사원삭제
SQL> DELTE FROM emp
	 WHERE sal< (SELECT avg(sal) FROM emp);

---모든 행 삭제
SQL> DELTE FROM emp;
     

MERGE문의 이해

  • MERGE문은 조건에 따라서 데이터의 삽입,갱신,삭제작업을 한번에 할 수 있다.
  • 해당 행이 존재하는 경우 UPDATE(DELTE 포함할 수 있음)를 수행하고, 새로운 행일 경우 INSERT를 수행
  • 대상 테이블에 대한 UPDATE/INSERT조건은 ON절에 의해 결정됨

MERGE문법

MERGE [ hint ] 
   INTO [ schema. ] { table | view } [ t_alias ] 
   USING { [ schema. ] { table | view } 
         | subquery  
         } [ t_alias ] 
   ON ( condition ) 
WHEN MATCHED THEN 
UPDATE SET column = { expr | DEFAULT } 
           [, column = { expr | DEFAULT } ]... 
[ DELETE where_clause ] 
WHEN NOT MATCHED THEN 
INSERT [ (column [, column ]...) ] 
VALUES ({ expr [, expr ]... | DEFAULT })
  • INTO: DATA가 UPDATE되거나 INSERT될 테이블이나 뷰를 지정
  • USING: 비교할 SOURCE테이블또는 뷰나 서브쿼리를 지정, INTO절의 테이블과 동일하거나 다를 수 있음
  • ON: UPDATE나 INSERT를 하게 될 조건으로,해당 조건을 만족하는 데이터가 있으면 WHEN MATCHED절을 실행하게되고 없으면 WHEN NOT MATCHED이하를 실행
  • WHEN MATCHED: ON조건절이 TRUE인 ROW에 수행할 내용(UPDATE,DELETE 포함될 수 있음)
  • WHEN NOT MATCHED :ON조건절에 맞는 ROW가 없을때 수행할 내용(INSERT)

MERGE예제1

부서번호20,30의 사원이 존재하면 급여를 10%인상하고, 존재하지 않으면 급여가 1000보다 큰 사원정보를등록하는예(INSERT,UPDATE예제)

---부서번호10,20의 사원정보를 갖는 테스트테이블생성
SQL> CREATE TABLE emp_merge_test
	 AS SELECT empno,deptno,sal FROM emp WHERE deptno IN (10,20);
     
--- 사원이 존재하면 10%인상 없으면 급여가 1000보다 큰 사원정보를 등록
MERGE INTO emp_merge_test m
USING (SELECT empno,deptno,sal
		FROM emp
       WHERE deptno IN (20,30)) e
       ON (m.empno = e.empno)
       WHEN MATCHED THEN
       		UPDATE SET m.sal = ROUND(m.sal*1.1)
       WHEN NOT MATCHED THEN
       		INSERT (m.empno,m.deptno,m.sal)
            VALUES (e.empno,e.deptno,e.sal)
            WHERE e.sal>1000
       COMMIT;
       
-- 20부서의 급여가 10%증가했고, 30부서는 등록되었는지 확인해 보자 
SELECT * FROM emp_merge_test; 
-- 다음 테스트를 위해서 emp_merge_test 테이블에 30부서 데이터를 삭제하자 
-- 부서번호 10과 20의 사원정보만 남을 것이다.  
DELETE FROM emp_merge_test WHERE deptno = 30; 
COMMIT;

MERGE예제2

부서번호 10의 사원 급여를 10%인상하고, 부서번호20의 사원정보는 삭제하며,부서번호30의 사원급여20%인상하는예(INSERT,UPDATE,DELETE예제)

---MEGER문작성
MERGE emp_merge_test m
USING emp e
ON (m.empno=e.empno)
WHEN MATCHED THEN
	UPDATE SET m.sal=ROUND(m.sal*1.1)
    DELTE WHERE (m.deptno =20)
WHEN NOT MATCHED THEN
INSERT (m.empno,m.deptno,m.sal)
VALUES (e.empno,e.detpno,ROUND(e.sal*1.2)
WHERE e.deptno=30
COMMIT;

-- 정상적으로 변경되었는지 확인해 보자 
SELECT * FROM emp_merge_test; 
-- 테스트 테이블은 삭제하자 
DROP TABLE emp_merge_test;

SELECT문 및 연산자

SELECT문은 데이터베이스로 부터 저장된 데이터를 검색하는데 사용

SELECT문법

  • DISTINCT:중복행 제거옵션
  • *:테이블의 모든 COLUMN을 출력
  • alias: 해당 column에 대해서 다른이름을 부여할때 사용
  • table_name:질의 대상 테이블명
  • WHERE: 조건을 만족하는 행들만 검색
  • condition: column, 표현식,상수및 비교연산자가 올수있다.
  • ORDER BY:질의 결과 정렬을 위한 옵션(ASC:오름차순, DESC:내림차순)

SQL문의 작성방법

  • SQL문은 대소문자 구분X
  • SQL문은 대소문자 구분 X
  • SQL문은 한줄 or 여러줄 입력가능
  • 일반적으로 키워드는 대문자, 다른 모든 단어, 즉 테이블이름,열 이름은 소문자로 입력(권장)
  • 가장 최근의 명령어 한개 가 SQL buffer에 저장
  • SQL문 마지막 절의 끝에 ";"를 기술하여 명령의 끝을 표시

WHERE절에 사용될 수 있는 SELECT 연산자

IN,NOT IN연산자

IN연산자 예시
--- 사번이 7900,7934번인 사원의 사번과 성명을 출력
SQL> SELECT empno, ename
	 FROM emp
     WHERE empno IN (7900,7934);
 
 EMPNO    ENAME 
 --------- ------------- 
    7934      MILLER 
    7900      JAMES
    
    
NOT IN연산자예시
---사번이 7900,7934번이 아닌 사원의 사번과 성명을 출력
SQL> SELECT empno, ename
	 FROM emp
     WHERE empno NOT IN (7900,7934);
     
EMPNO   ENAME 
-------- -------------- 
  7369    SMITH 
  7499    ALLEN 
  7698    BLAKE 
  ....     

BETWEEN 연산자

a와 b사이의 데이터를 출력 (a,b값 포함)
AND를 이용해 두조건을 결합한 검색과 같은 결과값을 보여줌

--- 급여가 3000에서 5000사이인 사원만 조회
SQL> SELECT empno,ename
	 FROM emp
     WHERE sal BETWEEN 3000 AND 5000;
     
     
   EMPNO ENAME 
------- ------ 
   7788 SCOTT 
   7839 KING 
   7902 FORD    

LIKE연산자

  • 검색 STRING 값에 대한 와일드 카드 검색을 위해서 LIKE연산자를 사용
  • %: 여러개의 문자열을 나타내는 와일드카드
  • _:단 하나의 문자를 나타내는 와일드카드
  • ESCAPE: 와일드카드 문자를 일반문자처럼 사용하고싶은 경우에 사용
    ex) WHERE name LIKE '%a_y%'ESCAPE''\'
  • LIKE연산자는 대소문자 구분함
  • UPPER()함수를 이용해 대소문자 구분없이 출력할 수 있음(인덱스 성능문제발생, 함수기반 인덱스사용)
--- 'K'문자가 들어있는 사원 정보 조회
--- UPPER()함수는 k를 대문자로 변환하여 'K'fhdlstlr
SQL> SELECT empno, ename
	 FROM emp
     WHERE UPPER(ename) LIKE '%K%';
     EMPNO   ENAME 
------- ----------- 
 7698   BLAKE 
 7782   CLARK 
 7839   KING
 
 -- '_'를 이용한 LIKE검색
 SQL> SELECT empno,ename
 	  FROM emp
      WHERE UPPER(ename) LIKE '_I%';		-- I가 두번째위치한 데이터들만 검색
     
 EMPNO ENAME 
------- ---------- 
   7839 KING 
   7934 MILLER     

ORDER BY

ORDER BY절은 데이터의 정렬을 위해 사용 ex)ASC(오름차순),DESC(내림차순)

-- 아래 두 개의 쿼리는 동일한 결과를 반환함
-- 이름을 ASC로 정렬
SQL> SELECT empno, ename
     ROM emp
     WHERE deptno =30
     ORDER BY ename ASC;

-- 두 번째 컬럼을 디폴트(ASC) 순으로 정렬 
SQL> SELECT empno, ename 
     FROM  emp 
     WHERE  deptno = 30 
     ORDER BY 2

   EMPNO ENAME 
-------- --------- 
    7499 ALLEN 
    7698 BLAKE 
    7900 JAMES 
...

예명(Alias)

테이블 예명(Alias)

  • 테이블 Alias로 column을 단순,명확히 할 수 있다.
  • 현재의 SELECT 문장에 대해서만 유효하다
  • 테이블 Alias는 길이가 30자 까지 가능하나 짧을수록 더욱 좋다
  • 테이블 Alias는 의미가 있어야 함
  • FROM절에 테이블 Alias 설정 시 해당 테이블 Alias는 SELECT 문장에서 테이블 이름 대신에 사용 한다
-- 사원수가 3명이 넘는 부서의 부서명과 사원수 조회
SQL> SELECT a.dname, b.cnt
     FROM dept a, (SELECT deptno, COUNT(empno) cnt
                   FROM emp
                   GROUP BY deptno) b
     WHERE a.deptno = b.deptno
        AND b.cnt>3
DNAME             CNT 
----------------- ---------- 
RESEARCH          5 
SALES             6

위 쿼리에서는 3개의 Alias가 사용되었다
1. dept테이블을 a라는 alias
2. 부서의 사원수인 COUNT(empno)를 cnt로 alias
3. 부서별 사원수를가져오는 쿼리를 b로 alias

예명은 컬럼에만 주는 것이 아니라. 쿼리 문 및 테이블에도 사용할 수 있다

profile
주니어 개발자 되고싶어요

0개의 댓글