SQLD 정리
데이터 모델링의 이해
- 모델링의 특징
- 추상화, 단순화, 명확화
- 모델링의 세 가지 관점
- 데이터 관점
- 프로세스 관점
- 데이터와 프로세스의 상관 관점
- 모델링의 3단계
- 개념적 데이터 모델링 : 추상화 레벨이 가장 높음, 업무 중심적
- 논리적 데이터 모델링 : 재사용성이 가장 높음, 데이터베이스 모델링의 최종 완료 상태, 정규화, 참조 무결성 규칙정의 등..
- 물리적 데이터 모델링 : 실제 데이터 베이스, 성능 가용성
- 3단계 스키마 구조
- 외부 스키마 : View, 사용자 관점
- 개념 스키마 : 모든 사용자 관점
- 내부 스키마 : 물리적인 저장 구조
- ERD 작성 순서
- 엔터티 도출
- 엔터티 배치
- 관계 설정
- 관계명 기입
- 참여도 기입
- 필수/선택 기입
- 엔터티의 분류(발생 시점)
- 기본 엔터티 : 독립적으로 생성
- 중심 엔터티 : 기본 엔터티로부터 파생, 업무에 중심역할, 데이터의 양 많음
- 행위 엔터티 : 2개 이상의 엔터티로부터 파생
- 속성을 특성에 따라 분류
- 기본속성 : 업무 프로세스 분석을 통해 바로 정의 가능
- 설계속성 : 업무 존재 X, 설계하다 도출
- 파생속성 : 다른 속성의 값을 계산, 특정 규칙을 변형하여 생성
- 주식별자의 특성(기본키, PK)
- 유일성, 최소성, 불변성, 존재성
- VIEW의 특징
- 독립성, 편리성, 보안성
- 식별자 분류
- 대표성 여부
- 주식별자
- 보조식별자 : 인스턴스 식별 가능, FK - X
- 대체 여부
- 원조식별자(본질식별자) : 업무 프로세스에 존재, 가공 X
- 대리식별자(인조식별자) : 주식별자의 속성이 두 개 이상인 경우 하나로 묶어서 사용되는 식별자
- 대표성 여부
- 정규화 : 데이터 정합성을 위해 엔티티를 작은 단위로 분리하는 과정
- 제1 정규형 : 중복되는 속성을 나누는 것
이름 | 나이 | 별명 |
크리스티아누 호날두 | 39세 | 날강두, 노쇼두, 축신두 |
↓↓↓↓↓
이름 | 나이 |
크리스티아누 호날두 | 39세 |
이름 | 별명 |
크리스티아누 호날두 | 날강두 |
노쇼두 | |
축신두 |
- 제2 정규형 : 부분함수 종속성을 가지는 테이블을 나누어서 부분함수 종속성을 제거해 주는 것
- 이름, 과목명 -> 성적
- 과목명 -> 지도교수
이름 | 과목명 | 지도교수 | 성적 |
홍길동 | 과학 | 아이슈타인 | 90 |
홍길동 | 영어 | 맥아더 장군 | 85 |
김메시 | 축구 | 마라도나 | 90 |
호날두 | 국어 | 유재석 | 10 |
호날두 | 한국사 | 전한길 | 10 |
↓↓↓↓↓
과목명 | 지도교수 |
과학 | 아이슈타인 |
영어 | 맥아더 장군 |
축구 | 마라도나 |
국어 | 유재석 |
한국사 | 전한길 |
이름 | 과목명 | 성적 |
홍길동 | 과학 | 90 |
홍길동 | 영어 | 85 |
김메시 | 축구 | 90 |
호날두 | 국어 | 10 |
호날두 | 한국사 | 10 |
- 제3 정규형 : 이행 함수 종속 제거
회원번호 | 이름 | 발롱도르 개수 | 국적코드 | 국적 |
1 | 리오넬 메시 | 8 | AR | 아르헨티나 |
2 | 크리스티아누 호날두 | 5 | PT | 포르투칼 |
3 | 요한 크루이프 | 3 | NL | 네덜란드 |
↓↓↓↓↓
회원번호 | 이름 | 발롱도르 개수 | 국가코드 |
1 | 리오넬 메시 | 8 | AR |
2 | 크리스티아누 호날두 | 5 | PT |
3 | 요한 크루이프 | 3 | NL |
국적코드 | 국적 |
AR | 아르헨티나 |
PT | 포르투칼 |
NL | 네덜란드 |
- 반정규화 : 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수도 있으며 데이터 정합성 문제 발생 가능
SQL 기본 및 활용
1. SQL 기본
1.1 SELECT
- 테이블명에 AS가 있을 경우 AS를 사용해야 한다.
- SELECT 수행 순서
- FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
- CASE / DECODE - 자바 switch랑 비슷
- 별도의 ELSE가 없을 경우 NULL(Default)
SELECT emp_name,
CASE
WHEN salary > 5000 THEN 'High'
WHEN salary > 3000 THEN 'Medium'
ELSE 'Low'
END AS salary_category
FROM employees;
SELECT emp_name,
DECODE(department_id,
10, 'Accounting',
20, 'Research',
30, 'Sales',
'Unknown') AS department_name
FROM employees;
1.2 WHERE - 조건 지정
- WHERE 1 = 2 or WHERE 칼럼명 <> NULL 결과는 무조건 False라 전체결과 NULL을 반환;
- BETWEEN A AND B (A, B 포함), <> NOT BETWEEN A AND B(A, B 미포함)
- A <= Value AND Value <= B
SELECT emp_name,
salary
FROM employees
WHERE salary BETWEEN 3000 AND 5000;
- 연산자의 우선순위
- 산술연산자
- 연결 연산자
- 비교 연산자
- IN, LIKE, BETWEEN, IS NULL
- NOT
- AND
- OR
- ESCAPE
- LIKE 표현식 내에서 특별한 의미를 가지는 와일드카드(%, _) 문자를 일반 문자로 처리하려 할 때 사용
SELECT column
FROM table
WHERE column LIKE '%\_%' ESCAPE '\';
1.3 GROUP BY, HAVING - 그룹화
1.4 ORDER BY - 정렬
- ASC(오름차순, Default) / DESC(내림차순)
1.5 Join
- USING 절을 사용한 JOIN 에는 별도의 테이블명이나 별칭(Alias) 사용 불가
- USING 절이 JOIN을 수행하는 열을 자동으로 결정하고, 이 열이 결과 집합에서 한 번만 나타나도록 하기 때문
1.5.1 NATURAL JOIN - 같은 이름을 가진 모든 열을 기준으로 조인
- ON, 별칭(Alias) 사용 불가
- EQUI JOIN(=)만 가능하다
'CUSTOMERS' TABLE
ID | NAME |
1 | Kim |
2 | Lee |
3 | Part |
'ORDERS' TABLE
ORDER_NUMBER | PRODUCT | ID |
1001 | Apple | 1 |
1002 | Banana | 2 |
1003 | Cherry | 3 |
SELECT *
FROM CUSTOMERS
NATURAL JOIN ORDERS;
Result
ID | NAME | ORDER_NUMBER | PRODUCT |
1 | Kim | 1001 | Apple |
2 | Lee | 1002 | Banana |
3 | Park | 1003 | Cherry |
1.5.2 CROSS JOIN
- 조인 조건문을 생략할 경우 Cartesion Product(카티션 곱)이 된다. 이는 CROSS JOIN과 같은 결과 값을 반환한다. 아래의 두 쿼리는 같은 결과값을 반환(ON절 X)
SELECT *
FROM Products
CROSS JOIN Categories;
SELECT *
FROM Products, Categories;
2.1 함수
2.1.1 문자 함수
- SUBSTR / SUBSTRING(String) MSSQL
SUBSTR(String, Start Index, Count)
SUBSTR('안녕하세요', 2, 2)
return '녕하'
- REPLACE
REPLACE(String, Target, Replace String)
REPLACE('안녕 물고기', '물고기', '거북이')
return '안녕 거북이'
- LPAD
LPAD(String, Length, Fill String)
LPAD('안녕', 5, '*')
return '***안녕'
- TRIP
2.1.2 숫자 함수
- SIGN : 음수, 양수, 0 판별
SIGN(Number)
Number > 0 return 1
Number < 0 return -1
Number = 0 return 0
SIGN(-7)
return -1
- ROUND : 지정 자릿수까지 반올림
ROUND(Number, Index)
ROUND(123.45)
return 123.5
- TRUNC : 지정 자릿수까지 버림
TRUNC(Number, Index)
TRUNC(123.45, 1)
return 123.4
TRUNC(123.45, -1)
return 120
- CEIL / SEILING(value) MSSQL : 소수점 이하의 수를 올림
CEIL(Number)
CEIL(10.1)
return 11
CEIL(10.9)
return 11
CEIL(-10.1)
return -10
CEIL(-10.9)
return -10
- FLOOR : 소수점 이하의 수를 내림
FLOOR(Number)
FLOOR(10.1)
return 10
FLOOR(10.9)
return 10
FLOOR(-3.67)
return -4
- MOD : Number1을 Numer2로 나눈 나머지를 반환
MOD(Nubmer1, Number2)
MOD(16, 5)
return 1
MOD(16, -5)
return 1
MOD(-16, -5)
return -1
MOD(16, 0)
return 16
- SUM : 합계를 구하는 함수
COL1 | COL2 | COL3 |
1 | 2 | 4 |
7 | NULL | 5 |
8 | 9 | NULL |
SELECT SUM(COL1 + COL2 + COL3) FROM SAMPLE;
return 7 = (7 + NULL + NULL)
SELECT SUM(COL1) + SUM(COL2) + SUM(COL3) FROM SAMPLE;
return 36 = (16 + 11 + 9)
- COUNT : 숫자를 세는 함수
- COUNT(1), COUNT(*) -> 전체 행의 개수 반환
- COUNT(COL) -> 칼럼명 입력시 NULL 제외 카운팅
COL |
1 |
2 |
3 |
NULL |
SELECT COUNT(1) FROM SAMPLE;
return 4
SELECT COUNT(*) FROM SAMPLE;
return 4
SELECT COUNT(COL) FROM SAMPLE;
return 3
2.1.3 NULL 관련 함수
- NVL(Value1, Value2) / IFNULL(value) MSSQL
- Value1 = NULL return Value2
- Value1 != NULL return Value1
- NULLIF(Value1, Value2)
- Value1 = Value2 return NULL
- Value1 != Value2 return Value1
- COALESCE(Value1, Value2, ...) : NULL이 아닌 최초의 값을 반환
COALESCE(NULL, NULL, 3, NULL)
return 3
COALESCE(1, 2, 3, NULL)
return 1
- NVL2(Value1, Value2, Value3)
- Value1 != NULL return Value2
- Value1 = NULL return Value3
2. SQL 활용
2.1 서브쿼리(Subquery)
- SELECT - 스칼라 서브쿼리
- FROM - 인라인 뷰
- WHERE, HAVING - 중첩 서브쿼리
2.2 집합 연산자
모든 집합 연산자는 두 SELECT 문의 구조가 동일해야 하고, 두 SELECT 문은 같은 수의 열을 반환해야 하며, 각 열의 데이터 타입이 일치해야 한다.
- UNION : 합집합, 중복된 행은 제거
- UNION ALL : 합집합, 중복된 행도 포함
- INTERSECT : 교집합, 중복된 행은 제거
- MINUS/EXCEPT : 앞에 쿼리 - 뒤에 쿼리 차집합, 중복된 행은 제거
2.3 그룹화 함수
GROUP BY절에서 사용
- ROLLUP : 서브토탈, 그랜드 토탈 생성
- ROLLUP(날짜, 품목명)
날짜 | 품목명 | 판매수 |
2024.01.01 | 김치볶음밥 | 2 |
2024.01.01 | 새우볶음밥 | 1 |
2024.01.01 | 3 | |
2024.01.02 | 김치볶음밥 | 4 |
2024.01.02 | 4 | |
7 |
- CUBE : 모든 가능한 조합에 대한 서브토탈 생성, 그랜드 토탈 생성
- CUBE(날짜, 품목명)
날짜 | 품목명 | 판매수 |
2024.01.01 | 김치볶음밥 | 2 |
2024.01.01 | 새우볶음밥 | 5 |
3 | ||
2024.01.02 | 김치볶음밥 | 4 |
2024.01.02 | 4 | |
김치볶음밥 | 6 | |
새우볶음밥 | 5 | |
11 |
- GROUPING SETS : 특정 항목에 대한 소계를 계산하는 함수, 그랜드 토탈 없음 추가로 CUBE, ROLLUP 사용하여 구현가능
- GROUPING SETS(날짜, 품목명), ROLLUP 데이터로 예를 듦
날짜 | 품목명 | 판매수 |
2024.01.01 | 3 | |
2024.01.02 | 4 | |
김치볶음밥 | 6 | |
새우볶음밥 | 1 |
- GROUPING : GROUP BY 절과 함께 ROLLUP, CUBE, GROUPING SETS를 사용할 때 특정 열이 집계 결과를 구분할 때 사용
아래의 예시는 ROLLUP(날짜)를 사용
날짜 | GROUPING(날짜) | 판매수 |
2024.01.01 | 0 | 3 |
2024.01.02 | 0 | 4 |
1 | 7 |
위 처럼 사용하면 된다. CASE, DECODE를 사용하면 더 깔끔하게 사용이 가능하다.
SELECT CASE GROUPING(날짜)
WHEN 1 THEN '총합' ELSE 날짜
END AS 날짜,
판매수
FROM SAMPLE
GROUP BY ROLLUP(날짜)
ORDER BY 날짜;
날짜 | 판매수 |
2024.01.01 | 3 |
2024.01.02 | 4 |
총합 | 7 |
2.4 윈도우 함수
무조건 OVER 절과 함께 사용된다.
PARTITION BY는 데이터를 특정 기준에 따라 분할하고, 각 분할 내에서 윈도우 함수를 적용하는 역할을 한다.
ORDER BY 뒤에 아무것도 명시해 주지 않았을 경우 RANGE UNBOUNDED FOLLOWING(Defualt) = 첫 번째 행 ~ 현재 행
- ROWS : 행을 기준
- RANGE : 행의 데이터 값 기준
- UNBOUNDED PRECENDING : 첫 번째 행
- UNBOUNDED FOLLOWING : 마지막 행
- CURRENT ROW : 현재 행
- [숫자] PRECENDING : 현재 행에서 위로 숫자 만큼 이동
- [숫자] FOLLOWING : 현재 행에서 아래로 숫자 만큼 이동
2.4.1 순위 함수
- RANK : 같은 순위가 존재하면 동일한 등수를 부여하고 다음 순위를 건너뛴다.
SELECT 가수명, 장르, 스트리밍_수
RANK() OVER (PARTITION BY 장르 ORDER BY 스트리밍_수 DESC) AS 순위
FROM SAMPLE;
가수명 | 장르 | 스트리밍_수 | RANK |
Juice Wrld | POP | 999,999,999 | 1 |
Justin Bieber | POP | 843,456,777 | 2 |
Post Malone | POP | 843,456,777 | 2 |
Chirs Brown | POP | 834,564,486 | 4 |
르세라핌 | K-POP | 987,153,665 | 1 |
트와이스 | K-POP | 894,153,785 | 2 |
태연 | K-POP | 893,151,456 | 3 |
- DENSE_RANK : 같은 순위가 존재하면 동일한 등수를 부여하고 다음 순위를 건너뛰지 않고 이어서 진행한다.
가수명 | 음원 스트리밍 수 | RANK |
Juice Wrld | 999,999,999 | 1 |
LE SSERAFIM | 843,456,777 | 2 |
Post Malone | 843,456,777 | 2 |
Chirs Brown | 834,564,486 | 3 |
- ROW_NUMBER() : 같은 순위가 존재해도 다른 순위를 부여한다.
가수명 | 음원 스트리밍 수 | RANK |
Juice Wrld | 999,999,999 | 1 |
LE SSERAFIM | 843,456,777 | 2 |
Post Malone | 843,456,777 | 3 |
Chirs Brown | 834,564,486 | 4 |
2.4.2 행 순서 함수
- FIRST_VALUE : 파티션별 가장 첫번째 데이터 반환
SELECT 장르, 가수명, 스트리밍_수,
FIRST_VALUE(가수명) OVER(PARTITION BY 장르 ORDER BY 스트리밍_수 DESC) AS 장르별_1위
FROM SAMPLE
가수명 | 장르 | 스트리밍_수 | 장르별_1위 |
POP | Juice Wrld | 999,999,999 | Juice Wrld |
POP | Justin Bieber | 843,456,777 | Juice Wrld |
POP | Post Malone | 843,456,777 | Juice Wrld |
POP | Chirs Brown | 834,564,486 | Juice Wrld |
K-POP | 르세라핌 | 987,153,665 | 르세라핌 |
K-POP | 트와이스 | 894,153,785 | 르세라핌 |
K-POP | 태연 | 893,151,456 | 르세라핌 |
- LAST_VALUE : 파티션별 가장 마지막 데이터 반환
- LAG : 파티션별 특정 수만큼 앞선 데이터 반환, 두 번째 인자값 생략 시 Defualt 1
SELECT 장르, 가수명, 스트리밍_수
LAG(가수명, 3) OVER(ORDER BY 스트리밍_수 DESC) AS LAG_TEST
FROM SAMPLE
가수명 | 장르 | 스트리밍_수 | LAG_TEST |
POP | Juice Wrld | 999,999,999 | NULL |
K-POP | 르세라핌 | 987,153,665 | NULL |
K-POP | 트와이스 | 894,153,785 | NULL |
POP | Justin Bieber | 843,456,777 | Juice Wrld |
POP | Post Malone | 843,456,777 | 르세라핌 |
K-POP | 태연 | 840,123,886 | 트와이스 |
POP | Chirs Brown | 834,564,486 | Justin Bieber |
- LEAD : 파티션별 특정 수만큼 뒤에 있는 데이터 반환, 두 번째 인자값 생략시 Defualt 1
2.4.3 비율 함수
- RATIO_TO_REPORT : 전체 합계에 대해 차지하는 비율 계산
- 행의 값 / 전체 합계
이름명 | 지각 횟수 | 총 지각 횟수 | RATIO_TO_REPORT |
크리스티아누 호날두 | 4 | 10 | 0.4 |
메시 | 2 | 10 | 0.2 |
손흥민 | 1 | 10 | 0.1 |
네이마르 | 2 | 10 | 0.2 |
손오공 | 1 | 10 | 0.1 |
- PERCENT_RANK : 맨 위 0, 맨 끝 1로 설정 후 현재 행을 백분위 순위 값을 계산
이름명 | 지각 횟수 | 총 지각 횟수 | PERCENT_RANK |
크리스티아누 호날두 | 4 | 10 | 0 |
메시 | 2 | 10 | 0.25 |
네이마르 | 2 | 10 | 0.50 |
손흥민 | 1 | 10 | 0.75 |
손오공 | 1 | 10 | 1 |
- CUME_DIST : 각 행의 누적 백분율을 계산
이름명 | 지각 횟수 | 총 지각 횟수 | CUME_DIST |
크리스티아누 호날두 | 4 | 10 | 0.2 |
메시 | 2 | 10 | 0.4 |
네이마르 | 2 | 10 | 0.6 |
손흥민 | 1 | 10 | 0.8 |
손오공 | 1 | 10 | 1 |
- NTILE : 인수 값만큼 등분한 후 해당하는 등급 부여
- 등분 후 나머지가 있을 경우 맨 앞의 그룹부터 더해준다. 아래의 예시는 국어점수로 내림차순
이름 | 국어점수 | NTILE(2) | NTILE(3) | NTILE(4) | NTILE(5) |
유재석 | 90 | 1 | 1 | 1 | 1 |
강호동 | 85 | 1 | 1 | 1 | 1 |
전현무 | 80 | 1 | 2 | 2 | 2 |
신동엽 | 65 | 2 | 2 | 2 | 3 |
성시경 | 45 | 2 | 3 | 3 | 4 |
노홍철 | 30 | 2 | 3 | 4 | 5 |
2.4.4 계층 쿼리
- CONNECT BY : 루트로부터 자식 노드를 생성
- CONNECT_BY_ROOT 칼럼 : 루트 노드의 칼럼 값을 반환
- CONNECT_BY_ISLEAF : 가장 하위 노드 1을 반환 그 외 0 반환
- START WITH : 시작되는 루트 노드를 생성
- PRIOR : 부모 노드의 값을 반환
- LEVEL : 현재 행의 깊이를 반환, 루트 노드 1
- SYS_CONNECT_BY_PATH(칼럼, 구분자) : 루트 노드부터 현재 행까지의 경로를 출력
- ORDER SIBLINGS BY : 계층 쿼리 정렬
3. 관리 구문
3.1 DML(Data Manipulation Language)
데이터를 입력, 수정, 삭제, 조회
- INSERT : 데이터 삽입
- 칼럼명을 넣어서 데이터를 삽입할 경우 VALUES의 개수와 같아야 한다.
INSERT INTO 테이블명 VALUES (전체 칼럼 데이터);
INSERT INTO 테이블명 (칼럼명1, 칼럼명2) VALUES (칼럼1 데이터, 칼럼2 데이터);
- UPDATE : 데이터 수정
UPDATE 테이블명 SET 수정할_칼럼명 = 변경값 WHERE 수정할_데이터_조건
- DELETE : 데이터 삭제
DELETE FROM 테이블명 WHERE 삭제할_데이터_조건
- MERGE : 테이블에 데이터 입력, 변경 작업을 한 번에 여러 작업을 가능하게 한다.
1. MERGE INTO target_table USING source_table
2. ON (target_table.id = source_table.id)
3. WHEN MATCHED THEN
UPDATE SET target_table.value = source_table.value
4. WHEN NOT MATCHED THEN
INSERT (id, value) VALUES (source_table.id, source_table.value);
- MERGE INTO target_table : 업데이트, 데이터 입력할 대상 테이블 지정
USING source_table : 업데이트, 데이터 입력에 이용할 테이블 지정 - ON (target_table.id = source_table.id) : 조건 설정
- 2번의 조건이 true일 경우 실행
- 2번의 조건이 false일 경우 실행
3.2 DDL(Data Definition Language)
데이터를 정의하는 SQL
- CREATE : 테이블 생성 명령어(아래의 명령어는 똑같은 결과를 반환한다)
CREATE TABLE FOOD (
FOOD_NO NUMBER PRIMARY KEY,
NAME VARCHAR2(50) NOT NULL,
CALORIE NUMBER
);
CREATE TABLE FOOD (
FOOD_NO NUMBER,
NAME VARCHAR2(50) NOT NULL,
CALORIE NUMBER,
CONSTRAINT FOOD_PK PRIMARY KEY (FOOD_NO)
);
- ALTER : 테이블의 구조 변경
칼럼 추가
ALTER TABLE 테이블명 ADD 칼럼명 데이터_유형;
ALTER TABLE FOOD ADD CHEF VARCHAR2(20);
칼럼 삭제
ALTER TABLE 테이블명 DROP COLUMN 칼럼명;
ALTER TABLE FOOD DROP COLUMN CHEF;
칼럼 데이터 수정
ALTER TABLE 테이블명 MODIFY (칼럼명 데이터 유형)
ALTER TABLE FOOD MODIFY (CHEF VARCHAR2(50) DEFAULT '짜파케티_요리사');
칼럼 이름 변경
ALTER TABLE 테이블명 RENAME COLUMN 기존_칼럼명 TO 변경_칼럼명;
ALTER TABLE FOOD RENAME COLUMN CHEF TO MAIN_CHEF;
칼럼 제약조건 추가
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);
ALTER TABLE FOOD ADD CONSTRAINT FOOD_FK FOREIGN KEY (CHEF_ID) REFERENCES CHEF(CHEF_ID);
- DROP : 테이블 삭제
DROP TABLE FOOD;
- RENAME : 테이블명 변경
RENAME FOOD TO DISH;
- TRUNCATE : 데이터 삭제(테이블은 유지)
TRUNCATE TABLE FOOD;
3.3 TCL(Transaction Control Language)
트랜잭션을 제어하는 명령어
- 트랜잭션의 특징 : 원자성, 일관성, 고립성, 지속성 (아래의 유튜브 영상에서 상세히 설명해 준다)
https://www.youtube.com/watch?v=sLJ8ypeHGlM&ab_channel=%EC%89%AC%EC%9A%B4%EC%BD%94%EB%93%9C
- COMMIT : INSERT, DELETE, UPDATE 후 변경된 내용을 반영
- ROLLBACK : INSERT, DELETE, UPDATE 후 변경된 내용을 취소하여 이전 내용으로 되돌린다
- SAVEPOINT : 특정 포인트를 지정해 그 지점으로 되돌아갈 수 있다
3.4 DCL(Data Control Language)
데이터 생성 권한을 부여하는 명령어
- CREATE USER, ALTER USER, DROP USER
- 사용자 생성, 변경, 삭제 명령어
- GRANT : 권한 부여
GRANT 권한 ON 테이블명 TO 유저명;
GRANT UPDATE ON SAMPLE TO USER_1;
- REVOKE : 권한 회수 명령어
REVOKE 권한 ON 테이블명 TO 유저명;
REVOKE UPDATE ON SAMPLE TO USER_1;