2020-10-27 TIL

56 minute read

sql - https://mariadb.com/kb/en/documentation/

projection

  • 특정 컬럼의 값만 조회하는 것.
  • select no, name, tel from test1;
MariaDB [studydb]> select no, name, tel from test1;
+----+------+------+
| no | name | tel  |
+----+------+------+
|  1 | aaa  | NULL |
|  2 | bbb  | NULL |
|  3 | ccc  | NULL |
|  4 | ddd  | NULL |
|  5 | eee  | NULL |
|  6 | kkk  | NULL |
|  7 | lll  | NULL |
|  8 | mmm  | NULL |
|  9 | nnn  | NULL |
| 10 | ooo  | NULL |
+----+------+------+
10 rows in set (0.000 sec)

가상의 컬럼 값을 조회하기

  • select no, concat(name,’(‘,class,’)’) from test1;
MariaDB [studydb]> select no, concat(name,'(',class,')') from test1;
+----+----------------------------+
| no | concat(name,'(',class,')') |
+----+----------------------------+
|  1 | aaa(java100)               |
|  2 | bbb(java100)               |
|  3 | ccc(java100)               |
|  4 | ddd(java100)               |
|  5 | eee(java100)               |
|  6 | kkk(java101)               |
|  7 | lll(java101)               |
|  8 | mmm(java101)               |
|  9 | nnn(java101)               |
| 10 | ooo(java101)               |
+----+----------------------------+
10 rows in set (0.002 sec)

조회하는 컬럼에 별명 붙이기

  • 별명을 붙이지 않으면 원래의 컬럼명이 조회 결과의 컬럼이름으로 사용된다.
  • 위의 예제처럼 복잡한 식으로 표현한 컬럼인 경우 컬럼명도 그 식이 된다.
  • 이런 경우 별명을 붙이면 조회 결과를 보기 쉽다.
  • as 생략 가능
MariaDB [studydb]> select 
    ->     no as num, 
    ->     concat(name,'(',class,')') as title 
    -> from test1; 
+-----+--------------+
| num | title        |
+-----+--------------+
|   1 | aaa(java100) |
|   2 | bbb(java100) |
|   3 | ccc(java100) |
|   4 | ddd(java100) |
|   5 | eee(java100) |
|   6 | kkk(java101) |
|   7 | lll(java101) |
|   8 | mmm(java101) |
|   9 | nnn(java101) |
|  10 | ooo(java101) |
+-----+--------------+
10 rows in set (0.002 sec)

조회할 때 조건 지정하기

  • where 절과 연산자를 이용하여 조회 조건을 지정할 수 있다.
  • 이렇게 조건을 지정하여 결과를 선택하는 것을 “셀렉션(selection)” 이라 한다.
MariaDB [studydb]> select * 
    -> from test1
    -> where no > 5;
+----+------+---------+---------+------+
| no | name | class   | working | tel  |
+----+------+---------+---------+------+
|  6 | kkk  | java101 | N       | NULL |
|  7 | lll  | java101 | Y       | NULL |
|  8 | mmm  | java101 | N       | NULL |
|  9 | nnn  | java101 | Y       | NULL |
| 10 | ooo  | java101 | N       | NULL |
+----+------+---------+---------+------+
5 rows in set (0.005 sec)

연산자 OR, AND, NOT

  • OR : 두 조건 중에 참인 것이 있으면 조회 결과에 포함시킨다.
  • AND : 두 조건 모두 참일 때만 조회 결과에 포함시킨다.
  • NOT : 조건에 일치하지 않을 때만 결과에 포함시킨다.
MariaDB [studydb]> select * from test1;
+----+------+---------+---------+------+
| no | name | class   | working | tel  |
+----+------+---------+---------+------+
|  1 | aaa  | java100 | Y       | NULL |
|  2 | bbb  | java100 | N       | NULL |
|  3 | ccc  | java100 | Y       | NULL |
|  4 | ddd  | java100 | N       | NULL |
|  5 | eee  | java100 | Y       | NULL |
|  6 | kkk  | java101 | N       | NULL |
|  7 | lll  | java101 | Y       | NULL |
|  8 | mmm  | java101 | N       | NULL |
|  9 | nnn  | java101 | Y       | NULL |
| 10 | ooo  | java101 | N       | NULL |
+----+------+---------+---------+------+
10 rows in set (0.000 sec)

or

MariaDB [studydb]> select no, name, class, working
    -> from test1
    -> where working='Y' or class='java100';
+----+------+---------+---------+
| no | name | class   | working |
+----+------+---------+---------+
|  1 | aaa  | java100 | Y       |
|  2 | bbb  | java100 | N       |
|  3 | ccc  | java100 | Y       |
|  4 | ddd  | java100 | N       |
|  5 | eee  | java100 | Y       |
|  7 | lll  | java101 | Y       |
|  9 | nnn  | java101 | Y       |
+----+------+---------+---------+
7 rows in set (0.000 sec)

and

MariaDB [studydb]> select no, name, class, working
    -> from test1
    -> where working='Y' and class='java100';
+----+------+---------+---------+
| no | name | class   | working |
+----+------+---------+---------+
|  1 | aaa  | java100 | Y       |
|  3 | ccc  | java100 | Y       |
|  5 | eee  | java100 | Y       |
+----+------+---------+---------+
3 rows in set (0.002 sec)
  • 실행 순서 주의
/* 주의!
 * where 절을 통해 결과 데이터를 먼저 선택(selection)한 다음 
 * 결과 데이터에서 가져올 컬럼을 선택(projection)한다.
 * 따라서 실행 순서는:
 * from ==> where ==> select 
 */
 MariaDB [studydb]> select no, name
    -> from test1
    -> where working='Y' and class='java100';
+----+------+
| no | name |
+----+------+
|  1 | aaa  |
|  3 | ccc  |
|  5 | eee  |
+----+------+
3 rows in set (0.000 sec)

not

MariaDB [studydb]> select no, name, class, working
    -> from test1
    -> where not working = 'Y';
+----+------+---------+---------+
| no | name | class   | working |
+----+------+---------+---------+
|  2 | bbb  | java100 | N       |
|  4 | ddd  | java100 | N       |
|  6 | kkk  | java101 | N       |
|  8 | mmm  | java101 | N       |
| 10 | ooo  | java101 | N       |
+----+------+---------+---------+
5 rows in set (0.000 sec)
MariaDB [studydb]> select no, name, class, working
    -> from test1
    -> where working != 'Y';
+----+------+---------+---------+
| no | name | class   | working |
+----+------+---------+---------+
|  2 | bbb  | java100 | N       |
|  4 | ddd  | java100 | N       |
|  6 | kkk  | java101 | N       |
|  8 | mmm  | java101 | N       |
| 10 | ooo  | java101 | N       |
+----+------+---------+---------+
5 rows in set (0.000 sec)
MariaDB [studydb]> select no, name, class, working
    -> from test1
    -> where working <> 'Y';
+----+------+---------+---------+
| no | name | class   | working |
+----+------+---------+---------+
|  2 | bbb  | java100 | N       |
|  4 | ddd  | java100 | N       |
|  6 | kkk  | java101 | N       |
|  8 | mmm  | java101 | N       |
| 10 | ooo  | java101 | N       |
+----+------+---------+---------+
5 rows in set (0.000 sec)

%

MariaDB [studydb]> update test1 set 
    ->     tel = '1111'
    -> where (no % 2) = 0;
Query OK, 5 rows affected (0.006 sec)
Rows matched: 5  Changed: 5  Warnings: 0

MariaDB [studydb]> select * from test1;
+----+------+---------+---------+------+
| no | name | class   | working | tel  |
+----+------+---------+---------+------+
|  1 | aaa  | java100 | Y       | NULL |
|  2 | bbb  | java100 | N       | 1111 |
|  3 | ccc  | java100 | Y       | NULL |
|  4 | ddd  | java100 | N       | 1111 |
|  5 | eee  | java100 | Y       | NULL |
|  6 | kkk  | java101 | N       | 1111 |
|  7 | lll  | java101 | Y       | NULL |
|  8 | mmm  | java101 | N       | 1111 |
|  9 | nnn  | java101 | Y       | NULL |
| 10 | ooo  | java101 | N       | 1111 |
+----+------+---------+---------+------+
10 rows in set (0.000 sec)
MariaDB [studydb]> update test1 set
    ->   tel = '2222'
    -> where (no % 3) = 0;
Query OK, 3 rows affected (0.001 sec)
Rows matched: 3  Changed: 3  Warnings: 0

MariaDB [studydb]> select * from test1;
+----+------+---------+---------+------+
| no | name | class   | working | tel  |
+----+------+---------+---------+------+
|  1 | aaa  | java100 | Y       | NULL |
|  2 | bbb  | java100 | N       | 1111 |
|  3 | ccc  | java100 | Y       | 2222 |
|  4 | ddd  | java100 | N       | 1111 |
|  5 | eee  | java100 | Y       | NULL |
|  6 | kkk  | java101 | N       | 2222 |
|  7 | lll  | java101 | Y       | NULL |
|  8 | mmm  | java101 | N       | 1111 |
|  9 | nnn  | java101 | Y       | 2222 |
| 10 | ooo  | java101 | N       | 1111 |
+----+------+---------+---------+------+
10 rows in set (0.002 sec)

is, is not (null에 사용)

MariaDB [studydb]> select *
    -> from test1
    -> where tel != null; 
Empty set (0.002 sec)

MariaDB [studydb]> select *
    -> from test1
    -> where tel is not null;
+----+------+---------+---------+------+
| no | name | class   | working | tel  |
+----+------+---------+---------+------+
|  2 | bbb  | java100 | N       | 1111 |
|  3 | ccc  | java100 | Y       | 2222 |
|  4 | ddd  | java100 | N       | 1111 |
|  6 | kkk  | java101 | N       | 2222 |
|  8 | mmm  | java101 | N       | 1111 |
|  9 | nnn  | java101 | Y       | 2222 |
| 10 | ooo  | java101 | N       | 1111 |
+----+------+---------+---------+------+
7 rows in set (0.000 sec)

