본문 바로가기

2. MySQL | MongoDB

3/15 IT K-DT(10일차) / 0.MySQL설치~1.MySQL개요

 

 


0. SQL

 

* Data : 자료
* Database : 자료를 통합하여 관리하는 집합체. 저장소
* Database Management System(DBMS) : 데이터베이스를 관리하는 소프트웨어.
  (예 : Oracle, MySQL, Microsoft SQL server, PostgreSQL, MongoDB, Redis)

 

* DBMS를 사용하는 목적:
    - 중복된 데이터를 제거 및 관리
    - 효율적인 데이터 처리
    - 자료의 구조화
    - 다양한 사용자들과의 데이터 공유


* DB 종류의 랭킹을 확인할 수 있는 사이트.
 ( https://db-engines.com/en/ranking)

 

DB-Engines Ranking

Popularity ranking of database management systems.

db-engines.com

 

     - Oracle : 현재 DB 랭킹 1위. 성능 매우 우수, 공부할 내용이 많음. 최근 사용량이 감소하는 추세.

                     가격이 매우 비쌈.
     - MySQL : 현재 DB 랭킹 2위. 무료. 교육 간 사용하게 될 프로그램.
                       Python으로 프로그램을 짜서 DB에 저장하기 위한 목적으로 사용할 예정.
                       (설치 주소 : https://dev.mysql.com/downloads/installer/)
                       MySQL Community Server가 무료버전이므로 이 프로그램을 설치함.

 


 RDBMS
 Relational(관계형) DBMS. table로 DB를 다룸. 엑셀과 유사하게 행과 열로 데이터를 저장한다는 의미.
 MySQL 이외에도 Oracle, Microsoft SQL server, PostgreSQL이 RDBMS이다.

  - 행 : row(로우), record(레코드)
  - 열 : field(필드), column(컬럼)
  - 행과 열 : table(테이블)

 

* SQL(Structured Query Language) 언어의 특징
  - 데이터베이스에서 데이터를 정의, 조작, 제어하기 위해 사용하는 언어.
  - 대소문자를 구별하지 않음.
  - 문자열을 저장할 때 항상 싱글 쿼트('', 홑따옴표)만 사용함.

정보를 요청하는 쪽   정보를 제공하는 쪽
Client ----------------------------> Server


* Port : 컴퓨터에서 통신할 때 사용하는 번호. 

  IP 주소와 함께 사용되며, 이를 통해 특정 프로세스나 애플리케이션에 대한 통신을 구분함.

  (MySQL 포트번호 : 3306)

 

0. MySQL의 설치

 

▲ MySQL Community Server를 다운로드함. 아래 437.3M 파일을 다운로드.

 

 

▲ 포트 번호는 '3306' 사용.

 

 

▲ 교육 간 python과 같은 프로그램도 함께 사용할 예정이라, 보안은 5.x 버전의 수준을 유지.

     일반적으로는 위의 체크박스에 체크를 추천.

 

 

▲ 교육 간 사용할 Password는 '1234'로 지정할 예정.

 

 

▲ 자동으로 동작할 수 있도록 해주는 기능. 'MySQL80'

 

 

▲ Password에 아까 설정한 '1234'를 입력하고 Check.

 

 

▲ 정상적으로 설치를 완료를 했을 때 뜨는 창. Workbench는 Client라는 의미.

    MySQL Shell은 창을 닫아도 됨.

 

▲ 정상적으로 설치를 완료를 했을 때 MySQL이 정상적으로 동작하는지를 확인할 수 있음.

 

 


1. MySQL의 개요

 

1-1. MySQL의 개요

 

* 주석문 작성
  한 줄 주석문 : # 또는 --(하이픈 2개)
  여러 줄 주석문 : /* 로 시작 후 */ 로 마무리

 

* MySQL workbench에서 실행 후 확인 시

   문장 맨 끝에 세미콜론(;)을 입력 후 Ctrl+Enter

 

* schemas : 전체적인 구조를 의미.
  MySQL의 schemas 내부에는


* 데이터베이스 확인하기


SHOW databases;

모든 코드는 작성 후 Ctrl+Enter

 


* 데이터베이스 생성하기


 CREATE database 데이터베이스명;

create 후 show로 다시 확인하면 정상적으로 생성이 된 것을 확인할 수 있음.

새 창을 open했을 때 sakila, sys, world라는 기본적인 3개의 DB가 있음.

 

 

* 데이터베이스 선택하기


USE 데이터베이스명;

 


* 데이터베이스 삭제하기


 DROP database 데이터베이스명;


* 스키마(schemar)
- 데이터베이스의 구조와 제약조건에 관한 명세를 기술한 집합의 의미

 


1-2. 데이터 타입(Data type)


1-2-1. 숫자형 타입

    tinyint: 정수형 데이터 타입(1byte), -128 ~ 127 표현


    samllint: 정수형 데이터 타입(2byte), -32,768 ~ 32,767 표현


    mediumint: 정수형 데이터 타입(3byte), -8,388,608 ~ 8,388,607 표현 


    int: 정수형 데이터 타입(4byte), 약 -21억 ~ 21억 표현

          가장 기본형. 속도가 빠르기 때문에 int타입을 사용하는 것이 가장 무난함.


    bigint: 정수형 데이터 타입(8byte), 대략 무제한 표현


    float: 부동 소수형 데이터 타입(4byte)


    decimal: 고정 소수형 데이터 타입(길이 + 1byte)


    double: 부동 소수형 데이터 타입(8byte) / 소수점을 사용할 때의 가장 기본형.

 

 

1-2-2. 문자형 타입

    char: 고정 길이 데이터 타입(최대 255byte).

             지정된 길이보다 짧은 데이터 입력 시 나머지 공간을 공백으로 채움. 이런 이유로 사용이 비추천됨.


    varchar: 가변 길이 데이터 타입(최대 65535byte). 

                  지정된 길이보다 짧은 데이터 입력 시 나머지 공간은 채우지 않음.

                  문자형 타입 중에서 많이 사용됨.

 

    text: 문자열 데이터 타입(최대 65535byte).


    longtext: 문자열 데이터 타입(무제한).

 


1-2-3. 이진 데이터 타입

    binary / byte: char의 형태의 이진 데이터 타입(최대 255byte).


    varbinary: varchar의 형태의 이진 데이터 타입(최대 65535byte).

 


1-2-4. 날짜 데이터 타입

    date: 날짜(년도, 월, 일) 형태의 데이터 타입(3byte).


    time: 시간(시, 분, 초) 형태의 데이터 타입(3byte).


    datetime: 날짜 + 시간의 데이터 타입(8byte).


    timestamp: '1970.01.01 0시 0분 0초' 부터 시작인 ms(1/1000초) 타입의 시간이 저장됨(4byte).
    

1-2-5. 제약 조건(constraint)

데이터의 무결성을 지키기 위해 데이터를 입력 받을 대 실행되는 검사 규칙을 의미.


    not null

    null값을 허용하지 않음.
    중복값을 허용.


    unique
    null값을 허용.
    중복값을 허용하지 않음.
    not null + unique → null값과 중복값을 모두 허용하지 않는다.


    primary key
    null값, 중복값을 허용하지 않음.
    테이블에 단 하나만 사용이 가능함.
    해당 테이블의 대표가 되는 key.

 

    foreign key
    primary key를 가진 테이블과 연결하는 역할.
    primary key에 포함되지 않은 데이터가 존재하는 경우 에러가 발생함.


    default
    null값을 삽입할 때 기본이 되는 값을 저장할 수 있게 함.


    enum
    원하는 범위를 설정하고 해당 범위의 값만 저장이 될 수 있도록 함.
    예) enum('남자', '여자')인 경우, 범위 안의 2개의 값만 저장이 가능해짐.
    웬만하면 사용하지 않는것을 권장하지 않는 type.


* 테이블 만들기


CREATE table 테이블명 (
    필드명1 데이터타입 제약조건,
    필드명2 데이터타입 제약조건,
    필드명3 데이터타입 제약조건,
    ...
    필드명n 데이터타입 제약조건,
)

예) member라는 table을 생성.

     field값:userid, userpw, username, hp, email, gender, ssn1, ssn2, zipcode,

                address1, address2, address3, regdate, point

     각 값의 데이터 타입 및 제약 조건은 아래 코드 참고.


 CREATE table member (

    userid varchar(20) PRIMARY KEY, # null값, 중복값이 들어갈 수 없고, 다른 테이블이 참조가 가능함.
    userpw varchar(200) NOT NULL, # not null : null값을 허용하지 않음. 반드시 작성해야 함.
    username varchar(20) not null,
    hp varchar(20) not null,
    email varchar(50) not null,
    gender varchar(10) not null,
    ssn1 varchar(6) not null,
    ssn2 varchar(7) not null,
    zipcode varchar(5), # 입력을 하지 않아도 저장이 가능하도록 not null을 사용하지 않음.
    address1 varchar(100),
    address2 varchar(100),
    address3 varchar(100),
    regdate datetime DEFAULT now(), # 현재시간을 자동으로 저장될 수 있도록 함.
    point int DEFAULT 0 # point의 기본값은 0.

 );

 

