관계형 데이터베이스 개요
DB
- 데이터들을 저장하는 공간
- 용도와 목적에 맞는 데이터들끼리 모아서 저장
<그림>
관계형 데이터베이스 (Relational DB)
- 관계형 데이터 모델에 기초를 둔 DB
- 모든 데이터를 2차원 테이블 형태로 표현한 뒤 각 테이블 간의 관계 정의
- RDBMS (Relational DB Management System) : RDB를 관리, 감독하기 위한 시스템 -> Oracle, SQL Server, MySQL, MariaDB, PostgreSQL 등이 이에 속함.
TABLE
- 엑셀을 작성할 때 흔히 이용하는 표 형식
- Row : 각각의 가로 행
- Col : 세로 열로, 속성이라고도 표현한다.
- 관계형 데이터베이스의 기본 단위이고 DB는 여러 개의 테이블로 구성된다.
- TABLE 형태로 데이터를 저장하는 주된 목적은 데이터를 활용하기 위해 저장하는 것.
<그림>
SQL (Structured Query Language)
- RDB에서 데이터를 다루기 위해 사용하는 언어
- SQL은 어떻게 작성하느냐에 따라 성능 차가 확연히 드러나기 때문에 잘 작성하고 Tuning 하는 것이 매우 중요
SELECT 문
SELECT
- 저장되어 있는 데이터를 조회하고자 할 때 사용하는 명령어
- Column 명시하지 않고 (*)를 사옹하면 전체 컬럼 조회
- 조회되는 Column 순서는 TABLE Column 순서와 동일
- 별도의 WHERE 절이 없으면 테이블의 전체 Row 조회
SELECT Column1, ... FROM TABLE WHERE Column1 = "아무개";
SELECT * FROM TABLE;
- TABLE name 이나 Column name 에 별도의 별칭 (Alias) 을 붙여줄 수 있는데, 붙여주는 목적은 평소 우리가 줄임말을 쓰는 이유와 같음.
- 앞에 AS를 넣어도 되고 넣지 않아도 됨.
SELECT BAND, BAND_NAME, BAND_MEMBER.MEMBER_NAME
FROM BAND, BAND_MEMBER;
SELECT B.BAND_NAME, BM.MEMBER_NAME
FROM BAND AS B, BAND_MEMBER AS BM;
산술 연산자
- NUMBER, DATE 유형의 데이터와 같이 사용할 수 있음
- NULL이 포함되어 있는 경우 결과값은 NULL이 됨.
연산자 | 의미 | 우선순위 |
() | 괄호로 우선순위를 조정할 수 있음 | 1 |
* | 곱하기 | 2 |
/ | 나누기(0으로 나눌 경우 에러 발생) | |
+ | 더하기 | 3 |
- | 빼기 | |
% (SQL Server) | 나머지 (0으로 나눌 경우 NULL 반환) |
합성 연산자
- 문자와 문자를 연결할 때 사용하는 연산자
SELECT 'S' || 'Q' || 'L' || '개' || '발' || '자' AS SQLD
FROM DUAL;
함수
문자 함수
1️⃣ CHR(ASCII 코드)
- ASCII 코드는 총 128개의 문자를 숫자로 표현 가능하도록 정의 해놓은 코드
- CHR function은 ASCII 코드를 인수로 입력했을 때 해당하는 문자가 무엇인지를 알려주는 함수
SELECT CHR(65) FROM DUAL; # CHR(65) -> A
2️⃣ LOWER(문자열)
- 문자열을 소문자로 변환해주는 함수
SELECT LOWER('JENNIE') FROM DUAL;
3️⃣ UPPER(문자열)
- 문자열을 대문자로 변환해주는 함수
SELECT UPPER('JENNIE') FROM DUAL;
4️⃣ LTRIM(문자열[,특정 문자])
- []는 옵션
- 특정 문자를 따로 명시해주지 않으면 문자열의 왼쪽 공백을 제거하고, 명시해주었을 경우 문자열을 왼쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되어 있지 않으면 멈춘다.
- SQL Server(MSSQL)의 경우 공백제거만 가능
SELECT LTRIM(' JENNIE') FROM DUAL; #' JENNIE' -> 'JENNIE'
5️⃣ RTRIM(문자열[, 특정 문자])
- []는 옵션
- 특정 문자를 따로 명시해주지 않으면 문자열의 오른쪽 공백을 제거하고, 명시해주었을 경우 문자열을 오른쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되지 않았으면 멈춘다.
SELECT RIRTM('JENNIE ') FROM DUAL; # 'JENNIE ' -> 'JENNIE'
6️⃣ TRIM([위치][특정 문자][FROM] 문자열)
- []는 옵션
- 옵션이 하나도 없을 경우 왼쪽과 오른쪽의 공백을 제거하고, 그렇지 않을 경우 문자열을 위치 (LEADING or TRAILING or BOTH)로 지정된 곳부터 한 글자씩 특정 문자와 비교하여 같으면 제거하고 같지 않으면 멈춘다. 특정 문자는 한 글자만 제거 가능
SELECT TRIM(LEADING '블' FROM '블랙핑크') FROM DUAL; # 블랙핑크 -> 랙핑크
- LEADING : 왼쪽
- TRAILING : 오른쪽
7️⃣ SUBSTR(문자열, 시작점[, 길이])
- []는 옵션
- 문자열의 원하는 부분만 잘라서 반환해주는 함수로, 길이를 명시하지 않았을 경우 문자열의 시작점부터 문자열의 끝까지 반환
- SQL Server(MSSQL)의 경우 SUBSTRING(문자열)
SELECT SUBSTR('블랙핑크제니', 3, 2) FROM DUAL; # 블랙핑크제니 -> 핑크
8️⃣ LENGTH(문자열)
- 문자열의 길이를 반환해주는 함수
- SQL Server(MSSQL)의 경우 LEN(문자열)
SELECT LENGTH('JENNIE') FROM DUAL;
9️⃣ REPLACE(문자열, 변경 전 문자열[, 변경 후 문자열])
- 문자열에서 변경 전 문자열을 찾아 변경 후 문자열로 바꿔주는 함수
- 변경 후 문자열을 명시해주지 않으면 문자열에서 변경 전 문자열을 제거.
SELECT REPLACE('블랙핑크제니', '제니', '지수') FROM DUAL; # 블랙핑크제니 -> 블랙핑크지수
SELECT REPLACE('블랙핑크제니', '블랙') FROM DUAL; # 블랙핑크제니 -> 핑크제니
🔟 LPAD(문자열, 길이, 문자)
- 문자열이 설정한 길이가 될 때까지 왼쪽을 특정 문자로 채우는 함수
SELECT LPAD('JENNIE', 10, 'V') # V -> VVVVJENNIE
숫자 함수
1️⃣ ABS (수)
- 수의 절대값을 반환해주는 함수
2️⃣ SIGN(수)
- 수의 부호를 반환해주는 함수 (양수 : 1, 음수 : -1, 0이면 0 반환)
3️⃣ ROUND(수[, 자릿수])
- 수를 지정된 소수점 자릿수까지 반올림해서 반환하는 함수
- 자릿수를 명시하지 않았을 경우 기본값은 0이며 반올림된 정수로 반환하고 자릿수가 음수일 경우 지정된 정수부를 반올림하여 반환
4️⃣ TRUNC(수[, 자릿수])
- 수를 지정된 소수점 자릿수까지 버림하여 반환해주는 함수
- 자릿수를 명시하지 않았을 경우 기본값은 0이며 버림된 정수로 반환하고 자릿수가 음수일 경우 지정된 정수부에서 버림하여 반환
5️⃣ CEIL(수)
- 소수점 이하의 수를 올림한 정수를 반환해주는 함수
- SQL Server(MSSQL)의 경우 CEILING(문자열)
6️⃣ FLOOR(수)
- 소수점 이하의 수를 버림한 정수를 반환해주는 함수
7️⃣ MOD(수1, 수2)
- 수1을 수2로 나눈 나머지를 반환해주는 함수
날짜 함수
1️⃣ SYSDATE
- 현재의 연, 월, 일, 시, 분, 초를 반환해주는 함수(nls_date_format에 따라서 sysdate의 출력 양식은 달라질 수 있음)
- SQL Server(MSSQL)의 경우 GETDATE()
2️⃣ EXTRACT(특정 단위 FROM 날짜 데이터)
- 날짜 데이터에서 특정 단위 (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND)만을 출력해서 반환해주는 함수
- SQL Server(MSSQL)의 경우 DATEPART(특정 단위, 날짜 데이터)
3️⃣ ADD_MONTHS(날짜 데이터, 특정 개월 수)
- 날짜 데이터에서 특정 개월 수를 더한 날짜를 반환해주는 함수
- 날짜의 이전 달이나 다음 달에 기준 날짜의 일자가 존재하지 않으면 해당 월의 마지막 일자가 반환
변환 함수
1️⃣ 명시적 형변환과 암시적 형변환
- 명시적 형변환 : 변환 함수를 사용하여 데이터 유형 변환을 명시적으로 나타냄
- 암시적 형변환 : 데이터베이스가 내부적으로 알아서 데이터 유형 변환
- 암시적 형변환이 가능하다고 Column 데이터 유형을 고려하지 않고 SQL 작성하게 되면 성능 저하 or 에러 발생 가능
2️⃣ 명시적 형변환에 쓰이는 함수
- SQL Server(MSSQL)의 경우, CONVERT나 CAST 함수를 사용할 수 있음
- TO_NUMBER(문자열) : 문자열을 숫자형으로 변환해주는 함수
- TO_CHAR(수 or 날짜[, 포맷]) : 수나 날짜형의 데이터를 포맷 형식의 문자형으로 변환해주는 함수
- TO_DATE(문자열, 포맷) : 포맷 형식의 문자형 데이터를 날짜형으로 변환해주는 함수
NULL 관련 함수
1️⃣ NVL(인수1, 인수2)
- 인수1의 값이 NULL인 경우 인수2를 반환하고 NULL이 아닐 경우 인수1을 반환해주는 함수
- SQL Server(MSSQL)의 경우 ISNULL(인수1, 인수2)
2️⃣ NULLIF(인수1, 인수2)
- 인수1과 인수2가 같으면 NULL을 반환하고 같지 않으면 인수1을 반환해주는 함수
3️⃣ COALESCE(인수1, 인수2, 인수3...)
- NULL이 아닌 최초의 인수를 반환해주는 함수
CASE
- 함수와 성격이 비슷하지만 구문에 가까운 표현 (~이면 ~이고, ~이면 ~이다)
WHERE절
- DML (except > INSERT) 문을 수행할 때 원하는 데이터만 골라서 수행할 수 있도록 해주는 구문
- SELECT Column1, ... FROM Table name WHERE 조건절;
- UPDATE Table name SET column name = 새로운 데이터 WHERE 조건절;
- DELETE FROM Table name WHERE 조건절;
비교 연산자
연산자 | 의미 | 예시 |
= | 같음 | where col = 10 |
< | 작음 | where col < 10 |
> | 큼 | where col > 10 |
<= | 작거나 같음 | where col <= 10 |
>= | 크거나 같음 | where col >= 10 |
- 문자형 Column을 비교 조건으로 사용하려면 우측 상수값을 반드시 인용부호로 감싸주어야 함
부정 비교 연산자
연산자 | 의미 | 예시 |
!= | 같지 않음 | where col != 10 |
^= | 같지 않음 | where col ^= 10 |
< > | 같지 않음 | where col <> 10 |
not 컬럼명 = | 같지 않음 | where not col = 10 |
not 컬럼명 > | 크지 않음 | where not col > 10 |
SQL 연산자
연산자 | 의미 | 예시 |
BETWEEN A AND B | A와 B의 사이(A, B 포함) | where col between 1 and 10 |
LIKE "비교 문자열" | 비교 문자열을 포함 | where col LIKE "방탄%" where col LIKE "%소년단" where col LIKE "%탄소년%" where col LIKE "방_소%" |
IN (LIST) | LIST 중 하나와 일치 | where col in (1, 3, 5) |
IS NULL | NULL 값 | where col is null |
부정 SQL 연산자
연산자 | 의미 | 예시 |
NOT BETWEEN A AND B | A와 B의 사이가 아님(A, B 미포함) | where col not between 1 and 10 |
NOT IN (LIST) | LIST 중 일치하는 것이 없음 | where col not in (1, 3, 5) |
IS NOT NULL | NULL 값이 아님 | where col is not null |
논리 연산자
연산자 | 의미 | 예시 |
AND | 모든 조건이 True | where col > 1 and col < 10 |
OR | 하나 이상의 조건이 TRUE | where col = 1 or col = 10 |
NOT | TRUE면 FALSE, FALSE면 TRUE | where not col > 10 |
- 처리 순서 : () -> NOT -> AND -> OR
GROUP BY, HAVING 절
GROUP BY
- 데이터를 그룹별로 묶음
- BY 뒤에는 그룹핑의 기준이 되는 컬럼(하나 이상)
집계 함수
- 데이터를 그룹별로 나누면 그룹별로 집계 데이터를 도출하는 것이 가능
COUNT(*) | 전체 Row를 Count해서 변환 |
COUNT(Column) | 컬럼 값이 Null인 Row를 제외하고 Count해서 반환 |
COUNT(DISTINCT 컬럼) | 컬럼값이 Null이 아닌 Row에서 중복을 제거한 Count를 반환 |
SUM(컬럼) | 컬럼값들의 합계를 반환 |
AVG(컬럼) | 컬럼값들의 평균을 반환 |
MIN(컬럼) | 컬럼값들의 최솟값을 반환 |
MAX(컬럼) | 컬럼값들의 최댓값을 반환 |
HAVING
- WHERE처럼 사용하는 조건절
- 데이터를 그룹핑한 후 특정 그룹을 골라낼 때 사용
- 그룹핑 후에 가능한 집계 함수로 조건 부여 가능
- SELECT 절 전에 수행되기 때문에 SELECT 절에 명시되지 않은 집계 함수로도 조건을 부여할 수 있음
- WHERE절을 사용해도 되는 조건까지 HAVING에 사용하면 성능이 떨어질 수 있음 -> WHERE절에서 필터링이 선행되어야 GROUP BY 할 데이터량이 줄어들기 때문임
- GROUP BY는 비교적 많은 비용이 드는 작업이므로 수행 전에 데이터량을 최소로 줄여 놓는 것이 바람직함.
ORDER BY절
ORDER BY
- SELECT 문의 논리적 수행 순서
1. FROM -> 2. WHERE -> 3. GROUP BY -> 4. HAVING -> 5. SELECT -> 6. ORDER BY
- SELECT한 데이터를 정렬할 수 있고, 따로 명시하지 않으면 임의의 순서대로 출력
- ORDER BY Column (정렬의 기준) ASC(Defalut : 오름차순) / DESC(내림차순)
- 정렬의 기준이 되는 컬럼에 NULL 데이터가 포함되어 있을 경우 DB 종류에 따라 정렬의 위치가 달라짐.
JOIN
JOIN이란?
- 각기 다른 테이블을 한 번에 보여줄 때 사용
- EQUI JOIN : (=) 조건 조인
- Non EQUI JOIN : (>, >=, <, <=) 조건 조인
- Oracle 에서는 OUTER JOIN 반대편에 + 기호 붙여서 작성
- FULL OUTER JOIN은 중복값은 제거하고 모두 출력됨
- CROSS JOIN : A와 B 테이블 사이에 JOIN 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력 -> Cartesian Product
'Data Engineer > SQLD' 카테고리의 다른 글
SQLD - SQL 활용 (1) | 2024.11.18 |
---|---|
데이터 모델과 SQL (3) | 2024.11.09 |
SQLD - Data modeling (5) | 2024.11.03 |