본문 바로가기
TIL

[TIL] 2025-5-27 sql

by Enhydra lutris 2025. 5. 28.
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 실행 순서

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY
  7. LIMIT

댓글