SQL

민콕이·2025년 12월 29일

SQL (Structured Query Language)

구조화된 질의 언어
사용자가 Database를 관리하기 위해 DBMS로 요청(질의)을 보내기 위한 언어
비절차적 언어로, 실행 절차에 대해서는 명시하지 않고 조건만 기술

SQL 종류 (분류 + 예시)

구분설명주요 명령
DDL구조 정의CREATE, ALTER, DROP
DML데이터 조작SELECT, INSERT, UPDATE, DELETE
DCL권한 제어GRANT, REVOKE
TCL트랜잭션COMMIT, ROLLBACK

DDL (Data Definition Language)

Database 생성 / 삭제 예시

# 기본 문법
CREATE DATABASE [IF NOT EXISTS] <<database_name>>;
DROP DATABASE [IF EXISTS] <<database_name>>;
CREATE DATABASE keduDB;
DROP DATABASE keduDB;
CREATE DATABASE IF NOT EXISTS keduDB;

Table 생성 (제약조건 예시)

# 기본 문법
CREATE TABLE [IF NOT EXISTS] <<table_name>> (
    <<column_name>> <<data_type>> [constraint],
    <<column_name>> <<data_type>> [constraint],
    ...
);
CREATE TABLE userTBL (
    id VARCHAR(5) PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE,
    birth INT,
    age INT CHECK (age >= 0),
    mileage INT DEFAULT 0,
    major VARCHAR(10)
);

제약조건 예시

  • PRIMARY KEY : 중복 X, NULL X
  • NOT NULL : 필수 입력
  • UNIQUE : 중복 불가
  • DEFAULT : 기본값
  • CHECK : 값 검증

FOREIGN KEY 예시 (관계 명확화)

CREATE TABLE buyTBL (
    id INT AUTO_INCREMENT PRIMARY KEY,
    userID VARCHAR(5),
    productName VARCHAR(50),
    amount INT,
    price INT,
    buyDate DATE,
    FOREIGN KEY (userID) REFERENCES userTBL(id)
);

ALTER 예시 (컬럼 추가 / 수정 / 삭제)

# 기본 문법
ALTER TABLE <<table_name>>
ADD <<column_name>> <<data_type>>;

ALTER TABLE <<table_name>>
MODIFY <<column_name>> <<data_type>>;

ALTER TABLE <<table_name>>
DROP <<column_name>>;
-- 컬럼 추가
ALTER TABLE userTBL ADD phone VARCHAR(20);

-- 컬럼 수정
ALTER TABLE userTBL MODIFY phone VARCHAR(30);

-- 컬럼 이름 변경
ALTER TABLE userTBL CHANGE phone mobile VARCHAR(20);

-- 컬럼 삭제
ALTER TABLE userTBL DROP mobile;

DML (Data Manipulation Language)

INSERT 예시

# 기본 문법
INSERT INTO <<table_name>>
VALUES (value1, value2, ...);
-- 전체 컬럼 입력
INSERT INTO userTBL
VALUES ('U001', '민수', 'minsu@test.com', 1998, 27, 0, 'CS');

-- 일부 컬럼 입력
INSERT INTO userTBL (id, name, age) VALUES ('U002', '영희', 25);

-- 여러 행 입력
INSERT INTO userTBL (id, name, age)
VALUES 
('U003', '철수', 30),
('U004', '지수', 22);

UPDATE 예시

# 기본 문법
UPDATE <<table_name>>
SET <<column1>> = <<value1>>,
    <<column2>> = <<value2>>, ...
[WHERE <<condition>>];
-- 특정 사용자 수정
UPDATE userTBL
SET mileage = mileage + 100
WHERE id = 'U001';

-- 조건 없이 실행 (주의)
UPDATE userTBL
SET mileage = 0;

DELETE

# 기본 문법
DELETE FROM <<table_name>>
[WHERE condition];
-- 조건 삭제
DELETE FROM buyTBL WHERE amount = 0;

-- 전체 삭제 (복구 가능)
DELETE FROM buyTBL;
# TRUNCATE
TRUNCATE TABLE <<table_name;

TRUNCATE 특징

  • 전체 데이터 삭제
  • ROLLBACK 불가
  • DELETE보다 빠름

SELECT 예제

WHERE 조건 연산자 예시

# 기본 문법(최소형)
SELECT <<column_list>>
FROM <<table_name>>;

# 기본 문법(전체)
SELECT [DISTINCT] <<column_list>>
FROM <<table_name>>
[WHERE condition]
[GROUP BY column_list]
[HAVING condition]
[ORDER BY column_list [ASC|DESC]]
[LIMIT row_count];
-- 비교 연산자
SELECT * FROM userTBL WHERE age >= 25;

-- 논리 연산자
SELECT * FROM userTBL WHERE age >= 20 AND mileage >= 100;

-- 범위
SELECT * FROM userTBL WHERE age BETWEEN 20 AND 29;

-- 목록
SELECT * FROM userTBL WHERE major IN ('CS', 'NET');

-- 패턴
SELECT * FROM userTBL WHERE name LIKE '김%';

집계 함수 (GROUP BY)

# 기본 문법
SELECT <<column>>, aggregate_function(column)
FROM <<table_name>>
GROUP BY <<column>>
HAVING [condition];

# 집계 함수
COUNT(), SUM(), AVG(), MAX(), MIN()
SELECT
    major,
    COUNT(*) AS cnt,
    AVG(age) AS avg_age
FROM userTBL
GROUP BY major;

HAVING (그룹 조건)

# 기본 문법은 Group By와 같다.
SELECT
    major,
    COUNT(*) AS cnt
FROM userTBL
GROUP BY major
HAVING COUNT(*) >= 2;

JOIN 예시 (명확한 문법)

# 기본 문법
SELECT <<column_list>>
FROM <<table1>>
JOIN <<table2>>
ON <<table1.column>> = <<table2.column>>;

INNER JOIN (일반 조인)

FROM A
INNER JOIN B ON 조건


SELECT
    u.name,
    b.productName,
    b.amount * b.price AS total
FROM userTBL u
INNER JOIN buyTBL b
    ON u.id = b.userID;

LEFT JOIN (구매 없는 사용자 포함)

FROM A
LEFT JOIN B ON 조건


SELECT
    u.name,
    b.productName
FROM userTBL u
LEFT JOIN buyTBL b
    ON u.id = b.userID;

서브쿼리 예시

SELECT <<column>>
FROM <<table>>
WHERE <<column>> > (
    SELECT aggregate_function(column)
    FROM <<table>>
);
-- 평균 나이보다 많은 사용자
SELECT name, age
FROM userTBL
WHERE age > (
    SELECT AVG(age) FROM userTBL
);

profile
정리 블로그

0개의 댓글