사칙연산

  • +, -, *, /, % 연산자를 사용할 수 있다.
MariaDB [studydb]> select (4 + 5), (4 - 5), (4 * 5), (4 / 5), (4 % 5);
+---------+---------+---------+---------+---------+
| (4 + 5) | (4 - 5) | (4 * 5) | (4 / 5) | (4 % 5) |
+---------+---------+---------+---------+---------+
|       9 |      -1 |      20 |  0.8000 |       4 |
+---------+---------+---------+---------+---------+
1 row in set (0.003 sec)

비교연산

  • =, !=, >, >=, <, <=, <>
MariaDB [studydb]> select (4=5), (4!=5), (4>5), (4>=5), (4<5), (4<=5), (4<>5);
+-------+--------+-------+--------+-------+--------+--------+
| (4=5) | (4!=5) | (4>5) | (4>=5) | (4<5) | (4<=5) | (4<>5) |
+-------+--------+-------+--------+-------+--------+--------+
|     0 |      1 |     0 |      0 |     1 |      1 |      1 |
+-------+--------+-------+--------+-------+--------+--------+
1 row in set (0.000 sec)

between 값1 and 값2

  • 두 값 사이(두 값도 포함)에 있는지 검사한다.
  • 1 은 true
MariaDB [studydb]> select 5 between 3 and 5;
+-------------------+
| 5 between 3 and 5 |
+-------------------+
|                 1 |
+-------------------+
1 row in set (0.002 sec)

like

  • 문자열을 비교할 때 사용한다.
MariaDB [studydb]> select * from test1;
+----+------+----------+---------+------+
| no | name | class    | working | tel  |
+----+------+----------+---------+------+
|  1 | aaa  | java100  | Y       | NULL |
|  2 | bbb  | java100  | N       | 1111 |
|  3 | ccc  | java100  | Y       | 2222 |
|  4 | ddd  | java100  | N       | 1111 |
|  5 | eee  | java100  | Y       | NULL |
|  6 | kkk  | java101  | N       | 2222 |
|  7 | lll  | java101  | Y       | NULL |
|  8 | mmm  | java101  | N       | 1111 |
|  9 | nnn  | java101  | Y       | 2222 |
| 10 | ooo  | java101  | N       | 1111 |
| 11 | xxx  | window27 | 1       | NULL |
| 12 | yyy  | window27 | 0       | NULL |
| 13 | zzz  | window28 | 1       | NULL |
| 14 | qqq  | window28 | 0       | NULL |
| 15 | s01  | javawin1 | 1       | NULL |
| 16 | s02  | javawin1 | 0       | NULL |
| 17 | s03  | javawin1 | 0       | NULL |
| 18 | s04  | iotjava5 | 1       | NULL |
| 19 | s05  | iotjava5 | 0       | NULL |
| 20 | s06  | iotjava5 | 0       | NULL |
| 21 | s011 | iotjava5 | 1       | NULL |
| 22 | s012 | iotjava5 | 1       | NULL |
| 23 | s013 | iotjava5 | 1       | NULL |
+----+------+----------+---------+------+
23 rows in set (0.000 sec)
  • if 문
  • https://mariadb.com/kb/en/if-function/
MariaDB [studydb]> update test1 set working=if(working='Y','1','0') where working = 'Y' or working = 'N';
Query OK, 10 rows affected (0.002 sec)
Rows matched: 10  Changed: 10  Warnings: 0

MariaDB [studydb]> select * from test1;
+----+------+----------+---------+------+
| no | name | class    | working | tel  |
+----+------+----------+---------+------+
|  1 | aaa  | java100  | 1       | NULL |
|  2 | bbb  | java100  | 0       | 1111 |
|  3 | ccc  | java100  | 1       | 2222 |
|  4 | ddd  | java100  | 0       | 1111 |
|  5 | eee  | java100  | 1       | NULL |
|  6 | kkk  | java101  | 0       | 2222 |
|  7 | lll  | java101  | 1       | NULL |
|  8 | mmm  | java101  | 0       | 1111 |
|  9 | nnn  | java101  | 1       | 2222 |
| 10 | ooo  | java101  | 0       | 1111 |
| 11 | xxx  | window27 | 1       | NULL |
| 12 | yyy  | window27 | 0       | NULL |
| 13 | zzz  | window28 | 1       | NULL |
| 14 | qqq  | window28 | 0       | NULL |
| 15 | s01  | javawin1 | 1       | NULL |
| 16 | s02  | javawin1 | 0       | NULL |
| 17 | s03  | javawin1 | 0       | NULL |
| 18 | s04  | iotjava5 | 1       | NULL |
| 19 | s05  | iotjava5 | 0       | NULL |
| 20 | s06  | iotjava5 | 0       | NULL |
| 21 | s011 | iotjava5 | 1       | NULL |
| 22 | s012 | iotjava5 | 1       | NULL |
| 23 | s013 | iotjava5 | 1       | NULL |
+----+------+----------+---------+------+
23 rows in set (0.000 sec)
  • java로 시작하는 모든 학생 조회
  • % : 0개 이상의 문자
MariaDB [studydb]> select *
    -> from test1
    -> where class like 'java%';
+----+------+----------+---------+------+
| no | name | class    | working | tel  |
+----+------+----------+---------+------+
|  1 | aaa  | java100  | 1       | NULL |
|  2 | bbb  | java100  | 0       | 1111 |
|  3 | ccc  | java100  | 1       | 2222 |
|  4 | ddd  | java100  | 0       | 1111 |
|  5 | eee  | java100  | 1       | NULL |
|  6 | kkk  | java101  | 0       | 2222 |
|  7 | lll  | java101  | 1       | NULL |
|  8 | mmm  | java101  | 0       | 1111 |
|  9 | nnn  | java101  | 1       | 2222 |
| 10 | ooo  | java101  | 0       | 1111 |
| 15 | s01  | javawin1 | 1       | NULL |
| 16 | s02  | javawin1 | 0       | NULL |
| 17 | s03  | javawin1 | 0       | NULL |
+----+------+----------+---------+------+
13 rows in set (0.002 sec)
  • class 이름에 java를 포함한 모든 학생 조회하기
MariaDB [studydb]> select *
    -> from test1
    -> where class like '%java%';
+----+------+----------+---------+------+
| no | name | class    | working | tel  |
+----+------+----------+---------+------+
|  1 | aaa  | java100  | 1       | NULL |
|  2 | bbb  | java100  | 0       | 1111 |
|  3 | ccc  | java100  | 1       | 2222 |
|  4 | ddd  | java100  | 0       | 1111 |
|  5 | eee  | java100  | 1       | NULL |
|  6 | kkk  | java101  | 0       | 2222 |
|  7 | lll  | java101  | 1       | NULL |
|  8 | mmm  | java101  | 0       | 1111 |
|  9 | nnn  | java101  | 1       | 2222 |
| 10 | ooo  | java101  | 0       | 1111 |
| 15 | s01  | javawin1 | 1       | NULL |
| 16 | s02  | javawin1 | 0       | NULL |
| 17 | s03  | javawin1 | 0       | NULL |
| 18 | s04  | iotjava5 | 1       | NULL |
| 19 | s05  | iotjava5 | 0       | NULL |
| 20 | s06  | iotjava5 | 0       | NULL |
| 21 | s011 | iotjava5 | 1       | NULL |
| 22 | s012 | iotjava5 | 1       | NULL |
| 23 | s013 | iotjava5 | 1       | NULL |
+----+------+----------+---------+------+
19 rows in set (0.000 sec)
  • 101 로 끝나는 반의 모든 학생
MariaDB [studydb]> select *
    -> from test1
    -> where class like '%101';
+----+------+---------+---------+------+
| no | name | class   | working | tel  |
+----+------+---------+---------+------+
|  6 | kkk  | java101 | 0       | 2222 |
|  7 | lll  | java101 | 1       | NULL |
|  8 | mmm  | java101 | 0       | 1111 |
|  9 | nnn  | java101 | 1       | 2222 |
| 10 | ooo  | java101 | 0       | 1111 |
+----+------+---------+---------+------+
5 rows in set (0.000 sec)
  • 이름이 s 로 시작하는 학생 전부
MariaDB [studydb]> select *
    -> from test1
    -> where name like 's0%';
+----+------+----------+---------+------+
| no | name | class    | working | tel  |
+----+------+----------+---------+------+
| 15 | s01  | javawin1 | 1       | NULL |
| 16 | s02  | javawin1 | 0       | NULL |
| 17 | s03  | javawin1 | 0       | NULL |
| 18 | s04  | iotjava5 | 1       | NULL |
| 19 | s05  | iotjava5 | 0       | NULL |
| 20 | s06  | iotjava5 | 0       | NULL |
| 21 | s011 | iotjava5 | 1       | NULL |
| 22 | s012 | iotjava5 | 1       | NULL |
| 23 | s013 | iotjava5 | 1       | NULL |
+----+------+----------+---------+------+
9 rows in set (0.000 sec)
  • 이름이 s 로 시작하는 세자인 학생 전부
MariaDB [studydb]> select *
    -> from test1
    -> where name like 's0_';
+----+------+----------+---------+------+
| no | name | class    | working | tel  |
+----+------+----------+---------+------+
| 15 | s01  | javawin1 | 1       | NULL |
| 16 | s02  | javawin1 | 0       | NULL |
| 17 | s03  | javawin1 | 0       | NULL |
| 18 | s04  | iotjava5 | 1       | NULL |
| 19 | s05  | iotjava5 | 0       | NULL |
| 20 | s06  | iotjava5 | 0       | NULL |
+----+------+----------+---------+------+
6 rows in set (0.001 sec)

