BASHA TECH

DB#CH03. SQL 문장 이해 본문

Computer/DB

DB#CH03. SQL 문장 이해

Basha 2022. 7. 26. 18:29
728x90

1. SELECT문

2. INSERT문

3. UPDATE문

4. DELETE문

5. COMMIT과 ROLLBACK, TRUNCATE

6. 의사컬럼

7. 연산자

8. 표현식

9. 조건식

 

EMPLOYEE_ID : 사원번호, PK
EMP_NAME : 사원명
EMAIL : 이메일 
PHONE_NUMBER : 연락처
HIRE_DATE : 입사일
SALARY : 급여, 연봉 (수정)
MANAGER_ID : 상급자 사원번호  (수정)
COMMISSION_PCT : 인센티브 비율 => 영업부 사원에게 부여 (수정)
RETIRE_DATE  : 퇴사일 => 퇴사 X => NULL  (수정)
DEPARTMENT_ID : 부서번호  (수정)
JOB_ID : 업무번호  (수정)
CREATE_DATE : 생성일 
UPDATE_DATE : 수정일

 

1. SELECT문 : 데이터 조회 / 목록

SELECT * 혹은 컬럼
FROM [스키마.] 테이블명 혹은 [스키마.] 뷰명
WHERE 조건 
ORDER BY 컬럼
;

 

2. INSERT문  : 데이터 추가

- INSERT 기본 형태

INSERT INTO [스키마.] 테이블명 (컬럼1, 컬럼2, ...) // 칼럼자리
VALUES (값1, 값2, ...) // 컬럼에 대입 될 값
;

- INSERT 컬럼 명 기술 생략 형태

INSERT INTO [스키마.] 테이블명 //컬럼 틀
VALUES (값1, 값2, ...)
;

- INSERT ~ SELECT 형태

   : 컬럼 순서와 데이터 타입을 맞춰줘야 한다.

INSERT INTO [스키마.] 테이블명 (컬럼1, 컬럼2, ...)
SELECT문
;

 

3. UPDATE문 : 데이터 수정

    : 기존 데이터를 수정할 때 사용한다

UPDATE [스키마.] 테이블명
SET { 컬럼1 = 변경값 1,
	  컬럼2 = 변경값 2,
      .
      .
      .
	}
WHERE 조건
;

 

4. DELETE문 : 데이터 삭제

- 일반 구문

DELETE [FROM] [스키마.] 테이블명
WHERE delete 조건 //Row 찾기
;

- 특정 파티션만 삭제할 경우의 구문

DELETE [FROM] [스키마.] 테이블명 PARTITION (파티션명)
WHERE delete 조건
;

 

5. COMMIT과 ROLLBACK, TRUNCATE : Transaction

- COMMIT : 변경한 데이터를 데이터베이스에 마지막으로 반영하는 역할

COMMIT [WORK] [TO SAVEPOINT 세이브포인트 명]
;

- ROLLBACK : 변경한 데이터를 변경하기 이전 상태로 되돌리는 역할

ROLLBACK [WORK] [TO SAVEPOINT 세이브포인트 명]
;

- TRUNCATE : TRUNCATE문을 한번 실행하면 데이터가 바로 삭제 되고, DELETE와 다르게 ROLLBACK을 실행하더라도 삭제 전 상태로 복귀 되지 않는다. 또한 DELETE문 처럼 WHERE절을 붙여 특정 조건에 해당되는 데이터만 삭제 할 수 없다. 쓰레기 데이터 삭제할 사용. 완전 삭제임. 조심해서 사용해야함.

TRUNCATE TABLE [스키마명.] 테이블명
;

 

6. 의사컬럼 : 컬럼 처럼 사용

   : 데이터를 저장하는 최소단위 .

컬럼은 물리적으로 존재하지만 의사 컬럼은 물리적으로 존재x

SELECT문에서는 의사컬럼을 사용O

INSERT, UPDATE, DELETE에선 사용X

  • ROWNUM
  • ROWID

-  ROWNUM: ROW단위 컬럼을 SELECT할 때 마다 ROWNUM value 발생. 1부터 시작하는 일련 번호

주의! ROWNUM은 비교연산자, 크다 등호 사용X

ROWNUM < 6 (O) :

ROWNUM = 6 (X) : ROW가 들어올 때마다 1로  구분하기 때문

ROWNUM > 6 (X) : 새로 추가된 1의 ROW가 6이상 수가 될 수 영원히 없음.

- ROWID: 테이블에 저장된 각 ROW가 저장된 주소 값. 각 로우를 식별하는 값이므로 유일한 값을 가진다. FIXED됨.

#예제 

SELECT ROWNUM, employee_id ROWID
	FROM employees
	WHERE ROWNUM < 5;

 

7. 연산자

  • 수식 연산자 : +, -, *, /
  • 비교 연산자 : >, <, >=, <=, = (비교연산자), <> (동일), != (Not)
  • 논리 연산자 : AND (둘 다 T → T), OR (둘 중 T → T), NOT ( T → F, F → T)
  • 집합 연산자 : Table의 합집합- UNION, UNION ALL / Table의 교집합- INTERSECT /  Table의 차집합- MINUS

