SQL 기본 문법에 대해 알아보기

맑음·2025년 5월 5일
0
post-thumbnail

SQL이란?

SQL (Structured Query Language)관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 관리하기 위해 사용되는 표준 프로그래밍 언어입니다
데이터베이스에 저장된 데이터를 조회, 삽입, 수정, 삭제하는 작업부터 데이터베이스 구조 생성과 수정까지 다양한 작업을 수행할 수 있어 데이터 관리의 핵심 도구입니다

SQL 기본 문법

SQL의 기본 문법은 다음과 같이 나눌 수 있습니다
DDL, DML, DCL, TCL로 총 4가지로 나눌 수 있습니다

DDL (Data Definition Language)

DDL데이터 정의어로 데이터베이스 스키마를 정의하거나 변경하기 위한 명령어들로 테이블 같은 데이터 구조를 생성, 수정, 삭제합니다

CREATE

CREATE는 새로운 데이터베이스 객체(테이블, 뷰, 인덱스 등)를 생성합니다
아래는 CREATE에 대한 예시입니다

CREATE TABLE Employees (
  EmpID INT PRIMARY KEY,
  FirstName VARCHAR(50),
  LastName VARCHAR(50),
  DepartmentID INT
);

이 예시는 Employees라는 테이블을 생성합니다

  • EmpID: 정수형 데이터이며 PRIMARY KEY로 기본키로 지정합니다
  • FirstName: 가변 길이의 문자열 데이터이며 최대 50자까지의 문자열을 저장할 수 있습니다
  • LastName: 마찬가지로 가변 길이의 문자열 데이터이며 최대 50자까지의 문자열을 저장할 수 있습니다
  • DepartmentID: EmpID와 마찬가지로 정수형 데이터입니다

데이터 타입 (MySQL 기준)

데이터 타입설명예시비고
INT정수 (4바이트)age INTTINYINT, SMALLINT, BIGINT 등도 있습니다
FLOAT / DOUBLE부동소수점 숫자score FLOAT(5,2)정확한 계산이 필요하면 DECIMAL을 사용합니다
DECIMAL(p,s)고정 소수점 숫자 (정확한 값 보장)price DECIMAL(10,2)금융 계산에 사용됩니다
CHAR(n)고정 길이 문자열gender CHAR(1)항상 n자리를 채웁니다
VARCHAR(n)가변 길이 문자열name VARCHAR(50)최대 n자까지 저장됩니다
TEXT긴 문자열description TEXT최대 65,535자 (MySQL 기준)
DATE날짜 (YYYY-MM-DD)birth DATE2025-05-05 형식
DATETIME날짜 + 시간created_at DATETIME2025-05-05 14:30:00 형식
TIMESTAMPUTC 기준 날짜 + 시간updated_at TIMESTAMP자동 생성/업데이트에 자주 사용됩니다
BOOLEAN참/거짓is_active BOOLEANMySQL에선 실제로는 TINYINT(1) 로 처리됩니다

ALTER

ALTER는 기존 데이터베이스 객체의 구조를 수정합니다 (컬럼 추가, 삭제, 수정, 이름 변경 등)
아래는 ALTER에 대한 예시입니다

-- 컬럼 추가
ALTER TABLE Employees ADD Email VARCHAR(100);

-- 컬럼 삭제
ALTER TABLE Employees DROP COLUMN DepartmentID;

-- 컬럼 이름 변경
ALTER TABLE Employees RENAME COLUMN FirstName TO Name;
  • 컬럼 추가: Employees 테이블에 가변 길이의 문자열로 최대 100자를 받을 수 있는 Email 컬럼을 추가합니다
  • 컬럼 삭제: Employees 테이블에서 DepartmentID 컬럼을 삭제합니다
  • 컬럼 이름 변경: Employees 테이블에서 FirstName 컬럼을 Name으로 이름을 변경합니다

DROP

DROP은 데이터베이스 객체를 완전히 삭제하며 데이터와 구조 모두 삭제되며 복구할 수 없습니다
아래는 DROP에 대한 예시입니다

