SQL
SQL 문장들의 종류
데이터 조작어
- 비절차적 데이터 조작어(DML)는 사용자가 무슨 데이터를 원하는 지만 명세함
- 절차적 데이터 조작어는 어떻게 데이터를 접근해야 하는지 명세함
- 호스트 프로그램 속에 삽입되어 사용되는 DML 명령어들을 데이터 부속어(Data Sub Language)라고 한다.
1. DML (Data Manipulation Language) - 데이터 조작어
역할: 테이블 안의 데이터(행)를 삽입/수정/삭제/조회
명령어 | 설명 | 특징 |
SELECT | 데이터 조회 | 가장 많이 쓰이는 DML |
INSERT | 데이터 삽입 | 트랜잭션 대상 |
UPDATE | 데이터 수정 | 트랜잭션 대상 |
DELETE | 데이터 삭제 | TRUNCATE와 달리 ROLLBACK 가능 |
MERGE | 데이터 덮어쓰기 | 데이터가 있으면 UPDATE, 없으면 INSERT |
🔹 DELETE, TRUNCATE, DROP 비교
항목 | DELETE | TRUNCATE | DROP |
분류 | DML | DDL | DDL |
ROLLBACK | 가능 | 불가능 | 불가능 |
테이블 구조 | 유지 | 유지 | 제거됨 |
속도 | 느림 | 빠름 | 빠름 |
로그 기록 | O | 거의 없음 | 없음 |
🔹명령어
기능 | 문법 |
데이터 조회 | SELECT 컬럼명 FROM 테이블명 WHERE 조건; |
데이터 삽입 | INSERT INTO 테이블명 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...); |
전체 삽입 | INSERT INTO 테이블명 VALUES (값1, 값2, ...); |
데이터 수정 | UPDATE 테이블명 SET 컬럼1 = 값1, 컬럼2 = 값2 WHERE 조건; |
데이터 삭제 | DELETE FROM 테이블명 WHERE 조건; |
테이블 전체 삭제 (주의) | DELETE FROM 테이블명; |
데이터 덮어쓰기 | MERGE INTO 대상테이블 USING 원본테이블 |
✅ SELECT – 데이터 조회
🔸기본
SELECT name, age
FROM students
WHERE age >= 20;
🔸전체 조회
SELECT * FROM students;
🔸정렬, 중복 제거
SELECT DISTINCT deptno
FROM emp
ORDER BY deptno;
✅ INSERT – 데이터 삽입
🔸일반 삽입
INSERT INTO students (id, name, age)
VALUES (101, '홍길동', 22);
🔸모든 컬럼 삽입 (컬럼명 생략)
INSERT INTO students
VALUES (102, '이몽룡', 23);
🔸다중 행 삽입 (지원 여부 DBMS에 따라 다름)
INSERT ALL
INTO students (id, name, age) VALUES (103, '성춘향', 21)
INTO students (id, name, age) VALUES (104, '변학도', 25)
SELECT * FROM dual; -- Oracle 기준
✅ UPDATE – 데이터 수정
🔸기본
UPDATE students
SET age = 24
WHERE id = 101;
🔸여러 컬럼 동시 수정
UPDATE students
SET name = '홍길순', age = 25
WHERE id = 102;
🔸 WHERE 조건 빠지면 모든 행이 수정되니 주의!
✅ DELETE – 데이터 삭제
🔸조건 삭제
DELETE FROM students
WHERE id = 103;
🔸전체 삭제
DELETE FROM students;
🔸삭제했더라도 COMMIT 전이면 ROLLBACK 가능
✅ MERGE – 데이터 덮어쓰기
🔸기본 ( Oracle 기준 )
MERGE INTO 대상테이블 A
USING 원본테이블 B
ON (A.기준컬럼 = B.기준컬럼)
WHEN MATCHED THEN
UPDATE SET A.컬럼 = B.컬럼
WHEN NOT MATCHED THEN
INSERT (컬럼1, 컬럼2)
VALUES (B.컬럼1, B.컬럼2);
✅ 예제
MERGE INTO students a
USING new_students b
ON (a.id = b.id)
WHEN MATCHED THEN
UPDATE SET a.name = b.name, a.age = b.age
WHEN NOT MATCHED THEN
INSERT (id, name, age)
VALUES (b.id, b.name, b.age);
📌 의미:
- id가 같으면 → name, age를 수정
- id가 없으면 → 새로 삽입
2. DDL (Data Definition Language) - 데이터 정의어
역할: 데이터베이스의 구조(테이블, 뷰 등)를 생성/변경/삭제
명령어 | 설명 | 주요 특징 |
CREATE | 테이블, 뷰, 시퀀스, 인덱스 등을 생성 | 외래키 정의 시 ON DELETE, ON UPDATE 사용 가능 |
ALTER | 테이블 구조 수정 (컬럼 추가/삭제/변경, 제약조건 추가 등) | Oracle과 SQL Server 문법 차이 존재 |
DROP | 객체(테이블 등) 삭제 | 구조 + 데이터 완전 삭제 |
RENAME | 테이블 이름 변경 | Oracle: RENAME A TO B, SQL Server: sp_rename |
TRUNCATE | 테이블의 모든 행 삭제 (구조는 유지) | DDL로 간주됨, ROLLBACK 불가 |
COMMENT | 객체에 주석 추가 | 문서화용 |
🔹 제약조건 종류 (CREATE나 ALTER에서 사용)
구분 설명
구분 | 설명 |
PRIMARY KEY (기본키) |
테이블에 저장된 행 데이터를 고유하게 식별하기 위한 기본키를 정의한다. 하나의 테이블에 하나의 기본키 제약만 정의할 수 있다. 기본키 제약을 정의하면 DBMS는 자동으로 UNIQUE 인덱스를 생성하며, 기본키를 구성하는 칼럼에는 NULL을 입력할 수 없다. 결국 ‘기본키 제약 = 고유키 제약 & NOT NULL 제약’이 된다 |
UNIQUE KEY (고유키) |
테이블에 저장된 행 데이터를 고유하게 식별하기 위한 고유키를 정의한다. 단, NULL은 고유키 제약의 대상이 아니므로, NULL 값을 가진 행이 여러 개가 있더라도 고유키 제약 위반이 되지 않는다 |
NOT NULL | NULL 값의 입력을 금지한다. 디폴트 상태에서는 모든 칼럼에서 NULL을 허가하고 있지만, 이 제약을 지정함으로써 해당 칼럼은 입력 필수가 된다. NOT NULL을 CHECK의 일부분으로 이해할 수도 있다 |
CHECK | 입력할 수 있는 값의 범위 등을 제한한다. CHECK 제약으로는 TRUE or FALSE로 평가할 수 있는 논리식을 지정한다. |
FOREIGN KEY (외래키) |
관계형 데이터베이스에서 테이블 간의 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사하는 경우 외래키가 생성된다. 외래키 지정시 참조 무결성 제약 옵션을 선택할 수 있다 |
※ 테이블명과 칼럼명은 반드시 문자로 시작해야 하며 A-Z, a-z, 0-9, _, $, # 문자만 허용된다.
🔹명령어
키워드 | 기능 | 문법 |
CREATE | 테이블 생성 | CREATE TABLE 테이블명 (컬럼명 데이터타입 [제약조건], ...); |
FOREIGN KEY(생략가능) ... REFERENCES |
외래키 포함 생성 | FOREIGN KEY (자식컬럼) REFERENCES 부모테이블(부모컬럼) ON DELETE CASCADE ON UPDATE SET NULL |
ALTER TABLE … ADD | 컬럼 추가 | ALTER TABLE 테이블명 ADD 컬럼명 데이터타입 [제약조건]; |
DROP COLUMN | 컬럼 삭제 | ALTER TABLE 테이블명 DROP COLUMN 컬럼명; |
MODIFY | 컬럼 수정 (Oracle) | ALTER TABLE 테이블명 MODIFY (컬럼명1 데이터타입 [DEFAULT 값] [NOT NULL], ...); |
ALTER COLUMN | 컬럼 수정 (SQL Server) |
ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 데이터타입 [NULL] |
CONSTRAINT | 제약조건 추가 | ALTER TABLE 테이블명 ADD CONSTRAINT 제약명 제약종류 (컬럼명); |
DROP CONSTRAINT | 제약조건 삭제 | ALTER TABLE 테이블명 DROP CONSTRAINT 제약명; |
RENAME | 테이블 이름 변경 (Oracle) |
RENAME 기존명 TO 새이름; |
EXEC | 테이블 이름 변경 (SQL Server) |
EXEC sp_rename '기존명', '새이름'; |
DROP TABLE | 테이블 완전 삭제 | DROP TABLE 테이블명; |
TRUNCATE TABLE | 테이블 데이터 초기화 | TRUNCATE TABLE 테이블명; |
COMMENT ON TABLE COMMENT ON COLUMN |
컬럼 테이블 주석 추가 |
COMMENT ON TABLE 테이블명 IS '설명'; COMMENT ON COLUMN 테이블명.컬럼명 IS '설명'; |
✅ CREATE – 테이블 생성
🔸기본 예시
CREATE TABLE students (
id NUMBER PRIMARY KEY,
name VARCHAR2(50) NOT NULL,
age NUMBER,
dept_id NUMBER
);
🔸외래키 포함 예시
CREATE TABLE departments (
dept_id NUMBER PRIMARY KEY,
dept_name VARCHAR2(50)
);
CREATE TABLE students (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
dept_id NUMBER,
CONSTRAINT fk_dept
FOREIGN KEY (dept_id)
REFERENCES departments(dept_id)
ON DELETE CASCADE
);
옵션 | 설명 | 예시 |
CASCADE | 부모 행 삭제 시, 자식 행도 같이 삭제됨 | 사라진 부서를 참조하던 학생들도 삭제됨 |
SET NULL | 부모 행 삭제 시, 자식의 외래키 값을 NULL로 설정 | 부서가 삭제돼도 학생 정보는 남음, 부서번호는 NULL |
SET DEFAULT | 자식 외래키를 기본값으로 변경 (잘 안 씀) | 기본값 설정이 필수 |
NO ACTION | 아무 조치 안 함 (기본값, Oracle에서 사실상 RESTRICT와 유사) | 부모를 삭제하면 오류 |
RESTRICT | 부모가 삭제되면 에러 발생 – 자식이 존재하므로 삭제 거부 | 안전한 삭제용 |
✅ ALTER – 테이블 구조 수정
🔸컬럼 추가
ALTER TABLE students
ADD email VARCHAR2(100);
🔸컬럼 삭제
ALTER TABLE students
DROP COLUMN email;
🔸컬럼 수정 (Oracle 기준)
ALTER TABLE students
MODIFY (name VARCHAR2(100) DEFAULT '미정' NOT NULL);
※ Oracle 기본값 설정 주의사항
✅ Oracle에서 NOT NULL로 바꾸려 할 때 발생하는 문제
🔸현재 테이블 상태:
CREATE TABLE students (
id NUMBER,
name VARCHAR2(100)
);
→ name 컬럼은 현재 NULL 허용
🔸다음 명령 실행:
ALTER TABLE students
MODIFY name VARCHAR2(100) NOT NULL;
→ ❌ 만약 name에 NULL이 한 건이라도 있다면 오류 발생:
ORA-01442: column to be modified to NOT NULL is already NULL
✅ 해결 방법 2가지
✅ 방법 1: NULL 값을 미리 대체
UPDATE students
SET name = '미정'
WHERE name IS NULL;
ALTER TABLE students
MODIFY name VARCHAR2(100) NOT NULL;
✅ 방법 2: 컬럼 자체에 DEFAULT 값 지정
Oracle 12c 이상부터는 ALTER하면서 DEFAULT도 동시에 지정 가능:
ALTER TABLE students
MODIFY name VARCHAR2(100) DEFAULT '미정' NOT NULL;
⚠️ 단, 이 방법은 기존 NULL 값을 자동으로 바꿔주지는 않음.
INSERT 시 값을 생략한 경우만 '미정'이 들어감
→ 그래서 UPDATE로 NULL 먼저 처리해주는 게 가장 안전해.
✅ 요약 정리
상황 | Oracle에서 NOT NULL 변경 |
기존에 NULL 있음 | ❌ 오류 발생 |
해결 방법 1 | NULL 값을 먼저 UPDATE |
해결 방법 2 | DEFAULT 지정 + NULL 처리 병행 |
DEFAULT만 지정 | ✅ INSERT 시만 자동 적용됨 (기존 행엔 영향 없음) |
🔸컬럼 수정 (SQL Server 기준)
ALTER TABLE students
ALTER COLUMN name VARCHAR(100) NOT NULL;
※컬럼 수정 차이점
항목 | Oracle | SQL Server |
키워드 | MODIFY | ALTER COLUMN |
DEFAULT 설정 | 같이 가능 | ADD CONSTRAINT로 따로 해야 함 |
제약조건 이름 지정 | 선택 가능 | 이름 지정해야 명확함 (특히 DEFAULT) |
※ SQL Server 기본값 설정 주의사항
칼럼 수정 null → null 변경 시 주의할점
💡NULL → NOT NULL 변경 시 주의할 점
❗ 컬럼 안에 NULL 값이 단 하나라도 있으면, NOT NULL로 바꿀 때 오류가 발생해
✅ 방법 1: NULL 값을 미리 기본값으로 변경
UPDATE students
SET name = '미정'
WHERE name IS NULL;
ALTER TABLE students
ALTER COLUMN name VARCHAR(100) NOT NULL;
✅ 방법 2: DEFAULT와 함께 동시에 처리 (신규 행만 적용됨)
-- 먼저 NOT NULL로 바꾸고
ALTER TABLE students
ALTER COLUMN name VARCHAR(100) NOT NULL;
-- 기본값 추가
ALTER TABLE students
ADD CONSTRAINT df_name DEFAULT '미정' FOR name;
단, 이 방법은 기존 NULL 값은 해결 안 돼서 여전히 UPDATE 필요할 수 있음
SQL Server 기본값 설정 주의점
✅ 기본값(DEFAULT)을 지정하지 않으면?
상황 | 결과 |
NOT NULL + 값 없음 | ❌ 오류 발생 – 값 필수 |
NULL 허용 + 값 없음 | ✅ NULL로 입력됨 |
DEFAULT 없음 | ✅ 별도로 자동으로 채워지는 값 없음 (무조건 명시하거나 NULL) |
🔍 예제로 이해해보자
🔸 컬럼 정의 (DEFAULT 없음)
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
🔴 문제 상황
INSERT INTO students (id) VALUES (1);
→ ❌ 오류 발생:
Column 'name' does not allow nulls. INSERT fails.
→ NOT NULL인데 값을 주지 않았고, DEFAULT도 없어서 막힘
✅ DEFAULT가 있으면?
ALTER TABLE students
ADD CONSTRAINT df_name DEFAULT '미정' FOR name;
-- 또는 처음부터
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL DEFAULT '미정'
);
INSERT INTO students (id) VALUES (2);
→ ✅ name에 자동으로 '미정'이 들어감
✅ 요약 정리
조건 | 결과 |
NOT NULL + DEFAULT 없음 | 반드시 값을 직접 줘야 함. 안 주면 ❌ 오류 |
NOT NULL + DEFAULT 있음 | 값을 안 줘도 자동 채워짐 ✅ |
NULL 허용 + DEFAULT 없음 | 값을 안 주면 NULL로 들어감 ✅ |
🔍 예제로 이해해보자
🔸 컬럼 정의 (DEFAULT 없음)
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
🔴 문제 상황
INSERT INTO students (id) VALUES (1);
→ ❌ 오류 발생:
Column 'name' does not allow nulls. INSERT fails.
→ NOT NULL인데 값을 주지 않았고, DEFAULT도 없어서 막힘
✅ DEFAULT가 있으면?
ALTER TABLE students
ADD CONSTRAINT df_name DEFAULT '미정' FOR name;
-- 또는 처음부터
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL DEFAULT '미정'
);
INSERT INTO students (id) VALUES (2);
→ ✅ name에 자동으로 '미정'이 들어감
✅ 요약 정리
조건 결과
NOT NULL + DEFAULT 없음 | 반드시 값을 직접 줘야 함. 안 주면 ❌ 오류 |
NOT NULL + DEFAULT 있음 | 값을 안 줘도 자동 채워짐 ✅ |
NULL 허용 + DEFAULT 없음 | 값을 안 주면 NULL로 들어감 ✅ |
🔸제약조건 추가
ALTER TABLE students
ADD CONSTRAINT uq_student_name UNIQUE (name);
🔸제약조건 삭제
ALTER TABLE students
DROP CONSTRAINT uq_student_name;
✅ DROP – 객체 삭제
🔸테이블 삭제
DROP TABLE students;
🔥 주의: 테이블 구조와 데이터 모두 완전히 삭제됨. ROLLBACK 불가능
✅ RENAME – 이름 변경
🔸Oracle
RENAME students TO students_old;
🔸SQL Server
EXEC sp_rename 'students', 'students_old';
✅ TRUNCATE – 테이블 데이터 초기화
TRUNCATE TABLE students;
🔥 모든 행 삭제되지만 테이블 구조는 유지. ROLLBACK 불가
✅ COMMENT – 주석 추가
🔸테이블 설명
COMMENT ON TABLE students IS '학생 정보를 저장하는 테이블';
🔸컬럼 설명
COMMENT ON COLUMN students.name IS '학생 이름';
✅ CHECK 제약 조건 예시
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
name VARCHAR2(50),
salary NUMBER CHECK (salary >= 0)
);
3. DCL (Data Control Language) - 데이터 제어어
역할: 사용자 권한 부여/회수
명령어 | 설명 | 특징 |
GRANT | 권한 부여 | SELECT, INSERT, EXECUTE 등 |
REVOKE | 권한 회수 | GRANT의 반대 |
※ DCL은 DBA(관리자) 권한이 있어야 사용 가능
※ DDL 실행 시에도 적절한 권한이 있어야 가능
✅ GRANT (권한 부여)
- 역할: 사용자나 역할(role)에게 특정 작업을 수행할 수 있는 권한을 부여합니다.
- 구문 예시:→ user1에게 employees 테이블에 대해 SELECT와 INSERT 권한을 부여
- GRANT SELECT, INSERT ON employees TO user1;
- WITH GRANT OPTION:
- 부여받은 권한을 다른 사용자에게 재부여할 수 있는 옵션
- 예시:
- GRANT SELECT ON employees TO user1 WITH GRANT OPTION;
특징 요약 | 특징 설명 |
권한 부여 대상 | 사용자, 역할(Role) |
대상 객체 | 테이블, 뷰, 시퀀스 등 |
재부여 가능 여부 | WITH GRANT OPTION 사용 시 가능 |
🚫 REVOKE (권한 회수)
- 역할: 기존에 부여했던 권한을 회수합니다.
- 구문 예시:
- REVOKE SELECT, INSERT ON employees FROM user1;
- WITH GRANT OPTION 회수 효과:
- 만약 어떤 사용자가 WITH GRANT OPTION으로 권한을 부여받아 다른 사용자에게 권한을 줬다면,
- 이 사용자의 권한을 REVOKE하면 그가 부여한 권한도 같이 무효됨 (cascade effect)
특징 요약 | 특징 설명 |
권한 회수 대상 | 사용자, 역할(Role) |
회수 범위 | 직접 부여한 권한만 회수 가능 |
cascading | 부여한 권한을 다른 사용자에게 전달한 경우, 회수 시 그 전달된 권한도 함께 취소됨 |
4. TCL (Transaction Control Language) - 트랜잭션 제어어
역할: 데이터 변경 작업(DML)에 대해 저장하거나 되돌리는 역할
명령어 | 설명 |
COMMIT | 트랜잭션 확정 (변경 내용을 저장) |
ROLLBACK | 트랜잭션 취소 (변경 내용 무효화) |
SAVEPOINT | 중간 저장점 설정, 특정 지점까지만 ROLLBACK |
SET TRANSACTION | 트랜잭션 속성 설정 |
🔹 트랜잭션의 4대 특성 (ACID)
특성 | 설명 |
원자성 (Atomicity) | 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않은 상태로 남아 있어야 한다.(All or Nothing) |
일관성 (Consistency) | 트랜잭션이 실행되기 전의 DB 내용이 잘못 되어 있지 않다면 트랜잭션이 실행된 이후에도 DB의 내용에 잘못이 있으면 안 된다. |
고립성 (Isolation) | 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안 된다. |
지속성 (Durability) | 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 DB의 내용은 영구적으로 저장된다. |
🔹 격리성 낮을 때 생기는 문제
Dirty Read | 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 것 |
Non-Repeatable Read | 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상 |
Phantom Read | 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom) 레코드가 두 번째 쿼리에서 나타나는 현상 |
✅ COMMIT – 변경 내용을 확정 저장
🔸예시
UPDATE students
SET age = 25
WHERE id = 101;
COMMIT;
🔍 설명:
- UPDATE로 데이터 바꿨지만 아직 임시 상태
- COMMIT 하면 → DB에 영구 반영
- 그 이후엔 ROLLBACK 불가
✅ ROLLBACK – 변경 내용 취소
🔸예시
UPDATE students
SET age = 30
WHERE id = 101;
ROLLBACK;
🔍 설명:
- ROLLBACK은 DML 변경 내용을 취소
- 실행하면 원래 값으로 돌아감 (COMMIT 전까지만 가능)
✅ SAVEPOINT – 중간 저장점 설정
🔸예시
DELETE FROM students WHERE id = 101;
SAVEPOINT sp1;
UPDATE students SET age = 22 WHERE id = 102;
SAVEPOINT sp2;
ROLLBACK TO sp1;
🔍 설명:
단계 | 설명 |
sp1 저장 후 | id 101 학생 삭제됨 |
sp2 저장 후 | id 102 나이 22로 수정 |
ROLLBACK TO sp1 | → id 102 수정은 취소, id 101 삭제는 유지됨 |
✅ 전체 취소가 아니라 부분 취소가 가능한 기능!
✅ SET TRANSACTION – 트랜잭션 속성 설정
이건 보통 자동 커밋 끄거나, 격리 수준 설정 시 사용
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
→ 이 문장은 다른 트랜잭션이 커밋한 데이터만 읽겠다는 뜻
✅ 격리성 낮을 때 문제 예시
🔸Dirty Read (더티 리드)
-- T1
UPDATE account SET balance = balance - 100 WHERE id = 1;
-- T2 (커밋 전인데 읽어버림)
SELECT balance FROM account WHERE id = 1;
→ T2는 T1이 아직 COMMIT 안 했는데 결과를 읽어버림 → 위험
🔸Non-Repeatable Read
-- T1
SELECT balance FROM account WHERE id = 1;
-- T2
UPDATE account SET balance = balance + 100 WHERE id = 1;
COMMIT;
-- T1
SELECT balance FROM account WHERE id = 1;
→ 같은 쿼리를 두 번 했는데 결과가 다름
🔸Phantom Read
-- T1
SELECT * FROM orders WHERE amount > 1000;
-- T2
INSERT INTO orders (order_id, amount) VALUES (999, 1500);
COMMIT;
-- T1
SELECT * FROM orders WHERE amount > 1000;
→ 첫 번째 쿼리에는 없던 유령 행이 두 번째 쿼리엔 생김
테이블 생성 시 주의사항
- 테이블명은 객체를 의미할 수 있는 적절한 이름을 사용한다. 가능한 단수형을 권고한다.
- 테이블 명은 다른 테이블의 이름과 중복되지 않아야 한다
- 한 테이블 내에서는 칼럼명이 중복되게 지정될 수 없다
- 테이블 이름을 지정하고 각 칼럼들은 괄호 “()”로 묶어 지정한다
- 각 칼럼들은 콤마 ”,”로 구분되고, 테이블 생성문의 끝은 항상 세미콜론 “;”으로 끝난다
- 칼럼에 대해서는 다른 테이블까지 고려하여 데이터베이스 내에서는 일관성 있게 사용하는 것이 좋다
- 칼럼 뒤에 데이터 유형은 꼭 지정되어야 한다
- 테이블명과 칼럼명은 반드시 문자로 시작해야하고, 벤더별로 길이에 대한 한게가 있다
- 벤더에서 사전에 정의한 예약어는 쓸 수 없다
- A-Z, a-z, 0-9, _, $, # 문자만 허용된다
벤더란?
벤더 = DBMS를 만든 회사 또는 제품
벤더 제품 | 이름 | 설명 |
Oracle | Oracle Database | 기업용 DB 시장에서 널리 쓰임 |
Microsoft | SQL Server | 윈도우 기반의 강력한 DBMS |
Oracle (인수) | MySQL | 오픈소스, 웹에서 많이 쓰임 |
PostgreSQL Global Dev Group | PostgreSQL | 표준 SQL에 충실한 오픈소스 DB |
IBM | DB2 | 대형 기업 시스템에서 사용 |
✅ "벤더별로 다르다"는 말의 의미
각 벤더는 표준 SQL을 기반으로 하지만,
→ 내부적으로 자기만의 문법, 제한, 함수, 동작 방식을 갖고 있어.
예시:
항목 | Oracle | SQL Server |
문자열 타입 | VARCHAR2 | VARCHAR |
현재 날짜 | SYSDATE | GETDATE() |
문자열 결합 | `'A' | |
RENAME 문법 | RENAME A TO B | sp_rename 'A', 'B' |
최대 테이블명 길이 | 30자 | 128자 |
✅ 여기서 말하는 "예약어"도 벤더마다 다름
예를 들어, 아래 단어들은 어떤 벤더에선 예약어라서 테이블명이나 칼럼명으로 못 씀:
CREATE TABLE select (id INT); -- ❌ 대부분의 DB에서 오류
- SELECT, FROM, DATE, GROUP, ORDER 같은 건 벤더에 따라 예약어일 수 있음
행 제한 절(Limiting Clause)
TOP (Expression) [PERCENT] [WITH TIES]
- WITH TIES : ORDER BY 조건 기준으로 TOP N의 마지막 행으로 표시되는 추가 행의 데이터가 같을 경우 N+동일 정렬 순서 데이터를 추가 반환하도록 지정하는 옵션 (마지막 기준 공통일 경우 모두 출력)
항목 | 설명 |
TOP | SQL Server에서 상위 N개 행을 추출하는 SELECT 절 옵션 |
WITH TIES | 상위 N개와 같은 정렬 값을 가진 나머지 행들도 같이 출력 |
순위 함수(X) | 내부적으로 RANK()를 쓰지 않음, 오직 행 추출용 |
예시 비교
🔸 TOP 사용 예 (순위 함수 아님)
SELECT TOP 3 WITH TIES name, salary
FROM employee
ORDER BY salary DESC;
- 급여 상위 3명 + 3위와 동일한 급여 가진 사람들 모두 출력
- 내부적으로 정렬 기준만 봄
DCL - ROLE
데이터베이스 관리자는 유저가 생성될 때마다 각각의 권한들을 유저에게 부여하는 작업을 수행해야 하며 간혹 권한을 빠뜨릴 수도 있으므로 각 유저별로 어떤 권한이 부여되었는지를 관리해야 한다. 하지만 관리해야 할 유저가 점점 늘어나고 자주 변경되는 상황에서는 매우 번거로운 작업이 될 것이다. 이와 같은 문제를 줄이기 위하여 많은 데이터베이스에서 유저들과 권한들 사이에서 중개 역할을 하는 ROLE 을 제공한다.
절차형 SQL
PL/SQL(Oracle), SQL/PL(DB2), T-SQL(SQL Server) 등의 절차향 SQL을 이용하면 저장 모듈을 생성할 수 있다.
저장 모듈(Stored Module)이란 SQL 문장을 데이터베이스 서버에 저장하여 사용자와 애플리케이션 사이에서 공유할 수 있도록 만든 일종의 SQL 컴포넌트 프로그램이며, 독립적으로 실행되거나 다른 프로그램으로부터 실행될 수 있는 완전한 실행 프로그램이다. Oracle의 저장 모듈에는 Procedure, User Defined Function, Trigger가 있다.
PL/SQL 특징
- PL/SQL 은 Block 구조로 되어있어 각 기능별로 모듈화가 가능하다.
- 변수, 상수 등을 선언하여 SQL 문장 간 값을 교환한다.
- IF, LOOP 등의 절차형 언어를 사용하여 절차적인 프로그램이 가능하도록 한다.
- DBMS 정의 에러나 사용자 정의 에러를 정의하여 사용할 수 있다.
- PL/SQL은 Oracle에 내장되어 있으므로 Oracle과 PL/SQL을 지원하는 어떤 서버로도 프로그램을 옮길 수 있다.
- PL/SQL은 응용 프로그램의 성능을 향상시킨다.
- PL/SQL은 여러 SQL 문장을 Block으로 묶고 한 번에 Block 전부를 서버로 보내기 때문에 통신량을 줄일 수 있다.
PL/SQL 에서는 동적 SQL 또는 DDL 문장을 실행할 때 EXECUTE IMMEDIATE를 사용해야 함
저장 모듈 종류
유형 | 설명 |
Procedure | 결과 없이 일련의 SQL을 수행 |
Function | 반드시 RETURN 값이 있음 |
Trigger | DML (INSERT/UPDATE/DELETE) 발생 시 자동 실행 |
- 책 설명일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다.Procedure처럼 절차형 SQL을 로직과 함께 데이터베이스 내에 저장해 놓은 명령문의 집합을 의미한다. Procedure와TriggerTrigger는 테이블과 뷰, 데이터베이스 작업을 대상으로 정의할 수 있으며, 전체 트랜잭션 작업에 대해 발생되는 Trigger와 각 행에 대해서 발생되는 Trigger가 있다.
- 특정한 테이블에 INSERT, UPDATE, DELETE와 같은 DML 문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램이다. 즉 사용자가 직접 호출하여 사용하는 것이 아니고 데이터베이스에서 자동적으로 수행하게 된다.
- 다른 점은 RETURN을 사용해서 하나의 값을 반드시 되돌려 줘야 한다는 것이다.
- User Defined Function
- Procedure
✅ 트랜잭션 (Transaction)
- 정의: 데이터베이스에서 논리적 작업의 최소 단위로, 여러 SQL문을 하나의 작업 단위로 묶은 것.
- 특징 (ACID):
- Atomicity (원자성): 전부 실행되거나 전부 롤백됨
- Consistency (일관성): 트랜잭션 전후로 데이터베이스의 일관성이 유지됨
- Isolation (격리성): 동시에 수행되는 트랜잭션들이 서로 간섭하지 않음
- Durability (지속성): 완료된 트랜잭션의 결과는 영구 반영됨
✅ 프로시저 (Stored Procedure)
- 정의: 반복 사용이 가능한 SQL 문장의 집합을 저장해둔 것 (일종의 함수).
- 용도:
- 복잡한 로직을 DB 안에서 처리할 수 있게 함
- 매개변수를 받아 동작 가능
- 성능 최적화, 코드 재사용, 보안성 증가
CREATE PROCEDURE sample_proc (IN p_id INT)
BEGIN
SELECT * FROM EMP WHERE ID = p_id;
END;
✅ 트리거 (Trigger)
- 정의: 특정 이벤트(DML: INSERT/UPDATE/DELETE)가 발생했을 때 자동 실행되는 SQL 코드 블록.
- 용도:
- 변경 이력 자동 기록
- 데이터 무결성 유지
- 연계 작업 자동화
CREATE TRIGGER trg_before_insert
BEFORE INSERT ON EMP
FOR EACH ROW
BEGIN
SET NEW.created_at = NOW();
END;
프로시저와 트리거의 차이점
항목 | Procedure | Trigger |
호출 방법 | 사용자가 직접 실행 | DML 수행 시 자동 실행 |
사용 목적 | 로직 묶음, 반복 작업 | 데이터 무결성, 감사 기능 등 |
COMMIT/ROLLBACK | 가능 | 불가능 |
프로시저 | 트리거 |
CREATE Procedure 문법사용 | CREATE Trigger 문법사용 |
EXECUTE 명령어로 실행 | 생성 후 자동으로 실행 |
COMMIT, ROLLBACK 실행 가능 | COMMIT, ROLLBACK 실행 불가능 |
'자격증 > SQL' 카테고리의 다른 글
SQL) 실행 계획과 성능 최적화 (1) | 2025.05.27 |
---|---|
SQL) SQL 활용 (2) | 2025.05.24 |
SQL) SQL 기본 (1) | 2025.05.23 |
오답노트 ( 관리구문 ) (2) | 2025.05.22 |
오답노트 ( SQL 활용_2 ) (1) | 2025.05.21 |