2020-10-27 TIL
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)