SQL & Database

김우진·2026년 3월 7일

DataBase

목록 보기
1/3
post-thumbnail

SQL 기초 정리 1🗄️

MySQL 기준으로 작성된 SQL 기초 학습 노트입니다.


1. 데이터베이스 설치

  • DBeaver 사용 권장 — 깔끔하고 직관적이며, MySQL 외 다른 DBMS(PostgreSQL, Oracle 등)도 쉽게 연결 가능

2. 테이블 만들기 & 데이터 타입

  • database = 폴더 개념
  • table = 파일 개념
  • 테이블을 만들기 전에 어떤 컬럼(열)이 들어갈지 미리 설계해야 함
    • 예) 상품 테이블 → 가격, 이름, 카테고리 컬럼

📌 주요 데이터 타입

분류타입설명
숫자INT일반 정수
BIGINT큰 정수
FLOAT소수
DOUBLE더 긴 소수
DECIMAL오차 없이 소수 저장 (금액 등에 적합)
문자VARCHAR(100)일반 문자열 (가변 길이)
MEDIUMTEXT긴 문자열
LONGTEXT매우 긴 문자열
날짜/시간DATETIMEYYYY-MM-DD HH:MM:SS 형식

3. 데이터 출력과 정렬 — SELECT, ORDER BY

기본 출력

-- 전체 컬럼 출력
SELECT * FROM 테이블이름;

-- 데이터베이스명 명시
SELECT * FROM 데이터베이스이름.테이블이름;

-- 특정 컬럼만 출력
SELECT 컬럼1, 컬럼2 FROM 테이블이름;

정렬

-- 오름차순(기본값)
SELECT * FROM 테이블이름 ORDER BY 컬럼 ASC;

-- 내림차순
SELECT * FROM 테이블이름 ORDER BY 컬럼 DESC;

-- 다중 정렬 (첫 번째 기준 정렬 후, 같은 값 내에서 두 번째 기준으로 다시 정렬)
SELECT * FROM 테이블이름 ORDER BY 컬럼1 ASC, 컬럼2 DESC;

4. 데이터 필터링 — WHERE

CSV 파일을 테이블에 가져오는 방법 (DBeaver)

  1. 기존 데이터 전체 선택 후 삭제 & 저장
  2. 테이블 우클릭 → 데이터 가져오기
  3. CSV에서 가져오기 클릭 후 파일 업로드
  4. 한글 데이터가 있다면 인코딩을 EUC-KR로 변경
  5. 파일명과 동일한 이름의 테이블이 생성됨 (기존 동일 이름 테이블은 미리 삭제 권장)

기본 필터링

SELECT * FROM product WHERE 컬럼 = '값';

-- 비교 연산자: =, !=, >, <, >=, <=
SELECT * FROM product WHERE 상품명 > '가';  -- 문자 비교도 가능

BETWEEN (범위 조건)

SELECT * FROM product WHERE 가격 BETWEEN 5000 AND 8000;

5. 복합 조건 — AND, OR, NOT, IN

AND / OR

SELECT * FROM product
WHERE 가격 = 5000 AND 카테고리 = '가구';

-- 괄호로 우선순위 지정
SELECT * FROM product
WHERE 가격 = 5000 AND (카테고리 = '가구' OR 카테고리 = '옷');

NOT (조건 제외)

SELECT * FROM product
WHERE NOT 카테고리 = '가구' AND NOT 가격 = 5000;

IN (여러 값 조건 축약 — 단일 컬럼에만 사용 가능)

-- 아래 두 쿼리는 동일한 결과
SELECT * FROM product
WHERE 카테고리 = '신발' OR 카테고리 = '가전' OR 카테고리 = '식품';

SELECT * FROM product
WHERE 카테고리 IN ('신발', '가전', '식품');

💡 코드 잘 짜는 팁: SQL을 바로 짜지 말고, 원하는 조건을 먼저 한글로 정리한 뒤 SQL로 변환하세요.


6. 패턴 검색 — LIKE, %, _

-- 특정 단어 포함 검색
SELECT * FROM product WHERE 상품명 LIKE '%소파%';

-- % : 임의의 문자열
-- _ : 임의의 문자 1개
-- __ : 임의의 문자 2개

⚠️ 주의사항

  • %를 남용하면 인덱스를 활용하지 못해 성능 이슈 발생 가능
  • LIKE%는 주로 VARCHAR 컬럼에 사용
  • CHAR 컬럼은 공백으로 패딩되어 저장되므로 예상과 다르게 작동할 수 있음

7. 집계 함수 — MIN, MAX, AVG, SUM, COUNT

SELECT MAX(결제횟수) FROM card;
SELECT MIN(결제횟수) FROM card;
SELECT AVG(결제횟수) FROM card;
SELECT SUM(결제횟수) FROM card;
SELECT COUNT(*) FROM card;

-- 여러 집계 동시에
SELECT MAX(결제횟수), MAX(사용금액) FROM card;

-- AS로 컬럼명 변경
SELECT MAX(사용금액) AS 최대사용금액 FROM card;

-- WHERE와 함께 일부 행만 집계
SELECT AVG(사용금액) FROM card WHERE 고객등급 = 'vip';

중복 제거 — DISTINCT

SELECT DISTINCT 연체횟수 FROM card;

-- 집계와 함께 사용
SELECT AVG(DISTINCT 연체횟수) FROM card;

ORDER BY + LIMIT으로 최대/최소 구하기

