데이터베이스(DB : Database)는 데이터를 체계화해 통합,관리하는 데이터 집합체를 의미한다. 즉, 효율적인 사용을 위해 처리된 데이터를 데이터베이스라고 생각할 수 있다. 이런 데이터베이스를 관리하는 프로그램을 데이터베이스 관리 시스템(DBMS : Database Management System)이라고 한다. 이런 DBMS 종류 중 지배적인 형태가 관계형 데이터베이스 관리 시스템(RDBMS : Relational Database Management System)이다. RDBMS의 가장 큰 특징은 테이블이라는 구조를 이용해 데이터를 저장한다는 점이다. 이런 RDBMS의 종류로는 Oracle, MySQL, MS-SQL, Maria DB 등이 있다.
Structured Query Language의 약어로 RDBMS를 이용하기 위해 제작된 언어이다. 다음과 같이 3가지로 분류할 수 있다.
테이블이나 인덱스같은 전체 구조를 조작하는 언어로, 기본적으로 바로 commit(저장)이 되는 성질이 있어서 rollback기능이 적용되지 않는다.
create table 테이블명(
필드명 필트타입 제약조건
);
create table 테이블명 as select 복제할다른테이블컬럼명 from 다른테이블명 where 조건;
-- 다른테이블에서 조건에 맞는 복제할다른테이블컬럼의 레코드를 복제한다
-- 여기서 조건에 false값을 넣어주면 다른테이블의 구조만 복제된다.
drop table if exists 테이블명;
alter table 테이블명 add 새로운컬럼명 새로운컬럼타입 새로운제한조건;
alter table 테이블명 modify 기존컬럼명 새로운컬럼타입 constraint 제약조건명 새로운제약조건;
alter table 테이블명 drop 기존컬럼명;
alter table 테이블명 change 기존컬럼명 변경컬럼명 변경컬럼타입;
truncate table 테이블명;
데이터베이스에 들어가는 데이터 자체를 관리하는 언어로, 별도의 auto-commit설정이 되어있지 않는한 바로 commit되지는 않아서 commit전으로 돌아가는 rollback기능을 사용해 되돌릴 수 있는 작업들이다.
select 필드명 as 표실할필드명 from 테이블명 where 조건 order by 컬럼명 asc(오름차순,내림차순:asc,desc);
-- 여러 컬럼을 각각 다르게 order by 하기(앞에 있는 조건이 우선됨)
select * from 테이블명 order by 컬럼명1 asc, 컬럼명2 desc;
select distinct 필드명 from 테이블명;
-- 필드에서 중복된 값은 제거하고 검색
select 필드명 from 테이블명 where 검색할필드명 between 검색시작범위 and 검색끝범위;
select ifnull(필드명, 값이 null일 경우 대체값) from 테이블명;
select 필드명 from 테이블명 where 비교할필드명 in(비교값1, 비교값2, ...);
-- 비교할필드명에 해당하는 값이 비교값1, 비교값2,... 에 포함되면 해당 레코드의 필드명 값 검색
select
case
when 조건1 then 작업1
when 조건2 then 작업2
else 작업3
end as 필드명별칭
from 테이블명;
-- 필드명별칭으로 표시하고 검색내용으로는 조건1을 만족하면 작업1실행, 조건2만족하면 작업2실행, 아무것도 만족하지 않으면 작업3실행하여 검색완료
insert into 테이블명 (값넣어줄필드들) values (값넣어줄필드에들어갈값);
-- 값넣어줄필드들을 아예 생략하면 모든 필드에 해당하는 값들을 다 넣어줘야한다.
-- 값넣어줄필드에 선택받지 못한 필드들은 그냥 default값으로 넣어진다.
insert into 테이블명 values (),();
-- 이런식으로 여러 레코드를 한번에 넣어줄 수 있다.
update 테이블명 set 필드값수정;
update 테이블명 set 필드값수정 where 조건;
delete from 테이블명 where 조건;
-- alter drop과 다른점 : alter drop은 특정 필드를 선택 그 필드 자체를 삭제함. delete는 where 조건을 통해조건을 만족하는 레코드들(행)만 삭제한다.
권한 조작, 작업 저장 조작
grant all privilege on 데이터베이스명.* to '계정명'@'localhost';
-- 해당 데이터베이스에 관한 localhost권한을 해당 계정에게 부여한다.
commit : 데이터베이스 속 영구메모리에 저장
rollback : 데이터베이스 속 임시메모리에 있는 내용 없에고 영구메모리에 있는 내용 불러옴
RDBMS의 가장 큰 특징으로 키(key)와 값(value)의 관계를 나타낸 구조다.
키는 테이블에서 레코드들(행들)을 서로 구분할 수 있게 하는 하나 이상의 속성들(열들)의 집합을 의미한다. 쉬운 예로 주민등록번호같은 경우 개개인이 고유한 값을 가지고 있어 주민등록번호가 개개인을 구분할 수 있게하는 키(key)라고 할 수 있다.
후보 키(candidate key) : 기본 키가 될 수 있는 후보
기본 키(primary key) : 후보 키들 중 선택된 단 하나의 키
not null : null값을 가지지 못함
선언방법(6가지)
-- 첫번째방법
create table 테이블명(
필드명 필드타입 primary key
);
-- 두번째방법
create table 테이블명(
필드명 필드타입,
constraint 제약조건명 primary key (필드명)
);
-- 세번째방법(새 필드 추가하면서 해당 필드를 기본 키로)
alter table 테이블명 add 필드명 필드타입 primary key;
-- 네번째방법(새 필드 추가하면서 해당 필드를 기본 키로)
alter table 테이블명 add constraint 제약조건명 primary key (필드명)
-- 다섯번째방법(기존 필드 기본 키로 수정)
alter table 테이블명 modify column 필드명 필드타입 primary key
-- 여섯번째방법(기존 필드 기본 키로 수정)
alter table 테이블명 modify column constraint 제약조건명 primary key (필드명)
대체 키(alternate key) : 후보 키들 중 선택된 기본 키를 제외한 나머지 후보 키들
슈퍼 키(super key) : 유일성은 만족하지만 최소성은 만족하지 않는 키들
외래 키(foreign key) : 하나의 테이블에서 참조하는 다른 테이블의 기본 키
제약조건을 거는 방법을 여러가지 있다. 위에서 설명된 alter를 이용해 제약조건을 추가하거나 기존 제약조건을 변경할 수도 있다. 아니면 create를 이용해 테이블을 생성할 때 제약조건을 걸어줄 수도 있다.
create table 테이블명(
필드명 필드타입,사이즈 제약조건
);
create table 테이블명(
필드명 필드타입,사이즈,
constraint 제약조건명 제약조건 (필드명)
);
-- 이미 테이블이 만들어졌을 때
alter table 테이블명 add constraint 제약조건명 제약조건 (필드명);
alter table 테이블명 modify 필드명 필드타입,사이즈 제약조건;
제약조건 종류들
not null : null값 저장 불가능
말 그대로 null값이 허용되지 않는다는 뜻이지, 생략이 불가하다는 뜻과 100% 같은 말은 아니다. 만약 not null로 제한조건이 걸려있는 컬럼에 해당하는 값을 생략하고 값을 insert한다고 했을 때 무조건 문제가 생기지 않는다. 생략하고 넣는다면 이것이 바로 null아닌가? 라고 생각할 수 있지만 더 정확히 말하자면 해당 값을 생략을 하고 insert를 할 경우 해당 칼럼에 설정된 default값이 넣어지게 되고 보통 default값이 null값으로 설정되어있어서 이런 오해를 할 수 있는 것이다. 예를 들어 제한조건은 not null이지만 default값이 777로 설정되어 있는 int타입 컬럼name이 있다고 가정하면, name에 대한 값을 생략하고 값을 insert하면 컬럼name에는 default값 777이 입력되고 not null을 만족하게 된다.
unique : 고유한 값만 저장 가능, null은 허용
primary key : 'unique + not null' 고유한 값만 저장 가능하며 null값 저장 불가능
foreign key : 타 테이블 필드를 참조해옴
-- 다른 제약조건들과 달리 두 개의 요소가 필요해 문법도 살짝 다름
create table 테이블명(
필드명 필드타입,사이즈,
foreign key (필드명) references 타테이블명(타테이블필드명)
);
-- 이미 테이블이 만들어졌을 때
alter table 테이블명 add constraint 제약조건명 foreign key (필드명) references 타테이블명(타테이블필드명);
create table 테이블명 (
필드명 필드타입,사이즈,
check (조건문)
);
create table 테이블명 (
필드명 필드타입,사이즈 default 지정할디폴트값
);
두 개 이상의 테이블을 겹쳐서 서로의 교집합, 합집합 부분 등을 사용하는 방법이다. 각각의 조인을 설명하기 위해 예시 테이블을 2개 만들어본다.
<A테이블> (A테이블의 번호는 B테이블의 번호를 참조한 외래 키다.)
번호 이름 재능
1 홍길동 춤
2 이장군 노래
3 김미소 null
<B테이블>
번호 지역
1 한국
2 미국
3 중국
4 null
select * from A as a,B as b where a.번호=b.번호;
-->
-- (번호,이름,춤,번호,지역 순으로)
-- 1, 홍길동, 춤, 1, 한국
-- 2, 이장군, 노래, 2, 미국
-- 3, 김미소, null, 3, 중국
-- 출력됨
select * from A where A.번호 between 1 and 2;
-- A에서 번호가 1과 2사이에 있는
-- (번호,이름,춤,번호,지역 순으로)
-- 1, 홍길동, 춤, 1, 한국
-- 2, 이장군, 노래, 2, 미국
-- 출력됨
ex)
<employee테이블>
번호 이름 상사번호
1 김철수 2
2 이영미 3
3 박희민 4
4 최지영 null
- 이중 호출 : 간단하게 두 번 호출하여 문제를 해결할 수 있다.
select e1.이름 부하이름, e2.이름 상사이름
from employee e1,employee e2
where e1.상사번호=e2.번호;
-- (부하이름 상사이름)
-- 김철수 이영미
-- 이영미 박희민
-- 박희민 최지영
-- 이렇게 3개의 데이터 출력된다.
- Sub Querry : 쿼리문을 중첩시키는 방법이다. 이런 서브 쿼리문으로 원하는 값을 특정해서 뽑아낼 수 있다.
select 이름
from employee
where 번호=(select 상사번호 from employee where 번호=1);
-- 서브 쿼리문부터 실행이 된다. 즉, 번호가 1인 레코드에서 상사번호를 검색해온다. 이는 번호:1,이름:김철수,상사번호:2인 레코드에서 상사번호 2를 검색해온다는 뜻이고 이 값이 where절로 대입되어 번호가 2인 레코드에서 이름을 검색하게 된다. 즉, 번호:2,이름:이영미,상사번호:3인 레코드에서 이름인 이영미를 뽑아오게 된다.
-- 출력: 이영미
select * from A inner join B on A.번호=B.번호;
-- A테이블의 번호와 B테이블의 번호가 같으면 선택해라.
-- (번호,이름,춤,번호,지역 순으로)
-- 1, 홍길동, 춤, 1, 한국
-- 2, 이장군, 노래, 2, 미국
-- 3, 김미소, null, 3, 중국
-- 이렇게 3개의 데이터가 출력된다.
select * from A right join B on A.번호=B.번호;
-- B가 기준테이블로 on에 제시된 조건을 충족하지 않더라도 값을 출력할 것임. 먼저 on 조건을 충족하는 값들은
-- (번호,이름,춤,번호,지역 순으로)
-- 1, 홍길동, 춤, 1, 한국
-- 2, 이장군, 노래, 2, 미국
-- 3, 김미소, null, 3, 중국
-- 이렇게 3개의 데이터가 있다. 하지만 B테이블에서 번호4에 대한 데이터가 있기 때문에 아무리 A테이블에 번호4와 매치되는 데이터가 없다고 해도 right join에 대한 기준을 B테이블로 잡았으므로 번호4에 대한 데이터도 출력된다.
-- (번호,이름,춤,번호,지역 순으로)
-- 1, 홍길동, 춤, 1, 한국
-- 2, 이장군, 노래, 2, 미국
-- 3, 김미소, null, 3, 중국
-- null,null,null,4,null
-- 이렇게 4개의 데이터가 출력된다.
select * from A right join B on A.번호=B.번호 where A.번호 is null;
-- 위에 있는 예시의 출력값에서 where절만 적용해 주면 된다.
-- (번호,이름,춤,번호,지역 순으로)
-- 1, 홍길동, 춤, 1, 한국
-- 2, 이장군, 노래, 2, 미국
-- 3, 김미소, null, 3, 중국
-- null,null,null,4,null
-- 이렇게 4개가 출력된 상황에서 where A.번호 is null을 만족하는 경우는
-- null,null,null,4,null
-- 이렇게 데이터 하나만 출력된다.
Left/Right Outer Join ... on A.key=B.key : outer는 사실 생략이 가능하다. 즉 생략을 하고보면 위에서 설명한 예시와 다를 것이 없다. full outer의 경우는 A와 B의 합집합을 의미하지만 mysql에서는 지원되지 않아서 outer 기능이 크게 쓰이지 않는다.
Left/Right Outer Join ... on A.key=B.key where A.key is null or B.key is null : A와 B테이블에서 on조건을 만족하는 부분만 뺀 나머지 데이터 검색
그룹함수란 다수의 행데이터를 한번에 처리하는 함수를 의미한다. null값은 자동 제거해주며 기능한다.