날짜

  • 날짜 함수와 문자열 함수를 사용하여 날짜 값을 다루는 방법.
  • text : 약 육만오천자 가능?
  • datetime 은 시간도 저장
MariaDB [studydb]> select * from test1;
+----+-------+---------+---------------------+
| no | title | content | regdt               |
+----+-------+---------+---------------------+
|  1 | aaaa  | NULL    | 2017-01-27 00:00:00 |
|  2 | bbbb  | NULL    | 2017-02-02 00:00:00 |
|  3 | cccc  | NULL    | 2017-02-13 00:00:00 |
|  4 | dddd  | NULL    | 2017-03-02 00:00:00 |
|  5 | eeee  | NULL    | 2017-04-15 00:00:00 |
|  6 | ffff  | NULL    | 2017-06-07 00:00:00 |
|  7 | gggg  | NULL    | 2017-06-17 00:00:00 |
|  8 | hhhh  | NULL    | 2017-06-27 00:00:00 |
|  9 | iiii  | NULL    | 2017-09-05 00:00:00 |
| 10 | jjjj  | NULL    | 2017-10-12 00:00:00 |
| 11 | kkkk  | NULL    | 2017-11-22 00:00:00 |
| 12 | llll  | NULL    | 2017-11-24 00:00:00 |
| 13 | mmmm  | NULL    | 2017-12-31 00:00:00 |
+----+-------+---------+---------------------+
13 rows in set (0.000 sec)
/* 특정 날짜의 게시글 찾기 */
MariaDB [studydb]> select * 
    -> from test1
    -> where regdt = '2017-6-17';
+----+-------+---------+---------------------+
| no | title | content | regdt               |
+----+-------+---------+---------------------+
|  7 | gggg  | NULL    | 2017-06-17 00:00:00 |
+----+-------+---------+---------------------+
1 row in set (0.001 sec)
/* 특정 기간의 게시글 조회 */
MariaDB [studydb]> select * 
    -> from test1
    -> where regdt between '2017-11-1' and '2017-12-31';
+----+-------+---------+---------------------+
| no | title | content | regdt               |
+----+-------+---------+---------------------+
| 11 | kkkk  | NULL    | 2017-11-22 00:00:00 |
| 12 | llll  | NULL    | 2017-11-24 00:00:00 |
| 13 | mmmm  | NULL    | 2017-12-31 00:00:00 |
+----+-------+---------+---------------------+
3 rows in set (0.000 sec)

MariaDB [studydb]> select * 
    -> from test1
    -> where regdt >= '2017-11-1' and regdt <= '2017-12-31';
+----+-------+---------+---------------------+
| no | title | content | regdt               |
+----+-------+---------+---------------------+
| 11 | kkkk  | NULL    | 2017-11-22 00:00:00 |
| 12 | llll  | NULL    | 2017-11-24 00:00:00 |
| 13 | mmmm  | NULL    | 2017-12-31 00:00:00 |
+----+-------+---------+---------------------+
3 rows in set (0.000 sec)

날짜를 다루는 연산자와 함수

  • 현재 날짜 및 시간 알아내기
MariaDB [studydb]> select now();
+---------------------+
| now()               |
+---------------------+
| 2020-10-27 11:02:38 |
+---------------------+
1 row in set (0.000 sec)
  • 현재 날짜 알아내기
MariaDB [studydb]> select curdate();
+------------+
| curdate()  |
+------------+
| 2020-10-27 |
+------------+
1 row in set (0.002 sec)
  • 현재 시간 알아내기
MariaDB [studydb]> select curtime();
+-----------+
| curtime() |
+-----------+
| 11:05:06  |
+-----------+
1 row in set (0.000 sec)
  • 주어진 날짜, 시간에서 날짜만 뽑거나 시간만 뽑기
MariaDB [studydb]> select regdt, date(regdt), time(regdt) from test1;
+---------------------+-------------+-------------+
| regdt               | date(regdt) | time(regdt) |
+---------------------+-------------+-------------+
| 2017-01-27 00:00:00 | 2017-01-27  | 00:00:00    |
| 2017-02-02 00:00:00 | 2017-02-02  | 00:00:00    |
| 2017-02-13 00:00:00 | 2017-02-13  | 00:00:00    |
| 2017-03-02 00:00:00 | 2017-03-02  | 00:00:00    |
| 2017-04-15 00:00:00 | 2017-04-15  | 00:00:00    |
| 2017-06-07 00:00:00 | 2017-06-07  | 00:00:00    |
| 2017-06-17 00:00:00 | 2017-06-17  | 00:00:00    |
| 2017-06-27 00:00:00 | 2017-06-27  | 00:00:00    |
| 2017-09-05 00:00:00 | 2017-09-05  | 00:00:00    |
| 2017-10-12 00:00:00 | 2017-10-12  | 00:00:00    |
| 2017-11-22 00:00:00 | 2017-11-22  | 00:00:00    |
| 2017-11-24 00:00:00 | 2017-11-24  | 00:00:00    |
| 2017-12-31 00:00:00 | 2017-12-31  | 00:00:00    |
+---------------------+-------------+-------------+
13 rows in set (0.002 sec)
  • 특정 날짜에 시,분,초,일,월,년을 추가하거나 빼기
  • now(지금의 날짜)에 interval 11(숫자) day(일 / 일, 월, 년 가능)
MariaDB [studydb]> select date_add(now(), interval 11 day);
+----------------------------------+
| date_add(now(), interval 11 day) |
+----------------------------------+
| 2020-11-07 11:06:27              |
+----------------------------------+
1 row in set (0.001 sec)

MariaDB [studydb]> select date_sub(now(), interval 11 day);
+----------------------------------+
| date_sub(now(), interval 11 day) |
+----------------------------------+
| 2020-10-16 11:06:34              |
+----------------------------------+
1 row in set (0.000 sec)

  • 두 날짜 사이의 간격을 알아내기
MariaDB [studydb]> select datediff(curdate(), '2018-3-19');
+----------------------------------+
| datediff(curdate(), '2018-3-19') |
+----------------------------------+
|                              953 |
+----------------------------------+
1 row in set (0.001 sec)
  • 날짜에서 특정 형식으로 값을 추출하기
MariaDB [studydb]> select regdt, date_format(regdt, '%m/%e/%Y') from test1;
+---------------------+--------------------------------+
| regdt               | date_format(regdt, '%m/%e/%Y') |
+---------------------+--------------------------------+
| 2017-01-27 00:00:00 | 01/27/2017                     |
| 2017-02-02 00:00:00 | 02/2/2017                      |
| 2017-02-13 00:00:00 | 02/13/2017                     |
| 2017-03-02 00:00:00 | 03/2/2017                      |
| 2017-04-15 00:00:00 | 04/15/2017                     |
| 2017-06-07 00:00:00 | 06/7/2017                      |
| 2017-06-17 00:00:00 | 06/17/2017                     |
| 2017-06-27 00:00:00 | 06/27/2017                     |
| 2017-09-05 00:00:00 | 09/5/2017                      |
| 2017-10-12 00:00:00 | 10/12/2017                     |
| 2017-11-22 00:00:00 | 11/22/2017                     |
| 2017-11-24 00:00:00 | 11/24/2017                     |
| 2017-12-31 00:00:00 | 12/31/2017                     |
+---------------------+--------------------------------+
13 rows in set (0.000 sec)

MariaDB [studydb]> select regdt, date_format(regdt, '%M/%e/%y') from test1;
+---------------------+--------------------------------+
| regdt               | date_format(regdt, '%M/%e/%y') |
+---------------------+--------------------------------+
| 2017-01-27 00:00:00 | January/27/17                  |
| 2017-02-02 00:00:00 | February/2/17                  |
| 2017-02-13 00:00:00 | February/13/17                 |
| 2017-03-02 00:00:00 | March/2/17                     |
| 2017-04-15 00:00:00 | April/15/17                    |
| 2017-06-07 00:00:00 | June/7/17                      |
| 2017-06-17 00:00:00 | June/17/17                     |
| 2017-06-27 00:00:00 | June/27/17                     |
| 2017-09-05 00:00:00 | September/5/17                 |
| 2017-10-12 00:00:00 | October/12/17                  |
| 2017-11-22 00:00:00 | November/22/17                 |
| 2017-11-24 00:00:00 | November/24/17                 |
| 2017-12-31 00:00:00 | December/31/17                 |
+---------------------+--------------------------------+
13 rows in set (0.000 sec)

/* 일요일 = 0 */
MariaDB [studydb]> select regdt, date_format(regdt, '%W/%w/%a') from test1;
+---------------------+--------------------------------+
| regdt               | date_format(regdt, '%W/%w/%a') |
+---------------------+--------------------------------+
| 2017-01-27 00:00:00 | Friday/5/Fri                   |
| 2017-02-02 00:00:00 | Thursday/4/Thu                 |
| 2017-02-13 00:00:00 | Monday/1/Mon                   |
| 2017-03-02 00:00:00 | Thursday/4/Thu                 |
| 2017-04-15 00:00:00 | Saturday/6/Sat                 |
| 2017-06-07 00:00:00 | Wednesday/3/Wed                |
| 2017-06-17 00:00:00 | Saturday/6/Sat                 |
| 2017-06-27 00:00:00 | Tuesday/2/Tue                  |
| 2017-09-05 00:00:00 | Tuesday/2/Tue                  |
| 2017-10-12 00:00:00 | Thursday/4/Thu                 |
| 2017-11-22 00:00:00 | Wednesday/3/Wed                |
| 2017-11-24 00:00:00 | Friday/5/Fri                   |
| 2017-12-31 00:00:00 | Sunday/0/Sun                   |
+---------------------+--------------------------------+
13 rows in set (0.001 sec)

