본문 바로가기
TIL

2024.04.29 48일차 DB DML, WHERE절

by Song.dev 2024. 4. 29.

 

DML

  • 데이터베이스 내의 데이터를 조작하는 데 사용되는 SQL 구문
  • SELECT 조회, INSERT 삽입, UPDATE 갱신, DELETE 삭제

 

SELECT 

SELECT 컬럼명1, 컬럼명2
FROM 테이블명;

 

  • SELECT 컬럼 순서대로 조회 결과 출력
  • [ * ] 모든 컬럼 조회, 유지보수를 위해 실무에서는 컬럼 나열 권장

 

DISTINCT vs ALL

  • DISTINCT는 중복된 값을 제거하고 고유한 값만 조회
  • ALL은 DEFAULT이며 생략 가능, 중복 상관없이 모든 값을 조회
SELECT DISTINCT
    issue_insti_nm
FROM tb_certi;

SELECT ALL  <--- ALL은 생략 가능 (DEFAULT)
    issue_insti_nm
FROM tb_certi;

 

 

 

문자열 연결연산자 ||

  • || : 오라클 문법
  • CONCAT 함수 : 다른 sql 문법
SELECT 
    certi_nm || ' (' || issue_insti_nm || ')'
FROM tb_certi;

 

 

별칭 ALIAS

  • AS 생략 가능
  • "" 생략 가능
  • 띄어쓰기가 있는 경우 "" 생략 불가
-- 열 별칭 부여
SELECT 
    emp_nm AS "사원명",
    addr AS "주소"
FROM tb_emp;

-- 띄어쓰기 있을 경우 "" 필요
SELECT 
    emp_nm 사원명,
    addr 거주지 주소 -- 에러 발생
FROM tb_emp;

 

 

 


INSERT 

INSERT INTO 테이블명 (컬럼명1, 컬럼명2, ...)
VALUES(값1, 값2, ...);

INSERT INTO employees (employee_id, first_name, last_name, email, hire_date)
VALUES (1, 'John', 'Doe', 'john.doe@example.com', TO_DATE('2023-05-01', 'YYYY-MM-DD'));

 

다중 행 삽입

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...),
               (value4, value5, value6, ...),
               (value7, value8, value9, ...), ...;

 

INSERT INTO SELECT

  • 다른 테이블에서 선택한 데이터를 기반으로 행을 삽입
  • insert into select 서브쿼리 
INSERT INTO 테이블1 (컬럼1, 컬럼2, 컬럼3, ...)
SELECT 컬럼1, 컬럼2, 컬럼3, ...
FROM 테이블2
WHERE 조건;

 

** INSERT문 주의사항

  • NOT NULL 제약 조건이 있는 열에는 NULL 값을 삽입할 수 없고 반드시 값을 제공해야 힘
  • 기본 키(primary key) 또는 고유 키(unique key) 제약 조건이 있는 열에 중복 값을 삽입하면 오류 발생
  • 외래 키(foreign key) 제약 조건이 있는 열에 존재하지 않는 참조 값을 삽입하면 오류 발생

 

** VARCHAR2(10) 은 10Byte - 한글, 이모티콘 주의

** 자동 형변환

    숫자 → 문자 : 자동 형변환 

    문자 → 숫자 : 숫자만 있다면 자동 형변환

INSERT INTO goods 
    (goods_name, id, reg_date, price)
VALUES 
    ('점퍼', 5, sysdate, '49000');   -- '100' 문자열이어도 숫자형태면 암묵적 형변환

 

* 컬럼명 생략시 테이블구조 순서대로 기입

  • 실무 관점에서는 생략하지 않는 것을 권장
  • 순서대로 모든 컬럼에 대한 데이터를 입력해야 함

 



UPDATE

UPDATE 테이블명
SET 컬럼명 = 변경값
WHERE 조건;

 

** UPDATE문 주의사항

  1. WHERE 절을 사용하여 특정 행을 선택하지 않으면, 테이블의 모든 행이 업데이트됨 (BULK UPDATE)
  2. NOT NULL 제약 조건이 있는 열에 NULL 값을 설정하려고 하면 오류가 발생
  3. 기본 키(primary key) 또는 고유 키(unique key) 제약 조건이 있는 열에 중복 값을 설정하려고 하면 오류가 발생
  4. 외래 키(foreign key) 제약 조건이 있는 열에 존재하지 않는 참조 값을 설정하려고 하면 오류가 발생

** 기존 값을 계산, 문자열 조합 등의 조작한 값으로 갱신할 수 있음

UPDATE employees
SET salary = salary + 1000, last_name = CONCAT(last_name, ' (Updated)')
WHERE employee_id = 1;

 

** 기본키 update 가능

   단, 제약조건 제한을 지켜야 함 ( ex. 다른 기본키와 중복될 수 없고 null로 수정도 불가 )

UPDATE goods
SET id = 11
WHERE id = 4;

-- 변경사항이 중복되면 에러 / NOT NULL을 NULL로 변경하면 에러
UPDATE goods
SET id = 1
WHERE id = 11;

 



DELETE

DELETE FROM 테이블명 WHERE 조건;

 

 

 

