3장. SQL 기본 문법
3.1. SELECT ~ FROM ~ WHERE
1. SELECT
- 구축이 완료된 테이블에서 데이터를 추출하는 기능을 한다.
2. WHERE (조건식)
(1) 조건식 예시
SELECT mem_id, mem_name FROM member WHERE height <= 162;
(2) AND / OR
SELECT mem_id, mem_name FROM member WHERE height <= 162 AND mem_number > 6;
SELECT mem_id, mem_name FROM member WHERE height <= 162 OR mem_number > 6;
(3) BETWEEN AND (숫자 범위)
SELECT mem_id, mem_name FROM member WHERE height BETWEEN 163 AND 165;
(4) IN (문자열 집합)
SELECT mem_id, mem_name FROM member WHERE addr IN ('경기', '전남', '경남');
(5) LIKE (문자 비교)
- 특정 문자를 포함하거나 시작하는 데이터를 찾는다.
SELECT * FROM member WHERE mem_name LIKE '우%';
정규식 참고
3. 데이터베이스 지정 (.)
- 현재 접속 중인 DB가 아니어도 “DB명.테이블명”으로 접근 가능
USE sys;
SELECT * FROM market_db.member WHERE mem_name = '블랙핑크';
4. 지정한 열만 조회
*는 모든 열을 의미하므로, 필요 열만 선택 가능
USE market_db;
SELECT addr, height, debut_date FROM member;
5. 별칭 (Alias)
- 열 이름에 별칭을 부여해 출력 시 보기 좋게 만든다.
SELECT height AS '키', debut_date AS '데뷔 날짜', addr FROM member;
기타 명령어 요약
DROP DATABASE IF EXISTS market_db;
CREATE DATABASE market_db;
USE market_db;
CREATE TABLE member (...);
3.2. SELECT 심화
1. SELECT 절의 순서
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
(순서가 틀리면 문법 오류 발생)
2. ORDER BY (정렬)
- 결과를 정렬하여 보여준다. (데이터 자체는 변경되지 않음)
SELECT * FROM member ORDER BY debut_date DESC, mem_id ASC;
3. LIMIT (출력 개수 제한)
LIMIT 3;
LIMIT 3, 2;
4. DISTINCT (중복 제거)
SELECT DISTINCT addr FROM member;
5. GROUP BY (그룹별 집계)
(1) 집계 함수
| 함수 | 설명 |
|---|
SUM() | 합계 |
AVG() | 평균 |
MIN() | 최소값 |
MAX() | 최대값 |
COUNT() | 행 개수 (NULL 제외) |
COUNT(DISTINCT) | 중복 제외한 행 개수 |
(2) 예시
SELECT mem_id, AVG(amount) AS '평균 구매 개수'
FROM buy
GROUP BY mem_id;
6. HAVING
GROUP BY의 결과에 조건을 걸 때 사용 (집계 함수 사용 가능)
SELECT mem_id, SUM(amount) AS '총 구매량'
FROM buy
GROUP BY mem_id
HAVING SUM(amount) >= 10;
3.3. 데이터 변경을 위한 SQL
1. INSERT INTO
(1) 기본 삽입
CREATE TABLE hongong1 (toy_id INT, toy_name CHAR(4), age INT);
INSERT INTO hongong1 VALUES (1, '우디', 25);
(2) 열 지정 삽입
INSERT INTO hongong1 (toy_id, toy_name, age)
VALUES (3, '제시', 20);
2. AUTO_INCREMENT, ALTER TABLE
- 자동 증가 번호 지정
- 시작 번호 및 증가 간격 설정 가능
CREATE TABLE hongong2 (
toy_id INT AUTO_INCREMENT PRIMARY KEY,
toy_name CHAR(4),
age INT
);
INSERT INTO hongong2 VALUES (NULL, '보핍', 25);
INSERT INTO hongong2 VALUES (NULL, '렉스', 21);
SELECT LAST_INSERT_ID();
ALTER TABLE hongong2 AUTO_INCREMENT = 100;
SET @@auto_increment_increment = 3;
3. INSERT INTO ~ SELECT
CREATE TABLE city_popul (city_name CHAR(35), population INT);
INSERT INTO city_popul
SELECT Name, Population FROM world.city;
4. UPDATE
UPDATE city_popul
SET city_name = '뉴욕', population = 0
WHERE city_name = 'New York';
UPDATE city_popul
SET population = population / 10000;
5. DELETE
DELETE FROM city_popul
WHERE city_name LIKE 'New%'
LIMIT 5;
참고 명령
DESC world.city;
4장. 자료형과 변수
4.1. 숫자형 (INT)
| 자료형 | 설명 |
|---|
| TINYINT | 작은 정수 |
| SMALLINT | 중간 크기 정수 |
| INT | 일반 정수 |
| BIGINT | 매우 큰 정수 |
단순 숫자 외 “전화번호” 등은 문자형(CHAR/VARCHAR) 사용
4.2. 문자형
| 자료형 | 설명 |
|---|
| CHAR(n) | 고정 길이 문자열 (최대 255자) — 빠름 |
| VARCHAR(n) | 가변 길이 문자열 (최대 16,383자) — 공간 효율적 |
4.3. 긴 문자열 및 바이너리
| 자료형 | 범위 |
|---|
| TEXT | 1 ~ 65,535 |
| LONGTEXT | 1 ~ 4,294,967,295 |
| BLOB | 1 ~ 65,535 |
| LONGBLOB | 1 ~ 4,294,967,295 |
4.4. 실수형
| 자료형 | 크기 |
|---|
| FLOAT | 4 byte |
| DOUBLE | 8 byte |
4.5. 날짜형
| 자료형 | 크기 | 설명 |
|---|
| DATE | 3 byte | 연-월-일 |
| TIME | 3 byte | 시:분:초 |
| DATETIME | 8 byte | 날짜 + 시간 |
4.6. 변수의 사용
- 변수는 임시저장 (Workbench 종료 시 사라짐)
SET @변수이름 = 값;
SELECT @변수이름;
PREPARE / EXECUTE
- LIMIT 내에서는 변수를 직접 사용할 수 없으므로, PREPARE 구문으로 대체
SET @limit_cnt = 5;
PREPARE stmt FROM 'SELECT * FROM member LIMIT ?';
EXECUTE stmt USING @limit_cnt;
4.7. 데이터 형변환
| 함수 | 문법 |
|---|
| CAST | CAST(값 AS 데이터형식[길이]) |
| CONVERT | CONVERT(값, 데이터형식[길이]) |
동일한 기능이며 문법만 다름
4.8. 문자열 결

합
SELECT CONCAT('아이유', '님') AS 결과;
5장. 조인 (JOIN)
5.1. 개념
- 두 개 이상의 테이블을 연결하여 하나의 결과로 묶는 기능
5.2. 내부 조인 (INNER JOIN)
- 두 테이블이 일대다(PK-FK) 관계일 때 사용
SELECT 조회할_열
FROM 외래키_테이블 A
INNER JOIN 기본키_테이블 B
ON A.fk_column = B.pk_column
WHERE 조건;
5.3. 외부 조인 (OUTER JOIN)
SELECT 열_목록
FROM 첫번째_테이블
LEFT OUTER JOIN 두번째_테이블
ON 조건
WHERE 검색조건;
- LEFT / RIGHT / FULL OUTER JOIN 형태로 사용
5.4. 상호 조인 (CROSS JOIN)
- 두 테이블의 모든 행 조합을 반환 (빅데이터용)
5.5. 자체 조인 (SELF JOIN)
SELECT *
FROM emp_table A
INNER JOIN emp_table B
ON A.member = B.manager;
참고
DROP TABLE IF EXISTS 테이블명;
SELECT CURRENT_DATE();
SELECT DATEDIFF('2025-12-31', '2025-01-01');