SQL 기본 -4. DML(Data Manipulation Language)

SSAD·2023년 2월 22일
0

SQLD

목록 보기
6/10

Insert문

1. Insert문

  • INSERT문은 테이블에 데이터를 입력하는 DML문이다.
  • INSERT문
INSERT INTO TABLE (COLUMN1, COLUMN2,....) VALUSES(EXPRESSION1, EXPRESSION2,..);
  • EMP 테이블에 데이터를 삽입하려면 테이블명, 칼럼명, 데이터 순으로 입력하면 됨
INSERT INTO EMP(EMPNO, ENAME) VALUES(1000, '임베스트');
  • 데이터를 입력할 때 문자열을 입력하는 경우에는 작은 따옴표(' ')를 사용해야 함
  • 만약 특정 테이블의 모든 칼럼에 대한 데이터를 삽입하는 경우에는 칼럼명을 생략할 수 있음
  • 모든 칼럼의 데이터를 입력함
INSERT INTO EMP VALUES(1000, '임베스트');
  • 위 예처럼 칼렴명을 생략할수 있음, 단 위의 예제에서 EMP 테이블의 칼럼은 숫자형 데이터 타입 한 개의 칼럼과
    문자형 데이터 타입 한 개의 칼럼만 있어야 함
  • 주의 사항은 INSERT문을 실행했다고 데이터 파일에 저장되는 것은 아님
    최종적으로 데이터를 저장하려면 TCL문인 Commit을 실행해야 함
  • 만약 Auto Commit(Set auto commit on)으로 설정된 경우에는 Commit을 실행하지 않아도 바로 저장됨

2. SELECT문으로 입력

  • SELECT문을 사용하여 데이터를 조회해서 해당 테이블에 바로 삽입할수 있음
  • 단, 입력되는 테이블은 사전에 생성되어 있어야함
INSERT INTO DEPT_TEST
	SELECT * FROM DEPT;

3. Nologging 사용

  • 데이터베이스에 데이터를 입력하면 로그파일(Log file)에 그 정보를 기록함
  • Check point라는 이벤트가 발생하면 로그파일의 데이터를 데이터 파일에 저장함
  • Nologging 옵션은 로그파일의 기록을 최소화시켜서 입력 시 성능을 향상시키는 방법
  • Nologging 옵션은 Buffer Cache라는 메모리 영역을 생략하고 기록
ALTER TABLE DEPT NOLOGGING;

2. UPDATE문

  • 입력된 데이터의 값을 수정하려면, UPDATE문을 사용
  • UPDATE문을 사용하여 원하는 조건으로 데이털르 검색해서 해당 데이터를 수정
  • 만약, UPDATE문에 조건문을 입력하지 않으면 모든 데이터가 수정되므로 유의
UPDATE EMP
     SET ENAME = '조조'
   WHERE EMPNO = 100;
  • UPDATE문에서 주의사항은 데이터를 수정할 떄 조건절에서 검색되는 행 수만큼 수정된다는 것
  • 위의 예에서 EMPNO가 100번인 직원이 두명이라면 두명의 ENAME은 모두 '조조'로 수정됨

3. DELETE문

  • DELETE문은 원하는 조건을 검색해서 해당되는 행을 삭제
  • DELETE문에 조건문을 입력하지 않으면 모든 데이터가 삭제,테이블에 있는 모든 데이터가 삭제됨
  • DELETE문으로 데이터를 삭제한다고 해서 테이블의 용량이 초기화되지는 않음
DELETE FROM EMP
	WHERE EMPNO = 100;
  • 만약 위의 예에서 WHERE절(조건)을 입력하지 않으면 EMP 테이블의 모든 데이터가 삭제 됨

TIP : 테이블 용량이 초기화되지 않는다는 의미

  • Oracle 데이터베이스는 저장공간을 할당할 때 Extent 단위로 할당
  • 테이블에 데이터가 입력되면 Extent에 저장하게 됨
  • 만약 Extent의 크기가 MAX_EXTENTS를 넘어서게 되면 용량 초과 오류가 발생 즉, 최대로 저장할 수 있는 공간의 의미
  • DELETE문으로 데이터를 삭제하면 용량이 감소할 것으로 생각하는데
    DELETE문은 삭제 여부만 표시하고 용량은 초기화되지 않음
SELECT TABLE_NAME, MAX EXTENTS
FROM USER_TABLES;

테이블의 모든 데이터 삭제

DELETE FROM 테이블명;

  • 데이블의 모든 데이터를 살제
  • 데이터가 삭제되어도 테이블의 용량은 감소하지 않음

TRUNCATE TABLE 테이블명;

  • 테이블의 모든 데이터를 삭제
  • 데이터가 삭제되면 테이블의 용량은 초기화됨
  • 'TRUNCATE TABLE EMP;'는 EMP 테이블의 모든 데이터를 삭제하면서 테이블의 용량이 초기화 됨

4. SELECT문

1. SELECT문 사용

  • 테이블에 입력된 데이터를 조회하기 위해서 SELECT문을 사용
  • SELECT문은 특정 칼럼이나 특정 행만을 조회
