✅ 1. SELECT 문 기본 구조
SELECT [컬럼 | 표현식 | 함수 | 별칭]
FROM [테이블]
[WHERE 조건]
[GROUP BY 컬럼]
[HAVING 조건]
[ORDER BY 컬럼 [ASC|DESC]]
[LIMIT 개수 OFFSET 시작위치];
✅ 2. SELECT 문에서 사용 가능한 요소들
각 요소를 하나씩 정리하겠습니다.
📌 2.1 컬럼 조회
SELECT name, age FROM users;
- 특정 컬럼 조회.
*
사용 가능: SELECT * FROM users;
(모든 컬럼 조회)
📌 2.2 별칭(alias) 사용 (AS
)
SELECT name AS 이름, age AS 나이 FROM users;
- 컬럼명에 별칭을 부여해 결과에서 컬럼명을 변경.
AS
는 생략 가능: SELECT name 이름 FROM users;
📌 2.3 산술 연산
SELECT salary, salary * 0.1 AS tax FROM employees;
- SELECT 내에서 수학 연산 가능:
+
, -
, *
, /
, %
📌 2.4 문자열 함수
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
SELECT LENGTH(name), UPPER(name), LOWER(name), SUBSTRING(name, 1, 3) FROM users;
함수 |
설명 |
CONCAT(a, b) |
문자열 합치기 |
LENGTH(str) |
문자열의 바이트 수 |
CHAR_LENGTH(str) |
문자 수 (다국어 지원) |
UPPER(str) / LOWER(str) |
대/소문자 변환 |
SUBSTRING(str, start, len) |
부분 문자열 추출 |
📌 2.5 숫자 함수
SELECT ROUND(price, 2), CEIL(price), FLOOR(price), ABS(balance) FROM items;
함수 |
설명 |
ROUND(n, d) |
n을 d자리까지 반올림 |
CEIL(n) |
올림 |
FLOOR(n) |
내림 |
ABS(n) |
절댓값 |
📌 2.6 날짜/시간 함수
SELECT NOW(), CURDATE(), CURTIME(), DATE_FORMAT(birth_date, '%Y-%m-%d') FROM users;
함수 |
설명 |
NOW() |
현재 날짜+시간 |
CURDATE() |
현재 날짜 |
CURTIME() |
현재 시간 |
DATE_FORMAT(date, format) |
날짜 포맷 변경 |
YEAR(date) , MONTH(date) , DAY(date) |
연도, 월, 일 추출 |
📌 2.7 조건 (WHERE 절)
SELECT * FROM users WHERE age >= 20 AND city = 'Seoul';
조건 연산자 |
설명 |
= , != , <> , > , < , >= , <= |
비교 연산 |
BETWEEN a AND b |
범위 조건 |
IN (a, b, c) |
목록 조건 |
LIKE 'a%' |
패턴 조건 (a로 시작) |
IS NULL , IS NOT NULL |
NULL 확인 |
AND , OR , NOT |
논리 연산 |
📌 2.8 정렬 (ORDER BY)
SELECT * FROM users ORDER BY age DESC, name ASC;
- 여러 컬럼 정렬 가능
- 기본은 ASC (오름차순)
📌 2.9 그룹화 (GROUP BY + 집계함수)
SELECT city, COUNT(*) AS cnt FROM users GROUP BY city;
함수 |
설명 |
COUNT(*) |
행 수 세기 |
SUM(col) |
총합 |
AVG(col) |
평균 |
MAX(col) , MIN(col) |
최댓값, 최솟값 |
📌 2.10 HAVING (그룹 결과 필터링)
SELECT city, COUNT(*) AS cnt FROM users GROUP BY city HAVING cnt > 5;
WHERE
는 개별 행 필터링
HAVING
은 그룹 필터링
📌 2.11 LIMIT, OFFSET (페이징)
SELECT * FROM users LIMIT 10 OFFSET 20;
-- 또는
SELECT * FROM users LIMIT 20, 10; -- 20부터 10개
📌 2.12 서브쿼리
SELECT name FROM users WHERE age > (SELECT AVG(age) FROM users);
- SELECT, WHERE, FROM 등 다양한 곳에서 사용 가능
📌 2.13 CASE 조건문
SELECT name,
CASE
WHEN age < 20 THEN 'Teen'
WHEN age < 30 THEN 'Young Adult'
ELSE 'Adult'
END AS age_group
FROM users;
📌 2.14 DISTINCT
SELECT DISTINCT city FROM users;
📌 2.15 IF / IFNULL / COALESCE
SELECT name, IF(gender = 'M', '남성', '여성') FROM users;
SELECT IFNULL(phone, '없음') FROM users;
SELECT COALESCE(phone, email, '없음') FROM users;
함수 |
설명 |
IF(cond, true_val, false_val) |
조건에 따라 결과 선택 |
IFNULL(val, alt) |
NULL이면 대체값 |
COALESCE(val1, val2, ...) |
NULL이 아닌 첫 번째 값 반환 |
✅ 3. 실전 활용 예시
SELECT
u.id,
CONCAT(u.first_name, ' ', u.last_name) AS full_name,
IFNULL(p.phone, '미입력') AS 연락처,
DATE_FORMAT(u.birth_date, '%Y년 %m월 %d일') AS 생년월일,
CASE
WHEN u.age < 20 THEN '10대'
WHEN u.age < 30 THEN '20대'
ELSE '30대 이상'
END AS 연령대
FROM users u
LEFT JOIN phones p ON u.id = p.user_id
WHERE u.status = 'active'
ORDER BY u.age DESC
LIMIT 20 OFFSET 0;
댓글