데이터베이스 환경 설정
이 가이드에서 다룰 고급 SQL 쿼리 예제들을 실습하기 위해 MySQL 데이터베이스를 설정하고 필요한 테이블과 데이터를 준비합니다.
-- MySQL 서버에 root 사용자로 접속
mysql -uroot -p
-- 데이터베이스 목록 확인 (선택 사항)
SHOW DATABASES;
-- 'enterprise_db' 데이터베이스 생성 및 선택
CREATE DATABASE enterprise_db;
USE enterprise_db;
-- 지점 정보 저장 테이블 생성
CREATE TABLE branches (
region VARCHAR(20),
branch_name VARCHAR(20)
);
-- 지점 정보 삽입
INSERT INTO branches VALUES ('East', '서울');
INSERT INTO branches VALUES ('East', '부산');
INSERT INTO branches VALUES ('West', '대구');
INSERT INTO branches VALUES ('West', '광주');
SELECT * FROM branches;
-- 판매 기록 저장 테이블 생성
CREATE TABLE sales (
branch_name VARCHAR(20),
amount INT(10),
sale_date DATE
);
-- 판매 기록 삽입
INSERT INTO sales VALUES ('대구', 1500, '2023-10-05');
INSERT INTO sales VALUES ('광주', 250, '2023-10-07');
INSERT INTO sales VALUES ('대구', 300, '2023-10-08');
INSERT INTO sales VALUES ('서울', 700, '2023-10-08');
INSERT INTO sales VALUES ('서울', 1800, '2023-10-09');
SELECT * FROM sales;
MySQL 고급 SQL 구문 탐색
1. SELECT - 데이터 조회
테이블에서 특정 열 또는 모든 열의 데이터를 검색합니다. 가장 기본적인 SQL 명령어입니다.
구문: SELECT [컬럼명1, 컬럼명2, ...] FROM [테이블명];
SELECT amount FROM sales;
2. DISTINCT - 중복 제거
조회 결과에서 중복되는 값을 제거하고 고유한 값만 표시합니다.
구문: SELECT DISTINCT [컬럼명] FROM [테이블명];
SELECT DISTINCT branch_name FROM sales;
3. WHERE - 조건부 조회
특정 조건을 만족하는 행들만 선택적으로 조회할 때 사용합니다.
구문: SELECT [컬럼명] FROM [테이블명] WHERE [조건];
SELECT branch_name, amount FROM sales WHERE amount > 1000;
4. AND, OR - 복합 조건
여러 조건을 조합하여 더욱 정교한 필터링을 수행합니다. AND는 모든 조건이 참일 때, OR는 하나라도 참일 때 결과를 반환합니다.
구문: SELECT [컬럼명] FROM [테이블명] WHERE [조건1] [AND|OR] [조건2];
SELECT branch_name, amount FROM sales WHERE amount > 1000 OR (amount < 500 AND amount > 200);
5. IN - 목록 내 값 조회
특정 열의 값이 제공된 값 목록 중 하나와 일치하는 행을 찾습니다.
구문: SELECT [컬럼명] FROM [테이블명] WHERE [컬럼명] IN ('값1', '값2', ...);
SELECT * FROM sales WHERE branch_name IN ('대구', '부산');
6. BETWEEN - 범위 내 값 조회
두 값 사이의 범위에 있는 데이터를 조회합니다. 경계값(시작값과 끝값)을 포함합니다.
구문: SELECT [컬럼명] FROM [테이블명] WHERE [컬럼명] BETWEEN '시작값' AND '끝값';
SELECT * FROM sales WHERE sale_date BETWEEN '2023-10-06' AND '2023-10-10';
7. 와일드카드와 LIKE - 패턴 매칭
LIKE 연산자와 함께 사용하여 특정 패턴과 일치하는 문자열을 검색합니다. 주요 와일드카드 문자는 다음과 같습니다.
%: 0개 이상의 문자와 일치합니다._: 정확히 하나의 문자와 일치합니다.
예시 패턴:
'S%L': 'S'로 시작하여 'L'로 끝나는 모든 문자열. 예: 'SEOUL', 'SQL''__울': 두 글자 다음에 '울'이 오는 세 글자 문자열. 예: '서울''%주%': '주'를 포함하는 모든 문자열. 예: '광주', '제주도'
구문: SELECT [컬럼명] FROM [테이블명] WHERE [컬럼명] LIKE '패턴';
SELECT * FROM branches WHERE branch_name LIKE '%주%'; -- '광주', '제주' 등을 검색
8. ORDER BY - 결과 정렬
조회된 데이터를 하나 이상의 컬럼을 기준으로 오름차순(ASC, 기본값) 또는 내림차순(DESC)으로 정렬합니다.
구문: SELECT [컬럼명] FROM [테이블명] [WHERE 조건] ORDER BY [정렬_컬럼] [ASC|DESC];
SELECT branch_name, amount, sale_date FROM sales ORDER BY amount DESC, sale_date ASC;
9. GROUP BY - 그룹별 집계
지정된 컬럼의 고유한 값을 기준으로 행들을 그룹화하고, 각 그룹에 대해 집계 함수(SUM, COUNT, AVG 등)를 적용합니다. SELECT 절에 집계 함수가 아닌 컬럼이 있다면, 그 컬럼은 반드시 GROUP BY 절에도 포함되어야 합니다.
구문: SELECT [그룹_컬럼], [집계_함수(컬럼)] FROM [테이블명] GROUP BY [그룹_컬럼];
SELECT branch_name, SUM(amount) AS total_sales FROM sales GROUP BY branch_name ORDER BY total_sales DESC;
10. HAVING - 그룹 필터링
GROUP BY 절에 의해 생성된 그룹에 대해 조건을 적용하여 필터링합니다. WHERE 절은 개별 행에 조건을 적용하는 반면, HAVING 절은 집계된 그룹에 조건을 적용합니다. 따라서 HAVING 절에서는 집계 함수를 직접 사용할 수 있습니다.
구문: SELECT [그룹_컬럼], [집계_함수(컬럼)] FROM [테이블명] GROUP BY [그룹_컬럼] HAVING [집계_함수(컬럼) 조건];
SELECT branch_name, SUM(amount) AS total_sales FROM sales GROUP BY branch_name HAVING SUM(amount) > 1500;
MySQL 내장 함수 활용
1. 수학 함수
수치 데이터에 대한 다양한 연산을 수행합니다.
SELECT ABS(-10) AS abs_value, -- 절대값
RAND() AS random_num, -- 0과 1 사이의 랜덤 값
MOD(10, 3) AS remainder, -- 나머지 연산
POWER(2, 4) AS power_result, -- 거듭제곱
ROUND(3.14159, 2) AS rounded_val, -- 반올림 (소수점 둘째 자리까지)
TRUNCATE(3.999, 1) AS truncated_val, -- 자릿수 버림
CEIL(5.2) AS ceil_val, -- 올림
FLOOR(5.8) AS floor_val, -- 내림
LEAST(10, 2, 7) AS min_val; -- 가장 작은 값
2. 집계 함수
여러 행의 데이터를 요약하여 단일 값을 반환합니다. COUNT(*)는 NULL을 포함한 모든 행을 세고, COUNT(컬럼명)은 NULL이 아닌 값만 셉니다.
AVG(컬럼): 평균COUNT(컬럼): 행의 개수MAX(컬럼): 최대값MIN(컬럼): 최소값SUM(컬럼): 합계
SELECT AVG(amount) FROM sales;
SELECT COUNT(DISTINCT branch_name) FROM sales;
SELECT MAX(amount) FROM sales;
SELECT MIN(amount) FROM sales;
SELECT SUM(amount) FROM sales;
3. 문자열 함수
문자열 데이터를 조작하고 분석합니다.
SELECT CONCAT(region, ' - ', branch_name) AS full_branch_info
FROM branches WHERE branch_name = '서울';
|| 연결 연산자 (MySQL 특정 설정)
MySQL에서 기본적으로 ||는 논리적 OR 연산자입니다. 그러나 sql_mode에 PIPES_AS_CONCAT을 설정하면, Oracle과 같이 ||를 문자열 연결 연산자로 사용할 수 있습니다. 이 모드가 활성화되지 않았다면 CONCAT() 함수를 사용해야 합니다.
-- sql_mode에 PIPES_AS_CONCAT이 설정된 경우 사용 가능
SELECT region || ' (' || branch_name || ' 지점)' AS branch_display
FROM branches WHERE branch_name = '부산';
SELECT SUBSTR(branch_name, 2) AS sub_str_from_second_char -- 두 번째 문자부터 끝까지
FROM branches WHERE branch_name = '대구';
SELECT SUBSTR(branch_name, 1, 2) AS sub_str_first_two_chars -- 첫 번째 문자부터 두 글자
FROM branches WHERE branch_name = '서울';