MariaDB [studydb]> select regdt, date_format(regdt, '%M %b') from test1;
+---------------------+-----------------------------+
| regdt               | date_format(regdt, '%M %b') |
+---------------------+-----------------------------+
| 2017-01-27 00:00:00 | January Jan                 |
| 2017-02-02 00:00:00 | February Feb                |
| 2017-02-13 00:00:00 | February Feb                |
| 2017-03-02 00:00:00 | March Mar                   |
| 2017-04-15 00:00:00 | April Apr                   |
| 2017-06-07 00:00:00 | June Jun                    |
| 2017-06-17 00:00:00 | June Jun                    |
| 2017-06-27 00:00:00 | June Jun                    |
| 2017-09-05 00:00:00 | September Sep               |
| 2017-10-12 00:00:00 | October Oct                 |
| 2017-11-22 00:00:00 | November Nov                |
| 2017-11-24 00:00:00 | November Nov                |
| 2017-12-31 00:00:00 | December Dec                |
+---------------------+-----------------------------+
13 rows in set (0.000 sec)

/* PM 01 13 1 */
MariaDB [studydb]> select regdt, date_format(regdt, '%p %h %H %l') from test1;
+---------------------+-----------------------------------+
| regdt               | date_format(regdt, '%p %h %H %l') |
+---------------------+-----------------------------------+
| 2017-01-27 00:00:00 | AM 12 00 12                       |
| 2017-02-02 00:00:00 | AM 12 00 12                       |
| 2017-02-13 00:00:00 | AM 12 00 12                       |
| 2017-03-02 00:00:00 | AM 12 00 12                       |
| 2017-04-15 00:00:00 | AM 12 00 12                       |
| 2017-06-07 00:00:00 | AM 12 00 12                       |
| 2017-06-17 00:00:00 | AM 12 00 12                       |
| 2017-06-27 00:00:00 | AM 12 00 12                       |
| 2017-09-05 00:00:00 | AM 12 00 12                       |
| 2017-10-12 00:00:00 | AM 12 00 12                       |
| 2017-11-22 00:00:00 | AM 12 00 12                       |
| 2017-11-24 00:00:00 | AM 12 00 12                       |
| 2017-12-31 00:00:00 | AM 12 00 12                       |
+---------------------+-----------------------------------+
13 rows in set (0.000 sec)

/* 분 초 */
MariaDB [studydb]> select regdt, date_format(now(), '%i %s') from test1;
+---------------------+-----------------------------+
| regdt               | date_format(now(), '%i %s') |
+---------------------+-----------------------------+
| 2017-01-27 00:00:00 | 17 27                       |
| 2017-02-02 00:00:00 | 17 27                       |
| 2017-02-13 00:00:00 | 17 27                       |
| 2017-03-02 00:00:00 | 17 27                       |
| 2017-04-15 00:00:00 | 17 27                       |
| 2017-06-07 00:00:00 | 17 27                       |
| 2017-06-17 00:00:00 | 17 27                       |
| 2017-06-27 00:00:00 | 17 27                       |
| 2017-09-05 00:00:00 | 17 27                       |
| 2017-10-12 00:00:00 | 17 27                       |
| 2017-11-22 00:00:00 | 17 27                       |
| 2017-11-24 00:00:00 | 17 27                       |
| 2017-12-31 00:00:00 | 17 27                       |
+---------------------+-----------------------------+
13 rows in set (0.000 sec)
  • 문자열을 날짜 값으로 바꾸기
MariaDB [studydb]> select str_to_date('11/22/2017', '%m/%d/%Y');
+---------------------------------------+
| str_to_date('11/22/2017', '%m/%d/%Y') |
+---------------------------------------+
| 2017-11-22                            |
+---------------------------------------+
1 row in set (0.002 sec)

MariaDB [studydb]> select str_to_date('2017.2.12', '%Y.%m.%d');
+--------------------------------------+
| str_to_date('2017.2.12', '%Y.%m.%d') |
+--------------------------------------+
| 2017-02-12                           |
+--------------------------------------+
1 row in set (0.000 sec)
  • 날짜 값을 저장할 때 기본 형식은 yyyy-MM-dd이다.
MariaDB [studydb]> insert into test1 (title, regdt) values('bbbb', '11/22/2017');
ERROR 1292 (22007): Incorrect datetime value: '11/22/2017' for column `studydb`.`test1`.`regdt` at row 1

MariaDB [studydb]> insert into test1 (title, regdt) 
  values('bbbb', str_to_date('11/22/2017', '%m/%d/%Y'));
Query OK, 1 row affected (0.001 sec)

FK(Foreign Key)

  • 다른 테이블의 PK를 참조하는 컬럼이다.
MariaDB [studydb]> select * from test1;
+----+-------+---------+---------------------+
| no | title | content | rdt                 |
+----+-------+---------+---------------------+
|  1 | aaa   | NULL    | 2020-10-27 11:52:36 |
|  2 | bbb   | NULL    | 2020-10-27 11:52:36 |
|  3 | ccc   | NULL    | 2020-10-27 11:52:36 |
|  4 | ddd   | NULL    | 2020-10-27 11:52:36 |
|  5 | eee   | NULL    | 2020-10-27 11:52:36 |
|  6 | fff   | NULL    | 2020-10-27 11:52:36 |
|  7 | ggg   | NULL    | 2020-10-27 11:52:36 |
|  8 | hhh   | NULL    | 2020-10-27 11:52:36 |
|  9 | iii   | NULL    | 2020-10-27 11:52:36 |
| 10 | jjj   | NULL    | 2020-10-27 11:52:37 |
+----+-------+---------+---------------------+
10 rows in set (0.000 sec)

MariaDB [studydb]> select * from test2;
+-----+-------------------+-----+
| fno | filepath          | bno |
+-----+-------------------+-----+
|   1 | c:/download/a.gif |   1 |
|   2 | c:/download/b.gif |   1 |
|   3 | c:/download/c.gif |   1 |
|   4 | c:/download/d.gif |   5 |
|   5 | c:/download/e.gif |   5 |
|   6 | c:/download/f.gif |  10 |
+-----+-------------------+-----+
6 rows in set (0.000 sec)

FK 제약 조건이 없을 때

  • 첨부파일 데이터를 입력할 때 존재하지 않는 게시물 번호가 들어 갈 수 있다.
  • 그러면 첨부파일 데이터는 무효한 데이타 된다.
  • 존재하지 않는 게시글에 첨부 파일을 인서트 해도 오류가 뜨지 않는다.
MariaDB [studydb]> insert into test2(filepath, bno) values('c:/download/x.gif', 100);
Query OK, 1 row affected (0.001 sec)

MariaDB [studydb]> select * from test2
    -> ;
+-----+-------------------+-----+
| fno | filepath          | bno |
+-----+-------------------+-----+
|   1 | c:/download/a.gif |   1 |
|   2 | c:/download/b.gif |   1 |
|   3 | c:/download/c.gif |   1 |
|   4 | c:/download/d.gif |   5 |
|   5 | c:/download/e.gif |   5 |
|   6 | c:/download/f.gif |  10 |
|   7 | c:/download/x.gif | 100 |
+-----+-------------------+-----+
7 rows in set (0.000 sec)
  • 첨부 파일이 있는 게시물을 삭제할 수 있다.
  • 마찬가지로 해당 게시물을 참조하는 첨부파일 데이터는 무효한 데이터가 된다.
MariaDB [studydb]> delete from test1 where no=1;
Query OK, 1 row affected (0.002 sec)

MariaDB [studydb]> select * from test1;
+----+-------+---------+---------------------+
| no | title | content | rdt                 |
+----+-------+---------+---------------------+
|  2 | bbb   | NULL    | 2020-10-27 11:52:36 |
|  3 | ccc   | NULL    | 2020-10-27 11:52:36 |
|  4 | ddd   | NULL    | 2020-10-27 11:52:36 |
|  5 | eee   | NULL    | 2020-10-27 11:52:36 |
|  6 | fff   | NULL    | 2020-10-27 11:52:36 |
|  7 | ggg   | NULL    | 2020-10-27 11:52:36 |
|  8 | hhh   | NULL    | 2020-10-27 11:52:36 |
|  9 | iii   | NULL    | 2020-10-27 11:52:36 |
| 10 | jjj   | NULL    | 2020-10-27 11:52:37 |
+----+-------+---------+---------------------+
9 rows in set (0.000 sec)

이런 문제가 발생한 이유?

  • 다른 테이블의 데이터를 참조하는 경우, 참조 데이터의 존재 유무를 검사하지 않기 때문이다.
  • 테이블의 데이터를 삭제할 때 다른 테이블이 참조하는지 여부를 검사하지 않기 때문이다.

해결책?

  • 다른 데이터를 참조하는 경우 해당 데이터의 존재 유무를 검사하도록 강제한다.
  • 다른 테이터에 의해 참조되는지 여부를 검사하도록 강제한다.
  • 이것을 가능하게 하는 문법이 “외부키(Foreign Key)” 이다.

FK(foreign key) 제약 조건 설정

  • 다른 테이블의 데이터와 연관된 데이터를 저장할 때 무효한 데이터가 입력되지 않도록 하는 문법이다.
  • 다른 테이블의 데이터가 참조하는 데이터를 임의의 지우지 못하도록 하는 문법이다.
  • 그래서 데이터의 무결성(data integrity; 결함이 없는 상태)을 유지하게 도와주는 문법이다.

  • 다른 테이블의 PK를 참조하는 컬럼으로 선언한다.
  • alter table 테이블명 add constraint 제약조건이름 foreign key (컬럼명) references 테이블명(컬럼명);

  • 참조 당하는 쪽이 부모 테이블, 참조하는 쪽이 자식 테이블.
  • 자식 테이블에는 FK 가 있다.
  • 부모 테이블은 1개와 관계가 있고 자식 테이블은 0개 이상과 관계가 있다.
  • 다이어그램 확인.
