Humility

아무리 노력해도 최고가 되지 못할 수 있다⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀그럼에도 노력하는자가 가장 겸손한 것 아닌가

공부하는 블로그

자격증/SQL

SQL) 관리구문

새벽_글쓴이 2025. 5. 25. 00:00
반응형

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