8. 표현식

Expression이란 한 개 이상의 값과 연산, SQL 함수 등이 결합된 식

CASE 표현식*

CASE WHEN 조건1 THEN 값1
		 WHEN 조건2 THEN 값2
...
		 ELSE 기타 값
END // Oracle에선 end로 마무리 해야함 안 그러면 error
SELECT employee_id,
       salary,
       CASE
              WHEN salary <= 5000
              THEN 'C등급',
              WHEN salary    > 5000
              AND    salary <= 15000
              THEN 'B등급',
              ELSE 'A등급'
       END AS salary_grade
FROM   employees;
SELECT a.EMPLOYEE_ID,
       a.SALARY
FROM   EMPLOYEES a
WHERE  ROWNUM < 6;

SELECT a.EMPLOYEE_ID ,
       a.SALARY ,
       CASE
              WHEN a.SALARY <= 5000
              THEN 'A'
              WHEN a.SALARY    > 5000
              AND    a.SALARY <= 15000
              THEN 'B'
              ELSE 'C'
                     --                  WHEN a.SALARY > 15000 THEN 'C'
       END
FROM   EMPLOYEES a
WHERE  ROWNUM < 6 ;

 

9. 조건식

ALSE, UNKNOWN 타입으로 반환

WHERE절에서 사용되었던 모든 조건이 조건식에 포함됨

비교 조건식 : 논리 연산자나 ANY,  ALL키워드로 비교하는 조건식

  ANY가 '아무것'이나 '하나'란 뜻

SELECT EMPLOYEE_ID, SALARY
	FROM EMPLOYEES 
	WHERE SALARY = ANY (2000, 3000, 4000) 
/*		  				 	   SALARY = 2000
							OR SALARY = 3000	
							OR SALARY = 3000 내용이 이하동일
*/
	ORDER BY EMPLOYEE_ID;

 

> SQLGATE

-- DB, ML ,DL : 가장 중요한 것은 데이터의 구조와 의미 파악 우선되어야 한다.
-- 컬럼(Column) => 특성(Feature)

-- 급여(연봉) 5000불 이상인 사원번호, 사원명 조회
-- 1. 테이블 찾기 : employees table
-- 2. 해당 컬럼 정리 : salary, employee_id, emp_name
SELECT employee_id, emp_name, salary
  FROM EMPLOYEES
 WHERE SALARY > 5000                            --> Row 선택
 ORDER BY employee_id ASC                  -- 사원번호 ASC 정렬 => 입사순 출력 =>  
;
SELECT * FROM EMPLOYEES;

-- 문제 : 급여가 5000이상이고 업무 'it_prog' 인 사원번호, 사원명 조회
SELECT a.EMPLOYEE_ID, a.EMP_NAME, a.SALARY
  FROM EMPLOYEES a
 WHERE a.SALARY > 5000
   AND a.JOB_ID = 'IT_PROG' -- 문자열 값은 대소문자를 따진다.
 ORDER BY a.EMPLOYEE_ID
;

SELECT a.EMPLOYEE_ID, a.EMP_NAME, a.SALARY
  FROM EMPLOYEES a
 WHERE a.JOB_ID = 'IT_PROG'
 ORDER BY a.EMPLOYEE_ID
;

-- emp, dept
SELECT emp.empno, emp.empnm
  FROM EMP
;
SELECT e.EMPNO, e.EMPNM
  FROM emp e -- 테이블의 별칭
;

SELECT e.EMPNO AS "사원번호" -- 컬럼 별칭 부여
       , e.EMPNM AS "사원명"      -- 컬럼 별칭 부여시 "" 사용
  FROM EMP e -- 테이블 별칭 부여
;

-- 데이터 복사 : insert select문
CREATE TABLE ex3_2(
     empid         NUMBER
   , emp_name   VARCHAR2(100)
);

-- 사원테이블에서 급여 5000이상인 사원번호, 사원명 추출 
-- => ex3_2 테이블 데이터 복사
INSERT INTO ex3_2
SELECT a.EMPLOYEE_ID, a.EMP_NAME
  FROM EMPLOYEES a
 WHERE a.SALARY > 5000
;
SELECT * FROM ex3_2;


-- CTAS
CREATE TABLE ex33
AS 
SELECT a.EMPLOYEE_ID, a.EMP_NAME 
  FROM EMPLOYEES a
 WHERE a.SALARY > 5000
;

SELECT * FROM ex33;

-- create table ex3_4 => DDL
CREATE TABLE ex3_4(
   employee_id   number
);

-- 데이터 추가 => insert => transaction start
INSERT INTO ex3_4 VALUES(100);

SELECT * FROM ex3_4;

-- disk 반영
COMMIT; -- Transaction end

INSERT INTO ex3_4 VALUES(200); -- Transaction start
INSERT INTO ex3_4 VALUES(300);

SELECT * FROM ex3_4;

ROLLBACK; -- Transaction end

SELECT * FROM ex3_4;

INSERT INTO ex3_4 VALUES(400);
COMMIT;
728x90
반응형
Comments