MariaDB [studydb]> select * from test1;
+----+-------+---------+---------------------+
| no | title | content | rdt                 |
+----+-------+---------+---------------------+
|  2 | bbb   | NULL    | 2020-10-27 11:52:36 |
|  3 | ccc   | NULL    | 2020-10-27 11:52:36 |
|  4 | ddd   | NULL    | 2020-10-27 11:52:36 |
|  5 | eee   | NULL    | 2020-10-27 11:52:36 |
|  6 | fff   | NULL    | 2020-10-27 11:52:36 |
|  7 | ggg   | NULL    | 2020-10-27 11:52:36 |
|  8 | hhh   | NULL    | 2020-10-27 11:52:36 |
|  9 | iii   | NULL    | 2020-10-27 11:52:36 |
| 10 | jjj   | NULL    | 2020-10-27 11:52:37 |
+----+-------+---------+---------------------+
9 rows in set (0.000 sec)

MariaDB [studydb]> alter table test2
    ->     add constraint test2_bno_fk foreign key (bno) references test1(no);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`studydb`.`#sql-alter-20b-3`, CONSTRAINT `test2_bno_fk` FOREIGN KEY (`bno`) REFERENCES `test1` (`no`))
MariaDB [studydb]> drop table test2;
Query OK, 0 rows affected (0.002 sec)

MariaDB [studydb]> alter table test2
    ->     add constraint test2_bno_fk foreign key (bno) references test1(no);
Query OK, 0 rows affected (0.033 sec)              
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [studydb]> insert into test2(filepath, bno) values('c:/download/a.gif', 1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`studydb`.`test2`, CONSTRAINT `test2_bno_fk` FOREIGN KEY (`bno`) REFERENCES `test1` (`no`))

MariaDB [studydb]> insert into test2(filepath, bno) values('c:/download/d.gif', 5);
Query OK, 1 row affected (0.001 sec)

MariaDB [studydb]> insert into test2(filepath, bno) values('c:/download/e.gif', 5);
Query OK, 1 row affected (0.000 sec)

MariaDB [studydb]> insert into test2(filepath, bno) values('c:/download/f.gif', 10);
Query OK, 1 row affected (0.001 sec)

MariaDB [studydb]> select * from test2;
+-----+-------------------+-----+
| fno | filepath          | bno |
+-----+-------------------+-----+
|   2 | c:/download/d.gif |   5 |
|   3 | c:/download/e.gif |   5 |
|   4 | c:/download/f.gif |  10 |
+-----+-------------------+-----+
3 rows in set (0.000 sec)

MariaDB [studydb]> /* 2번 게시물은 test2 테이블의 데이터들이 참조하지 않기 때문에 마음대로 지울 수 있다.*/
MariaDB [studydb]> delete from test1 where no=2;
Query OK, 1 row affected (0.001 sec)

MariaDB [studydb]> /* 그러나 5번 게시물은 삭제할 수 없다. 왜? test2 테이블의 데이터 중 일부가 참조하기 때문이다.*/
MariaDB [studydb]> delete from test1 where no=5;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`studydb`.`test2`, CONSTRAINT `test2_bno_fk` FOREIGN KEY (`bno`) REFERENCES `test1` (`no`))

MariaDB [studydb]> select * from test1;
+----+-------+---------+---------------------+
| no | title | content | rdt                 |
+----+-------+---------+---------------------+
|  3 | ccc   | NULL    | 2020-10-27 11:52:36 |
|  4 | ddd   | NULL    | 2020-10-27 11:52:36 |
|  5 | eee   | NULL    | 2020-10-27 11:52:36 |
|  6 | fff   | NULL    | 2020-10-27 11:52:36 |
|  7 | ggg   | NULL    | 2020-10-27 11:52:36 |
|  8 | hhh   | NULL    | 2020-10-27 11:52:36 |
|  9 | iii   | NULL    | 2020-10-27 11:52:36 |
| 10 | jjj   | NULL    | 2020-10-27 11:52:37 |
+----+-------+---------+---------------------+
8 rows in set (0.000 sec)

MariaDB [studydb]> delete from test2 where bno = 5;
Query OK, 2 rows affected (0.001 sec)

MariaDB [studydb]> select * from test2;
+-----+-------------------+-----+
| fno | filepath          | bno |
+-----+-------------------+-----+
|   4 | c:/download/f.gif |  10 |
+-----+-------------------+-----+
1 row in set (0.000 sec)

MariaDB [studydb]> delete from test1 where no=5;
Query OK, 1 row affected (0.001 sec)

MariaDB [studydb]> select * from test1;
+----+-------+---------+---------------------+
| no | title | content | rdt                 |
+----+-------+---------+---------------------+
|  3 | ccc   | NULL    | 2020-10-27 11:52:36 |
|  4 | ddd   | NULL    | 2020-10-27 11:52:36 |
|  6 | fff   | NULL    | 2020-10-27 11:52:36 |
|  7 | ggg   | NULL    | 2020-10-27 11:52:36 |
|  8 | hhh   | NULL    | 2020-10-27 11:52:36 |
|  9 | iii   | NULL    | 2020-10-27 11:52:36 |
| 10 | jjj   | NULL    | 2020-10-27 11:52:37 |
+----+-------+---------+---------------------+
7 rows in set (0.000 sec)

Exam06~

  • Entity Relationship Diagram
    • ER Diagram
    • ERD
  • ERD 를 그리는 도구
    • ExERD
    • ER-Win
  • ExERD
    • 이클립스에 설치할 수 있는 플러그인.
    • 이클립스-헬프-뉴프로그램인스톨

distinct 와 all

/* 모든 데이터를 가져온다.*/
MariaDB [studydb]> select all loc from room;
+--------+
| loc    |
+--------+
| 강남   |
| 강남   |
| 강남   |
| 서초   |
| 서초   |
| 서초   |
| 서초   |
| 종로   |
| 종로   |
| 종로   |
+--------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* all은 생략할 수 있다*/
MariaDB [studydb]> select loc from room;
+--------+
| loc    |
+--------+
| 강남   |
| 강남   |
| 강남   |
| 서초   |
| 서초   |
| 서초   |
| 서초   |
| 종로   |
| 종로   |
| 종로   |
+--------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* 중복 값을 한 개만 추출할 때 distinct 를 붙인다.*/
MariaDB [studydb]> select distinct loc from room;  
+--------+
| loc    |
+--------+
| 강남   |
| 서초   |
| 종로   |
+--------+
3 rows in set (0.003 sec)

MariaDB [studydb]> /* 컬럼이 2 개 이상일 때 
   /*>     그 컬럼들의 값이 중복될 경우만 한 개로 간주한다.*/
MariaDB [studydb]> select distinct loc, name from room;
+--------+------+
| loc    | name |
+--------+------+
| 강남   | 501  |
| 강남   | 502  |
| 강남   | 503  |
| 서초   | 301  |
| 서초   | 302  |
| 서초   | 501  |
| 서초   | 601  |
| 종로   | 301  |
| 종로   | 302  |
| 종로   | 303  |
+--------+------+
10 rows in set (0.000 sec)

order by

  • asc : 오름차순
  • desc : 내림차순
MariaDB [studydb]> /* 기본 인덱스 컬럼을 기준으로 정렬한다.*/
MariaDB [studydb]> select rno, loc, name 
    -> from room;
+-----+--------+------+
| rno | loc    | name |
+-----+--------+------+
|   1 | 강남   | 501  |
|   2 | 강남   | 502  |
|   3 | 강남   | 503  |
|   7 | 서초   | 301  |
|   8 | 서초   | 302  |
|   9 | 서초   | 501  |
|  10 | 서초   | 601  |
|   4 | 종로   | 301  |
|   5 | 종로   | 302  |
|   6 | 종로   | 303  |
+-----+--------+------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* 이름의 오름 차순으로 정렬하기 */
MariaDB [studydb]> select rno, loc, name 
    -> from room
    -> order by name asc;
+-----+--------+------+
| rno | loc    | name |
+-----+--------+------+
|   4 | 종로   | 301  |
|   7 | 서초   | 301  |
|   8 | 서초   | 302  |
|   5 | 종로   | 302  |
|   6 | 종로   | 303  |
|   9 | 서초   | 501  |
|   1 | 강남   | 501  |
|   2 | 강남   | 502  |
|   3 | 강남   | 503  |
|  10 | 서초   | 601  |
+-----+--------+------+
10 rows in set (0.002 sec)

MariaDB [studydb]> /* 오류 안난다. select 먼저 실행.*/
MariaDB [studydb]> select rno, loc
    -> from room
    -> order by name asc;
+-----+--------+
| rno | loc    |
+-----+--------+
|   4 | 종로   |
|   7 | 서초   |
|   8 | 서초   |
|   5 | 종로   |
|   6 | 종로   |
|   9 | 서초   |
|   1 | 강남   |
|   2 | 강남   |
|   3 | 강남   |
|  10 | 서초   |
+-----+--------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* asc는 생략 가능하다. */
MariaDB [studydb]> select rno, loc, name 
    -> from room
    -> order by name;
+-----+--------+------+
| rno | loc    | name |
+-----+--------+------+
|   4 | 종로   | 301  |
|   7 | 서초   | 301  |
|   8 | 서초   | 302  |
|   5 | 종로   | 302  |
|   6 | 종로   | 303  |
|   9 | 서초   | 501  |
|   1 | 강남   | 501  |
|   2 | 강남   | 502  |
|   3 | 강남   | 503  |
|  10 | 서초   | 601  |
+-----+--------+------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* 이름의 내림 차순으로 정렬하기 */
MariaDB [studydb]> /* desc 생략 불가능. 생략하면 asc. */
MariaDB [studydb]> select rno, loc, name 
    -> from room
    -> order by name desc;
