SQLD 시험준비 (벼락치기) 개념정리 6번째 글
2절인 SQL 기본 및 활용 내용 첫 글. 지난 글들은 아래 참고.
2024 SQLD 시험 준비 - 개념 정리 1편 <데이터 모델의 이해>
1월 말일에 SQLD 시험을 등록하고 한 달이 지났는데 아직 공부 시작을 하지 않았다. 물론 개인적으로 진짜 바쁘긴 했지만, 이렇게 코앞에 다가올 때까지 하지 않을 줄 몰랐다. 사실 사이트에 가서
minbook.tistory.com
2024 SQLD 시험 준비 - 개념 정리 2편 <엔터티, 속성, 관계>
SQLD 시험준비 (벼락치기) 개념정리 2번째 글 첫 번째 글인 정리는 아래를 참고. 2024.03.03 - [일상 기록] - 2024 SQLD 시험 준비 - 개념 정리 1편 엔터티 (Entity) 엔터티 (Entity) 정의 및 개념 데이터의 집합
minbook.tistory.com
2024 SQLD 시험 준비 - 개념 정리 3편 <식별자>
SQLD 시험준비 (벼락치기) 개념정리 3번째 글 개념정리 1, 2편은 아래 글을 참조 2024 SQLD 시험 준비 - 개념 정리 1편 1월 말일에 SQLD 시험을 등록하고 한 달이 지났는데 아직 공부 시작을 하지 않았다.
minbook.tistory.com
2024 SQLD 시험 준비 - 개념 정리 4편 <성능 데이터 모델링, 정규화, 반정규화>
SQLD 시험준비 (벼락치기) 개념정리 4번째 글 개념정리 1 ~ 3편은 아래 글을 참조 2024 SQLD 시험 준비 - 개념 정리 1편 1월 말일에 SQLD 시험을 등록하고 한 달이 지났는데 아직 공부 시작을 하지 않았다
minbook.tistory.com
2024 SQLD 시험 준비 - 개념 정리 5편 <관계와 조인, 트랜잭션, Null>
SQLD 시험준비 (벼락치기) 개념정리 5번째 글 아직도 갈 길이 좀 남은 것 같아 걱정.. 시험 하루 전 오늘, 마저 벼락치기를 해보려 한다. 개념정리 1 ~ 4편은 아래 글을 참조 2024 SQLD 시험 준비 - 개념
minbook.tistory.com
관계형 데이터베이스 개요
데이터베이스 (Database) & DBMS (Database Management System)
- 데이터베이스 (Database) : 데이터의 집합, 데이터를 일정한 형태로 저장해 놓은 것,
- DBMS (Database Management System) : 데이터를 효과적으로 관리하기 위한 시스템 (ORACLE, MYSQL 등)
관계형 데이터베이스 구성 요소
- 계정: 데이터 접근 제한을 위한 업무 / 시스템별 계정 존재
- 테이블 : DBMS의 DB안에 데이터 저장되는 형식
- 스키마 : 테이블 구성 및 정보에 대한 기본적인 구조 정의
참고:
- 도메인: 각 컬럼(속성)이 갖는 범위
- 릴레이션 : 테이블 간의 관계
- 튜플 : 하나의 행
- 키 : 식별자
테이블 (Table)
- 행 (row) 및 열 (column)을 갖는 2차원 구조로 구성
- 데이터를 입력 및 저장하는 최소 단위
- 하나의 테이블은 반드시 하나의 유저(계정) 소유여야 함
- 테이블간 관계는 1:1 / 1:N / N:N 관계를 가질 수 있음
- 테이블명은 중복될 수 없음, 다만 소유자가 다른 경우 같은 이름 생성 가능
- 행 단위로 데이터 입력, 삭제됨. 다만 수정의 경우 값 단위 수정 가능
데이터 무결성 (Integrity)
- 데이터의 정확성과 일관성을 유지하고, 데이터 결손과 부정합이 없음을 보증
- 데이터 무결성 유지는 데이터베이스 관리시스템에 중요한 기능
- 데이터 베이스 내에 지정된 값과 현실의 비즈니스 모델 값이 일치하는 정확성
데이터 무결성 종류
개체 무결성 | 테이블 기본키를 구성하는 컬럼(속성)은 Null 일수 없음 테이블 기본키를 구성하는 컬럼(속성)은 중복값을 가질 수 없음 |
참조 무결성 | 외래키 값은 Null 일수 있음 외래키 값은 참조 테이블의 기본키 값과 동일해야 함 |
도메인 무결성 | 속성 값이 정해진 도메인 내에 속한 값이어야 함 |
NULL 무결성 | 특정 속성에 대해 Null을 허용하지 않는 특징 |
고유 무결성 | 특정 속성에 대해 값이 중복되지 않는 특징 |
키 무결성 | 하나의 릴레이션 (관계)에 적어도 하나의 키가 존재해야 함 테이블이 서로 관계를 가질 경우 반드시 하나 이상의 조인키를 가짐 |
ERD (Entity Relationship Diagram)
- 테이블 간 서로의 상관관계를 그림으로 표현
- 구성 요소: 엔티티 (Entity) / 관계 (Relation) / 속성(Attribute)
SQL (Structured Query Language)
- 관계형 데이터베이스에서 데이터 조회 및 조작, DMBS 시스템 관리 기능을 명령하는 언어
- 데이터 정의 (DDL) 데이터 조작 (DML) 데이터 제어 언어 (DCL) 구분
- 대 소문자 구분하지 않음
SQL 종류
기능에 따라 구분
데이터 정의 (DDL) Data Definition Language |
CREATE, ALTER, DROP, TRUNCATE - roll back 할 수 없음 (되돌릴 수 없음) - Auto commit - Truncate (테이블의 구조는 두고 데이터를 지우는 것, 되돌릴 수 없기때문에 주의) |
데이터 조작 (DML) Data Manipulation Language |
INSERT, DELETE, UPDATE, MERGE |
데이터 제어 언어 (DCL) Data Control Language |
GRANT, REVOKE - 데이터 권한을 부여 갱신 회수 등 할 수 있음 |
TCL Transaction Control Language |
COMMIT, ROLLBACK |
DQL Data Query Language |
SELECT |
*SELECT 의 경우 SQL 종류 중 속하지 않아서 DQL이 등장함
SELECT 구조
- SELECT 문장을 사용하여 불러올 컬럼명, 연산 결과를 작성하는 절
- 6개의 절로 구성
- 각 절의 순서대로 작성 (GROUP BY ↔ HAVING 은 바뀔 수도 있지만 보통 사용 X)
- SELECT 문의 구성 순서와 파싱 순서(DBSM에서 해석하는 순서)는 다름
- 실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
SELECT * 또는 컬럼명 또는 표현식
FROM 테이블명 또는 뷰명
WHERE 조회 조건
GROUP BY 그룹핑 컬럼명
HAVING 그룹핑 필터링 조건
ORDER BY 정렬 컬럼명
SELECT 절
- *를 사용하여 전체 컬럼명 불러오거나, 원하는 컬럼을 콤마(,)로 나열하여 작성 → 작성 순서대로 출력
- 표현식 사용하여 원본과 다른 데이터 추출 가능 (예: 컬럼명 * 1.1 등으로 수식 작성)
- 불러올 컬럼에 별칭 (Alias) 지정 가능
- AS로 컬럼명 입력
- 한글 사용 가능
- SELECT 문보다 늦게 수행되는 ORDER BY 절에서 컬럼 별칭 사용 가능 (그 외 사용 시 에러)
- 이미 존재하는 예약어는 별칭 사용 불가 (예: count decode avg 등)
- 공백, 특수문자 (_제외), 대소문자 출력 구분 필요시 쌍 따옴표 활용 ("")
FROM 절
- 데이터를 불러올 테이블명 또는 뷰명
- 테이블 여러 개 가능 (콤마, 로 구분) → 조인 조건 없이 테이블명만 나열 시 카티시안 곱 발생 주의
- 테이블 별칭 선언 가능 (AS 사용하지 않음)
- ORACLE에서는 FROM 절 생략 불가, 의미상 불필요할 경우 DUAL 테이블 선언 (23c 버전부터 가능)
- MSSQL에서는 FROM 절 생략 가능 (예: 오늘 날짜 조회 시)
뷰 (View)
- 테이블과 동일하게 데이터를 조회할 수 있는 객체
- 테이블처럼 실제 데이터가 저장된 것이 아님 → SELECT 문 결과에 이름을 붙여 그 이름으로 조회가 가능하게 한 것
함수
- input value에 맞는 output value를 출력, 둘의 관계를 정의한 객체
- From 절을 제외한 모든 절에 사용 가능
함수의 기능
- 데이터 계산을 수행
- 개별 데이터 항목을 수정
- 표시할 날짜 및 숫자 형식을 지정
- 열 데이터 유형 (data type) 변환
함수의 종류
- 단일행 함수 : input ↔ output 관계가 1:1
- 복수행 함수 : 여러 건의 데이터를 동시에 입력 → 하나의 요약값 리턴 (=그룹함수 또는 집계함수)
문자형 함수
- 문자열 결합, 추출, 삭제 등 수행
- 단일행 함수 형태
- Output 역시 대부분 문자값 (LENGH, INSTR 제외)
함수명 | 함수기능 | 예시 | 출력 | 설명 |
LOWER(대상) | 소문자로 변환 | LOWER('ABC') | abc | |
UPPER(대상) | 대문자로 변환 | UPPER('abc') | ABC | |
SUBSTR(대상,m,n) | 문자열 중 m위치의 n개 문자열 추출 | SUBSTR('ABCDE',2,3) | BCD | |
INSTR(대상,찾을문자열) | 대상에서 찾을 문자열 위치 추출 | INSTR('A&B&C&','&',3,2) | 6 | 3번째 글자부터 시작해서 2번째로 나온 & 위치 |
LTRIM(대상,삭제문자열) | 특정 문자열을 왼쪽에서 삭제 | LTRIM('AABABAA','A') | BABAA | 삭제문자열 입력하지 않을 경우 공백 삭제 |
RTIRM(대상,삭제문자열) | 특정 문자열을 오른쪽에서 삭제 | RTRIM('AABABAA','A') | AABAB | 삭제문자열 입력하지 않을 경우 공백 삭제 |
TRIM(대상) | 특정 문자열을 양쪽에서 삭제 | TRIM('AABABAA','A') | BAB | Oracle Trim은 공백삭제만 가능 |
LPAD(대상,n,문자열) | 왼쪽에 문자열을 추가하여 총 n 길의 리턴 | LPAD('ABC',6,'*') | ***ABC | |
RPAD(대상,n,문자열) | 오른쪽에 문자열을 추가하여 총 n 길의 리턴 | RPAD('ABC',6,'*') | ABC*** | |
CONCAT(대상1, 대상2) | 문자열 결합 | CONCAT('A','B') | AB | 두개 인수만 가능 |
LENGTH(대상) | 문자열 길이 | LENGTH('ABCDEFG') | 7 | |
REPLACE(대상,찾을문자열,바꿀문자열) | 문자열 치환 및 삭제 | REPLACE('ABBBB','AB','ac') | acBBB | 바꿀문자열 생략 또는 빈칸으로 입력 시 찾을문자열 삭제 기능 |
TRANSLATE(대상,찾을문자열,바꿀문자열) | 글자를 1:1로 치환 | TRANSLATE('ABBA','AB','ab') | abba | 매칭 글자끼리 치환 (A→a, B→b) |
SQL-Server
- SUBSTR → SUBSTRING
- LENGTH → LEN
- INSTR → CHARINDEX
숫자형 함수
- 숫자 값을 반환
- 단일행 함수 형태
- ORACLE & SQL-server 함수 거의 동일함
함수명 | 함수기능 | 예시 | 출력 | 설명 |
ABS(숫자) | 절대값 반환 | ABS(-7.5) | 7.5 | |
ROUND(숫자,자리수) | 소수점 자리 반올림 | ROUND(123.456,2) ROUND(123.456,-2) |
123.46 100 |
음수일 경우 정수자리 |
TRUNC(숫자,자리수) | 소수점 자리 버림 | TRUNC(123.456,2) | 123.45 | |
SIGN(숫자) | 양수 (1) 음수 (-1) 0 (0) 반환 | TRUNC(123.456,-2) | 100 | |
FLOOR(숫자) | 작거나 같은 최대 정수값 리턴 | FLOOR(3.5) | 3 | |
CEIL(숫자) | 크거나 같은 최대 정수값 리턴 | CEIL(3.5) | 4 | |
MOD(숫자1, 숫자2) | 숫자 1 / 숫자 2 한 값의 나머지 리턴 | MOD(7,2) | 1 | |
POWER(m,n) | m의 n 거듭제곱값 리턴 | POWER(2,4) | 16 | |
SQRT(숫자) | 루트값 리턴 | SQRT(16) | 4 |
날짜형 함수
- 날짜 연산 관련 함수
- ORACLE & SQL-server 함수 거의 다름
함수명 | 함수기능 | 예시 | 출력 | 설명 |
SYSDATE | 현재 날짜 시간 리턴 | SYSDATE | 2024/03/08 11:23:34 | 출력형식에 따라 날짜만 리턴될 수 있음 |
CURRENT_DATE | 현재 날짜 리턴 | CURRENT_DATE | 2024/03/08 | 출력형식에 따라 날짜/시간이 리턴될 수 있음 |
CURRENT_TIMESTAMP | 현재 타임스탬프 리턴 | CURRENT_TIMESTAMP | 2024/03/08 11:23:34 +09:00 | |
ADD_MONTHS(날짜,n) | 날짜에서 n개월 후 날짜 리턴 | ADD_MONTHS(SYSDATE,3) | 2024/06/08 11:23:34 | n이 음수인 경우 n개월 전 과거 날짜 리턴 |
LAST_DAY(날짜) | 주워진 월의 마지막 날짜 리턴 | LAST_DAY(SYSDATE) | 2024/03/31 11:23:34 | |
LAST_DAY(날짜,n) | 주워진 날짜 이후 지정된요일의 첫번째 날짜 리턴 | LAST_DAY(SYSDATE,1) | 2024/03/11 11:23:34 | 1: 일요일, 2:월요일... |
ROUND(날짜, 자리수) | 날짜 반올림 | ROUND(SYSDATE, 'MONTH') | 2024/03/01 00:00 | |
TRUNC(날짜, 자리수) | 날짜 버림 | TRUNC(SYSDATE, 'MONTH') | 2024/03/01 00:00 |
SQL-server
- SYSDATE → GETDATE
- ADD_MONTHS → DATEADD (모든 단위 날짜 연산 가능)
- MONTHS_BETWEEN → DATEDIFF (두 날짜 사이의 연, 월, 일 추출)
변환 함수
- 값이 가지고 있는 데이터 타입을 변환
- 문자 → 숫자, 숫자 → 문자, 날짜 → 문자 등
함수명 | 함수기능 | 예시 | 출력 | 설명 |
TO_NUMBER(대상) | 숫자 타입으로 변경 | TO_NUMBER('100') | 100 | 문자 100 → 숫자 100 |
TO_CHAR(대상,포맷) | 날짜 포맷 변경 숫자 포맷 변경 |
TO_CHAR(SYSDATE,'MM-DD-YYYY') TO_CHAR(9000,'9,999') |
03-08-2024 9,000 |
날짜 포맷 (문자 리턴) 숫자 포맷 (문자 리턴) |
TO_DATE(문자,포맷) | 문자를 날짜로 변경 | TO_DATE('2024/01/01','YYYY/MM/DD') | 2024/01/01 | 문자 → 날짜 |
CAST(대상 AS 데이터타입) | 대상 데이터타입 변경 | CAST('100' AS int) | 100 | 문자 100 → 숫자 100 |
SQL-server
- TO_NUMBER, TO_DATE, TO_CHAR → CONVERT
- 단순 변환 시 주로 CAST 사용
그룹 함수
- 다중행 함수
- 여러 값의 input → 하나의 요약 값으로 리턴
- GROUP BY와 함께 자주 사용됨
- ORACLE & SQL-server 함수 거의 동일함
함수명 | 함수기능 | 설명 |
COUNT() | 행의 수 리턴 | |
SUM() | 총 합계 리턴 | |
AVG() | 평균값 리턴 | |
MIN() | 최소값 리턴 | |
MAX() | 최대값 리턴 | |
VARIANCE() | 분산 리턴 | |
STDDEV() | 표준편차 리턴 |
SQL-server
- VARIANCE → VAR
- STDDEV → STDEV
일반 함수
- 그 외 널 치환 함수 등
함수명 | 함수기능 | 설명 |
DECODE(대상,값1,리턴1,값2,..) | 대상이 값1일 경우 리턴1, 값2일경우 리턴 2 ... 그 외 리턴값 리턴 | 대소비교 치환 불가 오라클만 존재 |
NVL(대상,치환값) | 대상이 NULL 일경우 치환값으로 리턴 | |
NVL2(대상,치환값1,치환값2) | 대상이 NULL 일경우 치환값 1로 리턴 대상이 NULL 아닐 경우 치환값 2로 리턴 |
|
COALESCE(대상1,대상2,...그외리턴) | 대상 1이 NULL 이면 대상2 대상 2가 NULL 이면 대상3 ... 모두가 NULL 인경우 그외 리턴값 |
그외 리턴값 생략 시 NULL 리턴 |
CASE | 조건별 치환 및 연산 |
예시: DECODE
SELECT
DEPARTMENT_NO,
TITLE,
DECODE (DEPARTMENT_NO, 10, #DEPARTMENT_NO 값이 10일경우 아래 한번 더 DECODE
DECODE (TITLE,'MANAGER','A','B'),'C') AS CATEGORY ) #10일 경우 TITLE이 'MANAGER'이냐에 따라 A, B로 리턴하도록
FROM TABLE;
DEPARTMENT_NO | TITLE | CATEGORY | 참고 |
10 | MANAGER | A | DEPARTMENT_NO 값이 10일때 TITLE에 따라 별도 DECODE |
10 | ASSISTANT | B | |
20 | MANAGER | C | DEPARTMENT_NO 값이 10이 아니므로 C 리턴 |
20 | ANALYST | C | |
30 | MANAGER | C |
예시: NVL, NVL2
SELECT
CALCULATION,
NVL(CALCULATION,0), #CALCULATION 값이 NULL 일 경우 0으로 리턴
NVL2(CALCULATION,CALCULATION*2,1000) #CALCULATION 값이 NULL이 아닐 경우 기존 값에 x2, NULL 일 경우 1000으로 리턴
FROM TABLE;
CALCULATION | NVL(CALCULATION,0) | NVL2(CALCULATION,CALCULATION*2,1000) |
0 | 1000 | |
400 | 400 | 800 |
700 | 700 | 1400 |
0 | 1000 | |
500 | 500 | 1000 |
예시: CASE
다음과 같이 WHEN 사이에 어떤 대상이 있을 경우 생략되어 조건값이 설정되기도 함
--1
CASE DEPARTMENT
WHEN 10 THEN 'A'
WHEN 20 THEN 'B'
WHEN 30 THEN 'C'
ELSE 'ETC'
END AS NAME1
--2
CASE
WHEN DEPARTMENT = 10 THEN 'A'
WHEN DEPARTMENT = 20 THEN 'B'
WHEN DEPARTMENT = 30 THEN 'C'
ELSE 'ETC'
END AS NAME2
'일상 기록' 카테고리의 다른 글
2024 SQLD 시험 준비 - 개념 정리 7편 <WHERE, GROUP BY, HAVING, JOIN> (0) | 2024.03.08 |
---|---|
2024 SQLD 시험 준비 - 개념 정리 5편 <관계와 조인, 트랜잭션, Null> (0) | 2024.03.08 |
2024 SQLD 시험 준비 - 개념 정리 4편 <성능 데이터 모델링, 정규화, 반정규화> (0) | 2024.03.08 |
2024 SQLD 시험 준비 - 개념 정리 3편 <식별자> (1) | 2024.03.06 |
2024 SQLD 시험 준비 - 개념 정리 2편 <엔터티, 속성, 관계> (0) | 2024.03.03 |
댓글