반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

[초간단 SQL 학습][MySQL] 데이터베이스, 테이블 만들기. 본문

IT/Database

[초간단 SQL 학습][MySQL] 데이터베이스, 테이블 만들기.

현무랑 니니 2016. 4. 23. 02:46
반응형

간단히 SQL을 배우려면 우분투에 MySQL을 설치하면 된다.

MySQL이 설치된 가상 머신이 데이터베이스 서버가 된다.


이후 MySQL 서버에 연결하면 SQL 학습을 위한 도구는 준비된 것이다.


또 다른 방법은 윈도우즈에 MySQL을 설치하는 것이다.

사전에 Visual Studio가 설치되어 있어야 하며 10G 정도의 많은 용량이 필요하다.

이 글은 우분투에 MySQL 설치된 환경을 기초로 작성한다.


디폴트(현재) 데이터베이스 이름을 질의한다.

mysql> select database();
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

NULL 값이 반환되었으니 아직 어떤 데이터베이스도 선택하지 않았다.


데이터베이스 생성하기

아래와 같이 CREATE DATABASE 문으로 testdb란 이름을 가진 데이터베이스를 만든다.


mysql> CREATE DATABASE testdb;
Query OK, 1 row affected (1.51 sec)

데이터베이스를 만들었지만 사용하기 위해 선택하지는 않았다.


데이터베이스 선택하기

testdb란 데이터베이스는 만들기만 하였으므로 사용하기 전에 선택해야 한다.

mysql> USE testdb;
Database changed

mysql> select database();
+------------+
| database() |
+------------+
| testdb     |
+------------+
1 row in set (0.00 sec)

테이블 생성하기

이전에 생성한 데이터베이스는 비어 있다.

먼저, 테이블을 만들어 주어야 한다.

mysql> CREATE TABLE course
    -> (sno INT NOT NULL, 
    -> prof CHAR(2),
    -> dept CHAR(10),
    -> cno CHAR(4) NOT NULL,
    -> grade CHAR(1),
    -> PRIMARY KEY(sno, cno)
    -> );
Query OK, 0 rows affected (0.40 sec)

DESCRIBE문을 이용하여 생성한 course 테이블을 확인한다.

mysql> DESCRIBE course; 
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| sno   | int(11)  | NO   | PRI | NULL    |       |
| prof  | char(2)  | YES  |     | NULL    |       |
| dept  | char(10) | YES  |     | NULL    |       |
| cno   | char(4)  | NO   | PRI | NULL    |       |
| grade | char(1)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
5 rows in set (0.07 sec)

생성한 course 테이블 역시 비어 있다.

mysql> select * from course; Empty set (0.03 sec)


데이터 삽입

INSERT 문을 이용하여 튜플들을 추가한다.

mysql> INSERT INTO course VALUES -> (100, 'P1', 'Computer', 'C413', 'A'), -> (100, 'P1', 'Computer', 'E412', 'A'), -> (200, 'P2', 'Electric', 'C123', 'B'), -> -> (300, 'P3', 'Computer', 'C312', 'A'), -> (300, 'P3', 'Computer', 'C324', 'C'), -> (300, 'P3', 'Computer', 'C413', 'A'), -> -> (400, 'P1', 'Computer', 'C312', 'A'), -> (400, 'P1', 'Computer', 'C324', 'A'), -> (400, 'P1', 'Computer', 'C413', 'B'), -> (400, 'P1', 'Computer', 'E412', 'C') -> ; Query OK, 10 rows affected (0.04 sec) Records: 10 Duplicates: 0 Warnings: 0


course 테이블에 추가된 튜플들을 select 문을 이용하여 확인한다.

mysql> select * from course; +-----+------+----------+------+-------+ | sno | prof | dept | cno | grade | +-----+------+----------+------+-------+ | 100 | P1 | Computer | C413 | A | | 100 | P1 | Computer | E412 | A | | 200 | P2 | Electric | C123 | B | | 300 | P3 | Computer | C312 | A | | 300 | P3 | Computer | C324 | C | | 300 | P3 | Computer | C413 | A | | 400 | P1 | Computer | C312 | A | | 400 | P1 | Computer | C324 | A | | 400 | P1 | Computer | C413 | B | | 400 | P1 | Computer | E412 | C | +-----+------+----------+------+-------+ 10 rows in set (0.00 sec)


삽입이상