+-----+--------+------+
| rno | loc    | name |
+-----+--------+------+
|  10 | 서초   | 601  |
|   3 | 강남   | 503  |
|   2 | 강남   | 502  |
|   9 | 서초   | 501  |
|   1 | 강남   | 501  |
|   6 | 종로   | 303  |
|   5 | 종로   | 302  |
|   8 | 서초   | 302  |
|   7 | 서초   | 301  |
|   4 | 종로   | 301  |
+-----+--------+------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* 이름은 오름차순, 지점명도 오름차순으로 정렬하기*/
MariaDB [studydb]> /* 이름 먼저 오름차순, 같은 이름일 때 지점면 오름차순.*/
MariaDB [studydb]> select rno, loc, name 
    -> from room
    -> order by name asc, loc asc;
+-----+--------+------+
| rno | loc    | name |
+-----+--------+------+
|   7 | 서초   | 301  |
|   4 | 종로   | 301  |
|   8 | 서초   | 302  |
|   5 | 종로   | 302  |
|   6 | 종로   | 303  |
|   1 | 강남   | 501  |
|   9 | 서초   | 501  |
|   2 | 강남   | 502  |
|   3 | 강남   | 503  |
|  10 | 서초   | 601  |
+-----+--------+------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* 이름은 오름차순, 지점명은 내림차순으로 정렬하기*/
MariaDB [studydb]> select rno, loc, name 
    -> from room
    -> order by name asc, loc desc;
+-----+--------+------+
| rno | loc    | name |
+-----+--------+------+
|   4 | 종로   | 301  |
|   7 | 서초   | 301  |
|   5 | 종로   | 302  |
|   8 | 서초   | 302  |
|   6 | 종로   | 303  |
|   9 | 서초   | 501  |
|   1 | 강남   | 501  |
|   2 | 강남   | 502  |
|   3 | 강남   | 503  |
|  10 | 서초   | 601  |
+-----+--------+------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* 지점명은 오름차순으로, 이름은 오름차순  정렬하기*/
MariaDB [studydb]> select rno, loc, name 
    -> from room
    -> order by loc asc, name asc;
+-----+--------+------+
| rno | loc    | name |
+-----+--------+------+
|   1 | 강남   | 501  |
|   2 | 강남   | 502  |
|   3 | 강남   | 503  |
|   7 | 서초   | 301  |
|   8 | 서초   | 302  |
|   9 | 서초   | 501  |
|  10 | 서초   | 601  |
|   4 | 종로   | 301  |
|   5 | 종로   | 302  |
|   6 | 종로   | 303  |
+-----+--------+------+
10 rows in set (0.000 sec)

as 로 컬럼에 별명(라벨명) 붙이기

MariaDB [studydb]> /* 출력 라벨명을 변경하기
   /*>    => 라벨명을 지정하지 않으면 컬럼명이 라벨명이 된다*/
MariaDB [studydb]> select rno as room_no, loc as location, name 
    -> from room;
+---------+----------+------+
| room_no | location | name |
+---------+----------+------+
|       1 | 강남     | 501  |
|       2 | 강남     | 502  |
|       3 | 강남     | 503  |
|       7 | 서초     | 301  |
|       8 | 서초     | 302  |
|       9 | 서초     | 501  |
|      10 | 서초     | 601  |
|       4 | 종로     | 301  |
|       5 | 종로     | 302  |
|       6 | 종로     | 303  |
+---------+----------+------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* as 생략 가능 */
MariaDB [studydb]> select rno room_no, loc location, name 
    -> from room;
+---------+----------+------+
| room_no | location | name |
+---------+----------+------+
|       1 | 강남     | 501  |
|       2 | 강남     | 502  |
|       3 | 강남     | 503  |
|       7 | 서초     | 301  |
|       8 | 서초     | 302  |
|       9 | 서초     | 501  |
|      10 | 서초     | 601  |
|       4 | 종로     | 301  |
|       5 | 종로     | 302  |
|       6 | 종로     | 303  |
+---------+----------+------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* 라벨명에 공백을 넣고 싶으면 '' 안에 작성한다.*/
MariaDB [studydb]> select rno 'room no', loc location, name 
    -> from room;
+---------+----------+------+
| room no | location | name |
+---------+----------+------+
|       1 | 강남     | 501  |
|       2 | 강남     | 502  |
|       3 | 강남     | 503  |
|       7 | 서초     | 301  |
|       8 | 서초     | 302  |
|       9 | 서초     | 501  |
|      10 | 서초     | 601  |
|       4 | 종로     | 301  |
|       5 | 종로     | 302  |
|       6 | 종로     | 303  |
+---------+----------+------+
10 rows in set (0.000 sec)

MariaDB [studydb]> /* 복잡한 형식으로 출력할 경우 라벨명(별명)을 부여한다. 
   /*>     예) 강의실명(지점명)*/
MariaDB [studydb]> select concat(name, '(', loc, ')')
    -> from room;
+-----------------------------+
| concat(name, '(', loc, ')') |
+-----------------------------+
| 501(강남)                   |
| 502(강남)                   |
| 503(강남)                   |
| 301(서초)                   |
| 302(서초)                   |
| 501(서초)                   |
| 601(서초)                   |
| 301(종로)                   |
| 302(종로)                   |
| 303(종로)                   |
+-----------------------------+
10 rows in set (0.000 sec)

MariaDB [studydb]> select count(*) 
    -> from room;
+----------+
| count(*) |
+----------+
|       10 |
+----------+
1 row in set (0.003 sec)

MariaDB [studydb]> select count(*) cnt
    -> from room;
+-----+
| cnt |
+-----+
|  10 |
+-----+
1 row in set (0.000 sec)

MariaDB [studydb]> select count(*) cnt
    -> from room 
    -> where loc='서초';
+-----+
| cnt |
+-----+
|   4 |
+-----+
1 row in set (0.002 sec)

union 과 union all

MariaDB [studydb]> /* select 결과 합치기 
   /*>    union : 중복 값 자동 제거*/
MariaDB [studydb]> select distinct bank from stnt
    -> union 
    -> select distinct bank from tcher;
+--------------+
| bank         |
+--------------+
| 비트은행     |
| 캠프은행     |
| 우리은행     |
| 국민은행     |
| 신한은행     |
| 농협         |
| 기업은행     |
+--------------+
7 rows in set (0.002 sec)

MariaDB [studydb]> select bank from stnt;
+--------------+
| bank         |
+--------------+
| 비트은행     |
| 비트은행     |
| 캠프은행     |
| 우리은행     |
| 국민은행     |
+--------------+
5 rows in set (0.000 sec)

MariaDB [studydb]> select distinct bank from stnt;
+--------------+
| bank         |
+--------------+
| 비트은행     |
| 캠프은행     |
| 우리은행     |
| 국민은행     |
+--------------+
4 rows in set (0.001 sec)

MariaDB [studydb]> select bank from tcher;
+--------------+
| bank         |
+--------------+
| 신한은행     |
| 농협         |
| 기업은행     |
| 우리은행     |
| 국민은행     |
+--------------+
5 rows in set (0.000 sec)

MariaDB [studydb]> select distinct bank from tcher;
+--------------+
| bank         |
+--------------+
| 신한은행     |
| 농협         |
| 기업은행     |
| 우리은행     |
| 국민은행     |
+--------------+
5 rows in set (0.000 sec)

MariaDB [studydb]> /* union all: 중복 값 제거 안함*/
MariaDB [studydb]> select distinct bank from stnt
    -> union all
    -> select distinct bank from tcher;
+--------------+
| bank         |
+--------------+
| 비트은행     |
| 캠프은행     |
| 우리은행     |
| 국민은행     |
| 신한은행     |
| 농협         |
| 기업은행     |
| 우리은행     |
| 국민은행     |
+--------------+
9 rows in set (0.000 sec)
  • 빼는 기능은 없다.
    • where 로 조건을 만들어 처리해야 한다.

조인

  • 서로 관련된 테이블의 데이터를 연결하여 추출하는 방법
  • 기법
    • 1) CROSS 조인
    • 2) NATURAL 조인
    • 3) JOIN ~ ON
    • 4) OUTER JOIN

cross join : 두 테이블의 데이터를 1:1로 모두 연결한다.

MariaDB [studydb]> /* cross join : 두 테이블의 데이터를 1:1로 모두 연결한다.*/
MariaDB [studydb]> select mno, name from memb;
+-----+------+
| mno | name |
+-----+------+
| 300 | m300 |
| 301 | m301 |
| 302 | m302 |
| 303 | m303 |
| 304 | m304 |
| 100 | s100 |
| 101 | s101 |
| 102 | s102 |
| 103 | s103 |
| 104 | s104 |
| 200 | s200 |
| 201 | s201 |
| 202 | s202 |
| 203 | s203 |
| 204 | s204 |
+-----+------+
15 rows in set (0.002 sec)

MariaDB [studydb]> select mno, work, bank from stnt;  
+-----+------+--------------+
| mno | work | bank         |
+-----+------+--------------+
| 100 | N    | 비트은행     |
| 101 | Y    | 비트은행     |
| 102 | N    | 캠프은행     |
| 103 | Y    | 우리은행     |
| 104 | N    | 국민은행     |
+-----+------+--------------+
5 rows in set (0.000 sec)

MariaDB [studydb]> /* => mno가 어떤 테이블의 컬럼인지 지정하지 않으면 실행 오류!*/
MariaDB [studydb]> select mno, name, mno, work, bank
    -> from memb cross join stnt;
ERROR 1052 (23000): Column 'mno' in field list is ambiguous
MariaDB [studydb]> /* => select  컬럼이 두 테이블 모두 있을 경우,
   /*>          컬럼명 앞에 테이블명을 명시하여 구분하라!*/ 
MariaDB [studydb]> select memb.mno, name, stnt.mno, work, bank
    -> from memb cross join stnt;