* 테이블 확인하기


 DESC 테이블명;

 


* 테이블 삭제하기


 DROP table 테이블명;

 


* 테이블 필드 추가하기


 ALTER table 테이블명 ADD 컬럼명 데이터타입 제약조건;

예) mbti라는 field를 새로 추가. (문자열 가변값은 10)


ALTER table member ADD mbti varchar(10); 

 


* 테이블 필드 수정하기


  ALTER table 테이블명 MODIFY column 컬럼명 데이터타입 제약조건;

예) mbti field의 문자열 가변값을 20으로 수정.


 ALTER table member MODIFY column mbti varchar(20); 

 

* 테이블 필드 삭제하기


  ALTER table 테이블명 DROP 컬럼명;

예) mbti field를 삭제.


ALTER table member DROP mbti; 

 

* 테이블에 데이터 삽입하기


 INSERT INTO 테이블명(필드명1, 필드명2, 필드명3...) VALUES (값1, 값2, 값3 ... );

예) word라는 테이블을 생성.

     word에 'eng', 'kor', 'lev'의 field 삽입 후 'apple' 데이터 삽입


CREATE table word (   
    eng varchar(50) primary key,
    kor varchar(50) not null,
    lev int
);


INSERT INTO word VALUES ('apple', '사과', 1); 




