간단 지식/Database

07. SQL과 MySQL

납작한돌맹이 2020. 1. 22. 16:30
반응형

SQL과 MySQL은 같은 개념일까 다른 개념일까? 다르다고는 알고 있지만 정확히 설명할 수 있어야 안다고 할 수 있다.

SQL은 구조화 질의어로, DDL, DML, DCL의 기능인 질의어, 조작어, 제어어 기능을 모두 제공한다. SQL이 많은 사람들에게 사랑받는 이유는 사용자에게 친화적인 인터페이스 덕분이라고 생각한다. 이러한 인터페이스는 SQL이 고급에다가 비절차적 언어라는 점에서 비롯되었다. 그리고 관계형 데이터베이스를 관리하기 위해 오라클에서 지원하는 시스템이 바로 MySQL이다. 즉 SQL은 언어, MySQL은 시스템이다.

 

SQL에서는 여태까지 불렀던 relation, tuple, attribute과 같은 관계 모델의 용어 대신 일반 용어를 사용한다.

relation -> table

tuple -> row

attribute -> column


SQL을 작성하는 법을 알기 전에 MySQL 시스템부터 알아보자.

다들 오라클에서 MySQL을 다운받을텐데, 활용할 수 있는 툴이 필요할 것이다. 바로 MySQL workbench라는 것인데 이클립스나 비쥬얼 스튜디오 같은 거라고 생각하면 된다. 또 다른 방법은 cmd 창에서 커맨드를 치는 건데 개인적으로 DB나 table을 확인할 때면 몰라도 데이터를 조작할 때 불편했다. 

 

가장 먼저 해야하는 일은 DB를 생성하는 것이다.

workbench에서 생성한 DB 서버에는 처음에 아무것도 없다. 그 공간은 아직 DB가 생성되지 않았기 때문에 다음 명령어를 이용해서 DB를 생성해줘야 한다. 

 create schema university; 

또는 

 create database university;


두번째로 할 일은 관계형 데이터베이스를 만들 것이므로 table들을 생성해야 한다.

아래에 있는 관계 모델을 DB에 구현해보기 위해 table을 3개 만들어야 한다.

student
table
sno sname year dept
100 소현 4 컴퓨터공학과
200 뫄뫄 1 영어영문학과
300 묘묘 3 기계공학과
400 띠띠 3 부동산학과
500 나나 2 수학과
course
table
cno cname credit dept
1 대학영어 2 영어영문학과
2 java 프로그래밍 3 컴퓨터공학과
3 인공지능 3 컴퓨터공학과
4 공학수학 2 수학과
5 기초기계공학 3 기계공학과
6 부동산세법 3 부동산학과
enroll
table
sno cno grade midterm final
100 1 B 75 70
100 3 A 80 95
200 1 A 90 90
300 1 C 50 45
300 4 B 65 80
300 5 A 80 95
400 1 C 30 65
400 6 B 70 80
500 4 B 85 55

table을 생성하는 것도 똑같이 create을 이용하면 된다.

create table student(); 

create table course(); 

create table enroll(); 

 

그러나 위 sql은 잘못된 sql이다. 아래처럼 table 내에 저장될 데이터의 타입을 지정해줘야 하기 때문이다. 

 create table student(

        sno int primary key,            -------------------- (1)               

        sname char(3),

        year int not null,            -------------------- (2)

        dept char(10),

        enter_date datetime default now(),            -------------------- (3)
        modify_date datetime on update now()      -------------------- (3)

 );

 create table course(

        cno int primary key,                                 

        cname char(10),

        credit int,

        dept char(10),

        enter_date datetime default now(),
        modify_date datetime on update now()

 );

 create table enroll(

        sno int,

        cno int, 

        grade char(1),

        midterm int,

        final int,

        foreign key(sno) references student(sno),    -------------------- (4)

        foreign key(cno) references course(cno),     -------------------- (4)

        enter_date datetime default now(),
        modify_date datetime on update now()

 );

 

하나하나 읽어보면 이해하는 게 어렵지 않다. 그래도 몇 가지는 정리해두면 좋을 것 같아서 빨간색으로 번호를 남겨놨다.

(1) 에 해당하는 부분은 기본키 설정에 관한 부분이다. sql에서 기본키는 primary key로 지정하게 했다. char형도 기본키가 될 수는 있는데 일반적으로는 자릿수가 많지 않은 정수를 기본키로 삼는다.

(2) 에 해당하는 부분은 null 값에 관한 부분이다. 꼭 값이 유효해야 하는 열에 대해서는 not null을 붙여주면 된다. 그러면 만일 insert할 때 투플에서 해당 열에 값을 적지 않으면 에러 메시지를 볼 수 있게 된다.

(3) 에 해당하는 부분은 세트로 생각하면 된다. 없어도 되긴 하지만 언제 데이터가 저장되었고, 또 언제 데이터가 업데이트되었는지를 알려주기 때문에 편리하다.

(4) 에 해당하는 부분은 외래키 설정에 관한 부분이다. enroll table은 student, course table에서 sno와 cno를 가져다 쓰기 때문에 enroll에서의 sno와 cno는 외래키이다. 따라서 어디서 참조를 해왔는지를 명시해주는 것이다.


번호를 매겨놓지는 않았지만 데이터 타입에 대해서 정리해보았다.

sql에서 쓰는 데이터 타입은 꽤 많은데 대부분 정수형이나 문자열을 쓸 것이다. 말하고 싶은 부분은 문자열을 표현하는 char와 varchar의 차이다. 

char(10)

varchar(10)

이 둘의 차이는 무엇일까?

char(10)와 varchar(10)에 'happywinter'를 저장하면 happywinte가 저장되고 남은 공간은 없을 것이다.

char(10)와 varchar(10)에 'happy'를 저장하면 둘 다 happy를 저장할 것이다. 그러나  char(10)에는 남은 공간이 5byte, varchar(10)은 남은 공간이 없을 것이다. 왜냐하면 char는 고정형이지만, varchar는 가변형이기 때문에 happy가 저장될 때 재빨리 계산을 해서 공간을 재할당하기 시작한다.

따라서 char를 사용하면 그냥 처음에 할당된 공간에 저장만 하면 되기 때문에 시간복잡도가 좋고, varchar를 사용하면 효율적인 공간 사용으로 인해 공간복잡도가 좋다. 어느 것이 좋다고 딱 잘라 말할 수는 없지만 개인적으로는 시간복잡도를 위해 char를 자주 사용한다.


다음 글에서는 데이터를 조작하기 위한 sql과 생성된 DB나 table을 삭제하는 방법을 정리할 것이다. 요즘엔 구글에 검색만 하면 다 나오기 때문에 딱히 외울 필요는 없다. 다만 검색에만 의존하면 능숙함이 떨어진다고 생각하기 때문에 한 번씩 정리하는 시간이 필요하다고 생각한다. 

 

 

(이 글이 도움이 됐다면 광고 한번씩만 클릭 해주시면 감사드립니다, 더 좋은 정보글 작성하도록 노력하겠습니다 :) )

반응형