SQL
SQL (데이터베이스 표준 질의어)
- 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터베이스, 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어
- 질의어(Query Launguage)는 검색 언어라는 의미
- 데이터를 검색하는 역할 외에 데이터 입력, 수정, 삭제, 제어, 복구 등 다양한 기능을 제공하는 종합적인 언어
- Structured Query Language
에스큐엘
또는시퀄
이라 읽음- DBMS 제품 별 특화된 SQL 사용
SQL 문의 기능별 분류
데이터 정의어(DDL)
- 데이터베이스, 테이블 구조를 생성 / 수정 / 삭제하는데 사용
- 스키마, 테이블, 뷰, 인덱스 정의, 변경, 삭제할 때 사용하는 명령문
- CREATE / ALTER / DROP
- CREATE: 데이터베이스, 테이블 등 객체 생성
- ALTER: 기존에 존재하는 데이터베이스 객체 변경
- DROP: 데이터베이스 등 객체 삭제
데이터 조작어(DML)
- 테이블의 데이터를 검색, 삽입, 수정, 삭제하는데 사용
- 고급 프로그래밍 언어로 작성된 응용프로그램에 내포되어 사용
- SELECT / INSERT / UPDATE / DELETE
- SELECT: 데이터 검색
- INSERT: 데이터 입력
- UPDATE: 데이터 수정
- DELETE: 데이터 삭제
데이터 제어어(DCL)
- 데이터의 사용 권한 등 관리에 사용
- GRANT / REVOKE / COMMIT / ROLLBACK
- GRANT: 권한 부여
- REVOKE: 권한 취소
- COMMIT: 변경된 내용을 영구적으로 DB에 반영하는 것
- ROLLBACK: 변경된 내용을 취소하고 DB를 이전 상태로 되돌리는 것(특정 시점)
스키마 생성 (CREATE)
- CREATE SCHEMA / CREATE DATABASE
- SCHEMA와 DATABASE는 동일 의미
CREATE SCHEMA 스키마명;
CRREATE DATABASE 스키마명;
-- 스키마 (데이터베이스) 생성
CREATE SCHEMA sqldb DEFAULT CHARACTER SET utf8;
CREATE DATABASE sqldb2 DEFAULT CHARACTER SET utf8mb4;
스키마 삭제 (DROP)
- DROP SCHEMA / DROP DATABASE
- SCHEMA와 DATABASE는 동일 의미이기 때문에
- DROP SCHEMA sqldb2를 해도 스키마 삭제가 가능
DROP SCHEMA 스키마명;
DROP DATABASE 스키마명;
-- 스키마(데이터베이스) 삭제 (DELETE)
-- DROP SCHEMA sqldb2를 해도 동일한 의미이므로 삭제 됨
DROP DATABASE sqldb2;
테이블 생성
- CREATE TABLE
- 속성(열)과 속성에 관한 제약 정의
- 기본키(PRIMARY KEY), 외래키(FOREIGN KEY) 정의
CREATE TABLE 테이블명(
열이름 데이터타입(크기) [제약조건 리스트(생략 가능)],
열이름 데이터타입(크기) ~~~,
열이름...
);
사용할 데이터베이스 지정
use sqldb;
상품 테이블 생성
- 제약조건
- 기본키: prdNO
- prdNO, prdName: NOT NULL
- prdPrice, prdCompany
CREATE TABLE product(
prdNo VARCHAR(10) NOT NULL PRIMARY KEY,
prdName VARCHAR(30) NOT NULL,
prdPrice INT,
prdCompany VARCHAR(30)
);
PRIMARY KEY 제약조건
- 기본키 제약조건
- 열에 지정
- NULL 값 안됨
- (자동으로 중복 안됨)
PK 제약조건 설정방법 1
CREATE TABLE product(
prdNo VARCHAR(10) NOT NULL PRIMARY KEY,
prdName VARCHAR(30) NOT NULL,
prdPrice INT,
prdCompany VARCHAR(30)
);
PK 제약조건 설정방법 2
CREATE TABLE product2(
prdNo VARCHAR(10) NOT NULL,
prdName VARCHAR(30) NOT NULL,
prdPrice INT,
prdCompany VARCHAR(30),
PRIMARY KEY(prdNo)
);
PK 제약조건 설정방법 3
CREATE TABLE product3(
prdNo VARCHAR(10) NOT NULL,
prdName VARCHAR(30) NOT NULL,
prdPrice INT,
prdCompany VARCHAR(30),
CONSTRAINT PK_product_prdNo PRIMARY KEY(prdNo)
);
상세 정보 출력
DESCRIBE product;
출판사 테이블 생성(출판사 번호, 출판사명)
- 제약조건 설정
- 기본키로 pubNo NOT NULL
- pubName NOT NULL
CREATE TABLE publisher(
pubNo VARCHAR(10) NOT NULL PRIMARY KEY,
pubName VARCHAR(30) NOT NULL
);
FOREIGN KEY 제약조건
- REFERENCES 참조하는 테이블명(기본키) : 현재의 외래키가 기본키로 소속되어 있는 테이블(부모 테이블)
- CONSTRAINT: 제약조건
CONSTRAINT 외래키이름 FOREIGN KEY(외래키로 사용하는 열이름) REFERENCES 참조하는 테이블명(기본키)
도서 테이블 설정
- 외래키(출판사 번호 pubNo) 제약조건 설정
- 외래키(출판사 번호 pubNo) 제약조건 설정
- 기타 제약조건 설정
- 기본키: bookNo NOT NULL
- 외래키: pubNo (참조 테이블의 기본키와 동일하게 설정)
- bookPrice: 기본값(DEFAULT) 10000, 1000보다 크게 설정(CHECK(bookPrice > 1000))
CREATE TABLE book(
bookNo VARCHAR(10) NOT NULL PRIMARY KEY,
bookName VARCHAR(30) NOT NULL,
bookPrice INT DEFAULT 10000 CHECK(bookPrice > 1000),
bookDate date,
pubNo VARCHAR(10) NOT NULL,
CONSTRAINT FK_book_publisher FOREIGN KEY(pubNo) REFERENCES publisher(pubNo)
);
- PRI: 기본키
- MUL: 중복 가능한 키(외래키)
- 외래키로 지정된 열에는 동일 값(중복값) 저장 가능
- 강남 출판사에서 출간한 도서가 여러 권 있는 것과 동일
테이블 생성 순서 주의!!
- 외래키로 제약조건을 설정할 경우
- 테이블 생성순서
- publisher(기본키로 설정 해놓기)
- book (book 테이블에서 외래키로설정 가능하기 때문에)
- 테이블 생성 후 데이터 입력 시 주의사항
- publisher의 기본키인 pubNo에 값을 먼저 입력해야 book의 pubNo 입력할 때 오류 없음
- 즉, 외래키 값을 입력할 때는 참조되는 테이블의 기본 키로서의 값과 동일해야함(
참조 무결성 제약조건
)
테이블 삭제 시 주의!!
- publisher 먼저 삭제하면 외래키로 사용 중이라는 오류 발생 (book에서 pubNo 사용중이기 때문)
- book 테이블 먼저 삭제하고 publisher 삭제
- 즉, 외래키로 사용 중인 경우에는 참조되는 테이블(부모 테이블)의 기본키를 삭제할 수 없음(
참조 무결성 제약조건
)
데이터 입력 (INSERT 배우기 전이므로 표에 직접 삽입)
- publisher 테이블 먼저 입력
- 서울 출판사
- 도서출판 강남
- 정보 출판사
- book 테이블에 데이터 입력
- 설정된 제약조건
- bookName에 NULL값 삽입 불가능
- bookPrice에 1000이하 값을 입력 시 CHECK 제약조건 충돌오류 발생
- bookPrice에 입력하지 않으면(NULL) 10000으로 default 값 입력됨
- book 테이블의 pubNo 입력 시 1,2,3 이외의 값 입력 시 외래키 제약조건 위배로 충돌 발생
- 설정된 제약조건
연습문제
- 학생과 학과테이블 생성, 데이터 최소 3개씩 입력
- 제약 조건
- 기본키 설정
- 필요한 경우 외래키 설정
- 학생은 학과에 소속
- 학생 이름과 학과 이름은 NULL 값을 허용하지 않음
- 학년은 4를 기본값으로, 범위는 1 ~ 4로 설정(AND 키워드 사용)
- 테이블 생성 순서
- 학과 테이블(department)
- 학생 테이블(student) : 학과 번호를 외래키로 설정
-- 학과 테이블 생성
CREATE TABLE department(
dNo VARCHAR(30) NOT NULL PRIMARY KEY,
dName VARCHAR(10) NOT NULL,
dTel VARCHAR(13)
);
-- 학생 테이블 생성
CREATE TABLE student(
stdNo VARCHAR(10) NOT NULL PRIMARY KEY,
stdName VARCHAR(30) NOT NULL,
stdGrade INT DEFAULT 4 CHECK(stdGrade >= 1 AND stdGrade <=4),
stdAddress VARCHAR(50),
stdBirth DATE,
dNo VARCHAR(10) NOT NULL,
CONSTRAINT FK_student_department FOREIGN KEY(dNo) REFERENCES department(dNo)
);
- 테이블 3개 추가 생성 (교수 / 과목 / 성적)
- 학과 테이블
- 학과코드(PK)
- 학과명
- 전화번호
- 학생 테이블
- 학번(PK)
- 성명
- 학년
- 주소
- 생년월일
- 학과코드(FK)
- 교수 테이블
- 교수번호(PK)
- 교수명
- 직위
- 전화번호
- 학과코드(FK)
- 과목 테이블
- 과목코드(PK)
- 과목명
- 학점수
- 교수번호(FK)
- 성적
- 학번(FK)
- 과목코드(FK)
- 성적
- 등급
-- 교수 테이블 생성
CREATE TABLE professor(
proNo VARCHAR(10) NOT NULL PRIMARY KEY,
proName VARCHAR(30) NOT NULL,
proPosition VARCHAR(20),
proTel VARCHAR(13),
dNo VARCHAR(10) NOT NULL,
CONSTRAINT FK_professor_department FOREIGN KEY(dNo) REFERENCES department(dNo)
);
-- 과목 테이블 생성
CREATE TABLE subjects(
subNo VARCHAR(10) NOT NULL PRIMARY KEY,
subName VARCHAR(30) NOT NULL,
subCnt INT,
proNo VARCHAR(10) NOT NULL,
CONSTRAINT FK_subject_professor FOREIGN KEY(proNo) REFERENCES professor(proNo)
);
-- 성적 테이블 생성
CREATE TABLE score (
stdNo VARCHAR(10) NOT NULL,
subNo VARCHAR(10) NOT NULL,
scScore INT,
scGrade VARCHAR(2),
CONSTRAINT FK_score_stdNo_subNo PRIMARY KEY(stdNo, subNo),
CONSTRAINT FK_score_student FOREIGN KEY(stdNo) REFERENCES student(stdNo),
CONSTRAINT FK_score_subjects FOREIGN KEY(subNo) REFERENCES subjects(subNo)
);
기본키 값 자동 증가
- AUTO_INCREMENT
- 속성 값을 자동으로 증가(아무 것도 지정하지 않으면 기본 1부터 시작해서 1씩 증가)
- AUTO_INCREMENT = 100
- 기본 시작 값을 100으로 설정
- SET @@AUTO_INCREMENT_INCREMENT = 3
- 3씩 증가
실습
- 게시판 테이블 생성
- 조건
- 1부터 1씩 증가
- 초기값 100으로 설정하고 3씩 증가
-- 게시판 테이블 생성
CREATE TABLE board(
boardNo INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
boardTitle VARCHAR(30) NOT NULL,
boardWriter VARCHAR(20),
boardContent VARCHAR(100) NOT NULL
);
-- board2 생성 및 초기값 100으로 설정하고 3씩 증가
CREATE TABLE board2(
boardNo INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
boardTitle VARCHAR(30) NOT NULL,
boardWriter VARCHAR(20),
boardContent VARCHAR(100) NOT NULL
);
ALTER TABLE board2 AUTO_INCREMENT = 100;
SET @@AUTO_INCREMENT_INCREMENT=3;
- 다시 1부터 1씩 증가하도록 변경
Safe Updates 모드 해제
- 수정, 삭제, 기본키 수정 등 안전성 작업을 못하도록 기본 설정되어있는 것 해제
- Edit / Preferences 창 열고 SQL Editor 선택한 후에 맨 아래에 있는 Safe Updates 체크해제하고 [OK] 닫음
- 반드시 Workbench 종료하고 다시 시작
-- 100부터 시작해서 3씩 증가하는 것을
-- 1부터 1씩 증가하는 것으로 변경
SET @COUNT = 0;
UPDATE board2 SET boardNo = @COUNT:=@COUNT+1;
- 중간에 있는 값 삭제하고 전체를 다시 1부터 1씩 증가하도록 재정렬
- 2번 항목을 삭제하고 새로 추가했더니 4부터 시작하느 것이 아니라 106 다음의 109부터 시작
- 다시 0으로 설정 후 초기값 1로 다시 설정
SET @COUNT = 0;
UPDATE board2 SET boardNo = @COUNT:=@COUNT+1;
ALTER TABLE board2 AUTO_INCREMENT = 1;
- 4번 항목 다시 추가하면 원래대로 1부터 1씩 증가하는 테이블 생성됨
테이블 수정(ALTER)
- 테이블에 대한 정의(구조) 변경
- 새로운 열 추가, 특정 열의 디폴트값 변경, 특정 열 삭제 등 수정
- ALTER TABLE 테이블명
- ADD: 열 추가
- RENAME COLUMN: 열 이름 변경
- MODIFY: 열의 데이터 형식 변경
- CHANGE: 열 이름과 데이터 형식 동시 변경
- DROP COLUMN: 열 삭제
- DROP: 여러 개 열 삭제
- DROP PRIMARY KEY: 기본 키 삭제
- DROP CONSTRAINT: 제약조건 삭제
ALTER TABLE 테이블명 ADD ...
ALTER TABLE 테이블명 RENAME COLUMN ...
...
학생 테이블에 열 추가
- stdTel 열 추가
ALTER TABLE student ADD stdTel VARCHAR(13);
- 여러 개의 열 추가
- stdAge, stdAddress 열 추가
ALTER TABLE student ADD (stdAge VARCHAR(2), stdAddress2 VARCHAR(50));
- 열의 데이터 형식 변경
- stdAge 열의 데이터 타입 변경
ALTER TABLE student MODIFY stdAge INT;
- 열의 제약조건 변경
- stdName을 NULL 허용으로 변경
ALTER TABLE student MODIFY stdName VARCHAR(2) NULL;
- 열 이름 변경
- stdTel을 stdHP로 변경 (데이터 타입을 적으면 구문오류!!!)
ALTER TABLE student RENAME COLUMN stdTel TO stdHP;
- 열 이름과 데이터 타입 변경
ALTER TABLE student CHANGE stdAddress stdAddress1 VARCHAR(30);
- 열 삭제
- stdHP 열 삭제
ALTER TABLE student DROP COLUMN stdHP;
- 여러 개의 열 삭제
ALTER TABLE student DROP stdAge, DROP stdAddress1, DROP stdAddress2;
연습문제
- product 테이블에 숫자 값을 갖는 prdStock과 제조일을 나타내는 prdDate 열 추가
- product 테이블의 prdCompany 열을 NOT NULL로 변경
- publisher 테이블에 pubPhone, pubAddress 열 추가
- publisher 테이블에서 pubPhone 열 삭제
-- 1번
ALTER TABLE product ADD (prdStock INT, prdDate DATE);
-- 2번
ALTER TABLE product MODIFY prdCompany VARCHAR(30) NULL;
-- 3번
ALTER TABLE publisher ADD(pubPhone VARCHAR(13), pubAddress VARCHAR(30));
-- 4번
ALTER TABLE publisher DROP COLUMN pubPhone;
기본키 삭제
- 외래키 제약조건이 설정된 경우 기본키 테이블의 기본키 삭제 시 오류 발생
- 밑의 시긍ㄹ 실행하면 외래키 제약조건에 위배되기 때문에 실행되지 않음
ALTER TABLE department DROP PRIMARY KEY;
- 외래키 제약조건 먼저 삭제하기
- 학생과 교수 테이블에서 외래키로 사용하고 있기 때문에 둘 다 끊어줘야함
ALTER TABLE student DROP CONSTRAINT FK_student_department;
ALTER TABLE professor DROP CONSTRAINT FK_professor_department;
- 기본키 삭제하기
ALTER TABLE department DROP PRIMARY KEY;
기본키 / 외래키 추가
- 기본키 제약조건 추가: department 테이블
ALTER TABLE department ADD CONSTRAINT PK_department_dptNo PRIMARY KEY(dptNo);
-- 또는
ALTER TABLE department ADD PRIMARY KEY(dNo);
- 외래키 제약조건 추가: student, professor테이블
ALTER TABLE student
ADD CONSTRAINT FK_student_department
FOREIGN KEY(dNo) REFERENCES department(dNo);
ALTER TABLE professor
ADD CONSTRAINT FK_professor_department
FOREIGN KEY(dNo) REFERENCES department(dNo);
ON DELETE CASCADE
- 기준 테이블의 데이터가 삭제되었을 때, 외래키로 사용하는 테이블의 데이터도 자동으로 삭제되도록 설정
- department 테이블의 dNo 값 2가 삭제되었을 때
- student 테이블에서 dNo 값을 2로 갖고 있는 레코드도 자동 삭제
- student 테이블의 기존 외래키 삭제하고 다시 설정
ALTER TABLE student DROP CONSTRAINT FK_student_department;
- ON DELETE CASCADE로 다시 외래키 설정
ALTER TABLE student ADD CONSTRAINT FK_student_department FOREIGN KEY(dNo) REFERENCES department(dNo) ON DELETE CASCADE;
테이블 삭제(DROP TABLE)
- 스키마, 테이블, 뷰, 인덱스 등 삭제하는 명령문
- 테이블 구조와 데이터 모두 삭제 (데이터만 삭제 시 DELETE문 사용 - DML)
DROP TABLE 테이블명;
테이블 삭제하기
- book, publisher 테이블 삭제
DROP TABLE book;
DROP TABLE publisher;
모든 제약조건 출력
select * from information_schema.table_constraints;
- 특정 데이터베이스의 특정 테이블 제약조건 출력
select * from information_schema.table_constraints where table_schema="sqldb1" AND table_name = "student";
- 특정 테이블의 제약조건 출력
select * from information_schema.table_constraints where table_name = "student";
'프로그래밍 언어 > 데이터베이스' 카테고리의 다른 글
데이터베이스 Day5 - SQL에서의 각종 함수 (0) | 2021.11.24 |
---|---|
데이터베이스 Day3 - 데이터 조작어(DML) (0) | 2021.11.22 |
데이터베이스 Day1 - MySQL 실행 (0) | 2021.11.19 |
데이터베이스 Day1 - MySQL 설치 (0) | 2021.11.19 |
데이터베이스 Day1 - DBMS의 개요 (0) | 2021.11.18 |