DBMS (Data Base Management System)
파일 시스템의 문제점인 데이터의 중복성과 종속성 등의 문제를 최소화하기 위해 등장.
모든 사용자나 응용 프로그램들이 데이터베이스를 공유할 수 있도록 관리, 운영해 주는 소프트웨어 시스템
DBMS 필수기능 세가지
1. 정의기능
- 데이터의 형태, 구조 등 데이터베이스의 저장에 관한 여러 가지 사항을 정의하는 기능
2. 조작기능
- 사용자가 이용할 수 있도록 요구에 따라 검색, 갱신, 삽입, 삭제 등을 지원하는 기능
3. 제어기능
- 데이터의 정확성과 안전성 유지를 위한 기능으로, 데이터 무결성 유지, 보안, 병행 제어 등을 제공
내부스키마
- 물리적 저장 장치 관점에서 본 DB의 물리적인 구조
개념스키마
- 논리적 관점(사용자) 에서 본 전체적인 데이터 구조
외부스키마
- 사용자가 사용하는 한 부분에서 본 논리적 구조
- 서브스키마라고도 함.
데이터 모델의 정의와 종류
데이터 모델에 표시할 요소
- 구조 : 논리적으로 표된 개체 타입들 간의 관계
- 연산 : DB에 저장된 실제 데이터를 처리하는 작업 대한 명세
- 제약조건 : DB에 저장될 수 있는 실제 데이터의 논리적인 제약 조건
데이터 모델의 구성 요소
- 개체(Entity) : 데이터베이스에 표현하려는 것, 서로 연관된 몇 개의 속성으로 구성
- 구성(Attribute) = 속성 : 데이터의 가장 작은 논리적 단위, 파일 구조상 데이터의 항목 또는 필드에 해당.
개체를 구성하는 항목.
- 관계(Relationship) : 개체간의 관계 또는 속성간의 관계, 1:1 / 1:다관계 / 다 : 다관계
E-R 모델
데이터 베이스 설계
데이터베이스의 스키마를 정의하고, 이에 따라 DB를 구현하기 위한 전반적인 과정
관계형 데이터베이스
튜플 : 릴레이션을 구성하는 각 행(레코드), 속성의 모임
- 튜플의 수 : 카디널리티 또는 기수라고도 함
속성 : DB를 구성하는 가장 작은 논리적 단위(필드), 개체의 특성
- 속성의 수 : 디그리 또는 차수라고도 함.
도메인 : 하나의 어트리뷰가 취할 수 있는 모든 원자값들의 집합
관계형 데이터베이의 제약조건
키(key) : 데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬할 때 튜플들을 서로 구분할 수 있는 기준이되는 애트리뷰트를 말함.
개체 무결성
- 릴레이션에서 기본키를 구성하는 속성은 Null 값이나 중복값을 가질 수 없다.
참조 무결성
- 외래키 값은 Null 이거나 참조 릴레이션 기본키 값과 동해야한다.
- 참조 릴레이션은 참조할 수 없는 외래키 값을 가질 수 없다.
SQL - DDL : CREATE
CREATE : 테이블, 뷰, 인덱스, 스키마 등을 생성
SQL - DDL : VIEW
VIEW : 사용자에게 접근이 허용된 자료만 보여주기 위해 하나 이상의 테이블에서 유도된 가상 테이블
- 물리적으로 존재하지않고 논리적으로 존재.
SQL - DDL : DROP
DROP : 테이블,뷰,인덱스,스키마 등을 삭제
- CASCADE : 참조하는 테이블도 모두 제거
- RESTRICT : 참조하는 테이이 있을 경우 제거하지 않음
SQL - DDL : ALTER
ALTER : 테이블,인덱스,스키마 등 구조변경
SQL - DML : SELECT
SELECT : 테이블에 존재하는 데이터에 대한 질의
SQL - DML : INSERT, UPDATE, DELETE
INSERT : 생성된 테이블에 데이터 입력
UPDATE : 테이블에 데이터 수정
DELETE : 테이블에 데이터 삭제
exit => root로 재접속
// 유저 생성 => root계정에서만 가능
mysql - uroot -pezen
// mysql이 user를 관리하는 테이블로 이동
use mysql;
// user 생성 구문
create user '유저아이디'@'localhost' identified by '비밀번호';
create user 'mysqlUser2'@'localhost' identified by 'mysql';
// 권한 부여
grant all privileges on testdb.* to 'mysqlUser2'@'localhost' with grant option;
(select,insert,update)
// 권한 적용
flush privileges;
// 유저 확인
select user, host from user;
---------------------------------------------------------------------------
root 나와서 mysqlUser로 변경
table 생성
mysql 데이터 자료형
숫자
(정수)
- BIT(m) : 1~64 binary 값을 지정
- BOOL : TRUE(1) / FALSE(0) = TINYINT(1)
- TINYINT(m) : 0~255 사이의 작은 수를 표현 (-128~127)
- SMALLINT(m) : 2BYTE 0~65536 (-32768 ~ 32767)
- MEDIUMINT(m) : 3BYTE ( 0~166777215)
- INT(m) : 4BYTE => java int 동일
- BIGINT : 8BYTE => java long 동일
(실수) =>
- FLOAT(m, d) : 정밀도가 작은 부동소수점 표현 (d : 자리수)
- DOUBLE (m, d) : 정밀도가 큰 부동소수점 표현 (d : 자리수)
=> mysql 8.0.17 이후부터 사용하지 않음
- DECIMAL(m,d) : 고정 소수점 표현
문자
- CHAR(m) : 고정길이 문자열(0~255)
- VARCHAR(m) : 가변길이 문자열 (0~65536)
- TINYTEXT : 가변길이 1BYTE 문자열 저장
- BLOB : 바이너리 데이터 저장용 ( 이미지 )
- TEXT : 2BYTE 가변길이 문자열
- MEDIUMTEXT : 3BYTE
- LONGTEXT : 4BYTE
날짜
- DATE : 날짜표현
- DATETIME : 날짜+시간 => 가장많이 씀
- TIMESTAMP : insert, update 연산에 유리한 형태
- YEAR : 연도만
- TIME : 시간만
제약조건
PK : PRIMARY KEY => 기본키 속성 추가
NN : Not Null (데이터 값으로 null을 오지 못하게 막음)
AI : Auto_Increment (자동증가 : 정수만 가능)
UQ : unique (중복안됨)
B : binary 값
UN : Unsigned (음수 불가)
ZF : Zero_Fill ( 숫자 앞에 0으로 채우기) ex) 0001
G : Generated ( 속성 자동생성 )
기본값 : 기본값을 주지않고 값이 없으면 null
defalut 값
- null은 연산이 안됨.
주석 : 단축키 안됨.
/* 여러줄 주석 */
-- 한줄주석
-- 테이블 생성 구문
테이블명 : test1
속성 :
- id int ai pk
- name varchar(10) not null
- age int default 20 (기본값 20)
- address varchar(20)
create table test1(
id int auto_increment,
name varchar(10) not null,
age int default 20,
address varchar(20),
primary key(id));
-- 테이블 확인
show tables;
-- 테이블 구조 확인
desc 테이블 명;
desc test1;
-- 데이터 추가 구문
insert into 테이블명(필드명, 필드명)
values(값, 값);
insert into test1(name, address)
values('hong','seoul');
insert into test1(name, address)
values('kim','suwon');
insert into test1(name, address)
values('lee','seoul');
insert into test1(name, address)
values('choi','suwon');
insert into test1(name, address)
values('park','incheon');
-- 내용확인
select * from test1;
-- 테이블 생성
테이블 명 :test2
속성
- 학번(num) 숫자 => 111 222 ...
- 이름(name) 문자
- 학과(dep) 문자
- 주소(addr) 문자
- 전화번호(tel) 문자
create table test2(
num int ,
name varchar(10) not null,
dep varchar(20),
addr varchar(20),
tel varchar(15),
primary key(num));
-- 데이터 추가 (5명) 추가
insert into test2
values(111,'kim','math','seoul','010-5001-6064');
insert into test2
values(222,'lee','kor','suwon','010-1111-2222');
insert into test2
values(333,'park','eng','seoul','010-1212-3434');
insert into test2
values(444,'choi','elec','incheon','010-9999-8888');
insert into test2
values(555,'jeong','com','suwon','010-7777-7777');
-- 테이블 구조 변경
-age를 int로 추가
alter table 테이블명 add(추가) 필드명 속성;
alter table 테이블명 change(수정) 필드명 변경필드명 속성;
-> alter table test2 change aag age int default 20;
add(추가), modify(수정), change(수정:이름변경가능), drop(삭제)
마지막에 추가
alter table test2 add age int default 20;
alter table test2 add age int default 20 after name;
특정 필드 뒤에 추가 (after)
- age를 name뒤로 위치
alter table test2 modify age int default 20 after name;
-- 테이블 명 변경
- rename table 변경전 to 변경후
-- 데이터 변경
-- kim,pack 의 나이를 21로 변경
update 테이블명 set 변경필드 = 값
where 조건;
update test2
set age = 21
where name = 'kim' or 'pack';
where name in ('kim', 'pack');
update test2
set age = 22
where name = 'jeong';
-- test1 phone 추가 varchar(20)
-- 추가된 phone 값을 추가
alter table test1 add phone varchar(20);
update test1
set phone = '010-0000-0000'
where id = 1;
update test1
set phone = '010-1111-1111'
where id = 2;
update test1
set phone = '010-2222-2222'
where id = 3;
update test1
set phone = '010-3333-3333'
where id = 4;
update test1
set phone = '010-4444-4444'
where id = 5;
-- test1 테이블에서 address 가 seoul인 학생만 출력
select * from test1 where address = 'seoul';
select name,age,address,phone from test1
where address='seoul';
--------------------------------------------------------------------------------------
-- 테이블 생성
테이블 명 : student
num => 111,222 ... pk
name => nn
age => default 20
address => 주소
major => 학과
create table student(
num int ,
name varchar(10) not null,
age int default 20,
address varchar(20),
major varchar(20),
primary key(num));
5명의 데이터 추가
insert into student
values(111,'kim',20,'incheon','kor');
insert into student
values(222,'lee',20,'seoul','eng');
insert into student
values(333,'pack',20,'busan','math');
insert into student
values(444,'choi',20,'suwon','elec');
insert into student
values(555,'jeong',20,'incheon','com');
update student
set major = 'com'
where name = 'lee';
update student
set major = 'kor'
where name = 'pack';
update student
set address = 'seoul'
where name = 'choi';
-- student 테이블 변경
score default 0 속성추가
alter table student add score int default 0;
insert into student
values(666,'김현우',22,'seoul','kor',100);
insert into student
values(777,'이기연',21,'busan','elec',78);
insert into student
values(888,'박성민',20,'incheon','com',81);
insert into student
values(999,'최가을',24,'suwon','elec',67);
insert into student
values(1001,'정태웅',20,'suwon','kor',98);
update student
set score = 92
where num = 111;
update student
set score = 45
where num = 222;
update student
set score = 57
where num = 333;
update student
set score = 33
where num = 444;
update student
set score = 75
where num = 555;
-- score가 높은 사람 순으로 정렬
select * from student
order by score desc;
-----------------------------------------------------------------------------
select : 데이터를 조회할 때 사용
select 칼럼명 from 테이블명
where 조건
------------------------------------------------------------------------------
-major 가 computer인 학생만 출력
select * from student
where major='com';
- 나이가 23이상인 학생만 검색
select * from student
where age>=23;
- 점수가 80점 이상인 학생만 검색
select * from student
where score >= 80;
- 주소가 seoul인 학생만 검색
select * from student
where address = 'seoul';
- 점수가 70점 미만인 학생만 검색
select * from student
where score < 70 ;
- 점수가 70~90 사이인 학생만 검색
select * from student
where score between 70 and 90;
- 주소가 'seoul' 'incheon'인 학생만검색
select * from student
where address in ('seoul','incheon');
- 김씨인 학생만 검색
select * from student
where name like '김%';
- 점수가 70~90 사이인 학생만 검색 점수가 높은 순으로
select * from student
where score between 70 and 90
order by score desc;