INSERT
INSERT의 개념
- INSERT는 테이블에 새 행을 추가하는 DML 명령어
- 테이블이 먼저 생성되어 있어야 함
- 기본은 한 행 삽입이며, 문법에 따라 여러 행도 가능
- 실행 결과는 COMMIT 또는 ROLLBACK으로 확정·취소
단일 행 INSERT
- 한 번의 INSERT 문으로 한 행을 삽입하는 방식
- 컬럼 목록 명시 방식과 생략 방식이 있음
컬럼 목록 명시 방식
- 지정하지 않은 컬럼에는 DEFAULT 값 또는 NULL이 입력
- NOT NULL이며 DEFAULT가 없는 컬럼이면 오류가 발생
- VALUES의 값 순서는 명시한 컬럼 순서와 일치해야 함
- 실무에서 권장되는 방식
INSERT INTO 테이블명 (컬럼1, 컬럼2, 컬럼3) VALUES(값1, 값2, 값3);
컬럼 목록 생략 방식
- 모든 컬럼에 값을 입력해야 하며 순서가 테이블 정의 순서와 일치해야 함
- 순서나 개수가 맞지 않으면 오류가 발생
- 값을 생략할 컬럼은 NULL 또는 DEFAULT를 명시
INSERT INTO 테이블명 VALUES(값1, 값2, 값3);
다중 행 INSERT
- 한 번의 INSERT 문으로 여러 행을 삽입하는 방식
- DBMS별 지원 방식이 다름
UNION ALL + DUAL 방식(Oracle)
- DUAL은 Oracle의 더미 테이블로, 고정값 SELECT에 사용
- 각 SELECT가 한 행을 만들고 UNION ALL로 합쳐 삽입
INSERT INTO DEPARTMENT (DEPT_ID, DEPT_NAME, LOCATION)
SELECT 60, '품질관리팀', '서울' FROM DUAL
UNION ALL
SELECT 70, '법무팀', '서울' FROM DUAL
UNION ALL
SELECT 80, '연구소', '대전' FROM DUAL;
INSERT ALL 방식(Oracle)
- Oracle에서 다중 행 삽입에 자주 쓰는 문법
- 마지막에 SELECT * FROM DUAL을 붙여야 실행
- 서로 다른 테이블에 동시 삽입 가능
INSERT ALL
INTO DEPARTMENT (DEPT_ID, DEPT_NAME, LOCATION)
VALUES (60, '품질관리팀', '서울')
INTO DEPARTMENT (DEPT_ID, DEPT_NAME, LOCATION)
VALUES (70, '법무팀', '서울')
INTO DEPARTMENT (DEPT_ID, DEPT_NAME, LOCATION)
VALUES (80, '연구소', '대전')
SELECT*FROM DUAL;
VALUES 다중 나열 방식(MySQL/ANSI)
- MySQL, MariaDB, PostgreSQL 등에서 지원하는 방식
INSERT INTO DEPARTMENT (DEPT_ID, DEPT_NAME, LOCATION) VALUES
(60, '품질관리팀', '서울'),
(70, '법무팀', '서울'),
(80, '연구소', '대전');
INSERT INTO ~ SELECT
- SELECT 결과를 그대로 삽입하는 방식
- VALUES 절 없이 SELECT가 그 역할을 대체
- SELECT가 반환하는 행 수만큼 삽입
INSERT INTO 대상테이블 (컬럼1, 컬럼2,...)
SELECT 컬럼A, 컬럼B,...
FROM 원본 테이블
WHERE 조건;
SELECT 기본 구조
SELECT의 개념
- SELECT는 데이터를 조회하는 명령어
- 데이터를 변경하지 않으므로 트랜잭션 제어 대상이 아님
- 조회 대상·컬럼·조건·정렬 기준을 함께 지정
- SQL에서 가장 자주 쓰이는 명령어
SELECT 기본 문법
- SELECT 절에는 조회할 컬럼을 명시
- FROM 절에는 가져올 테이블을 명시
- SELECT와 FROM은 필수 절
- 작성 순서와 실행 순서는 다름
| 절 | 역할 | 실행순서 |
|---|
| FROM | 조회의 대상이 되는 테이블과 JOIN 지정 | 1 |
| WHERE | 조건을 만족하는 행(Row)을 필터링 | 2 |
| GROUP BY | 특정 컬럼을 기준으로 결과 집합을 그룹화 | 3 |
| HAVING | 그룹화된 결과에 대한 조건 필터링 | 4 |
| SELECT | 조회할 컬럼 및 표현식 선택 | 5 |
| ORDER BY | 최종 결과 데이터 정렬 | 6 |
전체 열 조회와 특정 열 조회
전체 열 조회(*)
*는 모든 컬럼을 출력하는 와일드카드
- 출력 순서는 테이블 정의 순서를 따름
- 실무에서는 필요한 컬럼만 명시하는 것이 좋음
SELECT * FROM EMPLOYEE;
| EMP_ID | EMP_NAME | SALARY | HIRE_DATE |
|---|
| 1010 | 박팀장 | 700 | 2012-03-15 |
| 1011 | 이대리 | 500 | 2020-04-01 |
| 1012 | 최사원 | 300 | 2024-01-02 |
특정 열 조회
- 출력할 컬럼을 쉼표(
,)로 구분
- SELECT 절에 작성한 순서대로 출력
- 같은 컬럼을 중복 작성하면 중복 출력됨
SELECT EMP_ID, EMP_NAME, SALARY FROM EMPLOYEE;
| EMP_ID | EMP_NAME | SALARY |
|---|
| 1010 | 박팀장 | 700 |
| 1011 | 이대리 | 500 |
| 1012 | 최사원 | 300 |
산술 연산자와 열 별칭(AS)
산술 연산자
- SELECT 절에서 컬럼 값으로 산술 연산을 수행할 수 있음
- 연산 결과는 새 컬럼처럼 출력
- NULL이 포함된 산술 연산 결과는
항상 NULL
- 연산자 종류는 다음과 같음
| 연산자 | 의미 | 예시 |
|---|
| + | 더하기 | SALARY + 100 |
| - | 빼기 | SALARY - 100 |
| * | 곱하기 | SALARY * 12 |
| / | 나누기 | SALARY/12 |
SELECT EMP_NAME, SALARY, ROUND(SALARY/12) AS 월급 FROM EMPLOYLEE;
열 별칭(AS)
- 컬럼 또는 연산 결과에 임시 이름을 부여하는 기능
- AS는 생략할 수 있음
- 별칭은 ORDER BY에서는 가능, WHERE에서는 불가능
- WHERE는 SELECT보다 먼저 실행되어 별칭이 아직 없기 때문
WHERE 절
WHERE 절 개념
- WHERE 절은 SELECT·UPDATE·DELETE에서 조건으로 행을 필터링함
- 조건을 만족하는 행만 결과에 포함
- FROM 절 다음에 위치하며 FROM 직후에 처리
- 조건식이 TRUE인 행만 결과에 포함
SELECT 컬럼1, 컬럼2,...
FROM 테이블명
WHERE 조건식;
비교 연산자
- 두 값을 비교해 TRUE 또는 FALSE를 반환
- 문자열은 작은따옴표(
') 처리
- 숫자는 따옴표 없이 씀
- NULL은 비교 연산자(
=, <>)로 비교할 수 없으며 IS NULL을 사용
| 연산자 | 의미 | 예시 |
|---|
| = | 같다 (Equal to) | SALARY = 500 |
<> 또는 != | 같지 않다 (Not equal to) | SALARY <> 500 |
| < | 작다 (Less than) | SALARY < 500 |
| > | 크다 (Greater than) | SALARY > 500 |
| <= | 작거나 같다 (Less than or equal to) | SALARY <= 500 |
| >= | 크거나 같다 (Greater than or equal to) | SALARY >= 500 |
UPDATE
UPDATE의 개념
- UPDATE는 저장된 행의 컬럼 값을 수정하는 DML 명령어
- WHERE 절로 수정할 행을 지정, 생략 시 모든 행의 컬럼 값이 수정
- 수정 결과는 COMMIT 또는 ROLLBACK으로 확정·취소
UPDATE 기본 문법
- SET 절에 수정할 컬럼과 새 값을 명시
- 여러 컬럼은 쉼표(
,)로 구분
- WHERE 절을 생략하면 모든 행의 컬럼 값이 수정되므로 주의가 필요
UPDATE 테이블명
SET 컬럼1 = 값1,
컬럼2 = 값2,...
WHERE 조건식;