+-----+------+-----+------+--------------+
| mno | name | mno | work | bank         |
+-----+------+-----+------+--------------+
| 300 | m300 | 100 | N    | 비트은행     |
| 300 | m300 | 101 | Y    | 비트은행     |
| 300 | m300 | 102 | N    | 캠프은행     |
| 300 | m300 | 103 | Y    | 우리은행     |
| 300 | m300 | 104 | N    | 국민은행     |
| 301 | m301 | 100 | N    | 비트은행     |
| 301 | m301 | 101 | Y    | 비트은행     |
| 301 | m301 | 102 | N    | 캠프은행     |
| 301 | m301 | 103 | Y    | 우리은행     |
| 301 | m301 | 104 | N    | 국민은행     |
| 302 | m302 | 100 | N    | 비트은행     |
| 302 | m302 | 101 | Y    | 비트은행     |
| 302 | m302 | 102 | N    | 캠프은행     |
| 302 | m302 | 103 | Y    | 우리은행     |
| 302 | m302 | 104 | N    | 국민은행     |
| 303 | m303 | 100 | N    | 비트은행     |
| 303 | m303 | 101 | Y    | 비트은행     |
| 303 | m303 | 102 | N    | 캠프은행     |
| 303 | m303 | 103 | Y    | 우리은행     |
| 303 | m303 | 104 | N    | 국민은행     |
| 304 | m304 | 100 | N    | 비트은행     |
| 304 | m304 | 101 | Y    | 비트은행     |
| 304 | m304 | 102 | N    | 캠프은행     |
| 304 | m304 | 103 | Y    | 우리은행     |
| 304 | m304 | 104 | N    | 국민은행     |
| 100 | s100 | 100 | N    | 비트은행     |
| 100 | s100 | 101 | Y    | 비트은행     |
| 100 | s100 | 102 | N    | 캠프은행     |
| 100 | s100 | 103 | Y    | 우리은행     |
| 100 | s100 | 104 | N    | 국민은행     |
| 101 | s101 | 100 | N    | 비트은행     |
| 101 | s101 | 101 | Y    | 비트은행     |
| 101 | s101 | 102 | N    | 캠프은행     |
| 101 | s101 | 103 | Y    | 우리은행     |
| 101 | s101 | 104 | N    | 국민은행     |
| 102 | s102 | 100 | N    | 비트은행     |
| 102 | s102 | 101 | Y    | 비트은행     |
| 102 | s102 | 102 | N    | 캠프은행     |
| 102 | s102 | 103 | Y    | 우리은행     |
| 102 | s102 | 104 | N    | 국민은행     |
| 103 | s103 | 100 | N    | 비트은행     |
| 103 | s103 | 101 | Y    | 비트은행     |
| 103 | s103 | 102 | N    | 캠프은행     |
| 103 | s103 | 103 | Y    | 우리은행     |
| 103 | s103 | 104 | N    | 국민은행     |
| 104 | s104 | 100 | N    | 비트은행     |
| 104 | s104 | 101 | Y    | 비트은행     |
| 104 | s104 | 102 | N    | 캠프은행     |
| 104 | s104 | 103 | Y    | 우리은행     |
| 104 | s104 | 104 | N    | 국민은행     |
| 200 | s200 | 100 | N    | 비트은행     |
| 200 | s200 | 101 | Y    | 비트은행     |
| 200 | s200 | 102 | N    | 캠프은행     |
| 200 | s200 | 103 | Y    | 우리은행     |
| 200 | s200 | 104 | N    | 국민은행     |
| 201 | s201 | 100 | N    | 비트은행     |
| 201 | s201 | 101 | Y    | 비트은행     |
| 201 | s201 | 102 | N    | 캠프은행     |
| 201 | s201 | 103 | Y    | 우리은행     |
| 201 | s201 | 104 | N    | 국민은행     |
| 202 | s202 | 100 | N    | 비트은행     |
| 202 | s202 | 101 | Y    | 비트은행     |
| 202 | s202 | 102 | N    | 캠프은행     |
| 202 | s202 | 103 | Y    | 우리은행     |
| 202 | s202 | 104 | N    | 국민은행     |
| 203 | s203 | 100 | N    | 비트은행     |
| 203 | s203 | 101 | Y    | 비트은행     |
| 203 | s203 | 102 | N    | 캠프은행     |
| 203 | s203 | 103 | Y    | 우리은행     |
| 203 | s203 | 104 | N    | 국민은행     |
| 204 | s204 | 100 | N    | 비트은행     |
| 204 | s204 | 101 | Y    | 비트은행     |
| 204 | s204 | 102 | N    | 캠프은행     |
| 204 | s204 | 103 | Y    | 우리은행     |
| 204 | s204 | 104 | N    | 국민은행     |
+-----+------+-----+------+--------------+
75 rows in set (0.002 sec)

MariaDB [studydb]> select memb.mno, name, stnt.mno, work, bank
    -> from memb, stnt;
+-----+------+-----+------+--------------+
| mno | name | mno | work | bank         |
+-----+------+-----+------+--------------+
| 300 | m300 | 100 | N    | 비트은행     |
| 300 | m300 | 101 | Y    | 비트은행     |
| 300 | m300 | 102 | N    | 캠프은행     |
| 300 | m300 | 103 | Y    | 우리은행     |
| 300 | m300 | 104 | N    | 국민은행     |
| 301 | m301 | 100 | N    | 비트은행     |
| 301 | m301 | 101 | Y    | 비트은행     |
| 301 | m301 | 102 | N    | 캠프은행     |
| 301 | m301 | 103 | Y    | 우리은행     |
| 301 | m301 | 104 | N    | 국민은행     |
| 302 | m302 | 100 | N    | 비트은행     |
| 302 | m302 | 101 | Y    | 비트은행     |
| 302 | m302 | 102 | N    | 캠프은행     |
| 302 | m302 | 103 | Y    | 우리은행     |
| 302 | m302 | 104 | N    | 국민은행     |
| 303 | m303 | 100 | N    | 비트은행     |
| 303 | m303 | 101 | Y    | 비트은행     |
| 303 | m303 | 102 | N    | 캠프은행     |
| 303 | m303 | 103 | Y    | 우리은행     |
| 303 | m303 | 104 | N    | 국민은행     |
| 304 | m304 | 100 | N    | 비트은행     |
| 304 | m304 | 101 | Y    | 비트은행     |
| 304 | m304 | 102 | N    | 캠프은행     |
| 304 | m304 | 103 | Y    | 우리은행     |
| 304 | m304 | 104 | N    | 국민은행     |
| 100 | s100 | 100 | N    | 비트은행     |
| 100 | s100 | 101 | Y    | 비트은행     |
| 100 | s100 | 102 | N    | 캠프은행     |
| 100 | s100 | 103 | Y    | 우리은행     |
| 100 | s100 | 104 | N    | 국민은행     |
| 101 | s101 | 100 | N    | 비트은행     |
| 101 | s101 | 101 | Y    | 비트은행     |
| 101 | s101 | 102 | N    | 캠프은행     |
| 101 | s101 | 103 | Y    | 우리은행     |
| 101 | s101 | 104 | N    | 국민은행     |
| 102 | s102 | 100 | N    | 비트은행     |
| 102 | s102 | 101 | Y    | 비트은행     |
| 102 | s102 | 102 | N    | 캠프은행     |
| 102 | s102 | 103 | Y    | 우리은행     |
| 102 | s102 | 104 | N    | 국민은행     |
| 103 | s103 | 100 | N    | 비트은행     |
| 103 | s103 | 101 | Y    | 비트은행     |
| 103 | s103 | 102 | N    | 캠프은행     |
| 103 | s103 | 103 | Y    | 우리은행     |
| 103 | s103 | 104 | N    | 국민은행     |
| 104 | s104 | 100 | N    | 비트은행     |
| 104 | s104 | 101 | Y    | 비트은행     |
| 104 | s104 | 102 | N    | 캠프은행     |
| 104 | s104 | 103 | Y    | 우리은행     |
| 104 | s104 | 104 | N    | 국민은행     |
| 200 | s200 | 100 | N    | 비트은행     |
| 200 | s200 | 101 | Y    | 비트은행     |
| 200 | s200 | 102 | N    | 캠프은행     |
| 200 | s200 | 103 | Y    | 우리은행     |
| 200 | s200 | 104 | N    | 국민은행     |
| 201 | s201 | 100 | N    | 비트은행     |
| 201 | s201 | 101 | Y    | 비트은행     |
| 201 | s201 | 102 | N    | 캠프은행     |
| 201 | s201 | 103 | Y    | 우리은행     |
| 201 | s201 | 104 | N    | 국민은행     |
| 202 | s202 | 100 | N    | 비트은행     |
| 202 | s202 | 101 | Y    | 비트은행     |
| 202 | s202 | 102 | N    | 캠프은행     |
| 202 | s202 | 103 | Y    | 우리은행     |
| 202 | s202 | 104 | N    | 국민은행     |
| 203 | s203 | 100 | N    | 비트은행     |
| 203 | s203 | 101 | Y    | 비트은행     |
| 203 | s203 | 102 | N    | 캠프은행     |
| 203 | s203 | 103 | Y    | 우리은행     |
| 203 | s203 | 104 | N    | 국민은행     |
| 204 | s204 | 100 | N    | 비트은행     |
| 204 | s204 | 101 | Y    | 비트은행     |
| 204 | s204 | 102 | N    | 캠프은행     |
| 204 | s204 | 103 | Y    | 우리은행     |
| 204 | s204 | 104 | N    | 국민은행     |
+-----+------+-----+------+--------------+
75 rows in set (0.000 sec)

MariaDB [studydb]> /* => 컬럼명 앞에 테이블명을 붙이면 너무 길다.
   /*>          테이블에 별명을 부여하고 
   /*>          그 별명을 사용하여 컬럼을 지정하라. */
