Contents
(MariaDB)데이터베이스 명령어 실습 - DMS, DDL, DCL까지
   2022년07월18일     27분정도면 다 읽어요     - Comments

[카카오 클라우드 스쿨] DB의 다양한 조회, 활용을 돕는 SQL문

MariaDB (5) - 전부 다 배우지는 못하겠지만 데이터베이스의 다양한 명령어, 쿼리문을 배워 보자

  • DML: 데이터 조작 (SELECT, DELETE, UPDATE, INSERT)
  • DDL: 데이터베이스 개체 (pk view등 뷰, 인덱스 와 같은 개체)를 생성, 삭제, 수정 (CREATE, DROP, ALTER)
  • DCL: 사용자에게 권한 부여 (GRANT, REVOKE, DENY)
    • ex) GRANT ALL PRIVILEGES ON . TO ‘root’@localhost’


[본문] SQL문 실습을 통해 배워 보자

1 . 테이블 생성하기

  • userTbl 생성
-- 데이터베이스 및 테이블 생성
MariaDB [labDB]> create table userTbl
    -> (userid CHAR(8) PRIMARY KEY,
    -> name VARCHAR(10) NOT NULL,
    -> birthyear INT NOT NULL,
    -> addr CHAR(3) NOT NULL,
    -> mobile1 CHAR(3),
    -> mobile2 CHAR(8),
    -> height SMALLINT,
    -> mdate DATE );

MariaDB [labDB]> desc userTbl;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| userid    | char(8)     | NO   | PRI | NULL    |       |
| name      | varchar(10) | NO   |     | NULL    |       |
| birthyear | int(11)     | NO   |     | NULL    |       |
| addr      | char(3)     | NO   |     | NULL    |       |
| mobile1   | char(3)     | YES  |     | NULL    |       |
| mobile2   | char(8)     | YES  |     | NULL    |       |
| height    | smallint(6) | YES  |     | NULL    |       |
| mdate     | date        | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
8 rows in set (0.024 sec)


  • buyTbl 생성
    • 구매항목 ID는 가용자가 입력하지 않고 자동으로 부여되게끔 함
    • auto increment 를 지정 - PK 지정 필요
MariaDB [labDB]> create table buyTbl
    -> (num INT AUTO_INCREMENT PRIMARY KEY,
    -> userid CHAR(8) NOT NULL,
    -> prodname CHAR(8) NOT NULL,
    -> groupname CHAR(4),
    -> price INT NOT NULL,
    -> amount SMALLINT NOT NULL, /*SMALLINT: 메모리를 절약하기 위해 사용함*/
    -> FOREIGN KEY (userid) REFERENCES userTbl(userid)
    -> );

MariaDB [labDB]> desc buyTbl;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| num       | int(11)     | NO   | PRI | NULL    | auto_increment |
| userid    | char(8)     | NO   | MUL | NULL    |                |
| prodname  | char(8)     | NO   |     | NULL    |                |
| groupname | char(4)     | YES  |     | NULL    |                |
| price     | int(11)     | NO   |     | NULL    |                |
| amount    | smallint(6) | NO   |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
6 rows in set (0.003 sec)



2 . 데이터 삽입하기

  • userTbl 데이터 입력하기
MariaDB [labDB]> INSERT INTO userTbl VALUES ('user1', '홍길동', 1996, '서울', '010', '11111111', 180, CURDATE());
Query OK, 1 row affected (0.001 sec)

MariaDB [labDB]> INSERT INTO userTbl VALUES ('user2', '김철수', 1996, '부산', '010', '22222222', 180, CURDATE());
Query OK, 1 row affected (0.001 sec)

MariaDB [labDB]> INSERT INTO userTbl VALUES ('user3', '고영희', 1996, '제주', NULL, NULL, NULL, CURDATE());
Query OK, 1 row affected (0.001 sec)

MariaDB [labDB]> select * from userTbl;
+--------+-----------+-----------+--------+---------+----------+--------+------------+
| userid | name      | birthyear | addr   | mobile1 | mobile2  | height | mdate      |
+--------+-----------+-----------+--------+---------+----------+--------+------------+
| user1  | 홍길동    |      1996 | 서울   | 010     | 11111111 |    180 | 2022-07-18 |
| user2  | 김철수    |      1996 | 부산   | 010     | 22222222 |    180 | 2022-07-18 |
| user3  | 고영희    |      1996 | 제주   | NULL    | NULL     |   NULL | 2022-07-18 |
+--------+-----------+-----------+--------+---------+----------+--------+------------+
3 rows in set (0.001 sec)


  • buyTbl 데이터 입력하기
 MariaDB [labDB]> INSERT INTO buyTbl VALUES (NULL, 'user1', '청바지', '의류', 30, 1);
Query OK, 1 row affected (0.002 sec)

MariaDB [labDB]> INSERT INTO buyTbl VALUES (NULL, 'user2', '선풍기', '전자', 120, 1);
Query OK, 1 row affected (0.002 sec)

MariaDB [labDB]> INSERT INTO buyTbl VALUES (NULL, 'user3', '노트북', '전자', 900, 2);
Query OK, 1 row affected (0.001 sec)

MariaDB [labDB]> SELECT * FROM buyTbl;
+-----+--------+-----------+-----------+-------+--------+
| num | userid | prodname  | groupname | price | amount |
+-----+--------+-----------+-----------+-------+--------+
|   1 | user1  | 청바지    | 의류      |    30 |      1 |
|   2 | user2  | 선풍기    | 전자      |   120 |      1 |
|   3 | user3  | 노트북    | 전자      |   900 |      2 |
+-----+--------+-----------+-----------+-------+--------+
3 rows in set (0.000 sec)



3 . FK CASCADE 설정하기

  • 자동으로 생성된 FK의 키 이름 확인하기
    • information_schema 테이블 하단의, table_constraints에 저장되어 있음
    • 따라서 다음으로 확인 가능
    • FK의 키 이름은 buyTbl_ibfk_1 이다
MariaDB [labDB]> select * from information_schema.table_constraints where table_name='buyTbl';
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
| def                | sqlDB             | PRIMARY         | sqlDB        | buyTbl     | PRIMARY KEY     |
| def                | sqlDB             | buyTbl_ibfk_1   | sqlDB        | buyTbl     | FOREIGN KEY     |
| def                | labDB             | PRIMARY         | labDB        | buyTbl     | PRIMARY KEY     |
| def                | labDB             | buyTbl_ibfk_1   | labDB        | buyTbl     | FOREIGN KEY     |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
4 rows in set (0.004 sec)


  • 이제 FK에 대한 CASCADE 설정하기
    • CASCADE: FK의 원본이 변경 시, FK도 변경될 수 있도록 설정하기
  • ON UPDATE CASCADE;
  • ON DELETE CASCADE;

새로운 FK의 이름은 FK_testdb로 지정하자

-- FK 제거
MariaDB [labDB]> ALTER TABLE buyTbl
    -> DROP FOREIGN KEY buyTbl_ibfk_1;
Query OK, 0 rows affected (0.019 sec)
Records: 0  Duplicates: 0  Warnings: 0

-- CASCADE가 적용된 FK 새로 설정
MariaDB [labDB]> ALTER TABLE buyTbl
    -> ADD CONSTRAINT FK_testdb
    -> FOREIGN KEY (userid)
    -> REFERENCES userTbl (userid)
    -> ON UPDATE CASCADE
    -> ON DELETE CASCADE;
Query OK, 3 rows affected (0.016 sec)
Records: 3  Duplicates: 0  Warnings: 0



4 . AUTO_INCREMENT

  • 행이 추가될수록 값을 자동으로 증가해 준다
    • ALTER TABLE testTbl AUTO_INCREMENT=100;



5 . UPDATE

MariaDB [labDB]> UPDATE userTbl SET addr = '대구' WHERE userid='user1';
Query OK, 1 row affected (0.002 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [labDB]> UPDATE buyTbl SET price=price*2 WHERE groupname='전자';
Query OK, 2 rows affected (0.001 sec)
Rows matched: 2  Changed: 2  Warnings: 0

MariaDB [labDB]> UPDATE userTbl SET userid='user02' WHERE userid='user2';
Query OK, 1 row affected (0.002 sec)
Rows matched: 1  Changed: 1  Warnings: 0
  • userid의 경우 CASCADE가 적용되어 있기 때문에 buyTbl에도 적용이 된다
MariaDB [labDB]> select * from userTbl;
+--------+-----------+-----------+--------+---------+----------+--------+------------+
| userid | name      | birthyear | addr   | mobile1 | mobile2  | height | mdate      |
+--------+-----------+-----------+--------+---------+----------+--------+------------+
| user02 | 김철수    |      1996 | 부산   | 010     | 22222222 |    180 | 2022-07-18 |
| user1  | 홍길동    |      1996 | 대구   | 010     | 11111111 |    180 | 2022-07-18 |
| user3  | 고영희    |      1996 | 제주   | NULL    | NULL     |   NULL | 2022-07-18 |
+--------+-----------+-----------+--------+---------+----------+--------+------------+
3 rows in set (0.000 sec)

MariaDB [labDB]> select * from buyTbl;
+-----+--------+-----------+-----------+-------+--------+
| num | userid | prodname  | groupname | price | amount |
+-----+--------+-----------+-----------+-------+--------+
|   1 | user1  | 청바지    | 의류      |    30 |      1 |
|   2 | user02 | 선풍기    | 전자      |   240 |      1 |
|   3 | user3  | 노트북    | 전자      |  1800 |      2 |
+-----+--------+-----------+-----------+-------+--------+
3 rows in set (0.000 sec)



6 . DELETE

MariaDB [labDB]> DELETE FROM buyTbl WHERE num=2;
Query OK, 1 row affected (0.002 sec)

MariaDB [labDB]> select * from buyTbl;
+-----+--------+-----------+-----------+-------+--------+
| num | userid | prodname  | groupname | price | amount |
+-----+--------+-----------+-----------+-------+--------+
|   1 | user1  | 청바지    | 의류      |    30 |      1 |
|   3 | user3  | 노트북    | 전자      |  1800 |      2 |
+-----+--------+-----------+-----------+-------+--------+
2 rows in set (0.000 sec)



7 . JOIN

  • (복습) JOIN의 종류
    • INNER JOIN: 두 테이블에 모두 있는 정보만 결합하여 출력
    • OUTER JOIN: 두 테이블에 있는 데이터 + 한쪽에만 있는 데이터
    • SELF JOIN: 자체 조인은 테이블을 자체에 연결한다


7-1 . INNER JOIN

  • SELECT [보고 싶은 열 이름] FROM [첫번째 테이블(왼쪽에 옴)] INNER JOIN [두 번째 테이블] ON [조인될 조건] WHERE[조건절]
MariaDB [sqlDB]> SELECT * FROM buyTbl
    -> INNER JOIN userTbl
    -> ON buyTbl.userID=userTbl.userID
    -> WHERE buyTbl.userID = 'KBS';
+-----+--------+-----------+-----------+-------+--------+--------+-----------+-----------+--------+---------+----------+--------+------------+
| num | userID | prodName  | groupName | price | amount | userID | name      | birthYear | addr   | mobile1 | mobile2  | height | mDate      |
+-----+--------+-----------+-----------+-------+--------+--------+-----------+-----------+--------+---------+----------+--------+------------+
|   1 | KBS    | 운동화    | NULL      |    30 |      2 | KBS    | 김범수    |      1979 | 경남   | 011     | 22222222 |    173 | 2012-04-04 |
|   2 | KBS    | 노트북    | 전자      |  1000 |      1 | KBS    | 김범수    |      1979 | 경남   | 011     | 22222222 |    173 | 2012-04-04 |
|   5 | KBS    | 청바지    | 의류      |    50 |      3 | KBS    | 김범수    |      1979 | 경남   | 011     | 22222222 |    173 | 2012-04-04 |
+-----+--------+-----------+-----------+-------+--------+--------+-----------+-----------+--------+---------+----------+--------+------------+
3 rows in set (0.001 sec)


  • join에 CONCAT 사용 가능
MariaDB [sqlDB]> SELECT U.userID, name, addr, CONCAT(mobile1, mobile2), prodname, amount
    -> FROM buyTbl B
    -> INNER JOIN userTbl U
    -> on B.userID=U.userID;
+--------+-----------+--------+--------------------------+-----------+--------+
| userID | name      | addr   | CONCAT(mobile1, mobile2) | prodname  | amount |
+--------+-----------+--------+--------------------------+-----------+--------+
| KBS    | 김범수    | 경남   | 01122222222              | 운동화    |      2 |
| KBS    | 김범수    | 경남   | 01122222222              | 노트북    |      1 |
| JYP    | 조용필    | 경기   | 01144444444              | 모니터    |      1 |
| BBK    | 바비킴    | 서울   | 01000000000              | 모니터    |      5 |
| KBS    | 김범수    | 경남   | 01122222222              | 청바지    |      3 |
| BBK    | 바비킴    | 서울   | 01000000000              | 메모리    |     10 |
| SSK    | 성시경    | 서울   | NULL                     |         |      5 |
| EJW    | 은지원    | 경북   | 01188888888              |         |      2 |
| EJW    | 은지원    | 경북   | 01188888888              | 청바지    |      1 |
| BBK    | 바비킴    | 서울   | 01000000000              | 운동화    |      2 |
| EJW    | 은지원    | 경북   | 01188888888              |         |      1 |
| BBK    | 바비킴    | 서울   | 01000000000              | 운동화    |      2 |
+--------+-----------+--------+--------------------------+-----------+--------+
12 rows in set (0.001 sec)


  • 결과에 중복 제거 DISTINCT
MariaDB [sqlDB]> SELECT DISTINCT B.userID, addr, CONCAT(mobile1, mobile2)
    -> FROM buyTbl B
    -> INNER JOIN userTbl U
    -> on B.userID=U.userID;
+--------+--------+--------------------------+
| userID | addr   | CONCAT(mobile1, mobile2) |
+--------+--------+--------------------------+
| BBK    | 서울   | 01000000000              |
| EJW    | 경북   | 01188888888              |
| JYP    | 경기   | 01144444444              |
| KBS    | 경남   | 01122222222              |
| SSK    | 서울   | NULL                     |
+--------+--------+--------------------------+
5 rows in set (0.001 sec)


  • 퀴즈 (VIEW)
    • 두 테이블을을 inner join하여 구매자의 이름, 주소, 휴대폰번호, 제품명, 수량 만을 포함하는 View(v_tracking)를 생성하라
    • 또한, 이 테이블에 접속할 수 있는 알바생의 계정인 alba1을 생성하고, alba1은 해당 뷰에서 select만 가능하다
    • 완성 후 alba1으로 로그인하여 해당 테이블을 조회해 본다
MariaDB [sqlDB]> CREATE VIEW v_tracking
    -> AS
    -> SELECT name, addr, CONCAT(mobile1, mobile2), prodname, amount
    -> FROM buyTbl B INNER JOIN userTbl U
    -> on B.userID=U.userID;
Query OK, 0 rows affected (0.003 sec)

MariaDB [sqlDB]> CREATE USER alba1 IDENTIFIED BY '1234';
Query OK, 0 rows affected (0.001 sec)

-- 권한 부여
MariaDB [sqlDB]> GRANT SELECT ON sqlDB.v_tracking TO 'alba1'@'localhost' IDENTIFIED BY 'alba1';
MariaDB [sqlDB]> GRANT SELECT ON sqlDB.v_tracking TO 'alba1'@'%' IDENTIFIED BY 'alba1';
MariaDB [sqlDB]> FLUSH PRIVILEGES;
  • 권한 부여?
    • – grant create session, create table, create sequence, create view to [계정 이름];
    • – GRANT 행동 ON 테이블명 TO 사용자명;


7-2 . OUTER JOIN

  • SELECT [보고 싶은 열] FROM [첫 번째 테이블] [LEFT/RIGHT/FULL] OUTER JOIN [두 번째 테이블]
  • LEFT: 오른쪽에 데이터가 없어도 왼쪽 테이블의 모든 것을 출력함
  • RIGHT: 왼쪽에 데이터가 없어도 오른 테이블의 모든 것을 출력함
  • FULL: 데이터가 둘다 없어도 (양쪽 모두에 일치하지 않아도) 전부 출력함
MariaDB [sqlDB]> SELECT U.userID, NAME, prodname, addr
    -> FROM userTbl U
    -> LEFT OUTER JOIN buyTbl B
    -> ON U.userID = B.userID
    -> ORDER BY U.userID;
+--------+-----------+-----------+--------+
| userID | NAME      | prodname  | addr   |
+--------+-----------+-----------+--------+
| BBK    | 바비킴    | 모니터    | 서울   |
| BBK    | 바비킴    | 메모리    | 서울   |
| BBK    | 바비킴    | 운동화    | 서울   |
| BBK    | 바비킴    | 운동화    | 서울   |
| EJW    | 은지원    |         | 경북   |
| EJW    | 은지원    | 청바지    | 경북   |
| EJW    | 은지원    |         | 경북   |
| JKW    | 조관우    | NULL      | 경기   |
| JYP    | 조용필    | 모니터    | 경기   |
| KBS    | 김범수    | 운동화    | 경남   |
| KBS    | 김범수    | 노트북    | 경남   |
| KBS    | 김범수    | 청바지    | 경남   |
| KKH    | 김경호    | NULL      | 전남   |
| LJB    | 임재범    | NULL      | 서울   |
| LSG    | 이승기    | NULL      | 서울   |
| SSK    | 성시경    |         | 서울   |
| user1  | gildong   | NULL      | NY     |
| YJS    | 윤종신    | NULL      | 경남   |
+--------+-----------+-----------+--------+
18 rows in set (0.001 sec)


MariaDB [sqlDB]> SELECT U.userID, NAME, prodname, addr
    -> FROM userTbl U
    -> LEFT OUTER JOIN buyTbl B
    -> ON U.userID = B.userID
    -> WHERE prodname IS NULL
    -> ORDER BY U.userID;
+--------+-----------+----------+--------+
| userID | NAME      | prodname | addr   |
+--------+-----------+----------+--------+
| JKW    | 조관우    | NULL     | 경기   |
| KKH    | 김경호    | NULL     | 전남   |
| LJB    | 임재범    | NULL     | 서울   |
| LSG    | 이승기    | NULL     | 서울   |
| user1  | gildong   | NULL     | NY     |
| YJS    | 윤종신    | NULL     | 경남   |
+--------+-----------+----------+--------+
6 rows in set (0.001 sec)


7-3 . CROSS JOIN

  • 한쪽 테이블의 모든 행들과 다른 쪽 테이블의 모든 행을 조인시키는 기능
    • 10행 * 12행 = 총 120행이 됨


7-4 . SELF JOIN

  • 자기 자신과 자신을 조인한다
    • 다음과 같은 조직도 등에서 사용할 수 있다
+-----------+-----------+----------+
| emp       | manager   | empTel   |
+-----------+-----------+----------+
| 나사장    | NULL     | 0000     |
| 김재무    | 나사장    | 2222     |
| 이부장    | 김재무    | 2222-2   |
| 우대리    | 이부장    | 2222-2-1 |
| 지사원    | 이부장    | 2222-2-2 |
+-----------+-----------+----------+



8 . UNION

  • 두 쿼리의 결과를 행으로 합친다
    • SELECT [문장] [UNION, UNION ALL, NOT IN, IN] SELECT [문장2]



9 . STORED PROCEDURE

  • 반복문은 물론 IF문도 사용 가능하다
  • 분기, 흐름 제어 등 프로그래밍 언어에서 사용하는 논리를 사용 가능함
  • 기본적인 형태는 다음과 같다
DELIMETER //
    CREATE PROCEDURE [스토어드 프로시져 이름]
    BEGIN
        [SQL 프로시져 코딩]
        (변수 선언, SQL )
    END //
DELIMETER;
CALL [스토어드 프로시져 이름]
  • 실습 ```sql DROP PROCEDURE IF EXISTS ifproc;

DELIMITER // CREATE PROCEDURE ifproc() BEGIN DECLARE var1 INT; SET var1 = 100;

    IF var1%2 = 0 THEN
        SELECT '값은 짝수이다';
    ELSE
        SELECT '값은 홀수이다';
    END IF;
END//

DELIMITER ; CALL ifproc(); +———————+ | 값은 짝수이다 | +———————+ | 값은 짝수이다 | +———————+ 1 row in set (0.001 sec)

Query OK, 0 rows affected (0.001 sec)


<br>
<hr>

**10 . 날짜 관련 함수**

* ADDDATE 사용

```sql
MariaDB [(none)]> SELECT ADDDATE('2022-01-01', INTERVAL 31 DAY), ADDDATE('2022-01-01', INTERVAL 1 MONTH);
+----------------------------------------+-----------------------------------------+
| ADDDATE('2022-01-01', INTERVAL 31 DAY) | ADDDATE('2022-01-01', INTERVAL 1 MONTH) |
+----------------------------------------+-----------------------------------------+
| 2022-02-01                             | 2022-02-01                              |
+----------------------------------------+-----------------------------------------+
1 row in set (0.001 sec)
  • 날짜 차이 계산 가능

MariaDB [(none)]> SELECT DATEDIFF('2002-12-31', '2021-01-01');
+--------------------------------------+
| DATEDIFF('2002-12-31', '2021-01-01') |
+--------------------------------------+
|                                -6576 |
+--------------------------------------+
1 row in set (0.001 sec)

select datediff(curdate(), '2021-01-01');
+-----------------------------------+
| datediff(curdate(), '2021-01-01') |
+-----------------------------------+
|                               563 |
+-----------------------------------+
  • 년으로 계산 가능
    • 일수를 365로 나누어 5가 넘는다 = 입사한지 5년이 넘었다
select datediff(curdate(), '2021-01-01')/365;
+---------------------------------------+
| datediff(curdate(), '2021-01-01')/365 |
+---------------------------------------+
|                                1.5425 |
+---------------------------------------+


  • QUIZ
    • 실습했던 userTbl에서 각 사용자들의 생년을 확인하여 올해에 짝수라면 생년이 짝수인 사람들의 정보출력시 마지막 열에 ‘올해’
    • 만약 생년이 홀수라면 ‘내년’이 출력되도록 해 보시오
      • 이름 주소 생년 건강검진대상
      • 홍길동 서울 1998 올해
      • 김미나 울산 1992 내년
DROP PROCEDURE IF EXISTS ifproc;
DELIMITER //
CREATE PROCEDURE ifproc()
BEGIN
  DECLARE thisyear INT;
  SET thisyear = YEAR(CURDATE())%2;
  SELECT ROW_NUMBER() OVER(ORDER BY birthYear) "연번", NAME, addr, birthYear,
  	CASE
  		WHEN (birthYear%2) = thisyear THEN "올해"
  		ELSE "내년"
  	END AS "건강검진"
FROM userTbl;
END //

DELIMITER ;
CALL ifproc();
+--------+-----------+--------+-----------+--------------+
| 연번   | NAME      | addr   | birthYear | 건강검진     |
+--------+-----------+--------+-----------+--------------+
|      1 | 조용필    | 경기   |      1950 | 올해         |
|      2 | 임재범    | 서울   |      1963 | 내년         |
|      3 | 조관우    | 경기   |      1965 | 내년         |
|      4 | 윤종신    | 경남   |      1969 | 내년         |
|      5 | 김경호    | 전남   |      1971 | 내년         |
|      6 | 은지원    | 경북   |      1972 | 올해         |
|      7 | 바비킴    | 서울   |      1973 | 내년         |
|      8 | 김범수    | 경남   |      1979 | 내년         |
|      9 | 성시경    | 서울   |      1979 | 내년         |
|     10 | 이승기    | 서울   |      1987 | 내년         |
|     11 | gildong   | NY     |      1996 | 올해         |
+--------+-----------+--------+-----------+--------------+



11 . OVER

  • 합계나 평균등의 집계함수의 결과를 group by 없이 출력하고 싶을때 사용할 수 있다.
  • 바로 위의 퀴즈에서 사용하였으니 참고바람



12 . 테이블 삭제

  • DROP TABLE [테이블 명];



13 . 테이블 수정

  • ALTER TABLE [테이블명] ..
  • 엄청 많지만 그중 몇 가지만 추리면


  • addr 열 바로 다음에 열 추가
MariaDB [sqlDB]> ALTER TABLE userTbl
    -> ADD sns VARCHAR(30) AFTER addr;
  • 열 통째로 제거
MariaDB [sqlDB]> ALTER TABLE userTbl DROP COLUMN sns;
  • 열 이름, 데이터 타입 변경
MariaDB [sqlDB]> ALTER TABLE userTbl
    -> CHANGE COLUMN name uname VARCHAR(20) NOT NULL;


  • QUIZ
    • 사용자 테이블에 추가로 point 열을 추가하고, 3~4명에 대하여 점수를 입력해 주세요
      • id     uname   … point
      • user1 김철수 … 80
      • user2 박명수 … 90
    • 또한 사용자의 ID 와 mobile2를 변수에 담고, 여기에 매치하는 학생의 점수를 출력하되, 아래와 같이 출력되도록 해 보세요
    • 만약 해당 사용자가 없다면, ‘사용자 없음’을 출력하시오
      • 이름 점수 합격여부
      • 박명수 90 합격
MariaDB [sqlDB]> ALTER TABLE userTbl ADD score INT;
MariaDB [sqlDB]> UPDATE userTbl SET score = 80 WHERE userID = 'BBK';
MariaDB [sqlDB]> UPDATE userTbl SET score = 90 WHERE userID = 'EJW';
MariaDB [sqlDB]> UPDATE userTbl SET score = 45 WHERE userID = 'JKW';

-- 내가 시도하려던 것 (잘 안됨)
DROP PROCEDURE IF EXISTS ifproc;
DELIMITER //
CREATE PROCEDURE ifproc()
BEGIN
  DECLARE userid VARCHAR(5);
  DECLARE mobile VARCHAR(10);
  SET userid = 'BBK';
  SET mobile = '00000000';

  SELECT userID, mobile2,
  IF score>70 THEN "pass"
  ELSE "nope"
  END IF AS "result"
FROM userTbl
WHERE userID = userid;
END //

DELIMITER ;
CALL ifproc();


--샘플 답안
drop procedure if exists point;
delimiter //
create procedure point()
begin
DECLARE id CHAR(8);
DECLARE phone CHAR(8);
DECLARE result INT;
DECLARE pass CHAR(10);

SET id='JKW';
SET phone = '99999999';

SELECT point INTO result FROM userTbl WHERE userID=id AND mobile2=phone;

if result >= 60 THEN
  SET pass = 'PASSWD';
ELSEIF result >= 0 THEN
  SET pass = 'FAILED';
ELSE -- 잘못된 입력 들어올 경우
  SET pass = 'NO RESULT';
end if;

  select concat('USER : ' , id), CONCAT('POINT : ', result), CONCAT('RESULT : ', pass);
end //
DELIMITER ;
CALL point();



14 . WHILE문

  • WHILE [부울 식] DO [SQL 명령문들] END WHILE;
  • 인스턴스를 만들어라
(인스턴스를 만드는 작업과 동시에 SQL문 수행)

WHILE TRUE
do
  인스턴스가 만들어져 있는가?
  아니다
    .출력
  만들어져 있다
    break;
  sleep 3;
done

=> ....OK!
  • Quiz. 1~100 사이의 숫자 중 5배수의 총 합은?
DROP PROCEDURE IF EXISTS ifproc;
DELIMITER //
CREATE PROCEDURE ifproc()
BEGIN
	DECLARE numm INT;
	DECLARE summ INT;
	SET numm = 1;
	SET summ = 0;

	WHILE (numm < 101) DO
		IF (numm % 5 = 0) THEN
		SET summ = summ + numm;
	END IF;
	SET numm = numm + 1;
	END WHILE;

SELECT summ;
END //

DELIMITER ;
CALL ifproc();

--결과는
1050




[DB 마무리] 엔지니어가 반드시 기억해야 할 DB 지식

  1. 데이터베이스 생성하기
  2. 테이블 생성하기
  3. INSERT 해서 데이터 입력하기
  4. SELECT 해서 조건절과 함께 원하는 데이터 출력하기
  5. PK, FK 지정하기
  6. INNER JOIN 수행하기
  7. VIEW 를 간단히 생성하기
  8. TRIGGER 간단히 생성하기

  9. DATA REPLICATION
    • img_29

  10. GALERA 클러스터링
    • 여러 대의 데이터베이스를 클러스터로 묶어 한 대의 DB 서버처럼 동작시키는 기술

  11. 프로메테우스+GRAFANA
    • 모니터링


  • Dashboard (웹 콘솔) 을 통해 웹서버 인스턴스, DB 등의 정보를 관리해야 함
    • 이러한 웹 콘솔은 DB로 만들어 둔다
    • 인스턴스 삭제 시 DB에서도 삭제되게끔 하는 작업을 만들어야 할 것임!