트랜젝션/JOIN/테이블 생성, 데이터 저장/UNION/VIEW/변수/저장 프로시저 (교육 55일차)

SW·2023년 2월 8일
1














실습> 트랜젝션 4

터미널 2개가 필요하다.

/dev/pts/0: 첫 번째 터미널
/dev/pts/1: 두 번째 터미널

1. autocommit 확인
/dev/pts/0# grep autocommit /etc/my.cnf
autocommit=0

2. DBMS 접속
/dev/pts/0# mysql test
/dev/pts/1# mysql test

3. /dev/pts/0에서 실행
첫 번째 터미널 /dev/pts/0 에서 실행한다.
MariaDB [test]> SET autocommit=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> SELECT @@autocommit;

+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

MariaDB [test]> CREATE TABLE table4(id int);
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> DESC table4;

+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

MariaDB [test]> INSERT INTO table4 VALUES(1),(2),(3),(4);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0

MariaDB [test]> SELECT * FROM table4;

+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

4. /dev/pts/1 에서 실행
두 번째 터미널 /dev/pts/1 에서 실행한다.
MariaDB [test]> SELECT * FROM table4;

+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

5. /dev/pts/0 에서 실행
첫 번째 터미널 /dev/pts/0 에서 실행한다.

트랜젝션을 시작한다.
트랜젝션이 시작되면 아래와 같다.

                 +-- START TRANSACTION
                 |
----[1,2,3,4]----|
               start
MariaDB [test]> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

6. /dev/pts/0 에서 실행
첫 번째 터미널 /dev/pts/0 에서 실행한다.

1을 10으로 변경한다.
MariaDB [test]> SELECT * FROM table4;

+------+
| id   |
+------+
|    1 |  <-- 1 -> 10으로 변경할 예정임.
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

MariaDB [test]> UPDATE table4 SET id=10 WHERE id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [test]> SELECT * FROM table4;

+------+
| id   |
+------+
|   10 |  <-- 1 -> 10으로 변경이 되었다.
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

7. /dev/pts/1 에서 실행
두 번째 터미널 /dev/pts/1 에서 실행한다.

table4를 확인하면 첫 번째 터미널에서 COMMIT 이 실행되지 않았기 때문에 1로 보인다.
MariaDB [test]> SELECT * FROM table4;

+------+
| id   |
+------+
|    1 |  <-- 1 -> 100으로 변경할 예정임.
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

이미 첫 번째 터미널에서 수정했기 때문에 Lock이 걸린 것이다.
-시간이 지나면 에러메세지가 나온다.
MariaDB [test]> UPDATE table4 SET id=100 WHERE id=1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

8. /dev/pts/0 에서 실행
첫 번째 터미널 /dev/pts/0 에서 실행한다.
MariaDB [test]> COMMIT;
Query OK, 0 rows affected (0.00 sec)

9. /dev/pts/1 에서 실행
두 번째 터미널 /dev/pts/1 에서 실행한다.

일치하는 행(no=1) 이 없기 때문에 실행되는 행이 없어서 0 rows로 표시된다.
MariaDB [test]> UPDATE table4 SET id=100 WHERE id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0

MariaDB [test]> SELECT * FROM table4;

+------+
| id   |
+------+
|   10 |  <-- 1 -> 10으로 변경이 되었다.
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

실습> 트랜젝션 5

터미널 2개가 필요하다.

/dev/pts/0: 첫 번째 터미널
/dev/pts/1: 두 번째 터미널

1. autocommit 확인
/dev/pts/0# grep autocommit /etc/my.cnf
autocommit=0

2. DBMS 접속
/dev/pts/0# mysql test
/dev/pts/1# mysql test

3. /dev/pts/0에서 실행
첫 번째 터미널 /dev/pts/0 에서 실행한다.
MariaDB [test]> SET autocommit=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> SELECT @@autocommit;

+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

MariaDB [test]> CREATE TABLE table5(id int);
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> INSERT INTO table5 VALUES(1),(2),(3),(4);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0

MariaDB [test]> SELECT * FROM table5;

+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

4. /dev/pts/1에서 실행
두 번째 터미널 /dev/pts/1 에서 실행한다.

MariaDB [test]> SELECT * FROM table5;

+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

5. /dev/pts/0에서 실행
첫 번째 터미널 /dev/pts/0 에서 실행한다.
MariaDB [test]> START TRANSACTION;

MariaDB [test]> DELETE FROM table5;
Query OK, 4 rows affected (0.00 sec)

MariaDB [test]> SELECT * FROM table5;
Empty set (0.00 sec)

6. /dev/pts/1에서 실행
두 번째 터미널 /dev/pts/1 에서 실행한다.

table4를 확인하면 첫 번째 터미널에서 COMMIT 이 실행되지 않았기 때문에 전체 자료가 보인다.
MariaDB [test]> SELECT * FROM table5;

+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

7. /dev/pts/0에서 실행
첫 번째 터미널 /dev/pts/0 에서 실행한다.

!!! 주의: 트랜젝션이 시작되고 DML 명령어를 이용한 데이터가 변경되었다면 DDL을 실행하면 자동 커밋이 된다. !!!
MariaDB [test]> CREATE TABLE table6(id int);
Query OK, 0 rows affected (0.00 sec)

8. /dev/pts/1에서 실행
두 번째 터미널 /dev/pts/1 에서 실행한다.

첫 번째 터미널에서 DDL을 실행했기 때문에 auto commit이 되었다.

MariaDB [test]> SELECT * FROM table5;
Empty set (0.00 sec)

MariaDB [test]> SHOW CREATE TABLE table6\G

*************************** 1. row ***************************
       Table: table6
Create Table: CREATE TABLE `table6` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)






















##########
📌 조인 📌
##########

-- bns DB를 생성한다.
CREATE DATABASE bns;
USE bns

-- market 테이블을 생성한다.

CREATE TABLE market
(
    m_no       INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '일련번호',
    m_category VARCHAR(32)  NOT NULL COMMENT '장비분류',
    m_name     VARCHAR(52)  NOT NULL COMMENT '장비명',
    m_seller   VARCHAR(32)  NOT NULL COMMENT '판매자',
    PRIMARY KEY(`m_no`)  -- PRIMARY KEY(m_no)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '장비 시장';

-- sword 테이블을 생성한다.

CREATE TABLE sword
(
    s_name   VARCHAR(52)  NOT NULL PRIMARY KEY COMMENT '이름',
    s_level  INT UNSIGNED NOT NULL COMMENT '착용 레벨', 
    s_attack INT UNSIGNED NOT NULL COMMENT '공격력'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '검 테이블';

-- market 테이블에 데이터를 입력한다.

INSERT INTO market VALUES(NULL, '지팡이', '촉마지팡이', 'merry');
INSERT INTO market VALUES(NULL, '검', '곤륜검', 'evernick'); 
INSERT INTO market VALUES(NULL, '기공패', '곤륜기공패', 'jamienick');
INSERT INTO market VALUES(NULL, '검', '풍뢰검', 'ruina');

-- sword 테이블에 데이터를 입력한다.

INSERT INTO sword VALUES('곤륜검', 50, 540);
INSERT INTO sword VALUES('염화검', 36, 147);
INSERT INTO sword VALUES('요마검', 20, 64);
INSERT INTO sword VALUES('풍뢰검', 45, 263);

MariaDB [bns]> SHOW CREATE TABLE market\G

*************************** 1. row ***************************
       Table: market
Create Table: CREATE TABLE `market` (
  `m_no` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '일련번호',
  `m_category` varchar(32) NOT NULL COMMENT '장비분류',
  `m_name` varchar(52) NOT NULL COMMENT '장비명',
  `m_seller` varchar(32) NOT NULL COMMENT '판매자',
  PRIMARY KEY (`m_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='장비시장'
1 row in set (0.00 sec)

MariaDB [bns]> SHOW CREATE TABLE sword\G

*************************** 1. row ***************************
       Table: sword
Create Table: CREATE TABLE `sword` (
  `s_name` varchar(52) NOT NULL COMMENT '이름',
  `s_level` int(10) unsigned NOT NULL COMMENT '착용 레벨',
  `s_attack` int(10) unsigned NOT NULL COMMENT '공격력',
  PRIMARY KEY (`s_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='검 테이블'
1 row in set (0.00 sec)

MariaDB [bns]> DESC market;

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| m_no       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| m_category | varchar(32)      | NO   |     | NULL    |                |
| m_name     | varchar(52)      | NO   |     | NULL    |                |
| m_seller   | varchar(32)      | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [bns]> DESC sword;

+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| s_name   | varchar(52)      | NO   | PRI | NULL    |       |
| s_level  | int(10) unsigned | NO   |     | NULL    |       |
| s_attack | int(10) unsigned | NO   |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MariaDB [bns]> SELECT * FROM market;

+------+------------+-----------------+-----------+
| m_no | m_category | m_name          | m_seller  |
+------+------------+-----------------+-----------+
|    1 | 지팡이     | 촉마지팡이      | merry     |
|    2 | 검         | 곤륜검          | evernick  |
|    3 | 기공패     | 곤륜기공패      | jamienick |
|    4 | 검         | 풍뢰검          | ruina     |
+------+------------+-----------------+-----------+
4 rows in set (0.00 sec)

MariaDB [bns]> SELECT * FROM sword;

+-----------+---------+----------+
| s_name    | s_level | s_attack |
+-----------+---------+----------+
| 곤륜검    |      50 |      540 |
| 염화검    |      36 |      147 |
| 요마검    |      20 |       64 |
| 풍뢰검    |      45 |      263 |
+-----------+---------+----------+
4 rows in set (0.00 sec)

명시적 조인 표현 : 직접 JOIN 문구를 사용해서 조회 하는 것(JOIN 키워드를 사용한 경우)
SELECT m_category, m_name, m_seller, s_name, s_level, s_attack
FROM market INNER JOIN sword ON m_name = s_name;

암시적 조인 표현 : JOIN 문구를 사용하지 않고 JOIN과 같은 결과 나오도록 조회 하는 것(JOIN 키워드를 사용하지 않은 경우)
SELECT m_category, m_name, m_seller, s_name, s_level, s_attack
FROM market, sword WHERE m_name = s_name;

MariaDB [bns]> SELECT m_category, m_name, m_seller FROM market;

+------------+-----------------+-----------+
| m_category | m_name          | m_seller  |
+------------+-----------------+-----------+
| 지팡이     | 촉마지팡이      | merry     |
| 검         | 곤륜검          | evernick  |
| 기공패     | 곤륜기공패      | jamienick |
| 검         | 풍뢰검          | ruina     |
+------------+-----------------+-----------+
4 rows in set (0.00 sec)

MariaDB [bns]> SELECT s_name, s_level, s_attack FROM sword;

+-----------+---------+----------+
| s_name    | s_level | s_attack |
+-----------+---------+----------+
| 곤륜검    |      50 |      540 |
| 염화검    |      36 |      147 |
| 요마검    |      20 |       64 |
| 풍뢰검    |      45 |      263 |
+-----------+---------+----------+
4 rows in set (0.00 sec)

ON을 사용하지 않고 두 개의 테이블을 합친 경우
market 테이블 + sword 테이블 ( 4행 x 4행 = 16행 )
-ON을 사용하지 않으면 16행이 나온다.
-그러므로 반드시 ON을 사용해서 조건에 일치하는 행만 출력한다.
SELECT m_category, m_name, m_seller, s_name, s_level, s_attack FROM market INNER JOIN sword;

+------------+-----------------+-----------+-----------+---------+----------+
| m_category | m_name          | m_seller  | s_name    | s_level | s_attack |
+------------+-----------------+-----------+-----------+---------+----------+
| 지팡이     | 촉마지팡이      | merry     | 곤륜검    |      50 |      540 |
| 검         | 곤륜검          | evernick  | 곤륜검    |      50 |      540 |
| 기공패     | 곤륜기공패      | jamienick | 곤륜검    |      50 |      540 |
| 검         | 풍뢰검          | ruina     | 곤륜검    |      50 |      540 |
| 지팡이     | 촉마지팡이      | merry     | 염화검    |      36 |      147 |
| 검         | 곤륜검          | evernick  | 염화검    |      36 |      147 |
| 기공패     | 곤륜기공패      | jamienick | 염화검    |      36 |      147 |
| 검         | 풍뢰검          | ruina     | 염화검    |      36 |      147 |
| 지팡이     | 촉마지팡이      | merry     | 요마검    |      20 |       64 |
| 검         | 곤륜검          | evernick  | 요마검    |      20 |       64 |
| 기공패     | 곤륜기공패      | jamienick | 요마검    |      20 |       64 |
| 검         | 풍뢰검          | ruina     | 요마검    |      20 |       64 |
| 지팡이     | 촉마지팡이      | merry     | 풍뢰검    |      45 |      263 |
| 검         | 곤륜검          | evernick  | 풍뢰검    |      45 |      263 |
| 기공패     | 곤륜기공패      | jamienick | 풍뢰검    |      45 |      263 |
| 검         | 풍뢰검          | ruina     | 풍뢰검    |      45 |      263 |
+------------+-----------------+-----------+-----------+---------+----------+
16 rows in set (0.00 sec)

MariaDB [bns]>

ON을 사용하고 두 개의 테이블을 합친 경우
market 테이블 + sword 테이블
-ON을 사용해서 조건에 일치하는 행만 출력하므로 m_name과 s_name이 일치하는 2행이 나온다.

SELECT m_category, m_name, m_seller, s_name, s_level, s_attack FROM market INNER JOIN sword ON m_name = s_name;

+------------+-----------+----------+-----------+---------+----------+
| m_category | m_name    | m_seller | s_name    | s_level | s_attack |
+------------+-----------+----------+-----------+---------+----------+
| 검         | 곤륜검    | evernick | 곤륜검    |      50 |      540 |
| 검         | 풍뢰검    | ruina    | 풍뢰검    |      45 |      263 |
+------------+-----------+----------+-----------+---------+----------+
2 rows in set (0.00 sec)

ON을 사용하고 두 개의 테이블을 합친 경우
market 테이블 + sword 테이블

  • 전체 컬럼을 출력하는 경우
    SELECT m_no, m_category, m_name, m_seller, s_name, s_level, s_attack FROM market INNER JOIN sword ON m_name = s_name;
+------+------------+-----------+----------+-----------+---------+----------+
| m_no | m_category | m_name    | m_seller | s_name    | s_level | s_attack |
+------+------------+-----------+----------+-----------+---------+----------+
|    2 | 검         | 곤륜검    | evernick | 곤륜검    |      50 |      540 |
|    4 | 검         | 풍뢰검    | ruina    | 풍뢰검    |      45 |      263 |
+------+------------+-----------+----------+-----------+---------+----------+
2 rows in set (0.00 sec)

ON을 사용하고 두 개의 테이블을 합친 경우
market 테이블 + sword 테이블
-전체 컬럼을 출력하는 경우
-컬럼을 *로 쓸 수 있다.

SELECT FROM market INNER JOIN sword ON m_name = s_name;
MariaDB [bns]> SELECT
FROM market INNER JOIN sword ON m_name = s_name;

+------+------------+-----------+----------+-----------+---------+----------+
| m_no | m_category | m_name    | m_seller | s_name    | s_level | s_attack |
+------+------------+-----------+----------+-----------+---------+----------+
|    2 | 검         | 곤륜검    | evernick | 곤륜검    |      50 |      540 |
|    4 | 검         | 풍뢰검    | ruina    | 풍뢰검    |      45 |      263 |
+------+------------+-----------+----------+-----------+---------+----------+
2 rows in set (0.00 sec)

암시적 조인 표현 : JOIN 문구를 사용하지 않고 JOIN과 같은 결과 나오도록 조회 하는 것(JOIN 키워드를 사용하지 않은 경우)
SELECT m_category, m_name, m_seller, s_name, s_level, s_attack
FROM market, sword
WHERE m_name = s_name;

MariaDB [bns]> -- SELECT FROM market, sword;
MariaDB [bns]> SELECT
FROM market, sword WHERE m_name = s_name;

+------+------------+-----------+----------+-----------+---------+----------+
| m_no | m_category | m_name    | m_seller | s_name    | s_level | s_attack |
+------+------------+-----------+----------+-----------+---------+----------+
|    2 | 검         | 곤륜검    | evernick | 곤륜검    |      50 |      540 |
|    4 | 검         | 풍뢰검    | ruina    | 풍뢰검    |      45 |      263 |
+------+------------+-----------+----------+-----------+---------+----------+
2 rows in set (0.00 sec)

market 테이블의 m_name 과 sword 테이블의 s_name이 동일한 데이터를 출력한다.
MariaDB [bns]> SELECT m_category, m_name, m_seller, s_name, s_level, s_attack FROM market, sword WHERE m_name = s_name;

+------------+-----------+----------+-----------+---------+----------+
| m_category | m_name    | m_seller | s_name    | s_level | s_attack |
+------------+-----------+----------+-----------+---------+----------+
| 검         | 곤륜검    | evernick | 곤륜검    |      50 |      540 |
| 검         | 풍뢰검    | ruina    | 풍뢰검    |      45 |      263 |
+------------+-----------+----------+-----------+---------+----------+
2 rows in set (0.00 sec)

테이블에 별칭 설정하기
FROM 테이블명1 별칭1, 테이블명2 별칭2 ...

컬럼명이 중복되지 않았기 때문에 출력이 된다.
만약 컬럼명이 중복되면 에러가 발생된다.
그런 경우에는 별칭.컬럼명을 사용해야 한다.

SELECT m_category, m_name, m_seller, s_name, s_level, s_attack
FROM market m INNER JOIN sword s
ON m.m_name = s.s_name;

SELECT m_category, m_name, m_seller, s_name, s_level, s_attack
FROM market m, sword s
WHERE m.m_name = s.s_name;

컬럼명이 중복되면 에러가 발생되므로 아래처럼 별칭.컬럼명을 사용해야 한다.
SELECT m.m_category, m.m_name, m.m_seller, s.s_name, s.s_level, s.s_attack
FROM market m INNER JOIN sword s
ON m.m_name = s.s_name;

SELECT m.m_category, m.m_name, m.m_seller, s.s_name, s.s_level, s.s_attack
FROM market m, sword s
WHERE m.m_name = s.s_name;

실습> JOIN

-- market 테이블을 생성한다.

CREATE TABLE market2
(
    no       INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '일련번호',
    category VARCHAR(32)  NOT NULL COMMENT '장비분류',
    name     VARCHAR(52)  NOT NULL COMMENT '장비명',
    seller   VARCHAR(32)  NOT NULL COMMENT '판매자',
    PRIMARY KEY(`no`)  -- PRIMARY KEY(no)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '장비 시장';

-- sword 테이블을 생성한다.

CREATE TABLE sword2
(
    no       INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '일련번호',
    name   VARCHAR(52)  NOT NULL COMMENT '이름',
    level  INT UNSIGNED NOT NULL COMMENT '착용 레벨', 
    attack INT UNSIGNED NOT NULL COMMENT '공격력'
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '검 테이블';

-- market 테이블에 데이터를 입력한다.

INSERT INTO market2 VALUES(NULL, '지팡이', '촉마지팡이', 'merry');
INSERT INTO market2 VALUES(NULL, '검', '곤륜검', 'evernick'); 
INSERT INTO market2 VALUES(NULL, '기공패', '곤륜기공패', 'jamienick');
INSERT INTO market2 VALUES(NULL, '검', '풍뢰검', 'ruina');

-- sword 테이블에 데이터를 입력한다.

INSERT INTO sword2 VALUES(NULL, '곤륜검', 50, 540);
INSERT INTO sword2 VALUES(NULL, '염화검', 36, 147);
INSERT INTO sword2 VALUES(NULL, '요마검', 20, 64);
INSERT INTO sword2 VALUES(NULL, '풍뢰검', 45, 263);

-- 별칭을 사용하지 않은 경우

-- 아래 SQL문은 에러가 발생된다.
-- WHERE절 뒤에 name이 어떤 테이블의 name인지 모르기 때문이다.

SELECT * FROM market2, sword2 WHERE name = name;

-- 이때는 아래처럼 사용해야 한다.
-- WHERE절 뒤에 name이 어떤 테이블의 name인지 알려줘야 에러가 발생하지 않는다.

SELECT * FROM market2, sword2 WHERE market2.name = sword2.name;

-- 에러가 발생한 원인은 no가 어느 테이블의 no인지 알 수 없기 때문이다.
-- 에러가 발생한 원인은 name이 어느 테이블의 name인지 알 수 없기 때문이다.

SELECT no, category, name, seller, no, name, level, attack 
    FROM market2, sword2 
    WHERE market2.name = sword2.name;

-- 별칭을 사용하지 않은 경우
-- 컬럼명이 중복되는 것을 테이블명.컬럼명의 형식으로 써야 한다.

SELECT market2.no, category, market2.name, seller, sword2.no, sword2.name, level, attack 
    FROM market2, sword2 
    WHERE market2.name = sword2.name;

-- 컬럼이 어느 테이블에 속해 있는지 명확하게 하기 위해서 모든 컬럼에 테이블명을 써준다.
-- 단점은 너무 길기 때문에 별칭을 이용해서 줄여서 사용하는 것이 좋다. (일반적으로 줄여서 많이 사용한다.)

SELECT market2.no, market2.category, market2.name, market2.seller, sword2.no, sword2.name, sword2.level, sword2.attack 
    FROM market2, sword2 
    WHERE market2.name = sword2.name;

-- 별칭을 사용한 경우
-- 별칭을 사용하므로 길이가 많이 줄어든 것을 볼 수 있다.

SELECT m2.no, m2.category, m2.name, m2.seller, s2.no, s2.name, s2.level, s2.attack 
    FROM market2 m2, sword2 s2
    WHERE m2.name = s2.name;
SELECT * FROM market2 m2, sword2 s2 WHERE m2.name = s2.name;

o LEFT JOIN

SELECT m_category, m_name, m_seller, s_name, s_level, s_attack
FROM market LEFT OUTER JOIN sword
ON m_name = s_name;

MariaDB [bns]> SELECT m_category, m_name, m_seller, s_name, s_level, s_attack
-> FROM market LEFT OUTER JOIN sword ON m_name = s_name;

+------------+-----------------+-----------+-----------+---------+----------+
| m_category | m_name          | m_seller  | s_name    | s_level | s_attack |
+------------+-----------------+-----------+-----------+---------+----------+
| 지팡이     | 촉마지팡이      | merry     | NULL      |    NULL |     NULL |
| 검         | 곤륜검          | evernick  | 곤륜검    |      50 |      540 |
| 기공패     | 곤륜기공패      | jamienick | NULL      |    NULL |     NULL |
| 검         | 풍뢰검          | ruina     | 풍뢰검    |      45 |      263 |
+------------+-----------------+-----------+-----------+---------+----------+
4 rows in set (0.00 sec)

SELECT m.m_category, m.m_name, m.m_seller, s.s_name, s.s_level, s.s_attack
FROM market m LEFT OUTER JOIN sword s
ON m.m_name = s.s_name;

+------------+-----------------+-----------+-----------+---------+----------+
| m_category | m_name          | m_seller  | s_name    | s_level | s_attack |
+------------+-----------------+-----------+-----------+---------+----------+
| 지팡이     | 촉마지팡이      | merry     | NULL      |    NULL |     NULL |  <-- m.m_name과 s.s_name이 일치하지 않는다.
| 검         | 곤륜검          | evernick  | 곤륜검    |      50 |      540 |      sword 테이블의 컬럼에는 NULL이 출력된다.
| 기공패     | 곤륜기공패      | jamienick | NULL      |    NULL |     NULL |  <--
| 검         | 풍뢰검          | ruina     | 풍뢰검    |      45 |      263 |
+------------+-----------------+-----------+-----------+---------+----------+
4 rows in set (0.00 sec)

SELECT m_category, m_name, m_seller, s_name, s_level, s_attack
FROM market RIGHT OUTER JOIN sword ON m_name = s_name;

+------------+-----------+----------+-----------+---------+----------+
| m_category | m_name    | m_seller | s_name    | s_level | s_attack |
+------------+-----------+----------+-----------+---------+----------+
| 검         | 곤륜검    | evernick | 곤륜검    |      50 |      540 |
| 검         | 풍뢰검    | ruina    | 풍뢰검    |      45 |      263 |
| NULL       | NULL      | NULL     | 염화검    |      36 |      147 |
| NULL       | NULL      | NULL     | 요마검    |      20 |       64 |
+------------+-----------+----------+-----------+---------+----------+
4 rows in set (0.00 sec)

SELECT m.m_category, m.m_name, m.m_seller, s.s_name, s.s_level, s.s_attack
FROM market m RIGHT OUTER JOIN sword s ON m.m_name = s.s_name;

+------------+-----------+----------+-----------+---------+----------+
| m_category | m_name    | m_seller | s_name    | s_level | s_attack |
+------------+-----------+----------+-----------+---------+----------+
| 검         | 곤륜검    | evernick | 곤륜검    |      50 |      540 |
| 검         | 풍뢰검    | ruina    | 풍뢰검    |      45 |      263 |
| NULL       | NULL      | NULL     | 염화검    |      36 |      147 |
| NULL       | NULL      | NULL     | 요마검    |      20 |       64 |
+------------+-----------+----------+-----------+---------+----------+
4 rows in set (0.00 sec)

실습> 테이블 생성, 데이터 저장하기

아래 조건에 맞게 테이블을 생성하고 데이터를 저장하시오.

member: 회원 정보가 저장된 테이블
top: 상의 정보가 저장된 테이블
pants: 하의 정보가 저장된 테이블
market: 상품을 구매한 회원 정보가 저장된 테이블

-- 조건 --
1. DB: myDB

2. 테이블 생성
테이블: member

+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| m_no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| m_id       | varchar(10) | NO   | UNI | NULL    |                |
| m_name     | varchar(20) | NO   |     | NULL    |                |
| m_sex      | char(1)     | YES  |     | NULL    |                |
| m_post_num | char(8)     | YES  |     | NULL    |                |
| m_address  | varchar(80) | YES  |     | NULL    |                |
| m_tel      | varchar(15) | YES  |     | NULL    |                |
| m_age      | int(11)     | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

테이블: top

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| no    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   |     | NULL    |                |
| price | int(11)     | NO   |     | NULL    |                |
| color | char(10)    | YES  |     | NULL    |                |
| size  | char(5)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

테이블: pants

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| no    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   |     | NULL    |                |
| price | int(11)     | NO   |     | NULL    |                |
| color | char(10)    | YES  |     | NULL    |                |
| size  | char(5)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

테이블: market

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| category | char(10)    | NO   |     | NULL    |                |
| name     | varchar(50) | NO   |     | NULL    |                |
| m_id     | varchar(10) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

3. 데이터 저장

테이블: member

+------+---------+-----------+-------+------------+---------------------------------------------+----------+-------+
| m_no | m_id    | m_name    | m_sex | m_post_num | m_address                                   | m_tel    | m_age |
+------+---------+-----------+-------+------------+---------------------------------------------+----------+-------+
|    1 | chpark  | 박철호    | M     | 503-200    | 광주시 남구 지석동                          | 298-9730 |    34 |
|    2 | jyjang  | 장영숙    | W     | 503-201    | 부산시 영도구 봉래동5가                     | 399-9809 |    24 |
|    3 | yjbae   | 배용진    | M     | 606-065    | 서울시 은평구 응암4동                       | 857-5683 |    30 |
|    4 | hnjang  | 정한나    | W     | 441-081    | 광주시 서구 화정4동                         | 845-4547 |    58 |
+------+---------+-----------+-------+------------+---------------------------------------------+----------+-------+

테이블: top;

+----+--------------+-------+--------+------+
| no | name         | price | color  | size |
+----+--------------+-------+--------+------+
|  1 | 기본티       |  6900 | white  | M    |
|  2 | 맨투맨       | 26000 | black  | M    |
|  3 | 후드티       | 23000 | red    | L    |
|  4 | 니트         | 17900 | beige  | S    |
|  5 | 후드집업     | 32000 | yellow | L    |
+----+--------------+-------+--------+------+

테이블: pants

+----+--------------------+-------+-------+------+
| no | name               | price | color | size |
+----+--------------------+-------+-------+------+
|  1 | 데님팬츠           | 21500 | blue  | S    |
|  2 | 코튼펜츠           | 22000 | black | M    |
|  3 | 일자데님           | 23400 | beige | S    |
|  4 | 밴딩팬츠           | 11500 | gray  | M    |
|  5 | 트레이닝팬츠       |  9800 | red   | L    |
+----+--------------------+-------+-------+------+

테이블: market;

+----+----------+--------------------+--------+
| no | category | name               | m_id   |
+----+----------+--------------------+--------+
|  1 | top      | 맨투맨             | chpark |
|  2 | top      | 후드티             | yjbae  |
|  3 | pants    | 일자데님           | chpark |
|  4 | top      | 후드티             | hnjang |
|  5 | pants    | 트레이닝팬츠       | jyjang |
+----+----------+--------------------+--------+

-- 조건 --

1. DB: myDB
CREATE DATABASE myDB;
USE myDB

2. 테이블 생성
테이블: member

+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| m_no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| m_id       | varchar(10) | NO   | UNI | NULL    |                |
| m_name     | varchar(20) | NO   |     | NULL    |                |
| m_sex      | char(1)     | YES  |     | NULL    |                |
| m_post_num | char(8)     | YES  |     | NULL    |                |
| m_address  | varchar(80) | YES  |     | NULL    |                |
| m_tel      | varchar(15) | YES  |     | NULL    |                |
| m_age      | int(11)     | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
CREATE TABLE member 
(
    m_no       int(11)     NOT NULL AUTO_INCREMENT,
    m_id       varchar(10) NOT NULL UNIQUE,
    m_name     varchar(20) NOT NULL,
    m_sex      char(1)     DEFAULT NULL,
    m_post_num char(8)     DEFAULT NULL,
    m_address  varchar(80) DEFAULT NULL,
    m_tel      varchar(15) DEFAULT NULL,
    m_age      int(11)     DEFAULT NULL,
    PRIMARY KEY (m_no)
);

테이블: top

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| no    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   |     | NULL    |                |
| price | int(11)     | NO   |     | NULL    |                |
| color | char(10)    | YES  |     | NULL    |                |
| size  | char(5)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
CREATE TABLE top
(
    no     int         NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(50) NOT NULL, 
    price  int(11)     NOT NULL,
    color  char(10)    DEFAULT NULL,
    size   char(5)     DEFAULT NULL
);

테이블: pants

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| no    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   |     | NULL    |                |
| price | int(11)     | NO   |     | NULL    |                |
| color | char(10)    | YES  |     | NULL    |                |
| size  | char(5)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
CREATE TABLE pants
(
    no     int(11)     NOT NULL AUTO_INCREMENT,
    name   varchar(50) NOT NULL,
    price  int(11)     NOT NULL,
    color  char(10)    DEFAULT NULL,
    size   char(5)     DEFAULT NULL,
    PRIMARY KEY (no)
);

테이블: market

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| category | char(10)    | NO   |     | NULL    |                |
| name     | varchar(50) | NO   |     | NULL    |                |
| m_id     | varchar(10) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
CREATE TABLE market 
(
    no        int(11)     NOT NULL AUTO_INCREMENT,
    category  char(10)    NOT NULL,
    name      varchar(50) NOT NULL,
    m_id      varchar(10) NOT NULL,
    PRIMARY KEY (no)
);

3. 데이터 저장

테이블: member

+------+---------+-----------+-------+------------+---------------------------------------------+----------+-------+
| m_no | m_id    | m_name    | m_sex | m_post_num | m_address                                   | m_tel    | m_age |
+------+---------+-----------+-------+------------+---------------------------------------------+----------+-------+
|    1 | chpark  | 박철호    | M     | 503-200    | 광주시 남구 지석동                          | 298-9730 |    34 |
|    2 | jyjang  | 장영숙    | W     | 503-201    | 부산시 영도구 봉래동5가                     | 399-9809 |    24 |
|    3 | yjbae   | 배용진    | M     | 606-065    | 서울시 은평구 응암4동                       | 857-5683 |    30 |
|    4 | hnjang  | 정한나    | W     | 441-081    | 광주시 서구 화정4동                         | 845-4547 |    58 |
+------+---------+-----------+-------+------------+---------------------------------------------+----------+-------+
INSERT INTO member VALUES('', 'chpark', '박철호', 'M', '503-200', '광주시 남구 지석동', '298-9730', 34);
INSERT INTO member VALUES('', 'jyjang', '장영숙', 'W', '503-201', '부산시 영도구 봉래동5가', '399-9809', 24);
INSERT INTO member VALUES('', 'yjbae',  '배용진', 'M', '606-065', '서울시 은평구 응암4동', '857-5683', 30);
INSERT INTO member VALUES('', 'hnjang', '정한나', 'W', '441-081', '광주시 서구 화정4동', '845-4547', 58);

테이블: top;

+----+--------------+-------+--------+------+
| no | name         | price | color  | size |
+----+--------------+-------+--------+------+
|  1 | 기본티       |  6900 | white  | M    |
|  2 | 맨투맨       | 26000 | black  | M    |
|  3 | 후드티       | 23000 | red    | L    |
|  4 | 니트         | 17900 | beige  | S    |
|  5 | 후드집업     | 32000 | yellow | L    |
+----+--------------+-------+--------+------+
INSERT INTO top VALUES('', '기본티', 6900, 'white', 'M');
INSERT INTO top VALUES('', '맨투맨', 26000, 'black', 'M');
INSERT INTO top VALUES('', '후드티', 23000, 'red', 'L');
INSERT INTO top VALUES('', '니트', 17900, 'beige', 'S');
INSERT INTO top VALUES('', '후드집업', 32000, 'yello', 'L');

테이블: pants

+----+--------------------+-------+-------+------+
| no | name               | price | color | size |
+----+--------------------+-------+-------+------+
|  1 | 데님팬츠           | 21500 | blue  | S    |
|  2 | 코튼펜츠           | 22000 | black | M    |
|  3 | 일자데님           | 23400 | beige | S    |
|  4 | 밴딩팬츠           | 11500 | gray  | M    |
|  5 | 트레이닝팬츠       |  9800 | red   | L    |
+----+--------------------+-------+-------+------+
INSERT INTO pants VALUES('', '데님팬츠', 21500, 'blue', 'S');
INSERT INTO pants VALUES('', '코튼펜츠', 22000, 'black', 'M');
INSERT INTO pants VALUES('', '일자데님', 23400, 'beige', 'S');
INSERT INTO pants VALUES('', '밴딩팬츠', 11500, 'gray', 'L');
INSERT INTO pants VALUES('', '트레이닝팬츠', 9800, 'red', 'L');

테이블: market;

+----+----------+--------------------+--------+
| no | category | name               | m_id   |
+----+----------+--------------------+--------+
|  1 | top      | 맨투맨             | chpark |
|  2 | top      | 후드티             | yjbae  |
|  3 | pants    | 일자데님           | chpark |
|  4 | top      | 후드티             | hnjang |
|  5 | pants    | 트레이닝팬츠       | jyjang |
+----+----------+--------------------+--------+
INSERT INTO market VALUES('', 'top', '맨투맨', 'chpark');
INSERT INTO market VALUES('', 'top', '후드티', 'yjbae');
INSERT INTO market VALUES('', 'pants', '일자데님', 'chpark');
INSERT INTO market VALUES('', 'top', '후드티', 'hnjang');
INSERT INTO market VALUES('', 'pants', '트레이닝팬츠', 'jyjang');

서브쿼리를 이용한 테이블 복사
-서브쿼리: 2개 이상 있는 쿼리

CREATE TABLE market2 AS SELECT * FROM market;
CREATE TABLE member2 AS SELECT * FROM member;
CREATE TABLE pants2 AS SELECT * FROM pants;
CREATE TABLE top2 AS SELECT * FROM top;

컬럼 수정
MariaDB [myDB]> DESC member;

+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| m_no       | int(11)     | NO   | PRI | NULL    | auto_increment |
| m_id       | varchar(10) | NO   | UNI | NULL    |                |
| m_name     | varchar(20) | NO   |     | NULL    |                |
| m_sex      | char(1)     | YES  |     | NULL    |                |
| m_post_num | char(8)     | YES  |     | NULL    |                |
| m_address  | varchar(80) | YES  |     | NULL    |                |  <-- varchar(70), NULL 허용 금지
| m_tel      | varchar(15) | YES  |     | NULL    |                |  <-- char(20), NULL 허용 금지
| m_age      | int(11)     | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

member 테이블의 컬럼 속성 수정하기
m_address varchar(80) NULL 허용 -> varchar(70), NULL 허용 금지로 변경한다.
ALTER TABLE member MODIFY m_address VARCHAR(70) NOT NULL;

m_tel varchar(15) NULL 허용 -> char(20) NULL 허용 금지
ALTER TABLE member MODIFY m_tel CHAR(20) NOT NULL;

정한나 회원이 상의 니트를 구매한다.
정한나 회원이 상의 니트를 구매했으니 market 테이블에 해당하는 데이터를 삽입한다.
INSERT INTO market VALUES(NULL, 'top', '니트', 'hnjang');

MariaDB [myDB]> SELECT * FROM market;

+----+----------+--------------------+--------+
| no | category | name               | m_id   |
+----+----------+--------------------+--------+
|  1 | top      | 맨투맨             | chpark |
|  2 | top      | 후드티             | yjbae  |
|  3 | pants    | 일자데님           | chpark |
|  4 | top      | 후드티             | hnjang |
|  5 | pants    | 트레이닝팬츠       | jyjang |
|  6 | top      | 니트               | hnjang |  <--
+----+----------+--------------------+--------+
6 rows in set (0.00 sec)

배용진 회원이 하의 트레이닝팬츠를 구매한다.
배용진 회원이 하의 트레이닝팬츠를 구매했으니 market 테이블에 해당하는 데이터를 삽입한다.
INSERT INTO market VALUES(NULL, 'pants', '트레이닝팬츠', 'yjbae');

MariaDB [myDB]> SELECT * FROM market;

+----+----------+--------------------+--------+
| no | category | name               | m_id   |
+----+----------+--------------------+--------+
|  1 | top      | 맨투맨             | chpark |
|  2 | top      | 후드티             | yjbae  |
|  3 | pants    | 일자데님           | chpark |
|  4 | top      | 후드티             | hnjang |
|  5 | pants    | 트레이닝팬츠       | jyjang |
|  6 | top      | 니트               | hnjang |
|  7 | pants    | 트레이닝팬츠       | yjbae  |  <-- 
+----+----------+--------------------+--------+
7 rows in set (0.00 sec)

member 테이블에서 남성의 이름, 나이, 성별, 아이디 컬럼을 조회하시오.
SELECT m_name, m_age, m_sex, m_id FROM member WHERE m_sex = 'M';
MariaDB [myDB]> SELECT m_name, m_age, m_sex, m_id FROM member WHERE m_sex = 'M';

+-----------+-------+-------+--------+
| m_name    | m_age | m_sex | m_id   |
+-----------+-------+-------+--------+
| 박철호    |    34 | M     | chpark |
| 배용진    |    30 | M     | yjbae  |
+-----------+-------+-------+--------+
2 rows in set (0.00 sec)

top 테이블에서 상품명, 가격을 출력하시오.
MariaDB [myDB]> SELECT name, price FROM top;

+--------------+-------+
| name         | price |
+--------------+-------+
| 기본티       |  6900 |
| 맨투맨       | 26000 |
| 후드티       | 23000 |
| 니트         | 17900 |
| 후드집업     | 32000 |
+--------------+-------+
5 rows in set (0.00 sec)

pants 테이블에서 사이즈가 L을 검색하시오.
MariaDB [myDB]> SELECT * FROM pants WHERE size='L';

+----+--------------------+-------+-------+------+
| no | name               | price | color | size |
+----+--------------------+-------+-------+------+
|  4 | 밴딩팬츠           | 11500 | gray  | L    |
|  5 | 트레이닝팬츠       |  9800 | red   | L    |
+----+--------------------+-------+-------+------+
2 rows in set (0.00 sec)

박철호 회원의 주소가 '서울시 강남구 역삼1동' 으로 이사를 와서 member 테이블의 내용을 변경한다.
UPDATE member SET m_address = '서울시 강남구 역삼1동' WHERE m_id = 'chpark';

상의 후드집업이 32,000원에서 37,000으로 가격이 인상되어서 top 테이블의 내용을 변경한다.
UPDATE top SET price=37000 WHERE name = '후드집업';

배용진 회원이 탈퇴했기 때문에 member 테이블에서 삭제한다.
DELETE FROM member WHERE m_id = 'yjbae';

DB 일반 사용자 shopuser 를 생성하고 shopuserDB의 모든 권한을 부여하시오.

User      Host       Password   DB
shopuser  localhost  P@ssw0rd   shopuserDB

SELECT host,user,password FROM mysql.user;
CREATE USER shopuser@localhost IDENTIFIED BY 'P@ssw0rd'; <--
GRANT ALL PRIVILEGES ON shopuserDB.* TO shopuser@localhost; <--
CREATE DATABASE shopuserDB; <--
SHOW GRANTS FOR shopuser@localhost;

market 테이블과 top테이블 모두 name이 일치하는 데이터만 반환하도록 Join을 이용해서 조회 하시오.
-컬럼: 모든 컬럼 조회
-Join(Innter Join)

MariaDB [myDB]> SELECT * FROM market;

+----+----------+--------------------+--------+
| no | category | name               | m_id   |
+----+----------+--------------------+--------+
|  1 | top      | 맨투맨             | chpark |
|  2 | top      | 후드티             | yjbae  |
|  3 | pants    | 일자데님           | chpark |
|  4 | top      | 후드티             | hnjang |
|  5 | pants    | 트레이닝팬츠       | jyjang |
|  6 | top      | 니트               | hnjang |
|  7 | pants    | 트레이닝팬츠       | yjbae  |
+----+----------+--------------------+--------+
7 rows in set (0.00 sec)

MariaDB [myDB]> SELECT * FROM top;

+----+--------------+-------+-------+------+
| no | name         | price | color | size |
+----+--------------+-------+-------+------+
|  1 | 기본티       |  6900 | white | M    |
|  2 | 맨투맨       | 26000 | black | M    |
|  3 | 후드티       | 23000 | red   | L    |
|  4 | 니트         | 17900 | beige | S    |
|  5 | 후드집업     | 37000 | yello | L    |
+----+--------------+-------+-------+------+
5 rows in set (0.00 sec)

별칭을 사용한 경우
-market: m
-top: t
MariaDB [myDB]> SELECT * FROM market m INNER JOIN top t ON m.name = t.name;

+----+----------+-----------+--------+----+-----------+-------+-------+------+
| no | category | name      | m_id   | no | name      | price | color | size |
+----+----------+-----------+--------+----+-----------+-------+-------+------+
|  1 | top      | 맨투맨    | chpark |  2 | 맨투맨    | 26000 | black | M    |
|  2 | top      | 후드티    | yjbae  |  3 | 후드티    | 23000 | red   | L    |
|  4 | top      | 후드티    | hnjang |  3 | 후드티    | 23000 | red   | L    |
|  6 | top      | 니트      | hnjang |  4 | 니트      | 17900 | beige | S    |
+----+----------+-----------+--------+----+-----------+-------+-------+------+
4 rows in set (0.00 sec)

명시적 조인 표현
MariaDB [myDB]> SELECT * FROM market INNER JOIN top ON market.name = top.name;

+----+----------+-----------+--------+----+-----------+-------+-------+------+
| no | category | name      | m_id   | no | name      | price | color | size |
+----+----------+-----------+--------+----+-----------+-------+-------+------+
|  1 | top      | 맨투맨    | chpark |  2 | 맨투맨    | 26000 | black | M    |
|  2 | top      | 후드티    | yjbae  |  3 | 후드티    | 23000 | red   | L    |
|  4 | top      | 후드티    | hnjang |  3 | 후드티    | 23000 | red   | L    |
|  6 | top      | 니트      | hnjang |  4 | 니트      | 17900 | beige | S    |
+----+----------+-----------+--------+----+-----------+-------+-------+------+
4 rows in set (0.00 sec)

암시적 조인 표현
별칭을 사용하지 않은 경우
MariaDB [myDB]> SELECT * FROM market, top WHERE market.name = top.name;

+----+----------+-----------+--------+----+-----------+-------+-------+------+
| no | category | name      | m_id   | no | name      | price | color | size |
+----+----------+-----------+--------+----+-----------+-------+-------+------+
|  1 | top      | 맨투맨    | chpark |  2 | 맨투맨    | 26000 | black | M    |
|  2 | top      | 후드티    | yjbae  |  3 | 후드티    | 23000 | red   | L    |
|  4 | top      | 후드티    | hnjang |  3 | 후드티    | 23000 | red   | L    |
|  6 | top      | 니트      | hnjang |  4 | 니트      | 17900 | beige | S    |
+----+----------+-----------+--------+----+-----------+-------+-------+------+
4 rows in set (0.00 sec)

암시적 조인 표현
별칭을 사용한 경우
MariaDB [myDB]> SELECT * FROM market m, top t WHERE m.name = t.name;

+----+----------+-----------+--------+----+-----------+-------+-------+------+
| no | category | name      | m_id   | no | name      | price | color | size |
+----+----------+-----------+--------+----+-----------+-------+-------+------+
|  1 | top      | 맨투맨    | chpark |  2 | 맨투맨    | 26000 | black | M    |
|  2 | top      | 후드티    | yjbae  |  3 | 후드티    | 23000 | red   | L    |
|  4 | top      | 후드티    | hnjang |  3 | 후드티    | 23000 | red   | L    |
|  6 | top      | 니트      | hnjang |  4 | 니트      | 17900 | beige | S    |
+----+----------+-----------+--------+----+-----------+-------+-------+------+
4 rows in set (0.00 sec)

###########
📌 UNION 📌
###########

MariaDB [myDB]> SELECT 1,2,3;

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
1 row in set (0.00 sec)

MariaDB [myDB]> SELECT 4,5,6;

+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
1 row in set (0.00 sec)

컬럼의 수가 3개씩 동일하기 때문에 두 개가 합쳐져서 출력된다.

MariaDB [myDB]> SELECT 1,2,3 
    ->          UNION
    ->          SELECT 4,5,6;
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 1 | 2 | 3 |
| 4 | 5 | 6 |
+---+---+---+
2 rows in set (0.00 sec)

컬럼의 수가 다르기 때문에 에러가 발생된다.

MariaDB [myDB]> SELECT 1,2,3
    ->          UNION
    ->          SELECT 5,6,7,8;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

market UNION sword 합쳐서 하나의 테이블로 출력한다.
주의점의 서로간의 컬럼이 동일해야 한다.

MariaDB [bns]> SELECT m_category,m_name,m_seller FROM market
    ->         UNION
    ->         SELECT s_name,s_level,s_attack FROM sword;
+------------+-----------------+-----------+
| m_category | m_name          | m_seller  |
+------------+-----------------+-----------+
| 지팡이     | 촉마지팡이      | merry     |
| 검         | 곤륜검          | evernick  |
| 기공패     | 곤륜기공패      | jamienick |
| 검         | 풍뢰검          | ruina     |
| 곤륜검     | 50              | 540       |
| 염화검     | 36              | 147       |
| 요마검     | 20              | 64        |
| 풍뢰검     | 45              | 263       |
+------------+-----------------+-----------+
8 rows in set (0.00 sec)

컬럼의 수가 다르기 때문에 에러가 발생된다.

MariaDB [bns]> SELECT m_no, m_category,m_name,m_seller FROM market
    -> UNION
    -> SELECT s_name,s_level,s_attack FROm sword;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

실습> union

staff 테이블 추가
sword 테이블과 statff 테이블 데이터 조회

CREATE table staff(
    f_name VARCHAR(52) PRIMARY KEY , 
    f_level INT UNSIGNED NOT NULL, 
    f_attack INT UNSIGNED NOT NULL
);

INSERT INTO staff VALUES('촉마지팡이', 50, 311);
INSERT INTO staff VALUES('유성지팡이', 50, 400);

SELECT * FROM sword;
SELECT * FROM staff;

SELECT * FROM sword
UNION
SELECT * FROM staff;

MariaDB [bns]> SELECT * FROM sword
    -> UNION
    -> SELECT * FROM staff;
+-----------------+---------+----------+
| s_name          | s_level | s_attack |
+-----------------+---------+----------+
| 곤륜검          |      50 |      540 |  <-- sword
| 염화검          |      36 |      147 |  <-- sword
| 요마검          |      20 |       64 |  <-- sword
| 풍뢰검          |      45 |      263 |  <-- sword
| 유성지팡이      |      50 |      400 |  <-- staff
| 촉마지팡이      |      50 |      311 |  <-- staff
+-----------------+---------+----------+
6 rows in set (0.00 sec)

###########
📌 VIEW 📌
###########

create database artist_db;
use artist_db

create table art_member
(
    u_no int unsigned not null auto_increment primary key comment '일련번호', 
    u_id varchar(20) not null unique comment '아이디',
    u_pass varchar(50) not null comment '비밀번호', 
    u_name varchar(20) not null  comment '이름', 
    u_age int unsigned comment '나이'
);

create table art_board
(
    b_no int unsigned auto_increment primary key comment '일련번호', 
    b_id varchar(20) not null comment '작성자아이디', 
    b_subject varchar(100) not null comment '글제목', 
    b_contents text not null comment '글내용', 
    reg_date datetime comment '작성일시'
);

insert into art_member values(NULL , 'bogummy' , 'bogobogo' , '박보검' ,24);
insert into art_member values(NULL , 'joongki' , 's1234' , '송중기' , 32);
insert into art_member values(NULL , 'hyekyo' , 'hkhk' , '송혜교' ,36);
insert into art_member values(NULL , 'parkbo' , 'boyoung' , '박보영' ,27);
insert into art_member values(NULL , 'parkhj' , 'park' , '박해진' ,35);
insert into art_member values(NULL , 'ksh' , 'shkim' , '김수현' ,30);
insert into art_member values(NULL , 'jihyun' , 'jenjh' , '전지현' ,36);
insert into art_member values(NULL , 'taehee' , 'rainth' , '김태희' ,37);

insert into art_board values(NULL, 'bogummy' , '핫뉴스~!!' , '보검이왔어요~!!' , now()); 
insert into art_board values(NULL, 'ksh', '하이염~!' , '수현이예요~~' , now());
insert into art_board values(NULL, 'parkhj' , '안녕하세요' , '반가워요~^^' , now());
insert into art_board values(NULL, 'hyekyo' ,'혜교예요~' , '혜교이뻐해주세요~' , now());
insert into art_board values(NULL, 'parkhj' ,'꼭 읽어주세요~!!' , '나 좀 멋진듯~?' , now());

MariaDB [artist_db]> DESC art_board;

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| b_no       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| b_id       | varchar(20)      | NO   |     | NULL    |                |
| b_subject  | varchar(100)     | NO   |     | NULL    |                |  <-- VIEW 생성 컬럼
| b_contents | text             | NO   |     | NULL    |                |
| reg_date   | datetime         | YES  |     | NULL    |                |  <-- VIEW 생성 컬럼
+------------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [artist_db]> DESC art_member;

+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| u_no   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| u_id   | varchar(20)      | NO   | UNI | NULL    |                |
| u_pass | varchar(50)      | NO   |     | NULL    |                |
| u_name | varchar(20)      | NO   |     | NULL    |                |  <-- VIEW 생성 컬럼 
| u_age  | int(10) unsigned | YES  |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [artist_db]> SELECT * FROm art_board;

+------+---------+------------------------+---------------------------+---------------------+
| b_no | b_id    | b_subject              | b_contents                | reg_date            |
+------+---------+------------------------+---------------------------+---------------------+
|    1 | bogummy | 핫뉴스~!!              | 보검이왔어요~!!           | 2023-02-08 02:31:57 |  <-- 
|    2 | ksh     | 하이염~!               | 수현이예요~~              | 2023-02-08 02:31:57 |  <--
|    3 | parkhj  | 안녕하세요             | 반가워요~^^               | 2023-02-08 02:31:57 |  <_-
|    4 | hyekyo  | 혜교예요~              | 혜교이뻐해주세요~         | 2023-02-08 02:31:57 |  <--
|    5 | parkhj  | 꼭 읽어주세요~!!       | 나 좀 멋진듯~?            | 2023-02-08 02:31:57 |  <--
+------+---------+------------------------+---------------------------+---------------------+
5 rows in set (0.00 sec)

MariaDB [artist_db]> SELECT * FROm art_member;

+------+---------+----------+-----------+-------+
| u_no | u_id    | u_pass   | u_name    | u_age |
+------+---------+----------+-----------+-------+
|    1 | bogummy | bogobogo | 박보검    |    24 |  <--
|    2 | joongki | s1234    | 송중기    |    32 |  
|    3 | hyekyo  | hkhk     | 송혜교    |    36 |  <--
|    4 | parkbo  | boyoung  | 박보영    |    27 |
|    5 | parkhj  | park     | 박해진    |    35 |  <--
|    6 | ksh     | shkim    | 김수현    |    30 |  <--
|    7 | jihyun  | jenjh    | 전지현    |    36 |
|    8 | taehee  | rainth   | 김태희    |    37 |
+------+---------+----------+-----------+-------+
8 rows in set (0.00 sec)
MariaDB [artist_db]> CREATE VIEW art_board_list 
    ->               AS SELECT b_subject, u_name, reg_date 
    ->               FROM art_board join art_member ON b_id = u_id;
Query OK, 0 rows affected (0.00 sec)

MariaDB [artist_db]> DESC art_board_list;

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| b_subject | varchar(100) | NO   |     | NULL    |       |
| u_name    | varchar(20)  | NO   |     | NULL    |       |
| reg_date  | datetime     | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

뷰 출력
SELECT 형식과 동일하게 사용할 수 있다.
MariaDB [artist_db]> SELECT * FROM art_board_list;

+------------------------+-----------+---------------------+
| b_subject              | u_name    | reg_date            |
+------------------------+-----------+---------------------+
| 핫뉴스~!!              | 박보검    | 2023-02-08 02:31:57 |
| 하이염~!               | 김수현    | 2023-02-08 02:31:57 |
| 안녕하세요             | 박해진    | 2023-02-08 02:31:57 |
| 혜교예요~              | 송혜교    | 2023-02-08 02:31:57 |
| 꼭 읽어주세요~!!       | 박해진    | 2023-02-08 02:31:57 |
+------------------------+-----------+---------------------+
5 rows in set (0.00 sec)

뷰 수정
-CREATE VIEW를 ALTER VIEW로 변경하면 된다.

ALTER VIEW art_board_list 
AS SELECT b_no, b_subject, u_name, reg_date 
FROM art_board join art_member ON b_id = u_id;
MariaDB [artist_db]> ALTER VIEW art_board_list 
    -> AS SELECT b_no, b_subject, u_name, reg_date 
    -> FROM art_board join art_member ON b_id = u_id;
Query OK, 0 rows affected (0.00 sec)

MariaDB [artist_db]> DESC art_board_list;

+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| b_no      | int(10) unsigned | NO   |     | 0       |       |
| b_subject | varchar(100)     | NO   |     | NULL    |       |
| u_name    | varchar(20)      | NO   |     | NULL    |       |
| reg_date  | datetime         | YES  |     | NULL    |       |
+-----------+------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

MariaDB [artist_db]> SELECT * FROM art_board_list;

+------+------------------------+-----------+---------------------+
| b_no | b_subject              | u_name    | reg_date            |
+------+------------------------+-----------+---------------------+
|    1 | 핫뉴스~!!              | 박보검    | 2023-02-08 02:31:57 |
|    2 | 하이염~!               | 김수현    | 2023-02-08 02:31:57 |
|    3 | 안녕하세요             | 박해진    | 2023-02-08 02:31:57 |
|    4 | 혜교예요~              | 송혜교    | 2023-02-08 02:31:57 |
|    5 | 꼭 읽어주세요~!!       | 박해진    | 2023-02-08 02:31:57 |
+------+------------------------+-----------+---------------------+
5 rows in set (0.00 sec)

원본 테이블에 데이터를 추가한다.
MariaDB [artist_db]> INSERT INTO art_board VALUES(NULL, 'parkbo', '보영임당~', '겸둥이보영이에여~!', now());
Query OK, 1 row affected (0.00 sec)

원본 테이블에 데이터를 추가하면 뷰에서도 동일하게 출력된다.
MariaDB [artist_db]> SELECT * FROM art_board_list;

+------+------------------------+-----------+---------------------+
| b_no | b_subject              | u_name    | reg_date            |
+------+------------------------+-----------+---------------------+
|    1 | 핫뉴스~!!              | 박보검    | 2023-02-08 02:31:57 |
|    2 | 하이염~!               | 김수현    | 2023-02-08 02:31:57 |
|    3 | 안녕하세요             | 박해진    | 2023-02-08 02:31:57 |
|    4 | 혜교예요~              | 송혜교    | 2023-02-08 02:31:57 |
|    5 | 꼭 읽어주세요~!!       | 박해진    | 2023-02-08 02:31:57 |
|    6 | 보영임당~              | 박보영    | 2023-02-08 02:52:05 |
+------+------------------------+-----------+---------------------+
6 rows in set (0.00 sec)

뷰에서 데이터를 추가하면 입력에 제한이 있을 수 있다.
-에러가 발생된다.

MariaDB [artist_db]> INSERT INTO art_board_list VALUES('', '보영임당`', '박보영', now());
ERROR 1394 (HY000): Can not insert into join view 'artist_db.art_board_list' without fields list

뷰 수정
-원본 테이블을 변경한다.

MariaDB [artist_db]> UPDATE art_board set b_subject='[끌올]혜교예요~' WHERE b_no=4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [artist_db]> SELECT * FROM art_board;

+------+---------+------------------------+----------------------------+---------------------+
| b_no | b_id    | b_subject              | b_contents                 | reg_date            |
+------+---------+------------------------+----------------------------+---------------------+
|    1 | bogummy | 핫뉴스~!!              | 보검이왔어요~!!            | 2023-02-08 02:31:57 |
|    2 | ksh     | 하이염~!               | 수현이예요~~               | 2023-02-08 02:31:57 |
|    3 | parkhj  | 안녕하세요             | 반가워요~^^                | 2023-02-08 02:31:57 |
|    4 | hyekyo  | [끌올]혜교예요~        | 혜교이뻐해주세요~          | 2023-02-08 02:31:57 |
|    5 | parkhj  | 꼭 읽어주세요~!!       | 나 좀 멋진듯~?             | 2023-02-08 02:31:57 |
|    6 | parkbo  | 보영임당~              | 겸둥이보영이에여~!         | 2023-02-08 02:52:05 |
+------+---------+------------------------+----------------------------+---------------------+
6 rows in set (0.00 sec)

MariaDB [artist_db]> SELECT * FROM art_board_list;

+------+------------------------+-----------+---------------------+
| b_no | b_subject              | u_name    | reg_date            |
+------+------------------------+-----------+---------------------+
|    1 | 핫뉴스~!!              | 박보검    | 2023-02-08 02:31:57 |
|    2 | 하이염~!               | 김수현    | 2023-02-08 02:31:57 |
|    3 | 안녕하세요             | 박해진    | 2023-02-08 02:31:57 |
|    4 | [끌올]혜교예요~        | 송혜교    | 2023-02-08 02:31:57 |
|    5 | 꼭 읽어주세요~!!       | 박해진    | 2023-02-08 02:31:57 |
|    6 | 보영임당~              | 박보영    | 2023-02-08 02:52:05 |
+------+------------------------+-----------+---------------------+
6 rows in set (0.00 sec)

뷰를 수정한다.
MariaDB [artist_db]> SELECT * FROM art_board_list;

+------+------------------------+-----------+---------------------+
| b_no | b_subject              | u_name    | reg_date            |
+------+------------------------+-----------+---------------------+
|    1 | 핫뉴스~!!              | 박보검    | 2023-02-08 02:31:57 |
|    2 | 하이염~!               | 김수현    | 2023-02-08 02:31:57 |
|    3 | 안녕하세요             | 박해진    | 2023-02-08 02:31:57 |
|    4 | [끌올]혜교예요~        | 송혜교    | 2023-02-08 02:31:57 |
|    5 | 꼭 읽어주세요~!!       | 박해진    | 2023-02-08 02:31:57 |
|    6 | 보영임당~              | 박보영    | 2023-02-08 02:52:05 |
+------+------------------------+-----------+---------------------+
6 rows in set (0.00 sec)

뷰를 이용해서 값을 수정할 수 있다.
MariaDB [artist_db]> UPDATE art_board_list SET b_subject='읽지마세요~!' WHERE b_no=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [artist_db]> SELECT * FROM art_board_list;

+------+-----------------------+-----------+---------------------+
| b_no | b_subject             | u_name    | reg_date            |
+------+-----------------------+-----------+---------------------+
|    1 | 핫뉴스~!!             | 박보검    | 2023-02-08 02:31:57 |
|    2 | 하이염~!              | 김수현    | 2023-02-08 02:31:57 |
|    3 | 안녕하세요            | 박해진    | 2023-02-08 02:31:57 |
|    4 | [끌올]혜교예요~       | 송혜교    | 2023-02-08 02:31:57 |
|    5 | 읽지마세요~!          | 박해진    | 2023-02-08 02:31:57 |
|    6 | 보영임당~             | 박보영    | 2023-02-08 02:52:05 |
+------+-----------------------+-----------+---------------------+
6 rows in set (0.00 sec)

뷰 삭제
생성된 art_board_list 뷰를 삭제한다.
DROP VIEW art_board_list;

실습> 뷰 생성하기

DB: myDB
원본 테이블: pants
뷰이름: pantsView
컬럼: no, name, price

MariaDB [artist_db]> USE myDB

MariaDB [myDB]> DESC pants;

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| no    | int(11)     | NO   | PRI | NULL    | auto_increment |  <-- 뷰 생성 컬럼
| name  | varchar(50) | NO   |     | NULL    |                |  <-- 뷰 생성 컬럼
| price | int(11)     | NO   |     | NULL    |                |  <-- 뷰 생성 컬럼
| color | char(10)    | YES  |     | NULL    |                |
| size  | char(5)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [myDB]> CREATE VIEW pantsView AS SELECT no, name, price FROM pants;
Query OK, 0 rows affected (0.00 sec)

MariaDB [myDB]> DESC pantsView;

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| no    | int(11)     | NO   |     | 0       |       |
| name  | varchar(50) | NO   |     | NULL    |       |
| price | int(11)     | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MariaDB [myDB]> SELECT * FROM pants;

+----+--------------------+-------+-------+------+
| no | name               | price | color | size |
+----+--------------------+-------+-------+------+
|  1 | 데님팬츠           | 21500 | blue  | S    |
|  2 | 코튼펜츠           | 22000 | black | M    |
|  3 | 일자데님           | 23400 | beige | S    |
|  4 | 밴딩팬츠           | 11500 | gray  | L    |
|  5 | 트레이닝팬츠       |  9800 | red   | L    |
+----+--------------------+-------+-------+------+
5 rows in set (0.00 sec)

MariaDB [myDB]> SELECT * FROM pantsView;

+----+--------------------+-------+
| no | name               | price |
+----+--------------------+-------+
|  1 | 데님팬츠           | 21500 |
|  2 | 코튼펜츠           | 22000 |
|  3 | 일자데님           | 23400 |
|  4 | 밴딩팬츠           | 11500 |
|  5 | 트레이닝팬츠       |  9800 |
+----+--------------------+-------+
5 rows in set (0.00 sec)

실습> 뷰 생성하기

원본 테이블: pants, top
뷰이름: pantsTop
컬럼:
-pants: no, name, price
-top: no, name, price

1. 원본 테이블 확인

MariaDB [myDB]> SELECT * FROM pants;

+----+--------------------+-------+-------+------+
| no | name               | price | color | size |
+----+--------------------+-------+-------+------+
|  1 | 데님팬츠           | 21500 | blue  | S    |
|  2 | 코튼펜츠           | 22000 | black | M    |
|  3 | 일자데님           | 23400 | beige | S    |
|  4 | 밴딩팬츠           | 11500 | gray  | L    |
|  5 | 트레이닝팬츠       |  9800 | red   | L    |
+----+--------------------+-------+-------+------+
5 rows in set (0.00 sec)

MariaDB [myDB]> SELECT * FROM top;

+----+--------------+-------+-------+------+
| no | name         | price | color | size |
+----+--------------+-------+-------+------+
|  1 | 기본티       |  6900 | white | M    |
|  2 | 맨투맨       | 26000 | black | M    |
|  3 | 후드티       | 23000 | red   | L    |
|  4 | 니트         | 17900 | beige | S    |
|  5 | 후드집업     | 37000 | yello | L    |
+----+--------------+-------+-------+------+
5 rows in set (0.00 sec)

2. 뷰 생성

CREATE VIEW pantsTop
AS
SELECT no, name, price FROM pants
UNION
SELECT no, name, price FROM top;

MariaDB [myDB]> SHOW CREATE VIEW pantsTop\G

*************************** 1. row ***************************
                View: pantsTop
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `pantsTop` AS select `pants`.`no` AS `no`,`pants`.`name` AS `name`,`pants`.`price` AS `price` from `pants` union select `top`.`no` AS `no`,`top`.`name` AS `name`,`top`.`price` AS `price` from `top`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

MariaDB [myDB]> DESC pantsTop;

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| no    | int(11)     | NO   |     | 0       |       |
| name  | varchar(50) | NO   |     |         |       |
| price | int(11)     | NO   |     | 0       |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

3. 뷰 확인

MariaDB [myDB]> SELECT * FROM pantsTop;

+----+--------------------+-------+
| no | name               | price |
+----+--------------------+-------+
|  1 | 데님팬츠           | 21500 |
|  2 | 코튼펜츠           | 22000 |
|  3 | 일자데님           | 23400 |
|  4 | 밴딩팬츠           | 11500 |
|  5 | 트레이닝팬츠       |  9800 |
|  1 | 기본티             |  6900 |
|  2 | 맨투맨             | 26000 |
|  3 | 후드티             | 23000 |
|  4 | 니트               | 17900 |
|  5 | 후드집업           | 37000 |
+----+--------------------+-------+
10 rows in set (0.00 sec)











#########
📌 변수 📌
#########

MariaDB [myDB]> SET @name='길동이', @age=20;
Query OK, 0 rows affected (0.00 sec)

MariaDB [myDB]> SELECT @name;

+-----------+
| @name     |
+-----------+
| 길동이    |
+-----------+
1 row in set (0.00 sec)

MariaDB [myDB]> SELECT @name, @age;

+-----------+------+
| @name     | @age |
+-----------+------+
| 길동이    |   20 |
+-----------+------+
1 row in set (0.00 sec)

MariaDB [myDB]> SELECT name;
ERROR 1054 (42S22): Unknown column 'name' in 'field list'
MariaDB [myDB]> SELECT age;
ERROR 1054 (42S22): Unknown column 'age' in 'field list'

MariaDB [myDB]> USE naver_db

Database changed
MariaDB [naver_db]> SET @d_no=1000;
Query OK, 0 rows affected (0.00 sec)

MariaDB [naver_db]> SELECT @d_no;

+-------+
| @d_no |
+-------+
|  1000 |
+-------+
1 row in set (0.00 sec)

MariaDB [naver_db]> SELECT no, name, age FROM member;

+----+--------------+------+
| no | name         | age  |
+----+--------------+------+
|  1 | 황영주       |   35 |
|  2 | 설기형       |   33 |
|  3 | 박철호       |   34 |
|  4 | 이상훈       |   32 |
|  5 | 장영숙       |   24 |
|  6 | 배용진       |   30 |
|  7 | 박혜빈       |   22 |
|  8 | 김문수       |   63 |
|  9 | 차범길       |   49 |
| 10 | 김길수       |   54 |
| 11 | 김수련       |   23 |
| 12 | 이성현       |   36 |
| 13 | 정한나       |   58 |
| 14 | 이명연       |   33 |
| 15 | 김영숙       |   53 |
| 16 | 케이         |   17 |
| 17 | 케이유저     |   20 |
+----+--------------+------+
17 rows in set (0.01 sec)

MariaDB [naver_db]> SELECT @d_no + no, name, age FROM member;

+------------+--------------+------+
| @d_no + no | name         | age  |
+------------+--------------+------+
|       1001 | 황영주       |   35 |
|       1002 | 설기형       |   33 |
|       1003 | 박철호       |   34 |
|       1004 | 이상훈       |   32 |
|       1005 | 장영숙       |   24 |
|       1006 | 배용진       |   30 |
|       1007 | 박혜빈       |   22 |
|       1008 | 김문수       |   63 |
|       1009 | 차범길       |   49 |
|       1010 | 김길수       |   54 |
|       1011 | 김수련       |   23 |
|       1012 | 이성현       |   36 |
|       1013 | 정한나       |   58 |
|       1014 | 이명연       |   33 |
|       1015 | 김영숙       |   53 |
|       1016 | 케이         |   17 |
|       1017 | 케이유저     |   20 |
+------------+--------------+------+
17 rows in set (0.00 sec)

: 이 생략이 되었기 때문에 연산이 안된다.
MariaDB [naver_db]> SELECT @v_no = @d_no + no, name, age FROM member;

+--------------------+--------------+------+
| @v_no = @d_no + no | name         | age  |
+--------------------+--------------+------+
|               NULL | 황영주       |   35 |
|               NULL | 설기형       |   33 |
|               NULL | 박철호       |   34 |
|               NULL | 이상훈       |   32 |
|               NULL | 장영숙       |   24 |
|               NULL | 배용진       |   30 |
|               NULL | 박혜빈       |   22 |
|               NULL | 김문수       |   63 |
|               NULL | 차범길       |   49 |
|               NULL | 김길수       |   54 |
|               NULL | 김수련       |   23 |
|               NULL | 이성현       |   36 |
|               NULL | 정한나       |   58 |
|               NULL | 이명연       |   33 |
|               NULL | 김영숙       |   53 |
|               NULL | 케이         |   17 |
|               NULL | 케이유저     |   20 |
+--------------------+--------------+------+
17 rows in set (0.00 sec)

: 이 들어가 있기 때문에 연산이 된다.
MariaDB [naver_db]> SELECT @v_no := @d_no + no, name, age FROM member;

+---------------------+--------------+------+
| @v_no := @d_no + no | name         | age  |
+---------------------+--------------+------+
|                1001 | 황영주       |   35 |
|                1002 | 설기형       |   33 |
|                1003 | 박철호       |   34 |
|                1004 | 이상훈       |   32 |
|                1005 | 장영숙       |   24 |
|                1006 | 배용진       |   30 |
|                1007 | 박혜빈       |   22 |
|                1008 | 김문수       |   63 |
|                1009 | 차범길       |   49 |
|                1010 | 김길수       |   54 |
|                1011 | 김수련       |   23 |
|                1012 | 이성현       |   36 |
|                1013 | 정한나       |   58 |
|                1014 | 이명연       |   33 |
|                1015 | 김영숙       |   53 |
|                1016 | 케이         |   17 |
|                1017 | 케이유저     |   20 |
+---------------------+--------------+------+
17 rows in set (0.00 sec)

MariaDB [naver_db]> SELECT @v_no;

+-------+
| @v_no |
+-------+
|  1017 |
+-------+
1 row in set (0.00 sec)

MariaDB [naver_db]> SELECT @v_no := @d_no + no as number, name, age FROM member;

+--------+--------------+------+
| number | name         | age  |
+--------+--------------+------+
|   1001 | 황영주       |   35 |
|   1002 | 설기형       |   33 |
|   1003 | 박철호       |   34 |
|   1004 | 이상훈       |   32 |
|   1005 | 장영숙       |   24 |
|   1006 | 배용진       |   30 |
|   1007 | 박혜빈       |   22 |
|   1008 | 김문수       |   63 |
|   1009 | 차범길       |   49 |
|   1010 | 김길수       |   54 |
|   1011 | 김수련       |   23 |
|   1012 | 이성현       |   36 |
|   1013 | 정한나       |   58 |
|   1014 | 이명연       |   33 |
|   1015 | 김영숙       |   53 |
|   1016 | 케이         |   17 |
|   1017 | 케이유저     |   20 |
+--------+--------------+------+
17 rows in set (0.00 sec)

MariaDB [naver_db]> SELECT 1,2,3;

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
1 row in set (0.00 sec)

MariaDB [naver_db]> SELECT 1 as c1,2 as c2,3 as c3;

+----+----+----+
| c1 | c2 | c3 |
+----+----+----+
|  1 |  2 |  3 |
+----+----+----+
1 row in set (0.00 sec)

###############
📌 저장 프로시저 📌
###############

구분자를 // 설정한 경우
; 은 SQL문의 끝이 아니므로 // 로 SQL문을 끝내야 한다.

MariaDB [naver_db]> DELIMITER //
MariaDB [naver_db]> SHOW TABLES;  
    -> 
    -> //
+--------------------+
| Tables_in_naver_db |
+--------------------+
| member             |
| t1                 |
| t2                 |
| test1              |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [naver_db]> DELIMITER ;
MariaDB [naver_db]> SHOW TABLES;

+--------------------+
| Tables_in_naver_db |
+--------------------+
| member             |
| t1                 |
| t2                 |
| test1              |
+--------------------+
4 rows in set (0.00 sec)

실습> 프로시저 생성하기

USE naver_db

-- 프로시저 생성
DELIMITER //
CREATE PROCEDURE selectMember()
BEGIN
-- member 테이블을 조회한다.
SELECT * FROM member;
END //
DELIMITER ;

-- 프로시저 목록 확인
SHOW PROCEDURE STATUS\G

-- 특정 프로시저 확인
SHOW CREATE PROCEDURE selectMember\G

-- 프로시저 실행
-- 형식: CALL 프로시저명(), CALL 프로시저명
CALL selectMember();
CALL selectMember;

-- 프로시저 삭제
-- 형식: DROP PROCEDURE 프로시저명

profile
정보보안 전문가

0개의 댓글