꾸준한 개발자

계속적인 성장을 추구하는 개발자입니다. 꾸준함을 추구합니다.

계속 쓰는 개발 노트

DATABASE

데이터베이스 모델링 및 sql문

gold_dragon 2020. 11. 24. 16:51

mysql workbanch에서 파일 메뉴에 new model을 선택하면 모델링할 수 있는 화면이 나옵니다.

 

해당 데이터베이스의 이름을 바꿔줄 수 있고 테이블을 생성하고 컬럼을 추가할 수 있습니다.(테이블 추가할 때는 왼쪽에 테이블 아이콘을 클릭하고 본 화면에 클릭하면 테이블이 생깁니다.

 

테이블에 컬럼을 추가했으면 왼쪽 메뉴바에서 1:1 혹은 1:n으로 테이블끼리 관계성을 갖도록 할 수 있습니다.

 

그 다음 Database 메뉴에서 Forward Engineer를 선택하고 설정 선택 후 INDEX부분에 mysql과 workbanch의 버전이 다르기 때문에 visible을 지워줍니다.

 

그 후 스키마를 확인해보면 모델링한 데이터베이스가 생성된 것을 확인할 수 있습니다. 테이블을 확인하고 싶으면 옆에 i를 클릭하고 columns 탭에서 확인할 수 있습니다.

 

반대로 데이터베이스를 다이어그램으로 보고싶으면 Database 메뉴에서 Reverse Engineer를 통해 확인할 수 있습니다.


select from을 통해 데이터를 출력할 수 있습니다.

select 뒤에 어떤 컬럼을 출력할지, from 뒤에 어떤 테이블에서 출력할지를 써줍니다.

ex) select code, name, continent, population, gnp from country;

 

where 문을 추가하여 원하는 데이터를 출력할 수 있습니다.(비교, 논리, IN, LIKE)

ex) select code, name, population from country where population >= 100000000;

ex) select code, name, population from country where population >= 80000000 and population <= 100000000;

ex) select code, name, population from country where population between 80000000 and 100000000; (위의 예시랑 같음)

ex) select code, name, continent from country where continent="Asia" or continent="Africa";

ex) select code, name, continent from country where continent in ("Asia", "Africa"); (위 예시랑 같음)

ex) select code, name, continent from country where continent not in ("Asia", "Africa"); (위 예시의 반대)

ex) select code, name, governmentform from country where governmentform like "%Republic%";

 

order by 문을 통해 데이터를 정렬할 수 있습니다.

ex) select code, name, population from country order by population asc; (오름차순으로 정렬 - asc는 생략이 가능)

ex) select code, name, population from country order by population desc; (내림차순으로 정렬)

ex) city에서 국가코드를 오름차순 정렬, 인수수를 내림차순 정렬select name, countrycode, population from city order by countrycode asc, population desc; (앞쪽이 1차 정렬, 뒷부분은 2차 정렬)

ex) select code, continent, population from country where population > 50000000 and continent = "Asia" order by population desc;

 

limit 문을 통해서 데이터의 출력 수를 제한할 수 있습니다.

ex) select countrycode, name, population from city order by population desc limit 3; (데이터 3개만 출력)

ex) select countrycode, name, population from city order by population desc limit 2, 3; (2개 스킵하고, 그 후로 3개 출력)

ex) select code, name, continent, gnp, lifeexpectancy from country where lifeexpectancy >= 70 and continent in ("Asia", "Europe") order by GNP desc limit 3, 5;

ex) select code, name, surfacearea, population, population / surfacearea as pps from country where (population / surfacearea) >= 100; (연산자를 쓸 수도 있음)

 

group by 문으로 특정 컬럼을 기준으로 동일한 데이터를 합쳐서 출력하는 방법 / 기준 데이터가 아닌 컬럼은 결합 함수를 이용해서 출력합니다. (결합 함수: count, max, min, avg, sum...)