DROP TABLE Employees;
  • Employees 테이블을 삭제합니다

TRUNCATE

TRUNCATE는 테이블의 모든 데이터를 삭제하지만 테이블 구조 (스키마)는 남겨둡니다
아래는 TRUNCATE에 대한 예시입니다

TRUNCATE TABLE Employees;
  • Employees 테이블을 삭제합니다 (테이블 구조는 남음)

DML (Data Manipulation Language)

DML은 데이터베이스 내의 데이터를 삽입, 조회, 수정, 삭제하는 명령어입니다

SELECT

SELECT는 데이터를 조회합니다
SQL에서 데이터를 조회할 때 가장 핵심이 되는 문장입니다

SELECT문 구조

SELECT [열 목록]
FROM [테이블 이름]
WHERE [조건]
GROUP BY []
HAVING [그룹 조건]
ORDER BY [] [ASC|DESC]
LIMIT [개수];
절 (Clause)설명
SELECT조회할 열(column)을 지정합니다. *는 모든 열을 의미합니다
FROM데이터를 가져올 테이블을 지정합니다
WHERE조건에 맞는 행(row)만 선택합니다
GROUP BY특정 열을 기준으로 그룹화합니다 (예: 집계 함수와 함께 사용)
HAVING그룹화된 결과에 조건을 거는 절입니다 (→ WHERE은 그룹 전에 필터링, HAVING은 그룹 후 필터링)
ORDER BY결과를 정렬합니다 기본은 ASC (오름차순), 내림차순은 DESC
LIMIT조회할 결과의 행 수를 제한합니다 (MySQL, PostgreSQL 등에서 사용)

SELECT 문에서 SELECT 및 FROM은 필수이며 나머지는 선택입니다
그러나 순서는 위의 코드와 같은 순서를 지켜야합니다

SELECT문 실행 순서

SQL은 우리가 쓴 순서대로 실행되지 않고 다음 순서로 작동하게 됩니다
SQL 엔진이 데이터를 점점 좁혀가면서 효율적으로 처리하기 위해 이렇게 설계된 것입니다

순서절(Clause)이유
1FROM어떤 테이블에서 데이터를 가져올지 결정합니다
2WHERE데이터를 먼저 걸러야, 불필요한 연산을 줄일 수 있습니다
3GROUP BY필터링된 데이터를 기준으로 그룹화합니다
4HAVING그룹화된 결과에 조건을 걸어 걸러냅니다
5SELECT최종으로 보여줄 열을 정합니다
6ORDER BY보여줄 데이터를 정렬합니다
7LIMIT보여줄 데이터 개수를 제한합니다

아래는 SELECT에 대한 예시입니다

SELECT department, COUNT(*) as cnt
FROM employees
WHERE salary > 3000
GROUP BY department
HAVING cnt > 5
ORDER BY cnt DESC;

실행 흐름
1. FROM employees → 전체 테이블에서
2. WHERE salary > 3000 → 조건에 맞는 행만 필터링
3. GROUP BY department → 부서별로 묶고
4. HAVING cnt > 5 → 그 중 직원 수가 5명 넘는 부서만 남김
5. SELECT → 부서 이름과 인원 수 출력
6. ORDER BY → 인원 많은 순으로 정렬

DISTINCT

DISTINCT는 중복을 제거하는 방법으로 SELECT에서 조회 시 컬럼 앞에 DISTINCT를 붙여 중복된 값을 제거한 결과를 얻을 수 있습니다
아래는 DISTINCT를 사용한 예시입니다

SELECT DISTINCT department
FROM Employees;

이럴 경우 department에서 중복없이 서로 다른 값만 출력하게 됩니다

집계 함수

집계 함수는 여러 행의 값을 하나의 결과로 요약할 때 사용하는 SQL 함수입니다
주로 GROUP BY 절과 함께 쓰이며 데이터를 통계적으로 분석하거나 요약할 때 유용합니다

