SQL 문법 & 용어 정리

JERRY·2025년 7월 24일

SQL

목록 보기
18/18
post-thumbnail

SQL 문법 정리

1. SELECT 기본

SELECT column1, column2
FROM table_name
WHERE condition
ORDER BY column ASC|DESC
LIMIT n;
  • SELECT : 조회할 컬럼 선택
  • FROM : 데이터를 가져올 테이블
  • WHERE : 조건 지정
  • ORDER BY : 정렬
  • LIMIT : 결과 개수 제한

Alias (별칭)

SELECT first_name AS name FROM employees;
SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.id;
  • 컬럼명, 테이블명에 별칭 부여 → 가독성 향상
  • AS는 생략 가능

2. 집계 함수 (Aggregate Functions)

SELECT COUNT(*), SUM(salary), AVG(salary), MIN(salary), MAX(salary)
FROM employees
WHERE department_id = 10;
  • COUNT() : 행 개수
  • SUM() : 합계
  • AVG() : 평균
  • MIN() MAX() : 최소값, 최대값

3. WHERE + LIKE (패턴 검색)

SELECT name FROM customers WHERE name LIKE 'J%';   -- J로 시작
SELECT name FROM customers WHERE name LIKE '%son'; -- son으로 끝남
SELECT name FROM customers WHERE name LIKE '_a%';  -- 두 번째 글자가 a
  • LIKE
    • 조회 조건 값이 명확하지 않을 때 특정 내용을 찾을 수 있음
    • 조건에 문자나 숫자를 포함할 수 있음
    • 주로 Wildcard와 함께 사용
  • Wildcard
    • % : 0개 이상의 문자
    • _ : 정확히 1개의 문자(_의 개수에 따라 뒤에 오는 문자열의 개수를 정할 수 있음)

4. GROUP BY & HAVING

SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;
  • GROUP BY : 그룹별 집계
  • HAVING : 그룹 조건
  • SELECT절에 컬럼명, 집계함수가 같이 기술된 경우 컬럼명은 GROUP BY에 기술되어야함

5. GROUPING SETS / ROLLUP / CUBE

SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY ROLLUP (department_id, job_id);

SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY CUBE (department_id, job_id);

SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY GROUPING SETS ((department_id), (job_id), ());
  • ROLLUP : 소그룹 간 소계 계산
  • CUBE : 다차원적 소계 계산
  • GROUPING SETS : 특정 항목의 소계 계산

6. JOIN (테이블 연결)

(1) INNER JOIN

SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

(2) LEFT JOIN / RIGHT JOIN

SELECT e.name, d.department_name
FROM employees e
LEFT|RIGHT JOIN departments d ON e.department_id = d.id;

(3) FULL OUTER JOIN (DBMS에 따라 UNION 활용)

SELECT e.name, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;
  • 관계형 데이터베이스의 테이블 내의 행들을 논리에 따라 연결할 수 있는 문법
  • 서로 다른 테이블에서 각각의 공통값을 이용하여 조합
  • 조인 유형을 지정하지 않으면 서버는 기본적으로 내부 조인(INNER JOIN)을 실행
  • 두 테이블을 조인할 때 사용한 열의 이름이 동일할 경우 ON 대신 USING을 사용 가능

7. 서브쿼리 (Subquery)

(1) WHERE 절 서브쿼리

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

(2) FROM 절 서브쿼리

SELECT department_id, avg_salary
FROM (
    SELECT department_id, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
) t;
  • 하나의 쿼리문 안에 포함되어 있는 또 다른 쿼리문으로 여러번의 쿼리를 수행해야만 얻을 수 있는 결과를 하나의 중첩된 쿼리문으로 간편하게 결과 획득
  • JOIN과 달리 새로운 컬럼이 필요하지 않을때 서브쿼리 사용
  • 서브쿼리 특징
    • 괄호로 묶어서 사용
    • 연산자의 오른쪽에 위치
    • 서브쿼리 내에서는 ORDER BY 문법 미지원
    • 괄호 뒤에 세미콜론(;) 사용 불가

8. 윈도우 함수 (Window Functions)

SELECT name, salary,
       RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_in_dept,
       ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num,
       AVG(salary) OVER (PARTITION BY department_id) AS avg_salary
