1.데이터베이스와 정보시스템
데이터- 현실세계에서 관찰 또는 수집의 결과로 나타난 객관적 사실
- 획득된 그대로의 정량적 혹은 정성적 실제값
정보- 획득된 데이터에 의미를 부여하거나 가공 처리를 통해 의사결정에 활용하도록 체계적으로 조직한 결과물
- 가공처리된 데이터로 가공처리란 간단한 데이터의 조건 검색, 정렬, 사칙연산부터 복잡한 업무 처리나 통계처리 등 다양한 행위 포함.
정보 시스템 - 한 조직의 활동과 운영에 필요한 데이터를 수집, 저장해 두었다가 다양한 방식으로 처리 및 가공함으로써 의사결정에 필요한 정보를 생성하는 소프트웨어 체계.
수집된 데이터를 저장했다가 필요할 때 제공하는 역할은 정보 시스템의 핵심 요소인 데이터베이스가 담당.
전통적 파일 정보 시스템의 처리방식 문제점
문제점1. 데이터 종속성의 증가
문제점2. 데이터 중복성의 증가
-데이터 중복성의 문제는 줄어들 수 있지만 여전히 파일 단위의 동시 공유나 보안만 가능하여 다수의 사용자 지원이 제한됨.
-대용량 데이터에 대한 공유나 보안, 장애 발생 시 회복등의 처리가 어려움.
데이터베이스 시스템의 등장으로 데이터 종속성 문제를 공통의 데이터 모델과 표준 데이터 언어를 이용하여 해결.
데이터 중복성 문제를 통합 저장소를 이용하여 해결
데이터베이스 접근을 DBMS가 제공
데이터베이스용어는 'Data'와 'Base'의 합성어로 1960년 초부터 공식적으로 사용
넓은의미: 관련된 콘텐츠를 모아놓은 데이터 저장소
좁은의미: 데이터베이스를 보다 효율적이고 체계적으로 활용하기 위해 구성한 데이터 형식이나 구성에 엄격한 제약을 갖는 시스템 관점에서의 데이터베이스
데이터베이스의 정의- 여러사용자나 응용프로그램이 함께 사용할 목적으로 체계적으로 통합하여 저장
힌 운영에 꼭 필요한 필수 데이터들의 저장소
- 공용데이터의 저장소
- 통합데이터의 저장소
- 운영데이터의 저장소
- 저장데이터의 저장소
데이터베이스의 특성
- 실시간접근
- 끊임없는 변화
- 동시공용
- 내용기반 참조
데이터베이스는 저장소, 데이터베이스관리시스템은 데이터베이스를 관리하는 소프트위어고 데이터베이스 시스템은 데이터베이스와 데이터베이스 관리 시스템들을 모두 포함하는 개념임
데이터 언어는 보통 SQL을 의미함. DBMS에 요청내용을 전달하기 위한 도구
SQL은 여러 명령어로 구성되는데 사용목적에 따라 데이터 정의어(DDL), 데이터조작어(DML), 데이터제어어(DCL)로 분류할 수 있음.
데이터 정의어는 새로운 데이터베이스 구조를 정의하고 기존 데이터베이스 구조를 변경하는 명령어
예)create, alter, drop....
데이터 조작어는 데이터베이스안의 데이터를 실제 조작하는 명령어 집합
예) select 컬럼명리스트 from 테이블명
delete from 테이블명
update 테이블명 set 컬럼명=값 (여기서 =의 뜻은 할당 내용)
insert into 테이블명(컬럼명리스트)
value (데이터리스트)
조건: where 컬럼명 = 데이터 (여기서 =의 뜻은 같다 라는 뜻)
데이터 제어어는 데이터베이스를 제어하고 통제하기 위해 사용하는 명령어 집합
예) grant(권한부여)
revoke(철회)
create user(새로운 사용자 계정 생성)
commit(실제로 적용)
rollback(다시 초기화)
데이터베이스 관리 시스템-데이터베이스를 효율적으로 관리하고 데이터베이스에 대한 데이터 요청을 처리하는 소프트웨어 시스템
DBMS의 필수 기능은 정의기능, 조작기능, 제어기능(여러사용자가 동시에 다양한 목적으로 접근하더라도 항상 데이터를 정확하고 안전하게 유지하도록 통제)
데이터베이스 서버(소프트웨어) - 데이터베이스가 구동되는 서버의 역할을 하는 컴퓨터
데이터모델- 데이터베이스 종류에 따라서 다양한 저장 구조를 갖게 되는데 이러한 데이터베이스 구조를 명세하기위한 개념 틀.
<데이터모델의 종류>
계층형데이터모델
-데이터 사이의 연관 관계를 물리적 위치 정보인 포인터로 표현하는 저장방식
-트리 형태의 계층 구조
-검색속도가 빠르기 때문에 일대다 관계를 갖는 대용량 데이터베이스 처리 유리
네트워크형 데이터 모델
-데이터 사이의 연관관계를 포인터로 표현하는 저장방식
-계층형 모델의 단점을 보완하여 트리 구조를 네트워크 형태로 변환한 모델
-검색속도가 빠르고 다대다 표현 용이
관계형 데이터 모델
-테이블형태의 저장구조를 가지며 데이터 사이의 연관관계를 테이블의 키 열을 통해 표현하는 저장방식
-연관된 데이터 사이에 기본키와 외래키를 통해 논리적 관련성을 표현함으로써 유연하고 이해하기 쉬움
+기본키는 중복값이 절대 없고 반드시 데이터를 가지고 있어야함.
외래키는 참조키
테이블 설정할 때 기본키와 외래키 미리 설정해야함
객체 지향형 데이터 모델
-객체 단위의 저장 구조를 가지며 연관된 데이터 사이의 관계를 객체 식별자로 표현하는 저장방식
-클래스, 상속,자료추상화 등의 객체 지향 개념과 데이터베이스 개념을 통합하여 실세계와 유사하게 모형화하는 데이터 모델
+참조되는 테이블 먼저 생성
참조하는 테이블 나중에 생성하기
삭제할땐 반대로~
객체 관계형 데이터 모델
-관계형 데이터 모델을 기본 개념으로 하고 객체 데이터 모델의 객체 특성을 일부 반영한 절충형 모델
-범용적인 관계형 데이터 모델을 기반으로 하고 필요할 경우, 특정한 분야를 위해 객체 개념을 추가로 지원하는 방식
스키마
-데이터베이스 안에 저장되는 데이터 구조와 제약 조건 등을 정의한 것
-데이터베이스의 정적인 구성뿐만 아니라 동적인 유지 조건까지를 포함
-동일한 데이터베이스라도 접근 관점에 따라 스키마는 다를 수 있음.
-주로 데이터구조에 관심을 가지므로 대부분의 경우, 스키마의 세부 제약조건보다는 릴레이션 구조만을 간략히 명세함
예) 학생(학번, 이름, 학년, 성별)
스키마의 종류
외부스키마:
사용자가 외부에서 바라보는 관점에서의 개인적 데이터베이스 구조를 정의한 것
개념 스키마:
모든 사용자들의 관점을 통합하여 전체 조직 관점에서 데이터베이스 구조를 정의한 것
내부스키마:
저장장치의 관점에서 전체 데이터베이스의 내부 구조를 정의, 개념 스키마에 대한 시스템 내부의 저장방식을 표현
데이터 사전
다양한 데이터베이스 객체에 관한 모든 데이터를 포함
DBMS가 스스로 생성하고 유지
관계형데이터모델
데이터 모델: 현실세계의 데이터를 명세하는 고유한 표현 방식이자 데이터 모델링을 위한 도구
데이터 모델의 3요소: 데이터구조, 연산, 제약조건
관계형 데이터 모델
테이블형태의 릴레이션을 통해 데이터를 저장하고 데이터 간의 관련성도 표현
릴레이션은 관계형 데이터 모델의 핵심 요소로 특별한 의미로 갖는 테이블.
관련된 여러 릴레이션들로 데이터베이스를 구성함.
속성: 테이블의 열, 데이터를 표현하는 가장 작은 논리적 단위
투플: 테이블의 각 행, 각 속성 값들의 조합으로 구성
도메인: 각 속성이 취할 수 있는 모든 값들의 집합을 정의. (데이터 값들의 유형과 크기, 범위)
관계형 데이터 모델은 속성 이름과는 별개로 각 도메인을 고유한 이름으로 정의
속성 이름은 보통 각 도에민이 릴레이션에서 담당하는 역할의 이름을 지정
카디널리티: 릴레이션 안의 전체 투플의 개수, 입력, 수정, 삭제 등을 통해 계속 변화
차수: 릴레이션을 구성하는 전체 속성의 개수, 각 투플이 가지는 속성 값의 개수는 릴레이션의 차수와 같음
릴레이션은 릴레이션 스키마와 릴레이션 인스턴스 2가지 요소로 구성됨.
릴레이션 스키마: 특정 릴레이션의 논리적 구조를 의미
릴레아션의 이름과 릴레이션 안에 포함된 모든 속성의 이름들로 정의
테이블의 첫번째 행인 헤더 부분에 표현
시간이 경과해도 좀처럼 변경되지 않는 정적인 특성
릴레이션 인스턴스: 어느 한시점에 릴레이션에 존재하는 투플들의 집합
보통 테이블의 첫 번째 행인 헤더 부분을 제외한 나머지 모든 행들의 집합으로 표현
시간에 따라 변하는 동적인 특성이 있음
릴레이션의 특성
1. 투플의 유일성: 릴레이션 안에는 똑같은 투플이 존재할 수 없음
2. 투플의 무순서성: 릴레이션의 투플 사이에 순서는 의미가 없음
3. 속성의 무순서성: 릴레이션의 속성 사이에 순서는 의미가 없음
4. 속성의 원자성: 릴레이션을 구성하는 모든 속성값은 의미적으로 더이상 분해할 수 없는 하나의 원자만을 갖음
릴레이션 키
각 투플을 유일하게 식별할 수 있는 하나 이상의 속성 집합으로 모든 릴레이션은 키를 갖음.
현재의 릴레이션 데이터값만으로 결정하는게 아니라 미래의 입력값까지 포함한 속성의 본질적인 의미를 고려하여 키 지지정여부를 결정.
후보키: 투플을 유일하게 식별할 수 있는 속성들의 최소집합, 유일성과 최소성 조건을 모두 만족해야함.
릴레이션에서 키로 지정한 속성 값의 조합은 투플마다 모두 달라야 하고 릴레이션에서 키로 지정한 속성의 개수를 최소화해야함.
모든 릴레이션은 최소 하나 이상의 후보키를 가짐.
슈퍼키: 투플을 유일하게 식별할 수 있는 속성 집합, 식별을 위해 꼭 필요한 속성이 아니어도 포함할 수 있음
최소성 충족 여부와 관련이 없음.
릴레이션 안에는 여러 후보키가 있을 수 있고 모든 후보키는 슈퍼키임. 후보키를 포함하는 속성 집합도 모두 슈퍼키가 됨.
기본키: 투플을 대표하도록 선정된 후보키
여러 후보키 중에서 하나를 기본키로 선택하여 지정.
대체키: 키본키로 선정되지 못한 후보키, 릴레이션 안에서 기본키는 하나이지만 대체키는 여러개 존재할 수 있음.
외래키: 특정 릴레이션의 기본키를 참조하는 속성 집합
외래키 값은 참조되는 기본키값 중에서 값 하나를 참조하여 취함.
기본키와 외래키는 릴레이션 간의 연관성을 표현
무결성 제약조건
:관계형 데이터 모델에서 릴레이션 안이 모든 데이터들을 의미적으로 흠없이 항상 정확하고 완전한 상태로 유지하기 위해 적용해야할 제약 사항.
데이터 무결성-데이터의 일관성과 정확성에 손상이 없도록 유지되는 특성
개체 무결성 제약 조건
:기본키로 지정한 모든 속성은 널 값을 가질 수 없고 릴레이션 안에서 중복되지 않는 유일한 값을 가져야 한다는 제약 사항
기본키는 개체 식별자의 역할
참조 무결성 제약 조건
:외래키로 지정한 속성은 참조하는 릴레이션의 기본키 속성 값과 일치하는 값이나 널 값만을 가져야 한다는 제약 사항
외래키는 개체 참조자의 역할
도메인 무결성 제약 조건
:투플의 모든 속성 값이 각 속성의 도메인에 속한 값만 취해야 한다는 제약사항
유일성 제약 조건
:모든 키 속성 값이 서로 중복되지 않고 유일해야 한다는 제약사항
관계 연산: 관계형 데이터 모델에서 릴레이션을 조작하기 위한 연산- 관계대수, 관계 해석
SQL-관계형 데이터베이스 표준언어로서 가장 많이 사용되는 데이터 언어
SQL- 데이터정의어DDL, 데이터조작어DML, 데이터제어어DCL
새로운 manager 관리자 계정을 생성
-create user 'manager'@'%' identified by '1234';
생성한 'manager'관리자 계정에 권한을 부여
grant all on *.* to 'manager'@'%'with grant option;
'manager'관리자 계정으로 접속
select user(); --현재 MySQL 사용자 표시
show database; --현재 데이터베이스 목록 표시
USE univDB; --작업 대상 데이터베이스 변경
SELECT database(); --현재사용데이터베이스 확인
SHOW TABLES; --univDB 안의 생성 테이블 목록 확인
DESC 학생; --학생테이블 생성정보 확인
SELECT문
-행검색, 테이블로부터 데이터를 검색하기 위해서 사용
- select [distinct|ALL] 열 리스트
- from 테이블 리스트
- where 검색 조건식
- group by 그룹 기준열 리스트
- having 그룹 조건식
- order by {정열 기준열[ASC}DESC][,]};
MySQL 실습
select user();
show databases;
drop database if exists univDB;
create database if not exists univDB;
create database if not exists test;
use univDB;
CREATE TABLE 학생
( 학번 CHAR(4) NOT NULL,
이름 VARCHAR(20) NOT NULL,
주소 VARCHAR(50) NULL DEFAULT '미정',
학년 INT NOT NULL,
나이 INT NULL,
성별 CHAR(1) NOT NULL,
휴대폰번호 CHAR(14) NULL,
소속학과 VARCHAR(20) NULL,
PRIMARY KEY (학번)) ;
CREATE TABLE 과목
( 과목번호 char(4) NOT NULL PRIMARY KEY,
이름 VARCHAR(20) NOT NULL,
강의실 CHAR(3) NOT NULL,
개설학과 VARCHAR(20) NOT NULL,
시수 INT NOT NULL ) ;
CREATE TABLE 수강
( 학번 char(6) NOT NULL,
과목번호 CHAR(4) NOT NULL,
신청날짜 DATE NOT NULL,
중간성적 INT NULL DEFAULT 0,
기말성적 INT NULL DEFAULT 0,
평가학점 CHAR(1) NULL,
PRIMARY KEY(학번, 과목번호));
INSERT INTO 학생
VALUES ('s001', '김연아', '서울 서초', 4, 23, '여', '010-1111-2222', '컴퓨터') ;
INSERT INTO 학생(학번, 이름, 주소, 학년, 나이, 성별, 휴대폰번호, 소속학과)
VALUES ('s002', '홍길동', DEFAULT, 1, 26, '남', NULL , '통계') ;
INSERT INTO 학생(학년, 나이, 성별, 소속학과, 학번, 이름)
VALUES (3, 30, '남', '정보통신', 's003', '이승엽') ;
INSERT INTO 학생
VALUES ('s004', '이영애', '경기 분당', 2, NULL, '여', '010-4444-5555', '정보통신') ;
INSERT INTO 학생
VALUES ('s005', '송윤아', '경기 분당', 4, 23, '여', '010-6666-7777', '컴퓨터') ;
INSERT INTO 학생
VALUES ('s006', '홍길동', '서울 종로', 2, 26, '남', '010-8888-9999', '컴퓨터') ;
INSERT INTO 학생
VALUES ('s007', '이은진', '경기 과천', 1, 23, '여', '010-2222-3333', '경영') ;
INSERT INTO 과목
VALUES ('c001', '데이터베이스', 126, '컴퓨터', 3) ;
INSERT INTO 과목
VALUES ('c002', '정보보호', 137, '정보통신', 3) ;
INSERT INTO 과목
VALUES ('c003', '모바일웹', 128, '컴퓨터', 3) ;
INSERT INTO 과목
VALUES ('c004', '철학개론', 117, '철학', 2) ;
INSERT INTO 과목
VALUES ('c005', '전공글쓰기', 120, '교양학부', 1) ;
INSERT INTO 수강
VALUES ('s001', 'c002', '2019-09-03', 93, 98, 'A') ;
INSERT INTO 수강
VALUES ('s004', 'c005', '2019-03-03', 72, 78, 'C') ;
INSERT INTO 수강
VALUES ('s003', 'c002', '2017-09-06', 85, 82, 'B') ;
INSERT INTO 수강
VALUES ('s002', 'c001', '2018-03-10', 31, 50, 'F') ;
INSERT INTO 수강
VALUES ('s001', 'c004', '2019-03-05', 82, 89, 'B') ;
INSERT INTO 수강
VALUES ('s004', 'c003', '2020-09-03', 91, 94, 'A') ;
INSERT INTO 수강
VALUES ('s001', 'c005', '2020-09-03', 74, 79, 'C') ;
INSERT INTO 수강
VALUES ('s003', 'c001', '2019-03-03', 81, 82, 'B') ;
INSERT INTO 수강
VALUES ('s004', 'c002', '2018-03-05', 92, 95, 'A') ;
select 이름, 주소
from 학생;
select count(*)
from 학생;
select sum(나이)
from 학생;
select distinct(소속학과)
from 학생;
select 이름, 학년, 소속학과, 휴대폰번호
from 학생
where 학년>=2 AND 소속학과='컴퓨터';
select 이름, 학년, 소속학과, 휴대폰번호
from 학생
where (학년>=1 AND 학년<=3) or not(소속학과='컴퓨터');
select 이름, 학년, 소속학과, 휴대폰번호
from 학생
where (학년 between 1 and 3) or not(소속학과 = '컴퓨터');
select 이름, 학년, 소속학과
from 학생
where 소속학과 = '컴퓨터' or 소속학과 = '정보통신'
order by 학년 asc;
select *
from 학생
order by 학년 asc, 이름 desc;
select *
from 수강
order by 중간성적 desc
limit 3;
select *
from 수강
order by 중간성적 desc
limit 5,3;
select count(*)
from 학생;
select count(학번)
from 학생;
select count(*) as 학생수1, count(주소) as 학생수2, count(distinct 주소) as 학생수3
from 학생;
select avg(나이) '여학생 평균나이'
from 학생
where 성별 = '여';
select 성별, max(나이) AS '최고 나이', min(나이) as '최저 나이'
from 학생
group by 성별;
select 나이, count(*) as '나이별 학생수'
from 학생
where 나이>=20 and 나이<30
group by 나이;
select 학년, count(*) as '학년별 학생수'
from 학생
group by 학년
having count(*)>=2;
select 학번, 이름
from 학생
where 이름 like '이__';
select 이름, 주소, 학년
from 학생
where 주소 like '%서울%'
order by 학년 desc;
select 이름, 휴대폰번호
from 학생
where 휴대폰번호 is null;
select 학번
from 학생
where 성별 = "여"
union
select 학번
from 수강
where 평가학점 = 'A';
select 학번
from 학생
where 성별 = "여"
union all
select 학번
from 수강
where 평가학점 = 'A';
select 이름
from 학생
where 학번 in ('s001','s003','s004');
select 이름
from 학생
where 학번 in (select 학번
from 수강
where 과목번호='c002');
select 이름
from 학생
where not exists (select*
from 수강
where 수강.학번=학생.학번);
select count(*)
from 학생,수강;
select count(*)
from 학생 cross join 수강;
select *
from 학생,수강
where 학생.학번=수강.학번;
select*
from 학생 join 수강 on 학생.학번=수강.학번;
select 학생.학번, 이름, 과목번호, 중간성적+(중간성적*0.1)as 변환중간성적
from 학생 join 수강 on 학생.학번=수강.학번
where 과목번호='c002';
select 학생.학번, 학생.이름, 수강.과목번호
from (학생 join 수강 on 학생.학번=수강.학번) join 과목 on 수강.과목번호=과목.과목번호
where 과목.이름='정보보호';
select 이름, 과목번호
from 학생 as S, 수강 E
where S.학번=E.학번 and 과목번호='c002';
select S1.이름, S2.이름
from 학생 S1 join 학생 S2 on S1.주소=S2.주소
where S1.학년>S2.학년;
create table 학생1 as (select * from 학생);
create table 수강1 as (select * from 수강);
create table 과목1 as (select * from 과목);
insert into 학생1
values('g001','김연아2','서울 서초',4,23,'여','010-1111-2222','컴퓨터');
insert into 학생1(이름, 주소, 학년, 나이, 성별, 휴대폰번호, 소속학과, 학번)
values('홍길동2',default,1,26,'남',null,'통계','g002');
insert into 학생1(학년, 나이, 성별, 소속학과, 학번, 이름)
values(3,30,'남','정보통신','g003','이승엽2');
select *
from 학생1
where 학번 like 'g%';
set sql_safe_updates=0;
update 학생1
set 학년=3
where 이름='이은진';
update 학생1
set 학년=학년+1, 소속학과='자유전공학부'
where 학년=4;
select*
from 학생1;
update 학생1
set 소속학과=null
where 학번 not in (select 학번 from 수강1);
select * from 학생1
update 수강1
set 학번 = (select 학번
from 학생1
where 이름='이은진')
where 학번='s003';
select * from 수강1 where 학번='s003' or 학번='s007';
select* from 수강1;
delete from 과목1
where 과목번호 in
(select 과목번호
from 수강1
group by 과목번호
having count(*)<2);
select* from 과목1;
create table 과목2
(과목번호 char(4) not null primary key,
이름 varchar(20) not null,
강의실 char(5) not null,
개설학과 varchar(20) not null,
시수 int not null);
create table 학생2
(학번 char(4) not null,
이름 varchar(20) not null,
주소 varchar(50) default '미정',
학년 INT NOT NULL,
나이 INT NULL,
성별 CHAR(1) NOT NULL,
휴대폰번호 CHAR(13) NULL,
소속학과 VARCHAR(20) NULL,
primary key(학번),
unique(휴대폰번호));
desc 학생2;
create table 수강2
(학번 char(6) not null,
과목번호 char(4) not null,
신청날짜 date not null,
중간성적 int null default 0,
기말성적 int null default 0,
평가학점 char(1) null,
primary key(학번, 과목번호),
foreign key(학번) references 학생2(학번),
foreign key(과목번호) references 과목2(과목번호));
insert into 과목2(과목번호, 이름, 강의실, 개설학과,시수)
values('c111', 'database', 'A-123','산업공학',3);
insert into 학생2(학번, 이름, 학년, 나이, 성별, 휴대폰번호, 소속학과)
values('s111','박태환',4,null,'남','010-1111-1111','산업공학');
insert into 학생2(학번,이름,학년,나이,성별,휴대폰번호,소속학과)
values('s222','박태환',2,null,'남','010-2222-2222','산업공학');
insert into 수강2(학번, 과목번호, 신청날짜)
values('s111','c111','2019-12-31');
insert into 수강2(학번,과목번호,신청날짜,중간성적,기말성적,평가학점)
values('s222','c111','2019-12-31',93,98,'A');
insert into 과목2 select * from 과목;
insert into 학생2 select * from 학생;
insert into 수강2 select * from 수강;
select * from 과목2;
select * from 학생2;
select * from 수강2;
alter table 학생2
add 등록날짜 DATETIME NOT NULL DEFAULT '2019-12-30';
select* from 학생2;
alter table 학생2
drop column 등록날짜 ;
select* from 학생2;