함수명설명예시 사용
COUNT()행의 개수를 셉니다COUNT(*), COUNT(column_name)
SUM()숫자형 컬럼의 총합을 계산합니다SUM(salary)
AVG()숫자형 컬럼의 평균을 계산합니다AVG(salary)
MAX()컬럼의 최대값을 반환합니다MAX(score)
MIN()컬럼의 최소값을 반환합니다MIN(score)

LIKE 및 와일드카드 문자

LIKE 연산자는 SQL에서 문자열을 패턴 매칭하는 데 사용됩니다
주로 WHERE 절과 함께 사용되며, 와일드카드 문자와 함께 쓰여 특정 조건에 맞는 데이터를 검색할 수 있습니다

와일드카드 문자의미예시설명
%0개 이상의 임의의 문자WHERE name LIKE '김%''김'으로 시작하는 모든 이름 (예: 김철수, 김영희 등)
_정확히 1개의 임의의 문자WHERE name LIKE '_영희''영희' 앞에 아무 문자 1개가 있는 경우 (예: 김영희)

앨리어스 (Alias: AS)

SELECT 절에서 컬럼 또는 테이블에 별명을 붙일 때 사용합니다
특히 JOIN, 서브쿼리, MERGE, 집계 함수 등에서 자주 사용됩니다

SELECT first_name AS 이름, salary * 12 AS 연봉 FROM employees;

AS를 사용하면 컬럼에 별명을 붙일 수 있습니다
출력 시 위의 예시 기준으로 first_name이 아닌 이름으로 출력됩니다

INSERT

INSERT는 새로운 데이터를 테이블에 삽입합니다
아래는 INSERT에 대한 예시입니다

INSERT INTO Employees (EmpID, FirstName, LastName, DepartmentID)
VALUES (1, 'Jane', 'Doe', 10);
  • Employees 테이블에 EmpID가 1, FirstName이 Jane, LastName이 Doe, DepartmentID가 10인 데이터를 삽입합니다
  • VALUES로 Employees의 모든 컬럼에 데이터를 넣는다면 Employees 옆 괄호를 생략해도 되지만, 일부만 넣을 경우 괄호를 통해 컬럼을 명시해줘야 합니다

UPDATE

UPDATE는 기존 데이터를 수정합니다
아래는 UPDATE에 대한 예시입니다

UPDATE Employees SET LastName = 'Smith' WHERE EmpID = 1;
  • Employees 테이블의 EmpID가 1인 사람의 LastName을 Smith로 수정합니다

주의할 점으로 WHERE을 통한 조건을 걸지 않는다면 모든 데이터가 수정될 수 있습니다

DELETE

DELETE는 데이터를 삭제합니다
아래는 DELETE에 대한 예시입니다

DELETE FROM Employees WHERE EmpID = 1;
  • Employees 테이블에서 EmpID가 1인 데이터를 삭제합니다

주의할 점으로 WHERE을 통한 조건을 걸지 않는다면 모든 데이터가 삭제될 수 있습니다

DCL (Data Control Language)

DCL데이터 제어어로 데이터베이스에 대한 접근 권한을 제어하는 명령어입니다

GRANT

GRANT는 사용자에게 특정 권한을 부여합니다
아래는 GRANT에 대한 예시입니다

GRANT SELECT, UPDATE ON Employees TO user1;
  • user1에게 Employees 테이블에 대한 SELECT, UPDATE 권한을 부여합니다

REVOKE

REVOKE는 사용자에게 부여된 권한을 회수합니다
아래는 REVOKE에 대한 예시입니다

REVOKE UPDATE ON Employees FROM user1;
  • user1의 Employees 테이블에 대한 UPDATE 권한을 회수합니다

TCL (Transaction Control Language)

TCL은 데이터베이스 트랜잭션의 실행, 확정, 취소 등을 제어합니다

COMMIT

COMMIT은 트랜잭션에서 수행된 모든 변경사항을 영구적으로 저장합니다
아래는 COMMIT에 대한 예시입니다