MariaDB [studydb]> select m.mno, name, s.mno, work, bank
    -> from memb m cross join stnt s; 
+-----+------+-----+------+--------------+
| mno | name | mno | work | bank         |
+-----+------+-----+------+--------------+
| 300 | m300 | 100 | N    | 비트은행     |
| 300 | m300 | 101 | Y    | 비트은행     |
| 300 | m300 | 102 | N    | 캠프은행     |
| 300 | m300 | 103 | Y    | 우리은행     |
| 300 | m300 | 104 | N    | 국민은행     |
| 301 | m301 | 100 | N    | 비트은행     |
| 301 | m301 | 101 | Y    | 비트은행     |
| 301 | m301 | 102 | N    | 캠프은행     |
| 301 | m301 | 103 | Y    | 우리은행     |
| 301 | m301 | 104 | N    | 국민은행     |
| 302 | m302 | 100 | N    | 비트은행     |
| 302 | m302 | 101 | Y    | 비트은행     |
| 302 | m302 | 102 | N    | 캠프은행     |
| 302 | m302 | 103 | Y    | 우리은행     |
| 302 | m302 | 104 | N    | 국민은행     |
| 303 | m303 | 100 | N    | 비트은행     |
| 303 | m303 | 101 | Y    | 비트은행     |
| 303 | m303 | 102 | N    | 캠프은행     |
| 303 | m303 | 103 | Y    | 우리은행     |
| 303 | m303 | 104 | N    | 국민은행     |
| 304 | m304 | 100 | N    | 비트은행     |
| 304 | m304 | 101 | Y    | 비트은행     |
| 304 | m304 | 102 | N    | 캠프은행     |
| 304 | m304 | 103 | Y    | 우리은행     |
| 304 | m304 | 104 | N    | 국민은행     |
| 100 | s100 | 100 | N    | 비트은행     |
| 100 | s100 | 101 | Y    | 비트은행     |
| 100 | s100 | 102 | N    | 캠프은행     |
| 100 | s100 | 103 | Y    | 우리은행     |
| 100 | s100 | 104 | N    | 국민은행     |
| 101 | s101 | 100 | N    | 비트은행     |
| 101 | s101 | 101 | Y    | 비트은행     |
| 101 | s101 | 102 | N    | 캠프은행     |
| 101 | s101 | 103 | Y    | 우리은행     |
| 101 | s101 | 104 | N    | 국민은행     |
| 102 | s102 | 100 | N    | 비트은행     |
| 102 | s102 | 101 | Y    | 비트은행     |
| 102 | s102 | 102 | N    | 캠프은행     |
| 102 | s102 | 103 | Y    | 우리은행     |
| 102 | s102 | 104 | N    | 국민은행     |
| 103 | s103 | 100 | N    | 비트은행     |
| 103 | s103 | 101 | Y    | 비트은행     |
| 103 | s103 | 102 | N    | 캠프은행     |
| 103 | s103 | 103 | Y    | 우리은행     |
| 103 | s103 | 104 | N    | 국민은행     |
| 104 | s104 | 100 | N    | 비트은행     |
| 104 | s104 | 101 | Y    | 비트은행     |
| 104 | s104 | 102 | N    | 캠프은행     |
| 104 | s104 | 103 | Y    | 우리은행     |
| 104 | s104 | 104 | N    | 국민은행     |
| 200 | s200 | 100 | N    | 비트은행     |
| 200 | s200 | 101 | Y    | 비트은행     |
| 200 | s200 | 102 | N    | 캠프은행     |
| 200 | s200 | 103 | Y    | 우리은행     |
| 200 | s200 | 104 | N    | 국민은행     |
| 201 | s201 | 100 | N    | 비트은행     |
| 201 | s201 | 101 | Y    | 비트은행     |
| 201 | s201 | 102 | N    | 캠프은행     |
| 201 | s201 | 103 | Y    | 우리은행     |
| 201 | s201 | 104 | N    | 국민은행     |
| 202 | s202 | 100 | N    | 비트은행     |
| 202 | s202 | 101 | Y    | 비트은행     |
| 202 | s202 | 102 | N    | 캠프은행     |
| 202 | s202 | 103 | Y    | 우리은행     |
| 202 | s202 | 104 | N    | 국민은행     |
| 203 | s203 | 100 | N    | 비트은행     |
| 203 | s203 | 101 | Y    | 비트은행     |
| 203 | s203 | 102 | N    | 캠프은행     |
| 203 | s203 | 103 | Y    | 우리은행     |
| 203 | s203 | 104 | N    | 국민은행     |
| 204 | s204 | 100 | N    | 비트은행     |
| 204 | s204 | 101 | Y    | 비트은행     |
| 204 | s204 | 102 | N    | 캠프은행     |
| 204 | s204 | 103 | Y    | 우리은행     |
| 204 | s204 | 104 | N    | 국민은행     |
+-----+------+-----+------+--------------+
75 rows in set (0.002 sec)

MariaDB [studydb]> /* 예전 문법 */
MariaDB [studydb]> select m.mno, name, s.mno, work, bank
    -> from memb m, stnt s;
+-----+------+-----+------+--------------+
| mno | name | mno | work | bank         |
+-----+------+-----+------+--------------+
| 300 | m300 | 100 | N    | 비트은행     |
| 300 | m300 | 101 | Y    | 비트은행     |
| 300 | m300 | 102 | N    | 캠프은행     |
| 300 | m300 | 103 | Y    | 우리은행     |
| 300 | m300 | 104 | N    | 국민은행     |
| 301 | m301 | 100 | N    | 비트은행     |
| 301 | m301 | 101 | Y    | 비트은행     |
| 301 | m301 | 102 | N    | 캠프은행     |
| 301 | m301 | 103 | Y    | 우리은행     |
| 301 | m301 | 104 | N    | 국민은행     |
| 302 | m302 | 100 | N    | 비트은행     |
| 302 | m302 | 101 | Y    | 비트은행     |
| 302 | m302 | 102 | N    | 캠프은행     |
| 302 | m302 | 103 | Y    | 우리은행     |
| 302 | m302 | 104 | N    | 국민은행     |
| 303 | m303 | 100 | N    | 비트은행     |
| 303 | m303 | 101 | Y    | 비트은행     |
| 303 | m303 | 102 | N    | 캠프은행     |
| 303 | m303 | 103 | Y    | 우리은행     |
| 303 | m303 | 104 | N    | 국민은행     |
| 304 | m304 | 100 | N    | 비트은행     |
| 304 | m304 | 101 | Y    | 비트은행     |
| 304 | m304 | 102 | N    | 캠프은행     |
| 304 | m304 | 103 | Y    | 우리은행     |
| 304 | m304 | 104 | N    | 국민은행     |
| 100 | s100 | 100 | N    | 비트은행     |
| 100 | s100 | 101 | Y    | 비트은행     |
| 100 | s100 | 102 | N    | 캠프은행     |
| 100 | s100 | 103 | Y    | 우리은행     |
| 100 | s100 | 104 | N    | 국민은행     |
| 101 | s101 | 100 | N    | 비트은행     |
| 101 | s101 | 101 | Y    | 비트은행     |
| 101 | s101 | 102 | N    | 캠프은행     |
| 101 | s101 | 103 | Y    | 우리은행     |
| 101 | s101 | 104 | N    | 국민은행     |
| 102 | s102 | 100 | N    | 비트은행     |
| 102 | s102 | 101 | Y    | 비트은행     |
| 102 | s102 | 102 | N    | 캠프은행     |
| 102 | s102 | 103 | Y    | 우리은행     |
| 102 | s102 | 104 | N    | 국민은행     |
| 103 | s103 | 100 | N    | 비트은행     |
| 103 | s103 | 101 | Y    | 비트은행     |
| 103 | s103 | 102 | N    | 캠프은행     |
| 103 | s103 | 103 | Y    | 우리은행     |
| 103 | s103 | 104 | N    | 국민은행     |
| 104 | s104 | 100 | N    | 비트은행     |
| 104 | s104 | 101 | Y    | 비트은행     |
| 104 | s104 | 102 | N    | 캠프은행     |
| 104 | s104 | 103 | Y    | 우리은행     |
| 104 | s104 | 104 | N    | 국민은행     |
| 200 | s200 | 100 | N    | 비트은행     |
| 200 | s200 | 101 | Y    | 비트은행     |
| 200 | s200 | 102 | N    | 캠프은행     |
| 200 | s200 | 103 | Y    | 우리은행     |
| 200 | s200 | 104 | N    | 국민은행     |
| 201 | s201 | 100 | N    | 비트은행     |
| 201 | s201 | 101 | Y    | 비트은행     |
| 201 | s201 | 102 | N    | 캠프은행     |
| 201 | s201 | 103 | Y    | 우리은행     |
| 201 | s201 | 104 | N    | 국민은행     |
| 202 | s202 | 100 | N    | 비트은행     |
| 202 | s202 | 101 | Y    | 비트은행     |
| 202 | s202 | 102 | N    | 캠프은행     |
| 202 | s202 | 103 | Y    | 우리은행     |
| 202 | s202 | 104 | N    | 국민은행     |
| 203 | s203 | 100 | N    | 비트은행     |
| 203 | s203 | 101 | Y    | 비트은행     |
| 203 | s203 | 102 | N    | 캠프은행     |
| 203 | s203 | 103 | Y    | 우리은행     |
| 203 | s203 | 104 | N    | 국민은행     |
| 204 | s204 | 100 | N    | 비트은행     |
| 204 | s204 | 101 | Y    | 비트은행     |
| 204 | s204 | 102 | N    | 캠프은행     |
| 204 | s204 | 103 | Y    | 우리은행     |
| 204 | s204 | 104 | N    | 국민은행     |
+-----+------+-----+------+--------------+
75 rows in set (0.002 sec)

Categories:

Updated: