MySQL 기준으로 작성된 SQL 기초 학습 노트입니다.
| 분류 | 타입 | 설명 |
|---|---|---|
| 숫자 | INT | 일반 정수 |
BIGINT | 큰 정수 | |
FLOAT | 소수 | |
DOUBLE | 더 긴 소수 | |
DECIMAL | 오차 없이 소수 저장 (금액 등에 적합) | |
| 문자 | VARCHAR(100) | 일반 문자열 (가변 길이) |
MEDIUMTEXT | 긴 문자열 | |
LONGTEXT | 매우 긴 문자열 | |
| 날짜/시간 | DATETIME | YYYY-MM-DD HH:MM:SS 형식 |
-- 전체 컬럼 출력
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;
CSV에서 가져오기 클릭 후 파일 업로드SELECT * FROM product WHERE 컬럼 = '값';
-- 비교 연산자: =, !=, >, <, >=, <=
SELECT * FROM product WHERE 상품명 > '가'; -- 문자 비교도 가능
SELECT * FROM product WHERE 가격 BETWEEN 5000 AND 8000;
SELECT * FROM product
WHERE 가격 = 5000 AND 카테고리 = '가구';
-- 괄호로 우선순위 지정
SELECT * FROM product
WHERE 가격 = 5000 AND (카테고리 = '가구' OR 카테고리 = '옷');
SELECT * FROM product
WHERE NOT 카테고리 = '가구' AND NOT 가격 = 5000;
-- 아래 두 쿼리는 동일한 결과
SELECT * FROM product
WHERE 카테고리 = '신발' OR 카테고리 = '가전' OR 카테고리 = '식품';
SELECT * FROM product
WHERE 카테고리 IN ('신발', '가전', '식품');
💡 코드 잘 짜는 팁: SQL을 바로 짜지 말고, 원하는 조건을 먼저 한글로 정리한 뒤 SQL로 변환하세요.
-- 특정 단어 포함 검색
SELECT * FROM product WHERE 상품명 LIKE '%소파%';
-- % : 임의의 문자열
-- _ : 임의의 문자 1개
-- __ : 임의의 문자 2개
⚠️ 주의사항
%를 남용하면 인덱스를 활용하지 못해 성능 이슈 발생 가능LIKE와%는 주로VARCHAR컬럼에 사용CHAR컬럼은 공백으로 패딩되어 저장되므로 예상과 다르게 작동할 수 있음
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';
SELECT DISTINCT 연체횟수 FROM card;
-- 집계와 함께 사용
SELECT AVG(DISTINCT 연체횟수) FROM card;
-- 사용금액 상위 1개 행 출력 (일부 상황에서 MAX()보다 빠를 수 있음)
SELECT 사용금액 FROM card ORDER BY 사용금액 DESC LIMIT 1;
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'
| 함수 | 설명 | 예시 |
|---|---|---|
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()를 사용합니다.
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. 반드시 소괄호로 감싸야 함
-- 고객등급별 평균 사용금액
SELECT 고객등급, AVG(사용금액) FROM card GROUP BY 고객등급;
-- 고객등급별 최대 사용금액
SELECT 고객등급, MAX(사용금액) FROM card GROUP BY 고객등급;
-- 고객등급별 인원 수
SELECT 고객등급, COUNT(사용금액) FROM card GROUP BY 고객등급;
💡
GROUP BY뒤에는 주로 카테고리성 컬럼 사용 (예: 고객등급, 지역, 성별)
| 구분 | 역할 |
|---|---|
WHERE | GROUP BY 이전에 원본 행 필터링 |
HAVING | GROUP 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 연체횟수;
-- 기본 구조: IF(조건식, 참일 때 값, 거짓일 때 값)
SELECT IF(1 + 2 = 4, 'aaa', 'bbb'); -- 결과: bbb
SELECT 사용금액, IF(사용금액 > 200000, '우수', '거지') FROM card;
SELECT 사용금액,
CASE
WHEN 사용금액 >= 200000 THEN '우수'
WHEN 사용금액 >= 100000 THEN '준수'
ELSE '거지'
END AS 평가
FROM card;
💡
WHEN조건은 위에서부터 순서대로 평가되므로, 범위가 큰 조건일수록 먼저 써주세요.
-- 고객등급에 따라 가중치 점수 합산
SELECT SUM(
CASE
WHEN 고객등급 = 'vip' THEN 3
WHEN 고객등급 = '로열' THEN 2
ELSE 1
END
) AS 총점수
FROM card;
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT