문미새 개발일지

DBMS시작 본문

공부 키워드/데이터베이스

DBMS시작

문미새 2022. 8. 2. 11:55
728x90

데이터베이스를 하기 위한 프로그램의 종류는 다양한데 대표적인 프로그램으론 Oracle, SQL Server, MySQL 8+, 등이 있습니다

데이터베이스 프로그램의 종류로 저는 MySQL 8+을 선택했습니다

 

데이터베이스(Database)란?

여러사람이 같이 공유하여 사용할 목적으로, 통합하여 관리되는 저장된 형태의 데이터의 집합입니다

자료 항목의 중복을 없애고 자료를 구조화해 저장함으로써 자료 검색과 갱신 등 운영의 효율을 높인 데이터의 집합

 

일상에서 사용하는 모든 정보들이 데이터베이스를 통해 열람되고 사용하고 삭제하게 됩니다

ex) 채팅목록, 게시판글 작성, 은행거래 등..

 

DBMS(database Management System)

사용자 와 데이터베이스(DB) 사이에서 사용자의 요구(query)에 따라 정보를 생성해주고 데이터베이스를 관리해주는 소프트웨어 집합입니다

사용자의 요구를 입력받아 데이터를 생성하여 보여주는거죠

 

데이터베이스에는 table에 정보가 저장이 되며 하나의 데이터베이스에는 여러 table 들로 구성되어있습니다

(database 설계라고 하면 보통 데이터베이스 안에 들어가는 table과 그 관계를 설계하는 것을 말합니다) 

 

테이블은 열과 행으로 구성되어 있고 

- 열은 column, attribute(속성)

- 행은 row, tuple

이라고 불리며, 테이블의 구조를 스키마(schema)라고 부릅니다

 

키(key)

테이블에서 특정 레코드를 검색하거나 정렬할 수 있는 기준이 되는 필드를 말합니다

(데이터베이스에선 레코드를 구분하기 위해 특별히 선정한 키를 primary key(기본키) 라고 합니다)

 

< SQL >

Structured Query Language의 약자이고 구조화된 질의 언어이며, 관계형 데이터베이스 시스템(RDBMS)에서 데이터를 다루기 위한 목적으로 설계된 프로그래밍 언어입니다.SQL 문법으로 짠 query문으로  DBMS에 실행하면 그에 따른 결과를 보내줍니다

 

< SQL 명령어 >

DML(Data Manipulation Language) INSERT(레코드 입력), UPDATE(변경), DELETE(삭제), MERGE(합병), SELECT(선택)
DDL(Data Definition Language) CREATE(생성), ALTER(수정), DROP(삭제), TRUNCATE(잘라내기)
DCL(Data Control Language) GRANT(권한 주기), REVOKE(권한 뺏기), COMMIT(확정), ROLLBACK(취소)

 

이제 직접 SQL을 해봅시다

 

cmd 관리자권한으로 실행하여 시작

 

mysql -u '사용자명' -p

: sql에 로그인할 때 사용하며 기본적으론 설치할때 작성한 root 사용자명으로 시작한다

작성하고 엔터치면 비밀번호 입력이 뜨는데 이것도 설치할때 세팅하는 비밀번호로 입력하면된다

ex)

C:\WINDOWS\system32>mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.30 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

SELECT user();

: 현재 내가 접속한 사용자명이 뭔지 보이는 테이블을 작성해준다

ex)

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+

 

SELECT user, host FROM mysql.user;

:sql에 있는 host 권한을 가진 user 목록을 선택해 보여줍니다 ex)

mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

 

show databases;

: 현재 데이터베이스가 뭐가 있는지 보여줍니다

ex)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+

 

CREATE DATABASE mydb609;

: mydb609라는 데이터베이스를 생성합니다

(여기서 다시  show databases;를 실행하면 데이터베이스 목록 mydb609라는 데이터베이스가 추가됨을 볼 수 있습니다)

 

DROP DATABASE mydb609(데이터베이스명);

: mydb609라는 데이터베이스를 삭제합니다

 

CREATE USER 'myuser609(데이터베이스명)' IDENTIFIED BY '1234';

: 비밀번호가 1234인 myuser609라는 유저를 생성합니다

 

SELECT user, host FROM mysql.user;

: host 권한을 가진 sql user를 선택해 보여줍니다

ex)

mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| myuser609        | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

(%는 정확힌 모르겠지만 아직 권한이 부여되지 않은 뜻 같습니다)

 

grant all privileges on 데이터베이스명.테이블명 to '사용자명'@'%';

: 사용자에게 데이터베이스의 테이블 권한을 부여하는 명령어

(중간에 (데이터베이스명).(테이블명). 이름대신에  * 표시는 전체를 의미합니다)

 

flush privileges;

: id나 패스워드 등이 추가 혹은 삭제되었을 때 새로운 설정을 적용합니다

 

quit;

: sql 벗어나기

 

status;

: 현재 로그인한 sql계정의 상태를 보여줍니다

ex)

mysql> status;
--------------
mysql  Ver 8.0.30 for Win64 on x86_64 (MySQL Community Server - GPL)

Connection id:          19
Current database:
Current user:           myuser609@localhost
SSL:                    Cipher in use is TLS_AES_256_GCM_SHA384
Using delimiter:        ;
Server version:         8.0.30 MySQL Community Server - GPL
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    euckr
Conn.  characterset:    euckr
TCP port:               3306
Binary data as:         Hexadecimal
Uptime:                 4 hours 8 min 7 sec

Threads: 2  Questions: 6550  Slow queries: 0  Opens: 308  Flush tables: 3  Open tables: 216  Queries per second avg: 0.439
--------------

 

use '데이터베이스명';

: 지정된 데이터베이스로 변경합니다

ex)

mysql> use mydb609;
Database changed

 

create table items(테이블명) (
    ->     id int,
    ->     content varchar(200)
    -> );

: int 타입이고 최대 200자까지의 items라는 테이블을 생성합니다

 

< 데이터 타입 종류 >

데이터타입 의미
VARCHAR 가변길이의 문자열을 저장할 때 사용하며, 문자열의 최대길이를 지정합니다
NUMBER 소숫점 저장이 가능한 숫자에 사용되는 데이터 타입
DATE 날짜에 사용되는 데이터 타입
CHAR 특정 문자열 갯수를 지정할 때 사용합니다( ex) char(10) : 10자리 문자열)

 

show tables;

: 현재 데이터베이스의 테이블목록을 보여줍니다ex)

mysql> show tables;
+-------------------+
| Tables_in_mydb609 |
+-------------------+
| items             |
+-------------------+

 

desc items(테이블명);

: items라는 테이블의 구조를 확인합니다

 

DROP TABLE items(테이블명);

: items라는 테이블을 삭제합니다(한번 삭제된 테이블은 복구가 안된다)

 

test)

mysql> CREATE TABLE phonebook(
    ->     id INT PRIMARY KEY AUTO_INCREMENT,
    ->     name VARCHAR(80) NOT NULL,
    ->     phonenum VARCHAR(20) DEFAULT '010-0000-000',
    ->     email VARCHAR(100),
    ->     regDate DATETIME DEFAULT now()
    -> );
Query OK, 0 rows affected (0.01 sec)


mysql> desc phonebook;
+----------+--------------+------+-----+-------------------+-------------------+
| Field    | Type         | Null | Key | Default           | Extra             |
+----------+--------------+------+-----+-------------------+-------------------+
| id       | int          | NO   | PRI | NULL              | auto_increment    |
| name     | varchar(80)  | NO   |     | NULL              |                   |
| phonenum | varchar(20)  | YES  |     | 010-0000-000      |                   |
| email    | varchar(100) | YES  |     | NULL              |                   |
| regDate  | datetime     | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+----------+--------------+------+-----+-------------------+-------------------+

 

ALTER TABLE phonebook(테이블명)

  MODIFY COLUMN name varchar(50);

: name 열의 최대 길이를 50으로 수정한다

ex)

mysql> ALTER TABLE phonebook
    -> MODIFY COLUMN name varchar(50);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc phonebook;
+----------+--------------+------+-----+-------------------+-------------------+
| Field    | Type         | Null | Key | Default           | Extra             |
+----------+--------------+------+-----+-------------------+-------------------+
| id       | int          | NO   | PRI | NULL              | auto_increment    |
| name     | varchar(50)  | YES  |     | NULL              |                   |
| phonenum | varchar(20)  | YES  |     | 010-0000-000      |                   |
| email    | varchar(100) | YES  |     | NULL              |                   |
| regDate  | datetime     | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+----------+--------------+------+-----+-------------------+-------------------+

 

위 테스트 테이블의 name 길이값이 달라진것을 알 수있습니다

 

그리고 테이블을 삭제했을시 또 삭제하려하면 오류가 발생하는데

 

DROP TABLE IF EXISTS phonebook(테이블명)

: phonebook이라는 테이블이 만약 존재하면 삭제해라 라는 뜻입니다

이렇게 작성할 경우는 없으면 삭제를 안하기때문에 오류가 안납니다

 

DML의 INSERT, UPDATE, DELETE 의 결과는 정수로  나온다

ex) '몇' 개의 데이터를 생성했다

반면에 SELECT의 결과는 테이블 형태로 나온다

 

SELECT * FROM phonebook;

: phonebook이라는 테이블의 데이터를 조회합니다

ex)

mysql> SELECT * FROM phonebook;
Empty set (0.00 sec)

데이터를 입력하지 않아 비어있다고 뜨네요

 

INSERT INTO phonebook VALUES(4, 'jake', '010-1234-5678',
'test@test.com', '2022-10-06 21:06:21');

: phonebook 테이블에 VALUE값들을 집어넣는다

(상단의 phonebook 테이블에 5개의 공간이 있는데 순서대로 거기에 하나씩 집어넣는 겁니다)

 

이후에 다시 테이블을 열어보면 데이터가 들어있습니다

ex)

mysql> INSERT INTO phonebook VALUES(4, 'jake', '010-1234-5678',
    -> 'test@test.com', '2022-10-06 21:06:21');
Query OK, 1 row affected (0.00 sec)


mysql> SELECT * FROM phonebook;
+----+------+---------------+---------------+---------------------+
| id | name | phonenum      | email         | regDate             |
+----+------+---------------+---------------+---------------------+
|  4 | jake | 010-1234-5678 | test@test.com | 2022-10-06 21:06:21 |
+----+------+---------------+---------------+---------------------+

 

INSERT INTO phonebook(id, name, phonenum)
VALUES(3, '문미새', '010-1111-2222');

: id, name, phonenum 칸에 순서대로 데이터를 집어넣는다

(부분적으로 데이터를 넣을수 있고 넣지 않은 부분은 NULL값으로 지정된다)

ex)

INSERT INTO phonebook(id, name, phonenum)
VALUES(3, '문미새', '010-1111-2222');
Query OK, 1 row affected (0.00 sec)


mysql> select * from phonebook;
+----+--------+---------------+---------------+---------------------+
| id | name   | phonenum      | email         | regDate             |
+----+--------+---------------+---------------+---------------------+
|  3 | 문미새 | 010-1111-2222 | NULL          | 2022-08-02 10:33:21 |
|  4 | jake   | 010-1234-5678 | test@test.com | 2022-10-06 21:06:21 |
+----+--------+---------------+---------------+---------------------+

 

UPDATE phonebook SET name = 'jesse' WHERE id = 4;

: phonebook테이블에서 id가 4인 컬럼의 name을 'jesse'로 변경합니다

ex)

mysql> UPDATE phonebook SET name = 'jesse' WHERE id = 4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from phonebook;
+----+--------+---------------+---------------+---------------------+
| id | name   | phonenum      | email         | regDate             |
+----+--------+---------------+---------------+---------------------+
|  3 | 문미새 | 010-1111-2222 | NULL          | 2022-08-02 10:33:21 |
|  4 | jesse  | 010-1234-5678 | test@test.com | 2022-10-06 21:06:21 |
+----+--------+---------------+---------------+---------------------+

 

DELETE FROM phonebook WHERE id = 3;

: phonebook테이블 안에서 id가 3인 컬럼을 삭제합니다

(삭제할 땐 WHERE(조건)을 넣지 않으면 테이블 전체 데이터가 삭제되버리니 주의하세요)

ex)

mysql> DELETE FROM phonebook WHERE id = 3;
Query OK, 1 row affected (0.00 sec)


mysql> select * from phonebook;
+----+--------+---------------+---------------+---------------------+
| id | name   | phonenum      | email         | regDate             |
+----+--------+---------------+---------------+---------------------+
|  4 | jesse  | 010-1234-5678 | test@test.com | 2022-10-06 21:06:21 |
+----+--------+---------------+---------------+---------------------+

 

728x90