SELECT * FROM EMP
	WHERE 사원번호=1000;
  • 위의 SELECT문에서 EMP 테이블의 모든 칼럼 '*'을 출력함
  • 단, WHERE절에 있는 조건문에 있는 행만 조회

SELECET문법

SELECT *

  • 모든 칼럼을 출력한다.

FROM EMP

  • FROM절에는 테이블명을 쓴다
  • 즉, EMP테이블을 지정

WHERE 사원번호=1000;

  • EMP 테이블에서 사원번호가 1000번인 행을 조회
  • 조건문을 지정

SELECT 칼럼 지정

SELECT EMPNO, ENAME FROM EMP;

  • EMP 테이블의 모든 행에서 EMPNO와 ENAME칼럼만 출력

SELECT * FROM EMP;

  • EMP 테이블의 모든 칼럼과 모든 행을 조회

SELECT ENAME || '님' FROM EMP;

  • EMP 테이블의 모든 행에서 ENAME 칼럼을 조회
  • 단, ENAME 칼럼 뒤에 '님'이라는 문자를 결합
  • 예를 들어 임베스트 님 이라고 출력됨

2. Order by를 사용한 정렬

  • SELECT문을 사용할 때 Order by를 같이 사용할수 있음
  • Order by는 데이터를 오름차순(Ascending) 혹은 내림차순(Descending)으로 출력
  • Order by가 정렬을 하는 시점은 모든 실행이 끝난 후에 데이터를 출력해 주기 바로 전
  • Order by는 정렬을 하기 때문에 데이터베이스 메모리를 많이 사용하게 됨
    즉 대량의 데이터를 정렬하게 되면 정렬로 인한 성능 저하가 발생
  • Oracle 데이터베이스는 정렬을 위해서 메모리 내부에 할당된 SORT AREA_SIZE를 사용
    만약 SORT_AREA_SIZE가 너무 작으면 성능저하 발생
  • 정렬을 회피하기 위해서 인덱스(Index)를 생성할 때 사용자가 원하는 형태로 오름차순 혹은 내림차순으로 생성
  • 특별한 지정이 없으면 Order by는 오름차순으로 정렬
SELECT * FR0M EMP
	ORDER BY ENAME, SAL DESC;
  • ENAME 부분은 ENAME ASC와 같음
    기본적으로 오름차순과 내림차순을 지정하지 않으면 오름차순으로 정렬
  • 내림차순으로 정려라고 싶을 때는 'DESC'를 사용

3. Index를 사용한 정렬 회피

  • 정렬은 Oracle 데이터베이스에 부하를 주므로, 인덱스를 사용해서 Order by를 회피할 수 있음

정렬 테스트 데이터 입력

 create table emp(
 	empno number(10) primary key,
    ename varchar2(20),
    sal    number(10)
 );
 
 insert into emp values(1000, '임베스트', 20000);
 insert into emp values(1001, '조조', 20000);
 insert into emp values(1002, '관우', 20000);
 
  • 위와 같이 데이터를 입력하고 SELECT문을 실행하면 EMPNO로 오름차순 정렬되어 조회됨
  • 그 이유는 EMPNO가 기본키이기 때문에 자동으로 오름차순 인덱스가 생성
SELECT  /*+ INDEX_DESC(A) */
FROM EMP A;
  • 위의 예를 보면 '/+ INDEX_DESC(A) /'를 사용
    즉 힌트를 사용한 것
    EMP 테이블에 생성된 인덱스를 내림차순으로 읽게 지정한것
  • SELECT문에 'ORDER BY EMPNO DESC'를 사용하지 않음
  • 위의 예처럼 SQL문을 사용하면 EMPNO 인덱스를 내림차순으로 읽음
  • 인덱스를 스캔한 후에 해당 EMPNO의 값을 가지고 테이블의 데이터를 읽음
  • 테이블에서 해당 행을 찾으면 인출하여 사용자 화면에 조회

4. Distinct와 Alias

1. Distinct

  • Distinct문은 칼럼명 앞에 지정하여 중복된 데이터를 한 번만 조회하게 함
SELECT DEPTNO FROM EMP ORDER BY DEPTNO;
  • 위의 예는 EMP 테이블의 DEPTNO 칼럼을 조회한 것
  • 조회내용을 보면 DEPTNO가 중복으로 지정되어 있는 것을 확인할 수 있음
SELECT DISTINCT DEPTNO FROM EMP
ORDER BY DEPTNO;
  • Distinct를 사용하면 DEPTNO 값이 중복되지 않음

2. Alias

  • Alias(별칭)은 테이블명이나 칼럼명이 너무 길어서 간략하게 할 때 사용
SELECT ENAME AS "이름" FROM EMP a;
WHERE a.EMPNO=1000;

SELECT ENAME AS "이름"

  • 칼럼명을 '이름'으로 출력하게 됨

FROM EMP a;

  • EMP 테이블명 대신 a를 사용

WHERE a.EMPNO=1000;

  • a를 테이블명처럼 사용
profile
learn !

0개의 댓글