데이터베이스(Database)와 DBMS (Database Management System)
- 데이터베이스 : 데이터의 집합
- DBMS : 데이터를 효과적으로 관리하기 위한 시스템 (ORACLE, MYSQL 등)
관계형 데이터베이스 구성 요소
- 계정 : 데이터 접근 제한 위한 여러 업무별/시스템별 계정 존재
- 테이블 : DBMS의 DB 안에서 데이터가 저장되는 형식
- 스키마 : 테이블이 어떠한 구성으로 되어있는지, 어떤 정보 가지고 있는지에 대한 기본적인 구조
테이블
- 행(로우), 열(컬럼) 갖는 2차원 구조로 구성
- 데이터 입력해 저장하는 최소 단위
- 컬럼은 속성이라고도 부름
특징
- 하나의 테이블은 반드시 하나의 유저 (계정) 소유여야 함
- 테이블간 관계는 일대일 (1:1), 일대다 (1:N), 다대다 (N:M) 관계 가질 수 있음
- 테이블명은 중복될 수 없지만, 소유자 다른 경우 같은 이름으로 생성 가능
- 행 단위로 데이터 입력, 삭제되며 수정은 값 단위로 가능
SQL (Structured Query Language)
- 관계형 데이터베이스에서 데이터 조회 및 조작, DBMS 시스템 관리 기능 명령 언어
- 데이터 정의 (DDL), 데이터 조작 (DML), 데이터 제어 언어 (DCL) 등
- SQL 문법은 대, 소문자 구분 X
관계형 데이터베이스 특징
- 데이터 분류, 정렬, 탐색 속도 빠름
- 신뢰성 높고, 데이터 무결성 보장
- 기존 작성된 스키마 수정 어려움
- 데이터베이스 부하 분석하는 것 어려움
데이터 무결성 (integrity)
: 데이터 정확성과 일관성 유지하고, 데이터에 결손과 부정합 없음 보증하는 것
데이터 무결성 종류
1. 개체 무결성 : 테이블 기본키 구성하는 컬럼 (속성)은 NULL 값이나 중복값 가질 수 X
2. 참조 무결성 : 외래키 값은 NULL 이거나 참조 테이블 기본키 값과 동일해야 함
3. 도메인 무결성 : 주어진 속성 값이 정의된 도메인에 속한 값이어야 함
4. NULL 무결성 : 특정 속성에 대해 NULL 허용하지 않는 특징
5. 고유 무결성 : 특정 속성에 대해 값 중복되지 않는 특징
6. 키 무결성 : 하나의 릴레이션 (관계)에는 적어도 하나의 키 존재해야 함
(테이블이 서로 관계 가질 경우 반드시 하나 이상 조인키 가짐)
ERD (Entity Relationship Diagram)
- 테이블 간 서로 상관 관계 그림을 표현한 것
- 구성요소에는 엔터티 (Entity), 관계 (Relationship), 속성 (Attribute) 있음
SQL 종류
구분 | 종류 |
DDL (Data Definitioin Language) |
CREATE, ALTER, DROP, 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문 구조
- 6개 절로 구성
- 각 절은 순서대로 작성해야 함
- 내부 파싱 (문법적 해석) 순서는 나열된 순서와 다름
- FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY 순서대로 실행
SELECT * | 컬럼명 | 표현식
FROM 테이블명 또는 뷰명
WHERE 조회 조건
GROUP BY 그룹핑 컬럼명
HAVING 그룹핑 필터링 조건
ORDER BY 정렬 컬럼명
SELECT 절
- SELECT 문장 사용해 불러올 컬럼명, 연산 결과 작성하는 절
- * 사용해 테이블 내 전체 컬럼명 불러올 수 있음
- 원하는 컬럼을 ,로 나열해 작성 가능 (순서대로 출력)
- Alias (별칭) 지정 가능
- 대소문자 구분하지 않아도 인식
컬럼 Alias (별칭)
- 컬럼명 대신 출력할 임시 이름 지정 (SELECT절에서만 정의 가능, 원본 컬럼명 변경되지 X)
- 컬럼명 뒤에 AS와 함께 컬럼 별칭 전달 (AS 생략 가능)
특징 및 주의사항
- SELECT 문보다 늦게 수행되는 ORDER BY절에서만 컬럼 별칭 사용 가능 (그 외 절에서 사용시 에러 발생)
- 한글 사용 가능
- 이미 존재하는 예약어는 별칭으로 사용 X
별칭에 반드시 쌍따옴표 붙여야 하는 경우
- 별칭에 공백 포함
- 별칭에 특수문자 포함 ("_" 제외)
- 별칭 그대로 전달할 경우 (입력한 대소 그대로 출력하고자 할 때)
FROM절
- 테이블 불러올 테이블명 또는 뷰명 전달
- 테이블 여러 개 전달 가능 (컴마로 구분) -> 조인 조건 없이 테이블명만 나열 시 카티시안 곱 발생
- 테이블 별칭 선언 가능 (ORACLE은 AS 사용 불가, SQL Server는 사용/생략가능)
(테이블 별칭 선언 시 컬럼 구분자는 테이블 별칭으로만 전달 (테이블명으로 사용 시 에러 발생))
- ORACLE에서는 FROM절 생략 불가 (의미상 필요 없는 경우 DUAL 테이블 선언)
- SQL Server에서는 FROM절 필요 없을 경우 생략 가능
함수
- input value와 output value 관계 정의한 객체
- from절 제외한 모든 절에서 사용 가능
함수 기능
- 데이터 계산 수행
- 개별 데이터 항목 수정
- 표시할 날짜 및 숫자 형식 지정
- 열 데이터 유형 (data type) 변환
함수 종류 (입력값 수에 따라)
- 단일행 함수 : input과 output 관계가 1:1
- 복수행 함수 : 여러 건 데이터 동시에 입력 받아 하나의 요약값 리턴 (그룹함수 또는 집계함수라고도 함)
입/출력값 타입에 따른 함수 분류
1. 문자형 함수
- 문자열 결합, 추출, 삭제 등 수행
- 단일행 함수 형태
- output은 대부분 문자값 (LENGTH, INSTR 제외)
함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
LOWER(대상) | 문자열을 소문자로 | LOWER('ABC') | abc | |
UPPER(대상) | 문자열을 대문자로 | UPPER('abc') | ABC | |
SUBSTR(대상,m,n) | 문자열 중 m위치에서 n 개의 문자열 추출 |
SUBSTR('ABCDE',2,3) | BCD | |
SUBSTR('ABCDE',2) | BCDE | n 생략 시 끝까지 추출 | ||
INSTR (대상,찾을문자열,m.n) |
대상에서 찾을 문자열 위치 반환 (m위치에서 시작,n번째 발견된 문자열 위치) |
INSTR('A#B#C#','#') | 2 | m과 n 생략 시 1로 해석 |
INSTR ('A#B#C#','#',3,2) |
6 | 3번째부터 두번째 발견된 # 위치 | ||
INSTR ('A#B#C#','#',-3,2) |
2 | 뒤에서 3번째 #에서 왼쪽으로 스캔해 두 번째로 발견된 # 위치 리턴 |
||
LTRIM (대상,삭제문자열) |
문자열 중 특정 문자열을 왼쪽에서 삭제 | LTRIM('AABABAA','A') | BABAA | 삭제문자열 생략 시 공백 삭제 |
RTRIM (대상,삭제문자열) |
문자열 중 특정 문자열을 오른쪽에서 삭제 | RTRIM('AABABAA','A') | AABAB | 삭제문자열 생략 시 공백 삭제 |
TRIM(대상) | 문자열 중 특정 문자열을 양쪽에서 삭제 | TRIM(' ABCDE ') | ABCDE | ORACLE TRIM은 공백만 삭제 가능 |
LPAD(대상,n,문자열) | 대상 왼쪽에 문자열 추가해 총 n의 길이 리턴 | LPAD('ABC',5,'*') | **ABC | |
RPAD(대상,n,문자열) | 대상 오른쪽에 문자열 추가해 총 n개 길이 리턴 | RPAD('ABC',5,'*') | ABC** | |
CONCAT(대상1,대상2) | 문자열 결합 | CONCAT('A','B') | AB | 두 개 인수만 전달 가능 |
LENGTH(대상) | 문자열 길이 | LENGTH('ABCDE') | 5 | |
REPLACE (대상,찾을문자열 ,바꿀문자열) |
문자열 치환 및 삭제 | REPLACE('ABBA',AB','ab') | abAB | 세번째 인수 생략하거나 빈문자열 전달 시 찾을 문자열 삭제 가능 |
TRANSLATE (대상,찾을문자열 ,바꿀문자열) |
글자를 1대1로 치환 | TRANSLATE('ABBA','AB','ab') | abba | 매칭되는 글자끼리 치환 (A는 a로, B는 b로 각각) 바꿀 문자열생략 불가, 빈문자열 전달 시 null 리턴 |
2. 숫자형 함수
- 숫자 입력하면 숫자 값 반환
- 단일행 함수 형태 숫자함수
함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
ABS(숫자) | 절대값 반환 | ABS(-1.5) | 1.5 | |
ROUND (숫자,자리수) |
소수점 특정 자리에서 반올림 | ROUND(123.456,2) | 123.46 | 소수점 둘째자리로 반올림 |
ROUND(123.456,-2) | 100 | 자리수가 음수면 정수자리에서 반올림 (백의 자리에서 반올림 진행) |
||
TRUNC (숫자,자리수) |
소수점 특정 자리에서 버림 | TRUNC(123.456,2) | 123.45 | |
SIGN(숫자) | 숫자가 양수면 1 음수면 -1 0이면 0반환 | SIGN(100) | 1 | |
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 |
3. 날짜형 함수
함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
SYSDATE | 현재 날짜와 시간 리턴 |
SYSDATE | 2025/05/16 10:45:30 |
날짜출력형식에 따라 다르게 출력 (날짜만 출력 가능) |
CURRENT_DATE | 현재 날짜 리턴 | CURRENT_DATE | 2025/05/16 | 날짜출력형식에 따라 다르게 출력 (시간 출력될 수 있음) |
CURRENT_TIMESTAMP | 현재 타임스탬프 리턴 | CURRENT_TIMESTAMP | 2025/05/16 10:47:20 +09:00 |
|
ADD_MONTHS (날짜,n) |
날짜에서 n개월 후 날짜 리턴 |
ADD_MONTHS (SYSDATE, 3) |
2025/08/16 10:50:15 |
n이 음수인 경우 n개월 이전 날짜 리턴 |
MONTHS_BETWEEN (날짜1,날짜2) |
날짜1과 날짜2의 개월 수 리턴 |
MONTHS_BETWEEN (SYSDATE,HIREDATE) |
3.7234 | 날짜1 < 날짜2로 전달 시 음수 리턴 |
LAST_DAY(날짜,n) | 주어진 월 마지막 날짜 리턴 |
LAST_DAY(SYSDATE) | 2025/05/31 10:52:35 |
|
NEXT_DAY(날짜,n) | 주어진 날짜 이후 지정된 요일 첫 번째 날짜 리턴 |
NEXT_DAY(SYSDATE,1) | 2025/05/11 10:54:40 |
1 : 일요일, 2 : 월요일, ~ , 7 : 토요일 |
ROUND(날짜,자리수) | 날짜 반올림 | ROUND (SYSDATE,'MONTH') |
2025/06/01 0:00 | 월 이전자리에서 반올림 |
TRUNC(날짜, 자리수) | 날짜 버림 | TRUNC (SYSDATE,'MONTH') |
2025/05/01 0:00 | 월 이전자리에서 버림 |
4. 변환함수
- 값 데이터 타입 변환
- 문자를 숫자로, 숫자를 문자로, 날짜를 문자로 변경
함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
TO_NUMBER(문자) | 숫자 타입으로 변경해 리턴 | TO_NUMBER('100') | 100 | 문자100을 숫자100으로 리턴 |
TO_CHAR(대상,포맷) | 1) 날짜 포맷 변경 | TO_CHAR(SYSDATE, 'MM/DD-YYYY') | 05/16-2025 | 날짜 형식 변경 (리턴은 문자타입) |
2) 숫자 포맷 변경 | TO_CHAR (9000,'9,999') |
9,000 | 천단위 구분기호 생성 (리턴은 문자타입) |
|
TO_CHAR (9000,'09999') |
09000 | 총 5자리로 리턴 (앞 자리수 0으로) | ||
FORMAT(날짜,포맷) | 날짜 포맷 변경 | FORMAT (GETDATE(),'YYYY') |
2025 | SQL Server 함수 |
CAST (대상 AS 데이터타입) |
대상을 주어진 데이터타입으로 변환 |
CAST('100' AS int) | 100 | 문자100을 숫자100으로 리턴 |
5. 그룹함수
- 다중행 함수
- 여러 값이 input값으로 들어가서 하나의 요약된 값으로 리턴
- GROUP BY와 함께 자주 사용
함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
COUNT(대상) | 행의 수 리턴 | SELECT COUNT(SAL) FROM EMP; | 각 연산 결과 | NULL 무시하고 연산 |
SUM(대상) | 총 합 리턴 | SELECT SUM(SAL) FROM EMP; | ||
AVG(대상) | 평균 리턴 | SELECT AVG(SAL) FROM EMP; | ||
MIN(대상) | 최솟값 리턴 | SELECT MIN(SAL) FROM EMP; | ||
MAX(대상) | 최댓값 리턴 | SELECT MAX(SAL) FROM EMP; | ||
VARIANCE(대상) | 분산 리턴 | SELECT VARIANCE (SAL) FROM EMP; | ||
STDDEV(대상) | 표준편차 리턴 | SELECT STDDEV(SAL) FROM EMP; |
6. 일반함수
함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
DECODE(대상,값1,리턴1,값2,리턴2,... ,그외리턴) |
대상이 값1이면 리턴1, 값2와 같으면 리턴2,... 그외에는 그외 리턴값 리턴 |
DECODE (DEPTNO,10,A,B) |
A 또는 B | 대소비교에 따른 치환 불가 그 외 리턴 생략 시 널 리턴 |
NVL(대상,치환값) | 대상이 널이면 치환값으로 치환해 리턴 | NVL(COMM,0) | COMM값 또는 0리턴 | |
NVL2 (대상,치환값1,치환값2) |
대상이 널이면 치환값2로 치환, 널이 아니면 치환값1로 치환해 리턴 |
NVL2(COMM ,COMM*1.1,0) |
COMM*1.1값 또는 0리턴 | COMM값이 널이면 0, 널 아니면 COMM*1.1 리턴 |
COALESCE(대상1 ,대상2,...,그외리턴) |
대상들 중 널이 아닌값 출력 (가장 첫번째부터) 대상3,..., 모두가 널이면 그외 리턴값이 리턴됨 |
COALESCE (NULL,100) |
100 | 그외 리턴값 생략 시 널 리턴 |
ISNULL(대상,치환값) | 대상이 널이면 치환값이 리턴 |
ISNULL(NULL,100) | 100 | SQL Server 함수 |
NULLIF(대상1,대상2) | 두 값이 같으면 널 리턴, 다르면 대상1 리턴 |
NULLIF(10,20) | 10 | |
CASE문 | 조건별 치환 및 연산 수행 |
WHERE절
- 원하는 조건이 맞는 데이터만 조회하고 싶을 경우 사용
- 여러 조건 동시 전달 가능 (AND와 OR로 조건 연결)
- NULL 조회 시 IS NULL/IS NOT NULL 연산자 사용 (연산자로 조회 불가)
- 연산자 사용해 다양한 표현 가능
- 문자나 날짜 상수 표현 시 반드시 홑따옴표 사용 (다른 절에서도 동일 적용)
- ORACLE은 문자 상수의 경우 대소문자 구분
- MSSQL은 기본적으로 문자상수 대소문자 구분 X
연산자 종류 | 설명 |
= | 같은 조건 검색 |
!=, <> | 같지 않은 조건 검색 |
> | 큰 조건 검색 |
>= | 크거나 같은 조건 검색 |
< | 작은 조건 검색 |
<= | 작거나 같은 조건 검색 |
BETWEEN a AND b | A와 B 사이에 있는 범위 값 모두 검색 |
IN(a, b, c) | A이거나 B이거나 C인 조건 검색 |
LIKE | 특정 패턴 가지고 있는 조건 검색 |
Is Null / Is Not Null | Null 값 검색 / Null 아닌 값 검색 |
A AND B | A 조건과 B 조건을 모두 만족하는 값만 검색 |
A OR B | A 조건이나 B 조건 중 한가지라도 만족하는 값 검색 |
NOT A | A 아닌 모든 조건 검색 |
LIKE 연산자
1. % : 자리수 제한 없는 모든이라는 의미
2. _ : _ 하나 당 한 자리수 의미
ex)
ENAME LIKE 'S%' : 이름이 S로 시작
ENAME LIKE '%S%' : 이름에 S를 포함
ENAME LIKE '%S' : 이름이 S로 끝남
ENAME LIKE '_S%' : 이름 두 번째 글자가 S
ENAME LIKE '__S__' : 이름 가운데 글자가 S이며 이름 길이 5글자
'Study > SQLD' 카테고리의 다른 글
[SQLD] SQLD 정리 (1) (4) | 2025.05.27 |
---|---|
[SQLD] SQLD 2과목 SQL기본 및 활용 (2) (1) | 2025.05.27 |
[SQLD] SQLD 1과목 데이터 모델링의 이해 (2) (3) | 2025.05.15 |
[SQLD] SQLD 1과목 데이터 모델링의 이해 (1) (2) | 2025.05.14 |
[SQLD] 핵심요약 (3) (0) | 2025.05.12 |