MySQL 기초 교안
목차
- MySQL이란?
- 데이터베이스 기본 개념
- MySQL 설치 및 접속
- 데이터베이스 관리
- 테이블 생성 및 관리
- 데이터 추가 (INSERT)
- 데이터 조회 (SELECT)
- 데이터 수정 (UPDATE)
- 데이터 삭제 (DELETE)
- 조건과 정렬
- 집계 함수
- 실습 문제
1. MySQL이란?
1-1. MySQL 소개
MySQL은 관계형 데이터베이스 관리 시스템(RDBMS: Relational Database Management System)입니다.
- 데이터를 표(Table) 형태로 저장하고 관리합니다
- 웹 서비스, 쇼핑몰, 게시판, 회원관리 시스템에서 가장 많이 사용됩니다
- 오픈소스이며 무료로 사용 가능합니다
- 빠른 성능과 안정성이 뛰어납니다
1-2. MySQL의 특징
- ✅ 오픈소스: 무료로 사용 가능
- ✅ 크로스 플랫폼: Windows, Linux, macOS 모두 지원
- ✅ 높은 성능: 빠른 데이터 처리 속도
- ✅ 표준 SQL: SQL 표준을 따름
- ✅ 다양한 프로그래밍 언어 지원: Java, Python, PHP, Node.js 등
1-3. MySQL 사용 예시
- 웹사이트: 사용자 정보, 게시글, 댓글 저장
- 쇼핑몰: 상품 정보, 주문 내역, 회원 정보 관리
- 학교 시스템: 학생 정보, 성적 관리
- 병원 시스템: 환자 정보, 진료 기록 관리
2. 데이터베이스 기본 개념
2-1. 데이터베이스(Database)
데이터베이스는 데이터를 체계적으로 저장하는 공간입니다.
- 여러 개의 테이블을 포함할 수 있습니다
- 예:
school데이터베이스 안에student,teacher,course테이블 존재
2-2. 테이블(Table)
테이블은 행(Row)과 열(Column)로 구성된 데이터 구조입니다.
테이블 구조 예시
| id | name | age |
|---|---|---|
| 1 | 홍길동 | 20 |
| 2 | 김영희 | 25 |
| 3 | 박철수 | 22 |
- 행(Row): 한 명의 학생 정보 (레코드, Record)
- 열(Column): 데이터의 종류 (필드, Field)
id: 학생 번호name: 학생 이름age: 학생 나이
2-3. 주요 용어 정리
| 용어 | 설명 | 예시 |
|---|---|---|
| 데이터베이스 | 테이블들을 모아놓은 공간 | school, shop |
| 테이블 | 행과 열로 구성된 데이터 구조 | student, product |
| 행(Row) | 한 건의 데이터 | 학생 한 명의 정보 |
| 열(Column) | 데이터의 속성 | name, age, email |
| 레코드(Record) | 행과 동일한 의미 | 한 명의 학생 정보 |
| 필드(Field) | 열과 동일한 의미 | name 필드, age 필드 |
| 기본키(Primary Key) | 각 행을 구분하는 고유한 값 | id |
3. MySQL 설치 및 접속
3-1. MySQL 설치
Windows:
- MySQL 공식 사이트에서 설치 파일 다운로드
- 설치 마법사 따라 설치
- root 비밀번호 설정
Mac:
brew install mysql
Linux:
sudo apt-get install mysql-server
3-2. MySQL 접속
명령줄(CLI) 접속
mysql -u root -p
-u root: root 사용자로 접속-p: 비밀번호 입력 요청
접속 후 확인
-- MySQL 버전 확인
SELECT VERSION();
-- 현재 시간 확인
SELECT NOW();
3-3. MySQL Workbench 사용
MySQL Workbench는 MySQL을 시각적으로 관리할 수 있는 GUI 도구입니다.
- 테이블 생성, 수정이 쉬움
- SQL 쿼리 실행 및 결과 확인
- 데이터베이스 구조 시각화
4. 데이터베이스 관리
4-1. 데이터베이스 생성
CREATE DATABASE school;
실행 결과:
Query OK, 1 row affected (0.01 sec)설명:
CREATE DATABASE: 데이터베이스를 생성하는 명령어school: 생성할 데이터베이스 이름- 세미콜론(
;)으로 명령어 종료
4-2. 데이터베이스 선택
USE school;
실행 결과:
Database changed설명:
USE: 사용할 데이터베이스를 선택하는 명령어- 이후 모든 명령어는 선택한 데이터베이스에서 실행됨
4-3. 데이터베이스 목록 보기
SHOW DATABASES;
실행 결과:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)설명:
SHOW DATABASES: 모든 데이터베이스 목록을 보여줌- 시스템 데이터베이스(
information_schema,mysql등)도 함께 표시됨
4-4. 데이터베이스 삭제
DROP DATABASE school;
⚠️ 주의: 데이터베이스를 삭제하면 내부의 모든 테이블과 데이터가 삭제됩니다!
5. 테이블 생성 및 관리
5-1. 테이블 생성 문법
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
age INT
);
실행 결과:
Query OK, 0 rows affected (0.02 sec)5-2. 문법 설명
기본 구조
CREATE TABLE 테이블명 (
컬럼명1 데이터타입 [제약조건],
컬럼명2 데이터타입 [제약조건],
...
);
데이터 타입
| 데이터 타입 | 설명 | 예시 |
|---|---|---|
INT |
정수 | 1, 100, -50 |
VARCHAR(n) |
가변 길이 문자열 | VARCHAR(20): 최대 20자 |
CHAR(n) |
고정 길이 문자열 | CHAR(10): 정확히 10자 |
DATE |
날짜 | '2024-01-15' |
DATETIME |
날짜와 시간 | '2024-01-15 14:30:00' |
DECIMAL(m, n) |
소수점 숫자 | DECIMAL(10, 2): 10자리, 소수점 2자리 |
제약조건
| 제약조건 | 설명 |
|---|---|
PRIMARY KEY |
기본키 (고유한 값, NULL 불가) |
AUTO_INCREMENT |
자동 증가 (1씩 자동 증가) |
NOT NULL |
NULL 값 불가 |
UNIQUE |
중복 값 불가 |
DEFAULT 값 |
기본값 설정 |
예제 분석
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT, -- 정수형, 기본키, 자동증가
name VARCHAR(20), -- 최대 20자 문자열
age INT -- 정수형
);
id: 학생 번호, 자동으로 1, 2, 3... 증가name: 학생 이름, 최대 20자age: 학생 나이, 정수
5-3. 테이블 목록 확인
SHOW TABLES;
실행 결과:
+------------------+
| Tables_in_school |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)5-4. 테이블 구조 확인
DESC student;
또는
DESCRIBE student;
실행 결과:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| age | int | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)컬럼 설명:
Field: 컬럼 이름Type: 데이터 타입Null: NULL 허용 여부 (YES/NO)Key: 키 종류 (PRI=기본키)Default: 기본값Extra: 추가 정보 (auto_increment 등)
5-5. 테이블 삭제
DROP TABLE student;
⚠️ 주의: 테이블을 삭제하면 모든 데이터가 삭제됩니다!
5-6. 테이블 수정 (ALTER)
컬럼 추가
ALTER TABLE student ADD COLUMN email VARCHAR(50);
컬럼 삭제
ALTER TABLE student DROP COLUMN email;
컬럼 수정
ALTER TABLE student MODIFY COLUMN name VARCHAR(30);
6. 데이터 추가 (INSERT)
6-1. 기본 INSERT 문법
INSERT INTO student (name, age)
VALUES ('홍길동', 20);
실행 결과:
Query OK, 1 row affected (0.01 sec)6-2. 문법 설명
기본 구조
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...);
여러 개 추가
INSERT INTO student (name, age)
VALUES
('홍길동', 20),
('김영희', 25),
('박철수', 22);
실행 결과:
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 06-3. AUTO_INCREMENT 컬럼 처리
id가 AUTO_INCREMENT로 설정되어 있으면, id 값을 생략할 수 있습니다.
-- id는 자동으로 1, 2, 3... 증가
INSERT INTO student (name, age) VALUES ('홍길동', 20);
INSERT INTO student (name, age) VALUES ('김영희', 25);
6-4. 데이터 확인
SELECT * FROM student;
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 홍길동 | 20 |
| 2 | 김영희 | 25 |
| 3 | 박철수 | 22 |
+----+--------+------+
3 rows in set (0.00 sec)7. 데이터 조회 (SELECT)
7-1. 전체 조회
SELECT * FROM student;
설명:
SELECT: 데이터를 조회하는 명령어*: 모든 컬럼을 의미FROM student:student테이블에서 조회
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 홍길동 | 20 |
| 2 | 김영희 | 25 |
| 3 | 박철수 | 22 |
+----+--------+------+
3 rows in set (0.00 sec)7-2. 특정 컬럼 조회
SELECT name, age FROM student;
실행 결과:
+--------+------+
| name | age |
+--------+------+
| 홍길동 | 20 |
| 김영희 | 25 |
| 박철수 | 22 |
+--------+------+
3 rows in set (0.00 sec)7-3. 조건 조회 (WHERE)
기본 WHERE 문법
SELECT * FROM student WHERE age >= 20;
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 홍길동 | 20 |
| 2 | 김영희 | 25 |
| 3 | 박철수 | 22 |
+----+--------+------+
3 rows in set (0.00 sec)비교 연산자
| 연산자 | 의미 | 예시 |
|---|---|---|
= |
같다 | WHERE age = 20 |
!= 또는 <> |
같지 않다 | WHERE age != 20 |
> |
크다 | WHERE age > 20 |
>= |
크거나 같다 | WHERE age >= 20 |
< |
작다 | WHERE age < 25 |
<= |
작거나 같다 | WHERE age <= 25 |
예제
-- 나이가 20세인 학생
SELECT * FROM student WHERE age = 20;
-- 나이가 20세 이상인 학생
SELECT * FROM student WHERE age >= 20;
-- 이름이 '홍길동'인 학생
SELECT * FROM student WHERE name = '홍길동';
7-4. 문자열 검색 (LIKE)
-- '홍'으로 시작하는 이름
SELECT * FROM student WHERE name LIKE '홍%';
-- '영'이 포함된 이름
SELECT * FROM student WHERE name LIKE '%영%';
-- '수'로 끝나는 이름
SELECT * FROM student WHERE name LIKE '%수';
와일드카드:
%: 0개 이상의 문자_: 정확히 1개의 문자
8. 데이터 수정 (UPDATE)
8-1. 기본 UPDATE 문법
UPDATE student
SET age = 21
WHERE id = 1;
실행 결과:
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 08-2. 문법 설명
기본 구조
UPDATE 테이블명
SET 컬럼1 = 값1, 컬럼2 = 값2, ...
WHERE 조건;
여러 컬럼 수정
UPDATE student
SET name = '홍길동', age = 21
WHERE id = 1;
8-3. ⚠️ 주의사항
WHERE 조건 없으면 전체 수정됨!
-- ❌ 위험: 모든 학생의 나이가 21로 변경됨!
UPDATE student SET age = 21;
-- ✅ 올바른 방법: 특정 학생만 수정
UPDATE student SET age = 21 WHERE id = 1;
8-4. 수정 확인
SELECT * FROM student WHERE id = 1;
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 홍길동 | 21 |
+----+--------+------+
1 row in set (0.00 sec)9. 데이터 삭제 (DELETE)
9-1. 기본 DELETE 문법
DELETE FROM student WHERE id = 1;
실행 결과:
Query OK, 1 row affected (0.01 sec)9-2. 문법 설명
기본 구조
DELETE FROM 테이블명
WHERE 조건;
9-3. ⚠️ 주의사항
WHERE 조건 필수!
-- ❌ 위험: 모든 데이터가 삭제됨!
DELETE FROM student;
-- ✅ 올바른 방법: 특정 학생만 삭제
DELETE FROM student WHERE id = 1;
9-4. 여러 조건으로 삭제
-- 나이가 20세 미만인 학생 삭제
DELETE FROM student WHERE age < 20;
-- 이름이 '홍길동'인 학생 삭제
DELETE FROM student WHERE name = '홍길동';
9-5. 삭제 확인
SELECT * FROM student;
10. 조건과 정렬
10-1. AND / OR
AND (그리고)
SELECT * FROM student
WHERE age >= 20 AND age <= 25;
설명: 나이가 20세 이상 그리고 25세 이하인 학생
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 홍길동 | 20 |
| 2 | 김영희 | 25 |
| 3 | 박철수 | 22 |
+----+--------+------+
3 rows in set (0.00 sec)OR (또는)
SELECT * FROM student
WHERE age = 20 OR age = 25;
설명: 나이가 20세 또는 25세인 학생
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 홍길동 | 20 |
| 2 | 김영희 | 25 |
+----+--------+------+
2 rows in set (0.00 sec)IN (여러 값 중 하나)
SELECT * FROM student
WHERE age IN (20, 25, 30);
설명: 나이가 20, 25, 30 중 하나인 학생
10-2. 정렬 (ORDER BY)
오름차순 정렬 (ASC)
SELECT * FROM student
ORDER BY age ASC;
또는 (ASC는 생략 가능)
SELECT * FROM student
ORDER BY age;
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 홍길동 | 20 |
| 3 | 박철수 | 22 |
| 2 | 김영희 | 25 |
+----+--------+------+
3 rows in set (0.00 sec)내림차순 정렬 (DESC)
SELECT * FROM student
ORDER BY age DESC;
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 2 | 김영희 | 25 |
| 3 | 박철수 | 22 |
| 1 | 홍길동 | 20 |
+----+--------+------+
3 rows in set (0.00 sec)여러 컬럼 정렬
SELECT * FROM student
ORDER BY age DESC, name ASC;
설명: 먼저 나이로 내림차순, 나이가 같으면 이름으로 오름차순
10-3. LIMIT (결과 개수 제한)
-- 상위 2개만 조회
SELECT * FROM student
ORDER BY age DESC
LIMIT 2;
실행 결과:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 2 | 김영희 | 25 |
| 3 | 박철수 | 22 |
+----+--------+------+
2 rows in set (0.00 sec)11. 집계 함수
11-1. COUNT (개수 세기)
SELECT COUNT(*) FROM student;
실행 결과:
+----------+
| COUNT(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)설명: 전체 학생 수
조건과 함께 사용
SELECT COUNT(*) FROM student WHERE age >= 20;
설명: 나이가 20세 이상인 학생 수
11-2. AVG (평균)
SELECT AVG(age) FROM student;
실행 결과:
+----------+
| AVG(age) |
+----------+
| 22.3333 |
+----------+
1 row in set (0.00 sec)설명: 평균 나이
11-3. SUM (합계)
SELECT SUM(age) FROM student;
실행 결과:
+----------+
| SUM(age) |
+----------+
| 67 |
+----------+
1 row in set (0.00 sec)설명: 나이의 합계
11-4. MAX (최댓값)
SELECT MAX(age) FROM student;
실행 결과:
+----------+
| MAX(age) |
+----------+
| 25 |
+----------+
1 row in set (0.00 sec)설명: 최대 나이
11-5. MIN (최솟값)
SELECT MIN(age) FROM student;
실행 결과:
+----------+
| MIN(age) |
+----------+
| 20 |
+----------+
1 row in set (0.00 sec)설명: 최소 나이
11-6. 집계 함수 정리
| 함수 | 설명 | 예시 |
|---|---|---|
COUNT(*) |
행의 개수 | SELECT COUNT(*) FROM student; |
AVG(컬럼) |
평균값 | SELECT AVG(age) FROM student; |
SUM(컬럼) |
합계 | SELECT SUM(age) FROM student; |
MAX(컬럼) |
최댓값 | SELECT MAX(age) FROM student; |
MIN(컬럼) |
최솟값 | SELECT MIN(age) FROM student; |
11-7. AS (별칭)
SELECT COUNT(*) AS 학생수 FROM student;
SELECT AVG(age) AS 평균나이 FROM student;
실행 결과:
+--------+
| 학생수 |
+--------+
| 3 |
+--------+
1 row in set (0.00 sec)12. 실습 문제
문제 1: 데이터베이스 및 테이블 생성
요구사항:
shop데이터베이스를 생성하세요member테이블을 생성하세요id: INT, PRIMARY KEY, AUTO_INCREMENTname: VARCHAR(20)email: VARCHAR(50)
정답:
-- 1. 데이터베이스 생성
CREATE DATABASE shop;
-- 2. 데이터베이스 선택
USE shop;
-- 3. 테이블 생성
CREATE TABLE member (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
email VARCHAR(50)
);
문제 2: 데이터 추가
요구사항:
회원 3명을 추가하세요
- 홍길동, hong@example.com
- 김영희, kim@example.com
- 박철수, park@example.com
정답:
INSERT INTO member (name, email)
VALUES
('홍길동', 'hong@example.com'),
('김영희', 'kim@example.com'),
('박철수', 'park@example.com');
확인:
SELECT * FROM member;
실행 결과:
+----+--------+-------------------+
| id | name | email |
+----+--------+-------------------+
| 1 | 홍길동 | hong@example.com |
| 2 | 김영희 | kim@example.com |
| 3 | 박철수 | park@example.com |
+----+--------+-------------------+
3 rows in set (0.00 sec)문제 3: 데이터 조회
요구사항:
- 전체 회원을 조회하세요
- 이름과 이메일만 조회하세요
- 이름이 '홍길동'인 회원을 조회하세요
정답:
-- 1. 전체 조회
SELECT * FROM member;
-- 2. 이름과 이메일만 조회
SELECT name, email FROM member;
-- 3. 특정 회원 조회
SELECT * FROM member WHERE name = '홍길동';
문제 4: 데이터 수정
요구사항:
id가 1인 회원의 이메일을 hong123@example.com으로 수정하세요
정답:
UPDATE member
SET email = 'hong123@example.com'
WHERE id = 1;
확인:
SELECT * FROM member WHERE id = 1;
실행 결과:
+----+--------+----------------------+
| id | name | email |
+----+--------+----------------------+
| 1 | 홍길동 | hong123@example.com |
+----+--------+----------------------+
1 row in set (0.00 sec)문제 5: 데이터 삭제
요구사항:
id가 3인 회원을 삭제하세요
정답:
DELETE FROM member WHERE id = 3;
확인:
SELECT * FROM member;
실행 결과:
+----+--------+----------------------+
| id | name | email |
+----+--------+----------------------+
| 1 | 홍길동 | hong123@example.com |
| 2 | 김영희 | kim@example.com |
+----+--------+----------------------+
2 rows in set (0.00 sec)문제 6: 집계 함수 사용
요구사항:
- 전체 회원 수를 조회하세요
- 회원 이름을 오름차순으로 정렬하여 조회하세요
정답:
-- 1. 전체 회원 수
SELECT COUNT(*) AS 회원수 FROM member;
-- 2. 이름 오름차순 정렬
SELECT * FROM member ORDER BY name ASC;
13. 핵심 포인트 정리
13-1. SQL 명령어 순서
SELECT → FROM → WHERE → ORDER BY → LIMIT예시:
SELECT name, age
FROM student
WHERE age >= 20
ORDER BY age DESC
LIMIT 5;
13-2. 주의사항
⚠️ UPDATE / DELETE는 항상 WHERE 확인!
-- ❌ 위험
UPDATE student SET age = 20;
DELETE FROM student;
-- ✅ 안전
UPDATE student SET age = 20 WHERE id = 1;
DELETE FROM student WHERE id = 1;
13-3. 데이터 타입 선택 가이드
| 데이터 종류 | 권장 타입 | 예시 |
|---|---|---|
| 정수 | INT |
나이, 수량 |
| 문자열 (가변) | VARCHAR(n) |
이름, 주소 |
| 문자열 (고정) | CHAR(n) |
우편번호, 코드 |
| 날짜 | DATE |
생년월일 |
| 날짜+시간 | DATETIME |
가입일시 |
| 소수점 | DECIMAL(m, n) |
가격, 평균 |
13-4. 자주 사용하는 패턴
-- 전체 조회
SELECT * FROM 테이블명;
-- 조건 조회
SELECT * FROM 테이블명 WHERE 조건;
-- 정렬 조회
SELECT * FROM 테이블명 ORDER BY 컬럼명 DESC;
-- 개수 조회
SELECT COUNT(*) FROM 테이블명;
-- 평균 조회
SELECT AVG(컬럼명) FROM 테이블명;
14. 다음 학습 추천
14-1. 중급 SQL
- JOIN: 여러 테이블 연결하기
- GROUP BY / HAVING: 그룹화 및 조건
- 서브쿼리: 쿼리 안의 쿼리
- 인덱스(Index): 검색 속도 향상
14-2. 고급 SQL
- 트랜잭션: 데이터 일관성 보장
- 뷰(View): 가상 테이블
- 프로시저(Procedure): 저장된 SQL 로직
- 트리거(Trigger): 자동 실행 SQL
14-3. 프로그래밍 연동
- Java + JDBC: Java에서 MySQL 사용
- Spring Boot + JPA: ORM 프레임워크
- Python + MySQL: Python에서 MySQL 사용
- Node.js + MySQL: Node.js에서 MySQL 사용
15. 참고 자료
15-1. 공식 문서
- MySQL 공식 문서: https://dev.mysql.com/doc/
- MySQL 튜토리얼: https://dev.mysql.com/doc/refman/8.0/en/tutorial.html
15-2. 학습 사이트
- SQLBolt: https://sqlbolt.com/
- W3Schools SQL: https://www.w3schools.com/sql/
📌 TIP
- SELECT → WHERE → ORDER BY 순서 기억하기
- UPDATE / DELETE는 항상 WHERE 확인하기
- 테이블 생성 전에 구조를 먼저 설계하기
- 데이터 타입을 적절히 선택하기
- PRIMARY KEY는 항상 설정하기
작성일: 2024년
버전: 1.0
'BackEnd > MySql' 카테고리의 다른 글
| MySQL 설치(Windows) (0) | 2026.01.27 |
|---|---|
| 1. MySQL 시작하기 (0) | 2026.01.22 |
| 2. MySQL 데이터베이스 기본 명령어 (0) | 2026.01.22 |
| SQLD 시험 준비 교안 (0) | 2026.01.22 |
| MySQL 중급 교안 (0) | 2026.01.22 |