ex) select continent, count(name) from country group by continent;

ex) select continent, sum(population) as population from country group by continent order by population desc;

ex) select continent, sum(population) as population from country group by continent having population >= 500000000 order by population desc; (having 문으로 결과 목록에서 자신이 원하는 데이터를 가져올 수 있음)

ex) select continent, avg(population), avg(GNP), (avg(GNP) / avg(population)) as gpa from country group by continent having gpa >= 0.01 order by gpa desc;

 

DDL은 데이터 정의어로 데이터베이스, 테이블 CRUD를 담당

그 중에 create는 생성

create database test; (test 데이터베이스를 만듦)

use test; (데이터베이스 선택)

select database(); (선택한 데이터베이스 확인)

create table user2(
    user_id INT primary key auto_increment,
    name varchar(20) not null,
    email varchar(30) unique not null,
    age INT default 30,
    rdate timestamp
);

 

alter는 수정을 할 수 있습니다.

ex) show variables like "character_set_database";

ex) alter database test character set = utf8;

 

alter에서 add는 컬럼을 추가할 수 있습니다.

ex) alter table user2 add tmp text;

 

alter에서 modify는 컬럼을 수정할 때 사용합니다.

ex) alter table user2 modify tmp int;;

 

alter에서 drop은 컬럼을 삭제할 때 사용합니다.

ex) alter table user2 drop tmp;

 

그냥 drop은 데이터베이스, 테이블을 삭제할 때 사용합니다.

ex) drop database tmp;

ex) drop table tmp;

 

insert는 특정 테이블에 row 데이터를 넣을 때 사용합니다.

ex) insert into user1(user_id, name, email, age, rdate) values (1, "peter", "p@gmail.com", 23, "2017-03-23"), (2, "guemyong", "g@gmail.com", 24, "2020-11-14");

ex) insert into tmp select name, code, population from country order by population desc limit 3; (검색 결과를 테이블에 추가, 컬럼은 맞춰야 함)

 

update는 테이블의 row 데이터를 수정할 수 있습니다.

ex) update user1 set age=20, email="fds@gmail.com" where name="peter" limit 1; (limit을 쓰는 이유는 workbench에서 제한을 걸어두었기 때문)

 

delete, truncate는 테이블의 특정 데이터를 지울 수 있습니다. (truncate는 DDL입니다. 안의 내용만 지우고 스키마는 그대로 둡니다. delete는 DML이기 때문에 트랜젝션을 탑니다.)

ex) delete from user1 where rdate > "2017-01-01" limit 1;

ex) truncate user1; (테이블은 남겨두고 데이터만 삭제)


foreign key

데이터의 무결성을 지킬 수 있습니다. 들어가면 안되는 데이터를 잡아줍니다.(데이터가 안들어가지게 막습니다.)

unique나 primary 제약조건이 있어야 설정 가능합니다.

 

ex)

alter table money
add constraint fk_user
foreign key (user_id)
references user (user_id);

 

ex)

create table money(
    money_id int primary key auto_increment,
    income int,
    user_id int,
    foreign key (user_id) references user(user_id)
);

 

만약 foreign key로 연결이 돼 있는데 삭제하고 싶으면 다음 명령어를 사용합니다.

on delete / on update

ex)

create table money(
    money_id int primary key auto_increment,
    income int,
    user_id int,
    foreign key (user_id) references user(user_id)
    on update cascade on delete set null
);

cascade : 참조되는 테이블에서 삭제하거나 수정하면, 참조하는 테이블에서도 삭제하거나 수정합니다.

'DATABASE' 카테고리의 다른 글

mongoDB (AWS EC2)  (0) 2020.11.30
sql 백업  (0) 2020.11.30
sql에서 function 종류  (0) 2020.11.26
AWS를 이용해서 mysql 사용하기  (0) 2020.11.23
mssql 여러 개 join 할 때  (0) 2020.11.13