학번이 500번인 학생의 지도교수가 P4라는 사실만 입력하면 아래와 같이 오류가 발생한다.
불필요하고 원하지 않은 과목정보에도 데이터를 추가해야 한다.

mysql> INSERT INTO course VALUE -> (500, 'P4'); ERROR 1136 (21S01): Column count doesn't match value count at row 1

모든 속성의 값을 명시하지 않아서 발생하는 오류이다.

mysql> INSERT INTO course VALUE
    -> (500, 'P4', NULL, NULL, NULL);
ERROR 1048 (23000): Column 'cno' cannot be null
과목번호도 기본 키이므로 NULL이 될 수 없기 때문에 발생한 오류이다.

mysql> INSERT INTO course VALUE
    -> (500, 'P4', NULL, '', NULL);
Query OK, 1 row affected (0.08 sec)

삽입한 튜플의 상태를 SELECT 문으로 확인한 것이다.
mysql> SELECT * FROM course;
+-----+------+----------+------+-------+
| sno | prof | dept     | cno  | grade |
+-----+------+----------+------+-------+
| 100 | P1   | Computer | C413 | A     |
| 100 | P1   | Computer | E412 | A     |
| 200 | P2   | Electric | C123 | B     |
| 300 | P3   | Computer | C312 | A     |
| 300 | P3   | Computer | C324 | C     |
| 300 | P3   | Computer | C413 | A     |
| 400 | P1   | Computer | C312 | A     |
| 400 | P1   | Computer | C324 | A     |
| 400 | P1   | Computer | C413 | B     |
| 400 | P1   | Computer | E412 | C     |
| 500 | P4   | NULL     |      | NULL  |
+-----+------+----------+------+-------+
11 rows in set (0.00 sec)

데이터 삭제

DELET 문을 사용하여 튜플을 삭제할 수 있다.
mysql> DELETE FROM course 
    -> WHERE sno = 200
    -> AND cno = 'C123';
Query OK, 1 row affected (0.05 sec)


삭제 후 course 테이블의 정보를 보여준다.
mysql> SELECT * FROM course;
+-----+------+----------+------+-------+
| sno | prof | dept     | cno  | grade |
+-----+------+----------+------+-------+
| 100 | P1   | Computer | C413 | A     |
| 100 | P1   | Computer | E412 | A     |
| 300 | P3   | Computer | C312 | A     |
| 300 | P3   | Computer | C324 | C     |
| 300 | P3   | Computer | C413 | A     |
| 400 | P1   | Computer | C312 | A     |
| 400 | P1   | Computer | C324 | A     |
| 400 | P1   | Computer | C413 | B     |
| 400 | P1   | Computer | E412 | C     |
| 500 | P4   | NULL     |      | NULL  |
+-----+------+----------+------+-------+
10 rows in set (0.00 sec)

삭제이상

학번이 200번이 학생의 교과목 C213을 취소하면, 이 학생의 지도교수가 P2란 정보도 삭제된다.
즉, 원하지 않은 정보까지도 삭제되는 연쇄삭제 현상이 일어나 정보 손실이 발생한다.

데이터 갱신

학번 400번인 학생의 지도교수를 P1에서 P2로 갱신한다.
결과는 4개의 튜플이 변경되었음을 알린다.

mysql> UPDATE course -> SET prof='P2' -> WHERE sno=400; Query OK, 4 rows affected (0.07 sec) Rows matched: 4 Changed: 4 Warnings: 0


갱신이상

4개의 튜플이 변경된다.
mysql> select * from course;
+-----+------+----------+------+-------+
| sno | prof | dept     | cno  | grade |
+-----+------+----------+------+-------+
| 100 | P1   | Computer | C413 | A     |
| 100 | P1   | Computer | E412 | A     |
| 300 | P3   | Computer | C312 | A     |
| 300 | P3   | Computer | C324 | C     |
| 300 | P3   | Computer | C413 | A     |
| 400 | P2   | Computer | C312 | A     |
| 400 | P2   | Computer | C324 | A     |
| 400 | P2   | Computer | C413 | B     |
| 400 | P2   | Computer | E412 | C     |
| 500 | P4   | NULL     |      | NULL  |
+-----+------+----------+------+-------+
10 rows in set (0.00 sec)
중복된 튜플 중 일부 속성만 갱신하면 정보의 모순이 발생한다.
따라서, 해당 튜플들을 모두 갱신해야 한다.


반응형
Comments