-- 사용금액 상위 1개 행 출력 (일부 상황에서 MAX()보다 빠를 수 있음)
SELECT 사용금액 FROM card ORDER BY 사용금액 DESC LIMIT 1;

8. 컬럼 연산 & 문자 함수

사칙연산

SELECT 사용금액 * 10 FROM card;
SELECT 사용금액 / 결제횟수 FROM card;  -- 컬럼끼리 연산도 가능

문자 함수

-- 문자 이어붙이기
SELECT CONCAT(고객명, ' is ', 고객등급) FROM card;

-- 좌우 공백 제거
SELECT TRIM('  hello  ') FROM card;

-- 문자 치환
SELECT REPLACE(고객등급, '패', '훼') FROM card;

-- 일부 문자열 추출 (시작위치, 길이)
SELECT SUBSTR(고객명, 3, 2) FROM card;

-- 일부 문자열 교체 (시작위치, 교체할길이, 바꿀단어)
SELECT INSERT('test@naver.com', 1, 4, 'hello') FROM card;
-- 결과: 'hello@naver.com'

9. 숫자 함수

함수설명예시
GREATEST()여러 값 중 최댓값GREATEST(5, 3, 2) → 5
LEAST()여러 값 중 최솟값LEAST(5, 3, 2) → 2
FLOOR()소수 내림FLOOR(10.9) → 10
CEIL()소수 올림CEIL(10.1) → 11
ROUND(n, d)소수점 d자리 반올림ROUND(10.777, 2) → 10.78
TRUNCATE(n, d)소수점 d자리 내림TRUNCATE(10.777, 2) → 10.77
POWER(a, b)거듭제곱POWER(4, 2) → 16
ABS()절댓값ABS(-100) → 100

💡 MAX() / MIN()한 컬럼 안에서 최대·최소를 구하고,
GREATEST() / LEAST()한 행 안의 여러 값 중에서 최대·최소를 구합니다.

💡 Oracle, PostgreSQL에서는 TRUNCATE() 대신 TRUNC()를 사용합니다.


10. 서브쿼리

SELECT 안에 또 다른 SELECT를 넣는 문법입니다.

-- 사용금액이 평균보다 높은 사람만 출력
SELECT * FROM card
WHERE 사용금액 > (SELECT AVG(사용금액) FROM card);

-- SELECT 절에서 활용
SELECT 사용금액, (SELECT AVG(사용금액) FROM card) FROM card;

-- IN 절에서 활용
SELECT * FROM card
WHERE 고객명 IN (SELECT 이름 FROM blacklist);

⚠️ 서브쿼리 주의사항
1. 서브쿼리는 숫자·문자(데이터) 위치에 넣을 수 있음
2. 반드시 1개의 값만 반환하는 쿼리여야 함 (여러 행 반환 시 오류)
3. 반드시 소괄호로 감싸야 함


11. 그룹별 집계 — GROUP BY, HAVING

-- 고객등급별 평균 사용금액
SELECT 고객등급, AVG(사용금액) FROM card GROUP BY 고객등급;

-- 고객등급별 최대 사용금액
SELECT 고객등급, MAX(사용금액) FROM card GROUP BY 고객등급;

-- 고객등급별 인원 수
SELECT 고객등급, COUNT(사용금액) FROM card GROUP BY 고객등급;

💡 GROUP BY 뒤에는 주로 카테고리성 컬럼 사용 (예: 고객등급, 지역, 성별)

WHERE vs HAVING

구분역할
WHEREGROUP BY 이전에 원본 행 필터링
HAVINGGROUP BY 이후에 그룹 결과 필터링
-- HAVING으로 그룹 결과 필터링
SELECT 고객등급, MAX(사용금액) FROM card
GROUP BY 고객등급
HAVING 고객등급 = 'vip' OR 고객등급 = '패밀리';

-- WHERE + GROUP BY + HAVING 함께 사용
SELECT 고객등급, MAX(사용금액) FROM card
WHERE 연체횟수 = 0
GROUP BY 고객등급
HAVING 고객등급 = 'vip' OR 고객등급 = '패밀리';

-- AS로 작명한 컬럼으로도 HAVING 필터링 가능
SELECT 연체횟수, COUNT(*) AS 인원수 FROM card
GROUP BY 연체횟수
HAVING 인원수 != 1
ORDER BY 연체횟수;

12. 조건 분기 — IF, CASE

IF (양자택일)

-- 기본 구조: IF(조건식, 참일 때 값, 거짓일 때 값)
SELECT IF(1 + 2 = 4, 'aaa', 'bbb');  -- 결과: bbb

SELECT 사용금액, IF(사용금액 > 200000, '우수', '거지') FROM card;

CASE (3가지 이상 분기)

SELECT 사용금액,
  CASE
    WHEN 사용금액 >= 200000 THEN '우수'
    WHEN 사용금액 >= 100000 THEN '준수'
    ELSE '거지'
  END AS 평가
FROM card;

💡 WHEN 조건은 위에서부터 순서대로 평가되므로, 범위가 큰 조건일수록 먼저 써주세요.

CASE + 집계 함수 응용

-- 고객등급에 따라 가중치 점수 합산
SELECT SUM(
  CASE
    WHEN 고객등급 = 'vip'  THEN 3
    WHEN 고객등급 = '로열' THEN 2
    ELSE 1
  END
) AS 총점수
FROM card;

📋 SQL 실행 순서 요약

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

0개의 댓글