본문 바로가기

백엔드 잡학사전

SQL BASICS 뽀개기 (수정 중)

DBMS, RDBMS, NoSQL

데이터들은 DB에 저장.

이 DB를 관리하는 시스템을 DBMS 즉, DataBase Management System이라고 함.

RDBMS는 데이터가 표 형태로 저장되어 고정된 스키마를 가지고 있는 형태를 뜻하고.

NoSQL은 데이터가 고정된 스키마 없이 다양한 방식으로 저장 가능 - 딕셔너리, 문서, 그래프 등.

RDBMS로는 MySQL, PostgreSQL, Oracle 등이, NoSQL로는 MongoDB (문서형) 등이 있음.

RDBMS수직확장(기존의 서버를 업그레이드)에 더 적합함. 수평확장 (다중 서버)은 어려움.

RDBMS에 우리가 접근하여 뭔가 인터랙션할 수 있는 언어가 SQL. NoSQL은 다 다름 - MongoDBMQL.

 

* 기본적으로는 SQL은 백엔드 DB용이지만, 프론트나 iOS, 안드로이드에서도 쓰고 싶으면 SQLite 쓰면 됨.

 

DB > 테이블 > 레코드 > 컬럼

DB는 테이블 단위로 나눌 수 있음. 기능 단위로, 회원 테이블, 메뉴 테이블, 게시글 테이블 등.

테이블을 이루는 단위는 레코드. 게시글 테이블이라면 1번 글, 2번 글, ... 각각이 레코드.

그리고 각각의 레코드에 대해, 작성자, 날짜, 내용 등 해당 레코드를 또 나눈 항목들이 컬럼. 메타데이터 느낌!

 

INDEX

컬럼을 탐색하려면, O(N)만큼의 시간이 걸리는데, 더 효율적으로 만들기 위해서 트리의 형태로 해당 컬럼을 저장해두는 것. B+TREE라는 형태의 저장법을 활용한다.

 

SQL 문법

(1) 질의어 (Data Query Language)

 

테이블에서 컬럼 가져오고 싶으면, SELECT [CustomerName] FROM [Customers]

두개 가져오고 싶으면,  SELECT [CustomerName], [Address] FROM [Customers]

다 가져오고 싶으면 SELECT * FROM [Customers]

특정한 조건에 맞는 것들만 가져오고 싶으면 SELECT [Address] FROM [Customers] WHERE [Age] = 19;

WHERE을 쓸 때, RANGE 관련이 나오면 [Age] BETWEEN [x] AND [y] 이런 식으로 작성.

마찬가지로, 특정한 문자열을 포함하는지를 확인하기 위해선 WHERE [Options] LIKE %[King]% 이런 식으로 씀.

이게 중요하다. [Date] = '2022-01' 뭐 이런 식이라면, DB의 컬럼 인덱스를 활용할 수 없기 때문에 비효율적임.

컬럼의 순서대로 정렬하고 싶다면 SELECT [Name] FROM [Customers] ORDER BY [Age]

컬럼의 반대 순서대로 정렬하고 싶다면 ... ORDER BY [Age] DESC

컬럼의 정렬은 큰 흐름, 작은 흐름 순으로 적용하고 싶다면 ORDER BY [Age], [Name] DESC 이런 식으로.

새로운 컬럼을 만들고 싶으면 SELECT [Val] AS [Average_fee] FROM ...

 

ROUND(, 0)은 소수점에서 반올림하기, AVG()는 평균내기, LEFT(, 3)은 왼쪽에서 세개 글자, UPPER()은 대문자화.

... IS NULL 이렇게 is 도 쓸 수 있음.

 

몇개의 레코드만 샘플 식으로 가져오고 싶다면, LIMIT 10 이렇게 해주면 상위 10개만 나옴.

 

 

(2) 조작어 (Data Manipulation Language)

 

두개 이상의 테이블을 엮고 싶으면, JOIN 키워드를 활용하면 됨. INNER, FULL, LEFT, RIGHT, CROSS JOIN

하고, ON 으로 엮어주면 됨. WHERE과는 별개임. ON을 통해서 기준이 될 칼럼에 대한 정보를 저장하는 것.

 

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

SELECT A.column1, B.column2
FROM TableA A
FULL OUTER JOIN TableB B ON A.id = B.id;

 

데이터 결합, 데이터 무결성 유지, 효율적인 데이터 검색.

 

* COALESCE(TLNO, 'NONE'): TLNO가 None이면 'NONE' 처리하도록.

* 비트 연산도 자주 씀. 특히나 하나의 DB에서 여러 개의 버전을 만들어야 할때.

 

 

GROUP BY

 

SQL에서 데이터를 그룹화할 때 사용하는 명령어.

데이터를 특정 컬럼을 기준으로 그룹화하고, 집계 함수(예: COUNT(), SUM(), AVG(), MIN(), MAX() 등)를 적용 가능.

기준이 되는 녀석을 기준으로 다 GATHER한다는 뜻. HAVING으로 세부조건을 조정해줌.

 

 

만약 아래처럼 해주면, COUNT(*)에서 *가 받는 건 USER_ID와 PRODUCT_ID 의 조합.

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID ASC, PRODUCT_ID DESC;

 

데이터 정규화 등...

관련해서 Chat GPT 활용하자

https://chatgpt.com/c/67085b44-45e0-8013-9198-781fedef10d9