본문 바로가기
CS/Database

[MySQL] MySQL의 `SELECT` 문에 나올 수 있는 요소들

by clolee 2025. 4. 4.

✅ 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;
  • IF문 대체로 조건 분기

📌 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;

댓글