
1) NOT NULL : NULL 입력 불가
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(50) NOT NULL -- 반드시 값이 있어야 함
);
2) UNIQUE : 유니크 키(중복X, NULL 가능)
CREATE TABLE employees (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE -- 이메일 중복 불가
);
3) PRIMARY KEY : 기본 키(중복X, NULLX)
CREATE TABLE students (
id INT PRIMARY KEY, -- 기본 키 설정 (중복X, NULLX)
name VARCHAR(50)
);
4) FOREIGN KEY : 다른 테이블의 기본 키 참조
CREATE TABLE department (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50) NOT NULL
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
dept_id INT,
FOREIGN KEY (dept_id)
REFERENCES department(dept_id) ON DELETE CASCADE
);
5) CHECK : 특정 조건을 만족해야 함
CREATE TABLE employees (
id INT PRIMARY KEY,
age INT CHECK (age >= 18) -- 18세 이상만 가능
);
create table employees(
id int auto_increment primary key, # unique + not null
name varchar(50),
age int check(age >= 18),
gender char(1) CHECK(gender IN('M', 'F'))
);
create table employees(
id int auto_increment primary key, # unique + not null
name varchar(50),
age int check(age >= 20), # 20세 이상만 가능
gender char(1) CHECK(gender IN('M', 'F')) # 'M' 또는 'F'만 허용
);
CREATE TABLE students (
student_id INT AUTO_INCREMENT PRIMARY KEY, -- 기본 키 설정
name VARCHAR(50) NOT NULL,
age INT
);

기본적으로 int는 signed이기 때문에 int의 범위는 -2,147,483,648 ~ 2,147,483,647 (약 -21억 ~ 21억)이다.
import pymysql
import pandas as pd
import numpy as np
# MySQL Connection 연결
conn = pymysql.connect(
host = 'localhost',
user = 'scott',
password = 'tiger',
db = 'scott', charset = 'utf8')
sql = "select * from dept"
df_dept = pd.read_sql(sql, conn)
print(df_dept)
# df_dept.to_csv("dept.csv") # csv 파일에 적음
# df_dept.to_excel("dept.xlsx") # 엑셀 파일에 적음
# 단 엑셀로 저장하고 싶을 경우
# pip install openpyxl
import pymysql
# MySQL Connection 연결
conn = pymysql.connect(
host = 'localhost',
user = 'scott',
password = 'tiger',
db = 'scott', charset = 'utf8')
# Connection으로부터 Cursor 형성
# cursor 객체 생성 -> cursor 객체의 역할은 SQL 문장을 실행하고 결과를 가져오는 역할
curs = conn.cursor()
# SQL문 실행
sql = "select * from dept"
curs.execute(sql)
# 데이터 Fetch
rows = curs.fetchall()
for row in rows :
print(row)
conn.close()
네줄요약)
1. int 는 4바이트, 32 비트, -21억 ~ 21억 이다.
2.delete , trucate, drop을 구분하여 쓰자
3. 트랜잭션은 일련의 작업 단위이다.
4. DB 연결시 connetion 객체 와 cursor 객체를 활용하여, 데이터를 CRUD 할수 있다.
: 데이터 정의어
: 테이블을 생성/수정/삭제하는 SQL 명령어
: CREATE, ALTER, DROP, TRUNCATE
: 자동 반영되지만 롤백 불가
: 테이블 구조 자체를 변경
: 데이터 조작어
: 테이블의 데이터를 삽입 / 수정 / 삭제하는 SQL 명령어
: commit 필요하지만 롤백 가능 (커밋하기 전의 변경 내용을 되돌리기 가능)
: 테이블의 데이터만 변경
Delete : 기본적인 뼈대는 남아있고 롤백 가능
Truncate : 기본적인 뼈대는 남아있고 롤백 불가능
Drop : 흔적도 없이 삭제됨
table을 drop한 후 다시 select로 보려고 하면 에러가 남
피도 눈물도 없는 drop임...
트랜잭션은 여러 개의 SQL 작업을 하나의 논리적인 단위로 묶는 것이다.
중간에 문제가 발생하면 변경사항을 취소(Rollback)할 수 있다.
Commit하면 변경내용이 확정되며 Rollback 할 수 없다.
START TRANSACTION; : 트랜잭션 시작
ROLLBACK; : 변경사항 취소 (되돌리기)
COMMIT; : 변경사항 확정 (저장)
SAVEPOINT 지점명; : 특정 지점 저장 (부분 롤백 가능)
SELECT @@autocommit; : 1이면 자동 커밋 모드이기 때문에 SQL 실행 즉시 저장되고 0이면 수동 커밋 모드이기 때문에 COMMIT 해야 저장된다.
