mysql에서는 실제로 데이터 타입을 바꿔서 사용하는 기능이 따로 없었는데 버전4.2부터 추가됨.
대표적으로 CAST
,CONVERT
함수 등이 있음.
cast함수는 타입을 변경(지정)하는데 유용하다.
cast 함수의 사용법:
CAST(expression AS type)
-> expr식에서 나오는 값을 as뒤에 나오는 타입으로 바꿔달라.
CONVERT(expression,type)
-> cast에서 as를 사용했다면 convert에서는 ,
를 사용해 표현한다. 마찬가지로 식의 값을 ,
뒤의 타입으로 바꿔달라는 함수이다.
CONVERT(expr USING transcoding_name)
-> convert함수중에는 using
으로 구분해서 사용하면 Charset
을 바꿀 수 있는 부분도 존재한다.
MySQL 타입: BINARY
,CHAR
,DATE
,DATETIME
,SIGNED{INTEGER}
,TIME
,UNSIGNED{INTEGER}
예제
mysql> select cast(now() as date);
mysql> select cast(1-2 as unsigned);
mysql> select cast(1-2 as signed);
-> 차례때로 현재날짜를 보여달라. -1을 unsigned형으로 보여달라. -1을 signed형으로 보여달라이다.
단일함수의 경우,
mysql> select concat(name,'aaaa') from employee;
-> employee 테이블의 모든 직원들의 이름뒤에 aaaa
를 붙여서 출력해라.
그룹함수의 경우,
mysql> select count(*) from employee;
-> count는 전체 몇개인지 카운트해준다. 그리고 결과가 하나(총개수)만 나온다. 전체가 몇개 레코드인지 알고싶을 때 위처럼 *
을 써준다.(결과: 14)
mysql> select avg(salary) from employee;
-> employee 테이블에서 모든 직원들의 급여의 평균을 보여준다. 결과는 하나이다.(그룹함수)
select count
해보면 14개가 아니라 13개가 나온다 널값은 제외하고 카운팅하기 때문이다. mysql> select avg(salary),sum(salary) from employee where deptno = 30;
-> employee 테이블에서 부서번호가 30인 직원의 급여의 평균과 총합계를 출력해라.
mysql> select deptno,avg(salary), sum(salary) from employee
group by deptno;
-> employee 테이블에서 부서별 직원의 부서번호, 급여평균과 총합계를 출력해라. group bt 절
을 사용하였다.
insert into 테이블명(필드1,필드2,필드3,필드4, ...)
values (필드1의 값, 필드2의 값, 필드3의 값, 필드4의 값, ...)
insert into 테이블명
values (필드1의 값, 필드2의 값, 필드3의 값, 필드4의 값, ...)
desc 테이블명
의 결과로 나오는 순서대로 필드값을 부여해주면 된다.만약 테이블 생성시 디폴트 값 같은 것이 세팅되어 있었다면 필드가 나열되지 않아도 해당 디폴트 값이 알아서 입력이 될것이다.
mysql> insert into ROLE(role_id, description) values(200,'CEO');
mysql> insert into ROLE values(200,'CEO');
-> ROLE 테이블에 role_id는 200, description에는 'CEO'로 한건의 데이터를 저장해라. 만약 desc ROLE
을 실행해보고 필드가 위의 2개가 다면 2번째 쿼리와 같이 나타낼 수 있다.
mysql> insert into ROLE(description) values('aaa');
-> 위의 ROLE 테이블에 대해서 위의 명령어를 실행하면 에러가 발생하는 것을 볼 수 있다. 위의 테이블에서 role_id를 보면 KEY
에서 PRIMARY KEY
로 지정되어 있는 것을 볼 수 있다. PRIMARY KEY
는 널 값을 입력할 수 없는데, 디폴트가 널이다. 지정하지 않으면 널 값이 들어가서 오류를 발생시킨다.
mysql> insert into ROLE(role_id) values(201);
-> 반대로 role_id만 넣어서 입력하면, 201번이 제대로 입력되는 것을 볼 수 있다.
즉, 칼럼명을 나열해서 원하는 칼럼만 입력이 가능하지만, 대신 NOT
,NULL
조건이나 PRIMARY KEY
와 같이 널이 들어갈 수 없는 칼럼들은 반드시 나열해서 값을 지정해야 한다. 그렇지 않으면 널 값이 들어가서 조건자체가 받아들여지지 않을 것이다. 그렇게 되면 오류를 발생시킨다.
UPDATE 테이블명
SET 필드1 = 필드1의 값, 필드2 = 필드2의 값,필드3 = 필드3의 값,...
WHERE 조건식
,
로 구분하면 된다.update ROLE
set description = 'CTO'
where role_id = 200;
-> ROLE 테이블에 role_id가 200인 경우 description을 'CTO'로 수정해라.
단, where절에 적절한 조건을 부여하지 않으면 모든데이터가 수정되므로 조심해야 한다.
delete
from 테이블명
where 조건식
-> 조건식을 통해 특정 row만 삭제할 수 있다.
delete from ROLE where role_id = 200;
-> ROLE 테이블에서 role_id는 200인 정보를 삭제하여라.
CREATE
, DROP
, ALTER
등이 해당된다.
테이블을 정의하기 위해서는 테이블의 어떤 필드
들을 정의하고, 해당 필드들은 어떤 타입
이고, 자릿수
는 얼만큼 차지할 것인지 등의 정보를 줘야 함.
-> 이때 필요한 것이 데이터타입
이다.
내가 사용할 이 테이블의 이 칼럼에는 어떤 타입의 데이터들을 사용할지 지정할 수 있다.
mysql> create table 테이블명
-> 필드명1 타입 [NULL | NOT NULL][DEFAULT][AUTO_INCREASED],
-> 필드명2 타입 [NULL | NOT NULL][DEFAULT][AUTO_INCREASED],
-> 필드명3 타입 [NULL | NOT NULL][DEFAULT][AUTO_INCREASED]
..............
-> PRIMARY KEY(필드명)
);
NULL
값을 허용할거다 또는 아예 NOT NULL
로만 실행할거다.PRIMARY KEY
로 특정한 필드를 지정할 것이다. 단, PRIMARY KEY
는 필드생성시에도 지정가능하다.create
절에서 table이 아닌 다른 객체
로 실행을 하면 똑같은 구문으로 실행이 된다.mysql> create table book(
-> ibsn varchar(10) primary key,
-> title varchar(20) not null,
-> price integer not null);
ibsn
,title
,price
라는 칼럼이 있는 book
테이블 생성 show tables
를 통해 확인가능.alter
예약어 사용.add
예약어 사용하고 필드이름, 타입, 제약조건 부여해야 함.drop
사용.mysql> alter table 테이블명
-> add 필드명 타입 [NULL | NOT NULL][DEFAULT][AUTO_INCREASED];
mysql> alter table 테이블명
-> drop 필드명;
mysql> alter table book
-> add author varchar(20);
mysql> alter table book
-> drop price;
book
이라는 테이블에 author
이라는 칼럼(필드) 추가. author
칼럼은 20개이하의 자리를 갖는 문자형태를 갖음.price
필드(칼럼)를 삭제함.change
예약어 사용mysql> alter table 테이블명
-> change 필드명 새필드명 타입 [NULL | NOT NULL][DEFAULT][AUTO_INCREASED];
desc 테이블명
으로 필드 확인 가능.mysql> alter table 테이블명 rename 변경이름;
rename
뒤의 이름으로 바꿈drop
예약어 사용mysql> drop table 테이블명;
단, 제약조건 때문에 삭제가 되지 않는 경우가 존재한다.
우리 샘플 테이블로 예를 들면, department
테이블과 employee
테이블이 있다. department
테이블에 부서넘버라는 필드가 있고 employee
테이블에도 부서넘버 필드가 존재한다.
해당 필드들은 서로 관계를 가지고 있다. 이와 같은 관계를 foreign key
관계라고 한다.
이때, employee
테이블에 deptno
를 삽입할때, department
테이블이 갖고 있는 숫자만 가능하다. 그렇지 않으면 null
값으로 입력을 해야 한다.
mysql> insert into employee (empno,name,deptno)
-> values(1111,'kang',100);
employee
테이블의 deptno
에 department
테이블이 갖고 있지 않은 값인 100을 넣어본다. -> 에러발생
에러 발생 이유: foreign key
제약조건으로 department
테이블과 연관관계를 맺고 있기 때문이다. 그래서 없는 값 넣으면 안된다.
mysql> insert into employee (empno,name,deptno)
-> values(1111,'kang',30);
department
테이블에 존재하는 값인 30을 deptno
에 넣었을 때 제대로 입력이 된다.
즉, 테이블을 삭제할 시, 테이블을 생성한 반대순서
로 삭제해야 한다.
위의 예시에서는 employee
테이블 삭제후에 department
테이블을 삭제해야 한다.