SQL 기본

관계형 데이터베이스 개요

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이란?

  • 각기 다른 테이블을 한 번에 보여줄 때 사용

출처 : https://velog.io/@youjung/MySQL-JOIN

 

  • EQUI JOIN : (=) 조건 조인
  • Non EQUI JOIN : (>, >=, <, <=) 조건 조인

출처 : https://minah-workmemory.tistory.com/24

 

  • 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