BEGIN TRANSACTION;
UPDATE Employees SET LastName = 'Kim' WHERE EmpID = 1;
COMMIT;

ROLLBACK

ROLLBACK은 트랜잭션 내에서 이루어진 변경사항을 취소하고 이전 상태로 복구합니다
아래는 ROLLBACK 예시입니다

BEGIN TRANSACTION;
UPDATE Employees SET LastName = 'Lee' WHERE EmpID = 1;
ROLLBACK;

SAVEPOINT

SAVEPOINT는 트랜잭션 내에서 특정 시점을 설정하여 이후 해당 시점까지 부분적으로 롤백을 할 수 있게 합니다
아래는 SAVEPOINT 예시입니다

BEGIN TRANSACTION;
SAVEPOINT before_update;
UPDATE Employees SET LastName = 'Park' WHERE EmpID = 2;
ROLLBACK TO before_update;
COMMIT;

각 명령어는 데이터베이스 설계, 데이터 조작, 보안, 트랜잭션 처리 등 다양한 상황에서 핵심적으로 활용됩니다

JOIN

JOIN은 SQL에서 두 개 이상의 테이블을 관련된 컬럼을 기준으로 결합해 하나의 결과 집합으로 만드는 명령어입니다
관계형 데이터베이스는 데이터를 여러 테이블에 분산시켜 저장하는데, 실제로 데이터를 조회할 때는 이 테이블들을 조합해서 필요한 정보를 얻는 경우가 많습니다
이때 JOIN을 사용합니다

JOIN의 기본 구조

JOIN은 보통 아래와 같은 구조를 가집니다

SELECT 컬럼목록
FROM 테이블1
JOIN 테이블2
ON 테이블1.컬럼 = 테이블2.컬럼

이때 Alias를 사용하면 좀 더 편리할 수 있습니다
또한 그냥 JOIN 대신 INNER JOIN, LEFT JOIN 등 다양한 유형을 사용할 수 있습니다

JOIN의 주요 종류

JOIN 종류포함되는 데이터NULL 포함 여부사용 예시 설명
INNER JOIN양쪽 테이블 모두 조건에 일치하는 행만 포함일치하지 않으면 제외학생과 점수 테이블에서 점수가 있는 학생만 조회
LEFT JOIN왼쪽 테이블은 모두 포함, 오른쪽은 일치하는 행만 포함오른쪽에 없으면 NULL모든 학생 목록을 보여주되, 점수가 없으면 NULL
RIGHT JOIN오른쪽 테이블은 모두 포함, 왼쪽은 일치하는 행만 포함왼쪽에 없으면 NULL모든 점수 목록을 보여주되, 학생 정보 없으면 NULL
FULL OUTER JOIN양쪽 테이블 모두 포함, 일치하지 않으면 각각 NULL로 채움둘 다 NULL 가능모든 학생과 모든 점수 다 보여주고, 일치 여부와 상관없이 출력
CROSS JOIN두 테이블의 모든 가능한 조합NULL 없음학생 수 * 과목 수 = 모든 경우의 수 (카티션 곱)

JOIN 시 주의할 점

JOIN 시 주의할 점은 아래와 같습니다

  • ON 조건을 정확히 지정하지 않으면, 모든 행이 곱해져서 카티션 곱으로 나오게 될 수 있습니다
  • 테이블 alias (s, sc 같은 것)를 쓰면 쿼리가 짧고 가독성이 좋습니다
  • 성능을 위해서는 적절한 인덱스 설정이 중요합니다

마무리

이번 포스트에서는 SQL 및 기본 문법, JOIN에 대해 간단하게만 다뤄봤습니다
SQL데이터베이스 관리에서 필수적인 언어입니다
즉 데이터베이스에 대해 먼저 알아야 하며 데이터베이스에 대해 공부했거나 공부한다면 이정도는 기본 상식 정도인 것을 알 수 있을 것입니다

어렵게 느껴진다면 실습을 통해 활용해보면 이정도는 쉽게 느껴질 것입니다!

profile
내일도 맑음

0개의 댓글