** DELETE문 주의사항

  1. WHERE 절을 사용하여 특정 행을 선택하지 않으면, 테이블의 모든 행이 삭제됨
    (복구가 필요없다면 TRUNCATE문을 사용하는 것이 더 효율적)
  2. 삭제된 데이터는 복구할 수 없으므로, DELETE문을 사용하기 전에
    데이터를 백업하거나 데이터를 복구할 수 있는 방법을 고려해야 함
  3. 외래 키(foreign key) 제약 조건으로 인해 참조 무결성이 깨질 경우, 해당 행을 삭제할 수 없음
    참조하는 행을 먼저 삭제하거나 외래 키 제약 조건을 수정해야 함

 

 

DELETE FROM 과 TRUNCATE TABLE의 차이

 

 **DELETE FROM**을 사용하는 경우:

  • 특정 조건을 충족하는 행만 삭제하려는 경우
  • 트리거를 발생시키려는 경우
  • 삭제 과정을 로깅하려는 경우

 **TRUNCATE TABLE**을 사용하는 경우:

  • 테이블의 모든 데이터를 빠르게 삭제하려는 경우
  • 트리거를 발생시키지 않으려는 경우
  • 삭제 과정을 로깅하지 않으려는 경우

실무적인 예를 들자면,

  - 웹 애플리케이션에서 사용자가 작성한 댓글을 삭제할 때 DELETE FROM을 사용하여 특정 댓글만 삭제

  - 일정 기간이 지난 후 사용되지 않는 임시 데이터를 삭제하려면 TRUNCATE TABLE을 사용해 삭제

 


WHERE 조건절

  • 데이터베이스 테이블에서 특정 조건에 맞는 행(row)만 선택하여 조회할 때 사용
  • SELECT, UPDATE, DELETE 등 다양한 SQL문에서 사용 가능
  • 데이터베이스에서 원하는 데이터만 검색하여 추출할 수 있으며, 데이터베이스의 부하를 줄일 수 있음
  • 조건 표현식(expression)은 비교 연산자(<, >, =, <=, >=, <>), 논리 연산자(AND, OR, NOT) 사용하여 구성

 

연산자

WHERE절 비교 연산자, 논리 연산자, IN 연산자, LIKE 연산자, BETWEEN 연산자 등이 있음

    • 비교 연산자
      • =: 컬럼 값과 조건 값이 같음
      • <> 또는 !=:  컬럼 값이 조건 값과 다름
      • <: 컬럼 값이 조건 값 보다 작음
      • >: 컬럼 값이 조건 값 보다 큼
      • <=: 컬럼 값이 조건 값 보다 작거나 같음
      • >=: 컬럼 값이 조건 값 보다 크거나 같음
    • 논리 연산자
      • AND: 두 개의 조건이 모두 참일 때 참
      • OR: 두 개의 조건 중 하나 이상이 참일 때 참
      • NOT: 조건의 결과를 부정
    • IN 연산자:
      - WHERE절에서는 IN 연산자를 사용하여 여러 개의 값을 비교하여 하나라도 해당되는 데이터 선택
      - OR 연산 2개 이상 할 때 유용
      -- IN 연산: OR연산
      SELECT emp_no, emp_nm, dept_cd
      FROM tb_emp
      WHERE dept_cd IN (100002, 100007);
      
      SELECT emp_no, emp_nm, dept_cd
      FROM tb_emp
      WHERE dept_cd = 100002 OR dept_cd = 100007;
      
      SELECT emp_no, emp_nm, dept_cd
      FROM tb_emp
      WHERE dept_cd NOT IN (100002, 100007, 100008);


    • LIKE 연산자 
      문자열 패턴을 검색
      - %: 0개 이상의 문자와 일치합니다.

      - _: 한 개의 문자와 일치합니다.
      SELECT email
      FROM user
      WHERE email LIKE '_A%@%';

  • BETWEEN 연산자
    - 컬럼명 BETWEEN  작은 값 AND 큰 값 : 작은 값 이상, 큰 값 이하 범위에 해당하는 데이터 선택
    - 컬럼명 NOT BETWEEN A AND B

  • IS NULL 연산자
    - 해당 열(column)의 값이 NULL인 행(row)을 선택
    - IS NOT NULL
    - ** NULL 연산은 무조건 결과가 NULL

 

연산자 우선순위

  •  (), NOT > AND > OR 

  - AND 김 AND 수원 OR 일산 ⇒ 김씨이면서 수원에 사는 사람 || 그냥 일산에 사는 사람

  - AND 김 AND( 수원 OR 일산) ⇒ 김씨 AND (수원 또는 일산에 사는 사람 )

-- 연산자 우선 순위
-- NOT > AND > OR
SELECT 
	EMP_NO ,
	EMP_NM ,
	ADDR 
FROM TB_EMP
WHERE 1=1
	AND EMP_NM LIKE '김%'
	AND (ADDR LIKE '%수원%' OR ADDR LIKE '%일산%')

 

 

주석처리 Tip

  • 주석처리 편의를 위해 컬럼, 조건마다 다음 줄로 작성 권장
  • ; 도 다음 줄로 작성하면 주석 처리가 더 편함
-- 성씨가 김씨이면서
-- 부서가 100003, 100004 중에 하나면서
-- 90년대생인 사원의 사번, 이름, 생일, 부서코드 조회

SELECT 
    emp_no 사번,
    emp_nm 이름,
    birth_de 생일,
    dept_cd 부서코드
FROM tb_emp
WHERE 1=1
    AND emp_nm LIKE '김%' 
    AND dept_cd IN (100003, 100004) 
    AND birth_de BETWEEN '19900101' AND '19991231'
;