스키마 = 데이터베이스
create table test1(
no int primary key,
name varchar(20),
age int,
kor int,
eng int,
math int,
constraint test1_uk unique (name, age),
fulltext index test1_name_idx (name) -- 이름 데이터를 가지고 인덱스를 만들어줘!
);
insert into test1(no,name,age,kor,eng,math) values(1,'aaa',20,80,80,80);
insert into test1(no,name,age,kor,eng,math) values(2,'bbb',21,90,80,80);
insert into test1(no,name,age,kor,eng,math) values(3,'ccc',20,80,80,80);
insert into test1(no,name,age,kor,eng,math) values(4,'ddd',22,90,80,80);
insert into test1(no,name,age,kor,eng,math) values(5,'eee',20,80,80,80);
FULLTEXT INDEX는 일반적인 인덱스와는 달리 매우 빠르게 테이블의 모든 텍스트 필드를 검색한다.
이 인덱스는 검색 엔진과 유사한 방법으로 자연어를 이용하여 데이터를 검색할 수 있도록 모든 데이터의 문자열 단어를 저장한다.
검색할 때 사용한다.
select * from test1 where name = 'bbb';
create table test1(
no int not null,
name varchar(20) not null
);
alter table test1
modify column no int not null auto_increment; /* 아직 no가 pk가 아니기 때문에 오류*/
alter table test1
add constraint primary key (no); /* 일단 no를 pk로 지정한다.*/
alter table test1
add constraint unique (no); /* no를 unique로 지정해도 한다.*/
alter table test1
modify column no int not null auto_increment; /* 그런 후 auto_increment를 지정한다.*/
/* auto-increment 컬럼의 값을 직접 지정할 수 있다.*/
insert into test1(no, name) values(1, 'xxx');
/* auto-increment 컬럼의 값을 생략하면 마지막 값을 증가시켜서 입력한다.*/
insert into test1(name) values('aaa');
insert into test1(no, name) values(100, 'yyy');
insert into test1(name) values('bbb'); /* no는 101이 입력된다.*/
insert into test1(name) values('ccc'); /* no=102 */
insert into test1(name) values('ddd'); /* no=103 */
/* 값을 삭제하더라도 auto-increment는 계속 앞으로 증가한다.*/
delete from test1 where no=103;
insert into test1(name) values('eee'); /* no=104 */
insert into test1(name) values('123456789012345678901234');
/* 다른 DBMS의 경우 입력 오류가 발생하더라도 번호는 자동 증가하기 때문에
* 다음 값을 입력할 때는 증가된 값이 들어간다.
* 그러나 MySQL(MariaDB)는 증가되지 않는다.
*/
insert into test1(name) values('fff'); /* no=105 */
- 조회 결과를 테이블처럼 사용하는 문법
- select 문장이 복잡할 때 뷰로 정의해 놓고 사용하면 편리하다.
create table test1 (
no int primary key auto_increment,
name varchar(20) not null,
class varchar(10) not null,
working char(1) not null,
tel varchar(20)
);
insert into test1(name,class,working) values('aaa','java100','Y');
insert into test1(name,class,working) values('bbb','java100','N');
insert into test1(name,class,working) values('ccc','java100','Y');
insert into test1(name,class,working) values('ddd','java100','N');
insert into test1(name,class,working) values('eee','java100','Y');
insert into test1(name,class,working) values('kkk','java101','N');
insert into test1(name,class,working) values('lll','java101','Y');
insert into test1(name,class,working) values('mmm','java101','N');
insert into test1(name,class,working) values('nnn','java101','Y');
insert into test1(name,class,working) values('ooo','java101','N');
직장인만 조회한 결과를 가상 테이블로 만들기
create view worker
as select no, name, class from test1 where working = 'Y';
insert into test1(name,class,working) values('ppp','java101','Y');
select * from worker;
즉, 뷰는 따로 데이터를 가져와서 별도의 테이블을 만든 것이 아니라,
그저 데이터를 가져와서 보여주는 것이다.
그래서 원본 테이블 수정하면 뷰도 자동으로 바로 수정된다.
drop view worker;
컬럼: 이름, 이메일, 암호, 성별, 학교, 나이, 주민번호, 휴대폰, 주소, 우편번호, 재직여부
{이름, 이메일}
{이름, 학교, 우편번호}
{이메일}
{이름, 주민번호}
{주민번호}
{이름, 주소}
{이름, 휴대폰}
{휴대폰, 우편번호}
{이메일}
{주민번호}
{휴대폰}
{이름, 주소} ← 굳이? 한 개의 컬럼으로 된 KEY가 많으니까 두 개 이상의 컬럼을 키로 사용할 필요가 없다.
{이메일}
{주민번호}
{휴대폰}
→ 보통 '일련번호' 컬럼!
{학생번호}
{이메일}
{주민번호} ← 개인정보보호에 포함되기 떄문에 (법에 따라) 사용 불가!
{휴대폰}
데이터처리 작업 중에서 한 단위로 묶어서 처리해야하는 경우가 있다.
Transaction: 여러개의 DML작업을 한 단위로 묶은 것
그 단위에 묶인 작업이 모두 성공할 때만 업무가 완성된다.
데이터 등록, 변경, 삭제를 다루는 SQL 문법
/* PK 컬럼 지정 */
alter table test1
add constraint test1_pk primary key (no);
/* 자동 증가 컬럼 지정 */
alter table test1
modify column no int not null auto_increment;
/* 컬럼을 지정하지 않으면
* 테이블을 생성할 때 선언한 컬럼 순서대로
* 값을 지정해야 한다.*/
insert into 테이블명 values(값,....);
insert into test1 values(null,'aaa','111','222','10101','seoul');
/* 컬럼을 명시할 수 있다. 이때 값을 입력하는 컬럼의 순서를 바꿀 수 있다. */
insert into 테이블명(컬럼,컬럼,...) values(값,값,...);
insert into test1(name,fax,tel,no,pstno,addr)
values('bbb','222','111',null,'10101','seoul');
/* no 컬럼은 필수 입력 컬럼이지만,
자동 증가 컬럼이기 때문에 값을 입력하지 않아도 된다.*/
insert into test1(name,tel) values('ccc','333');
insert into test1(name,tel) values
('aaa', '1111'),
('bbb', '2222'),
('ccc', '3333');
select 결과의 컬럼명과 insert 테이블의 컬럼명이 같을 필요는 없다.
그러나 결과의 컬럼 개수와 insert 하려는 컬럼 개수가 같아야 한다.
결과의 컬럼 타입과 insert 하려는 컬럼의 타입이 같거나 입력 할 수 있는 타입이어야 한다.
insert into test2(fullname,phone)
select name, tel from test1 where addr='seoul';
update 테이블명 set 컬럼명=값, 컬럼명=값, ... where 조건...;
delete from 테이블명 where 조건;
mysql은 autocommit의 기본 값이 true이다.
따라서 명령창에서 SQL을 실행하면 바로 실제 테이블에 적용된다.
수동으로 처리하고 싶다면 autocommit을 false로 설정하라!
set autocommit=false;
insert/update/delete을 수행한 후 승인을 해야만 실제 테이블에 적용된다.
commmit;
마지막 commit 상태로 되돌리고 싶다면,
rollback;
데이터를 조회할 때 사용하는 문법