FROM employees;
  • OVER() : 윈도우 함수 사용
  • PARTITION BY : 전체 집합에 대해 소그룹으로 나누는 기준
  • ORDER BY : 소그룹에 대한 정렬 기준
  • WINDOWING : 행에 대한 범위 기준
  • 집계 함수
    • SUM() AVG() MIN() MAX()
  • 순위 함수
    • RANK() : 동일한 값에 동일한 순위 부여
    • DENSE_RANK() : 동일한 값에 동일한 순위 부여하나 한 건으로 취급
    • ROW_NUMBER() : 동일한 값이라도 고유한 순위 부여 (통상적으로 Primary Key 기준)
  • 행 순서 함수
    • FIRST_VALUE() : 조건을 만족하는 가장 첫번째 값
    • LAST_VALUE() : 조건을 만족하는 가장 마지막 값
    • LAG(컬럼, n) : 이전 n번째 행
    • LEAD(컬럼, n) : 이후 n번째 행

9. 테이블 집합 연산자

SELECT name FROM employees
UNION
SELECT name FROM customers;

SELECT name FROM employees
INTERSECT
SELECT name FROM customers;

SELECT name FROM employees
EXCEPT
SELECT name FROM customers;
  • UNION : 합집합 (중복 제거)
  • UNION ALL : 합집합 (중복 허용)
  • INTERSECT : 교집합
  • EXCEPT : 차집합

10. CASE WHEN ~ THEN

SELECT name,
       CASE
           WHEN salary >= 7000 THEN 'High'
           WHEN salary >= 4000 THEN 'Medium'
           ELSE 'Low'
       END AS salary_level
FROM employees;
  • CASE WHEN 조건1 THEN 반환1 END : 조건에 따라 다른 값을 반환하는 다중 조건문
  • CASE문은 WHEN의 조건을 순차적으로 체크하고 조건이 충족되면 THEN에 명시된 값을 반환
    • WHEN과 THEN은 한 쌍으로 존재하며 여러 쌍 존재 가능
    • ELSE는 앞의 조건들에 모두 해당하지 않았을 때 정해줄 기본 값
    • ELSE가 없고 조건에 맞는 값이 없으면 NULL값 반환

11. IF (조건문)

SELECT IF(salary >= 5000, 'High', 'Low') AS salary_level FROM employees;
  • IF(조건, 참일 때 반환 값, 거짓일 때 반환 값) : 단일 조건문
  • SELECT, WHERE절에서 사용 가능
  • 엑셀의 IF 함수와 동일

12. CTE (Common Table Expression)

WITH department_avg AS (
    SELECT department_id, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
)
SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN department_avg d ON e.department_id = d.department_id;
  • WITH 임시 테이블명 AS (쿼리) : 서브쿼리를 이름 있는 임시 테이블로 정의하여 가독성 향상

13. 알아두면 좋은 SQL 문법

(1) DISTINCT : 결과에서 중복된 값을 제거하고 고유한 값만 반환

SELECT DISTINCT column_name FROM table;

(2) ALTER TABLE : 기존 테이블의 구조(컬럼, 제약조건 등)를 변경

ALTER TABLE employees ADD COLUMN age INT;
ALTER TABLE employees DROP COLUMN age;

(3) TRUNCATE : 테이블의 모든 데이터를 삭제하지만 구조는 유지

TRUNCATE TABLE employees;

(4) INDEX : 데이터 검색 속도를 향상시키는 구조를 생성

CREATE INDEX idx_name ON employees(name);
DROP INDEX idx_name;

(5) TRANSACTION : 여러 쿼리를 하나의 작업 단위로 묶어 원자성 보장

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 또는 ROLLBACK;

(6) COALESCE / NULLIF : NULL값 처리

SELECT COALESCE(phone, 'No phone') FROM customers;
SELECT NULLIF(a, b) FROM table;
  • COALESCE(expr1, expr2, …) : 첫 번째 NULL이 아닌 값을 반환
  • NULLIF(expr1, expr2): 두 값이 같으면 NULL, 다르면 첫 번째 값 반환

(7) EXISTS : 서브쿼리 결과가 존재하면 TRUE 반환

SELECT name FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.id = e.department_id);

