728x90
오늘 강의도 sql 관련이였습니당 select 연산 순서도 sqld에 나온다고 하시더라구요!
다른건 많이 본 내용들인데 select 연산순서는 처음 보는거 같아서 (그냥 기억 안나는 걸지도..) 주의깊게 보았습니다 ㅎㅎ
SELECT 기본 구문 구조
SELECT [DISTINCT] 컬럼명 | 표현식 [AS 별칭], ...
FROM 테이블명
[WHERE 조건]
[GROUP BY 컬럼]
[HAVING 조건]
[ORDER BY 컬럼 ASC|DESC]
[LIMIT 개수 OFFSET 시작];
SELECT 요소별 설명
전체 조회 | 테이블 모든 컬럼 조회 | SELECT * FROM employees; |
특정 컬럼 조회 | 원하는 컬럼만 선택 | SELECT ename, sal FROM employees; |
계산식 사용 | 컬럼 간 연산 가능 | SELECT sal * 12 FROM employees; |
함수 사용 | 내장함수 활용 | SELECT UPPER(ename) FROM employees; |
별칭 사용 | 표현식에 이름 부여 | SELECT sal * 12 AS annsal FROM employees; |
공백 포함 별칭 | 큰따옴표 사용 | SELECT sal * 12 AS "Annual Salary" |
산술 연산과 NULL 처리
- NULL + 100 → NULL
- NULL = NULL → FALSE (정확한 비교는 IS NULL 사용)
NULL 처리 함수
IFNULL(a, b) | a가 NULL이면 b 반환 | IFNULL(commission, 0) | NULL → 0 |
COALESCE(a, b, c) | 첫 번째 NULL이 아닌 값 반환 | COALESCE(NULL, 'x', 'y') | 'x' |
IF(cond, a, b) | 조건 참이면 a, 거짓이면 b | IF(commission IS NULL, '수당없음', commission) | 수당없음 |
NULLIF(a, b) | 같으면 NULL, 다르면 a | NULLIF(10, 10) → NULL, NULLIF(10, 20) → 10 |
DISTINCT - 중복 제거
- 하나의 컬럼: 해당 컬럼 값 기준으로 중복 제거
- 여러 컬럼: 전체 행이 동일한 경우만 제거
SELECT DISTINCT deptno FROM employees;
ORDER BY - 정렬
SELECT ename, sal FROM employees ORDER BY sal DESC;
ASC | 오름차순 (기본값) |
DESC | 내림차순 |
ORDER BY는 SELECT의 마지막에 위치해야 함
WHERE - 조건 필터링
SELECT * FROM employees WHERE deptno = 10 AND job != 'MANAGER';
- 문자열, 날짜는 '값'으로 감싸야 함
- WHERE에서는 집계함수 사용 불가 (집계는 HAVING에서)
주요 연산자
비교 | =, !=, <, >, <=, >= | sal > 3000 |
논리 | AND, OR, NOT | deptno = 10 OR job = 'CLERK' |
특수 | BETWEEN, IN, LIKE, IS NULL | sal BETWEEN 1000 AND 2000 |
IN, LIKE, IS NULL
IN
SELECT * FROM employees WHERE deptno IN (10, 20, 30);
여러 값 중 하나와 일치하는 경우 선택
LIKE
% | 0개 이상의 문자 | 'A%' → A로 시작 |
_ | 정확히 1개의 문자 | '_A%' → 두 번째 글자 A |
SELECT * FROM employees WHERE ename LIKE 'J%';
IS NULL
SELECT * FROM employees WHERE commission IS NULL;
NULL 비교는 반드시 IS NULL 또는 IS NOT NULL로 수행해야 함
LIMIT과 OFFSET
SELECT * FROM employees LIMIT 5 OFFSET 10;
- OFFSET: 건너뛸 행 수
- LIMIT: 가져올 행 수
집합 연산자 (UNION 등)
UNION | 중복 제거 후 합집합 |
UNION ALL | 중복 포함 합집합 |
INTERSECT | 교집합 (MySQL 8.0.31 이상) |
EXCEPT | 차집합 (MySQL 8.0.31 이상) |
제약사항:
- SELECT문의 컬럼 수, 순서, 데이터 타입이 일치해야 함
- ORDER BY, LIMIT은 마지막 SELECT문 뒤에만 사용 가능
집계 함수 (Aggregate Functions)
COUNT() | 행 개수 | COUNT(*) |
SUM() | 합계 | SUM(sal) |
AVG() | 평균 | AVG(sal) |
MAX(), MIN() | 최대값, 최소값 | MAX(sal), MIN(sal) |
DISTINCT 사용 가능: SUM(DISTINCT sal)
GROUP BY와 HAVING
SELECT deptno, COUNT(*) AS cnt
FROM employees
GROUP BY deptno
HAVING COUNT(*) > 2;
GROUP BY | 같은 값을 가진 행들을 묶음 |
HAVING | 그룹화된 결과에 조건 부여 |
- WHERE → 그룹 전 조건
- HAVING → 그룹 후 조건
고급 기능
WITH ROLLUP
GROUP BY deptno WITH ROLLUP;
그룹별 합계와 전체 합계를 함께 보여줌
GROUP_CONCAT
SELECT deptno, GROUP_CONCAT(ename ORDER BY ename SEPARATOR ', ')
FROM employees
GROUP BY deptno;
그룹 내 여러 문자열을 연결해 반환 (MySQL 전용)
SELECT 실행 순서
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
- LIMIT
'TIL' 카테고리의 다른 글
[TIL] 2025-6-2 웹서비스 관점에서의 OSI7계층 / WAS (0) | 2025.06.02 |
---|---|
[TIL] 2025-5-28 MySQL 내장 함수 / 조인 (0) | 2025.05.28 |
[TIL] 2025-5-26 DML, DCL, TCL (0) | 2025.05.28 |
[TIL] 2025-5-23 제약조건/정규화 (0) | 2025.05.28 |
[TIL] 2025-5-22 자바 입출력 (0) | 2025.05.22 |
댓글