# insert into word values('banana', '바나나'); 로 작성을 한다면, column 수가 value 수와 달라서 에러가 발생.
# Error Code: 1136. Column count doesn't match value count at row 1 0.000 sec
insert into word values('banana', '바나나', null); # 오류 없이 빈 칸으로 두고싶은 경우에는 'null'로 입력.
# insert into word values('orange', null, null); 로 eng 필드명만 두고 작성을 한다면 에러가 발생.

   (kor 필드 제약 조건이 not null 이므로)

insert into word (eng, kor, lev) values ('melon', '메론', 1);

# word에 'eng', 'kor', 'lev'의 field 삽입 후 'melon' 데이터 삽입(2번방법 이용)
insert into word (eng, kor) values ('orange', '오렌지'); # 'orange'데이터에서 필드명 lev에 대한 데이터 생략.
# insert into word (eng) values ('grapes'); 로 eng 필드명만 두고 작성을 한다면 에러가 발생.

(kor 필드 제약 조건이 not null 이므로)

select * from word; # word 테이블에 데이터가 제대로 추가되었는지를 확인.

create table member( # 위에서 작성한 member 테이블.
userid varchar(20) primary key, 
    userpw varchar(200) not null,
    username varchar(20) not null,
    hp varchar(20) not null,
    email varchar(50) not null,
    gender varchar(10) not null,
    ssn1 varchar(6) not null,
    ssn2 varchar(7) not null,
    zipcode varchar(5),
    address1 varchar(100),
    address2 varchar(100),
    address3 varchar(100),
    regdate datetime default now(),
    point int default 0
);

desc member; # member 테이블이 정상적으로 생성이 된 것을 확인.

 

  field값:userid, userpw, username, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3, regdate, point

  각 값의 데이터 타입 및 제약 조건은 아래 코드 참고.

insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values ('kim', '1234', '김', '0000', 'aaaa', '남자', '000000', '0000000');
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values ('lee', '1234', '이', '1111', 'bbbb', '여자', '111111', '0000000');
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values ('park', '1234', '박', '2222', 'cccc', '남자', '222222', '0000000');
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values ('jeong', '1234', '정', '3333', 'dddd', '여자', '333333', '0000000');
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values ('choi', '1234', '최', '4444', 'eeee', '남자', '444444', '0000000');

select * from member; # member테이블의 내용 확인.

 


* 데이터 삭제하기
   delete from 테이블명;
   delete from 테이블명 where 조건절;
delete from member; # 에러 발생.

# You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.  

"WHERE" 조건 없이 "UPDATE" 또는 "DELETE" 쿼리를 실행하려고 할 때 발생하는 에러.

   (실수로 전체 테이블을 수정하거나 삭제하는 것을 방지하기 위해 MySQL이 제공하는 보안 기능)

SET SQL_SAFE_UPDATES = 0; # 이 코드를 사용하여 보안기능을 끌 수 있고, 0의 자리에 1을 넣으면 다시 켤 수 있음.

 


* 조건절의 예시
delete from member where userid='kim'; # userid가 'kim'인 사용자를 삭제하는 조건절.
delete from member where gender='남자'; # gender가 '남자'인 사용자를 삭제하는 조건절.

 


* 데이터 수정하기 

  update 테이블명 set 필드명1=값1, 필드명2=값2...;
  update 테이블명 set 필드명1=값1, 필드명2=값2... where 조건절;
update member set point=100; # member테이블의 point필드를 0에서 100으로 수정.
update member set point=point+300 where gender='여자'; 

# member테이블의 gender가 '여자'인 사용자의 point에 300을 더하는 조건절.
update member set email='jeong@naver.com' where username='정'; 

# username이 '정'인 사람의 email을 jeong@naver.com으로 변경.

 

 


TIP

 

*  DBMS의 종류는 많지만, 한 가지만 확실하게 공부해둔다면 나머지를 공부하는데 수월해짐.


* SQL은 CRUD가 중요. (Create Read Update Delete)