(8) CAST : 데이터 타입 변환

SELECT CAST('2025-07-24' AS DATE);
SELECT CAST(123 AS CHAR);

(9) STRING 함수

SELECT CONCAT(first_name, ' ', last_name) AS full_name,
       SUBSTRING(name, 1, 3),
       UPPER(city),
       LOWER(city)
FROM customers;
  • CONCAT() : 문자열 결합
  • SUBSTRING() : 부분 문자열 추출
  • TRIM() : 문자열의 공백이나 지정한 문자를 제거 (변형 : LTRIM() RTRIM())
  • UPPER() / LOWER() : 대문자/소문자 변환

(10) DATE 함수

SELECT NOW(), DATE_ADD(NOW(), INTERVAL 7 DAY), DATEDIFF('2025-08-01', NOW());
  • NOW() : 현재 날짜 및 시간
  • DATE_ADD() : 날짜 연산
  • DATE_DIFF() : 두 날짜의 차이



SQL (+Database) 용어 정리

1. 기본 개념

용어설명
데이터 (Data)의미 있는 정보로 가공되기 전의 값 또는 기록
데이터베이스 (Database)데이터를 체계적으로 저장하고 관리하는 시스템
DBMS데이터베이스 관리 시스템 (예: MySQL, PostgreSQL, Oracle)
테이블 (Table)행(Row)과 열(Column)로 구성된 데이터 집합
행 (Row, Record)테이블의 한 줄 데이터
열 (Column, Field)테이블에서 데이터의 속성을 나타내는 부분
스키마 (Schema)데이터베이스 구조(테이블, 뷰, 관계 등) 정의
데이터 타입 (Data Type)데이터가 저장되는 형식 (예: INT, VARCHAR, DATE)
쿼리 (Query)DB에서 데이터를 조회, 삽입, 수정, 삭제하는 명령

2. 기본 키 개념

용어설명
PK (Primary Key)테이블에서 행을 고유하게 식별하는 컬럼 (NULL/중복 불가)
FK (Foreign Key)다른 테이블의 PK를 참조하는 컬럼
Composite Key두 개 이상의 컬럼으로 구성된 PK
Candidate KeyPK 후보가 될 수 있는 컬럼
Alternate KeyCandidate Key 중 PK로 선택되지 않은 키
Super Key행을 유일하게 식별할 수 있는 모든 컬럼 집합

3. 제약 조건 & 무결성

용어설명
NOT NULLNULL 값 허용 불가
UNIQUE중복 허용 불가
CHECK특정 조건 만족 시 입력 가능
DEFAULT값이 없을 때 기본값 설정
Integrity데이터의 정확성과 일관성을 유지하는 성질 (무결성)

4. SQL 명령어 그룹

용어설명
DDL (Data Definition Language)데이터 구조 정의: CREATE, ALTER, DROP
DML (Data Manipulation Language)데이터 조작: SELECT, INSERT, UPDATE, DELETE
DCL (Data Control Language)권한 제어: GRANT, REVOKE
TCL (Transaction Control Language)트랜잭션 관리: COMMIT, ROLLBACK

5. DB 객체

용어설명
ViewSELECT 결과를 저장하는 가상 테이블
Stored Procedure미리 작성해 저장한 SQL 코드 블록
Trigger특정 이벤트 발생 시 자동 실행되는 SQL 코드

6. 성능 & 트랜잭션

용어설명
Index검색 성능 향상을 위한 자료구조
TransactionDB 작업의 논리적 단위
ACID트랜잭션 4대 속성: 원자성, 일관성, 고립성, 지속성

7. 데이터 모델링 & 설계

용어설명
정규화 (Normalization)데이터 중복 제거 & 무결성 유지
반정규화 (Denormalization)성능 향상을 위해 일부 중복 허용
ERD (Entity Relationship Diagram)엔터티 간 관계를 시각화한 다이어그램

8. 실무에서 자주 쓰는 개념

용어설명
ShardingDB를 수평 분할해 성능 개선
Partitioning테이블을 여러 부분으로 나눔
Replication데이터를 복제해 고가용성 확보
Failover장애 발생 시 자동 전환
Batch대량 데이터를 일괄 처리

0개의 댓글