본문 바로가기

etc/SQLD

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 네덜란드
  • 반정규화 : 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수도 있으며 데이터 정합성 문제 발생 가능

https://dataonair.or.kr/db-tech-reference/d-guide/sql/?mod=document&uid=333

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

https://www.ionos.com/digitalguide/hosting/technical-matters/sql-outer-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

https://www.tutorialspoint.com/sql/sql-cross-join.htm

  • 조인 조건문을 생략할 경우 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)

https://www.complexsql.com/subqueries-correlated-subquery/

  • SELECT - 스칼라 서브쿼리
  • FROM - 인라인 뷰
  • WHERE, HAVING - 중첩 서브쿼리

2.2 집합 연산자

모든 집합 연산자는 두 SELECT 문의 구조가 동일해야 하고, 두 SELECT 문은 같은 수의 열을 반환해야 하며, 각 열의 데이터 타입이 일치해야 한다.

https://minhngocda.medium.com/join-and-union-in-sql-what-is-the-difference-180da362d2a6

  • 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);
  1. MERGE INTO target_table : 업데이트, 데이터 입력할 대상 테이블 지정
    USING source_table : 업데이트, 데이터 입력에 이용할 테이블 지정
  2. ON (target_table.id = source_table.id) : 조건 설정
  3. 2번의 조건이 true일 경우 실행
  4. 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;