메뉴 건너뛰기

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
보통 mysql에서는 외래키를 잡아놓고 두 외래키가 같은 것들로 조인을 해서 쓰는 방식이 많다. 필자도 보통 그런식으로만 해왔기 때문에 지금부터 쓸 포스트의 내용을 쓸일이 여태껏 거이 없었다. 하지만 종종 쓰다보니, 아무래도 이건 나중에 쓸때 또 찾을거 같은 내용 같기에 이렇게 글을 써본다.

일단 두 테이블 ids와 list가 있다고 하자.

mysql> select * from ids;
+-----+------+------+
| sid | year | id   |
+-----+------+------+
|   1 | 2007 | A    |
|   2 | 2008 | B    |
|   3 | 2010 | C    |
|   4 | NULL | D    |
+-----+------+------+
4 rows in set (0.00 sec)

mysql> select * from list;
+------+------+-------+
| year | id   | fee   |
+------+------+-------+
| 2008 | A    | 10000 |
| 2008 | A    | 15000 |
| 2008 | B    | 20000 |
| 2009 | B    | 10000 |
| 2009 | A    | 15000 |
| 2010 | C    | 10000 |
| 2010 | D    | 20000 |
+------+------+-------+
7 rows in set (0.00 sec)

위 두 테이블을 조인해서 아이디별로 자신의 year에 해당하는 list의 목록을 뽑아 오려고 한다면,

mysql> select * from ids left join list on ids.id = list.id where ids.year = list.year;
+-----+------+------+------+------+-------+
| sid | year | id   | year | id   | fee   |
+-----+------+------+------+------+-------+
|   2 | 2008 | B    | 2008 | B    | 20000 |
|   3 | 2010 | C    | 2010 | C    | 10000 |
+-----+------+------+------+------+-------+
2 rows in set (0.00 sec)

위와 같이 뽑아 올수 있다. 

위의 결과에서 A는 ids 테이블에 year해당하는 list의 값이 없기에 뽑아올수 없는데, 이런 A와 같은 목록을 뽑아오려면 not exists나 not in를 쓰면 된다.

mysql> select * from ids where not exists (select 1 from list where ids.id = list.id and ids.year = list.year );
+-----+------+------+
| sid | year | id   |
+-----+------+------+
|   1 | 2007 | A    |
|   4 | NULL | D    |
+-----+------+------+
2 rows in set (0.00 sec)

mysql> select * from ids where id not in (select id from list where ids.id = list.id and ids.year = list.year );
+-----+------+------+
| sid | year | id   |
+-----+------+------+
|   1 | 2007 | A    |
|   4 | NULL | D    |
+-----+------+------+
2 rows in set (0.00 sec)

하지만 여기서 한가지 알아둘것이 있는데, 위의 조건은 ids의 year과 list의 year이 같지 않은 id를 찾는것이다. 그렇다면, 아래와 같은 조건으로 not in을 쓸 수 있다.

mysql> select * from ids where year not in (select year from list where ids.id = list.id );
+-----+------+------+
| sid | year | id   |
+-----+------+------+
|   1 | 2007 | A    |
+-----+------+------+
1 row in set (0.00 sec)

바로 여기서 차이점이 발생한다. 조건만으로 따져볼때는 위의 조건이 틀려 보이진 않는다.
D의 year를 보면, ids에는 NULL로 되어 있고 list에는 2010로 되어 있기 때문에 NULL과 2010은 다르기 때문이다.
하지만, not in은 조건으로 들어가는 값이 NULL인 것을 결과에서 제외시켜 버린다. 

뭐 이건 이거대로 잘 활용한다면 괜찮은 팁이 될 수 있으나, not in으로 NULL까지 나오게 하고 싶다면 조건을 잘 주어야 할 것이다.

List of Articles
번호 제목 날짜 조회 수
86 [MySQL] 백업 및 복구 2017.04.12 5392
85 MySQL 손상된 테이블 복구 2017.04.12 5330
84 MySQL 에서 랜덤(random)으로 레코드 읽어오기 2017.04.12 5727
83 MySQL root 패스워드 분실시 2017.04.12 5252
82 MySQL 쿼리 결과 값 세로로 보기 2017.04.12 6053
81 테이블 타입(Heap, MyIsam, InnoDB...) 변경하기 2017.04.12 5272
80 백업시 캐릭터셋(charset) 지정하기 2017.04.12 5071
79 세자리 마다 콤마 찍기 file 2017.04.12 5879
78 flush privileges 명령어 file 2017.04.12 5303
77 MySQL JOIN 걸어서 UPDATE 하기 2017.04.12 5352
76 mysql(union,join) file 2017.11.16 3837
75 서브쿼리 file 2017.11.16 3444
74 mysql(exists, not exists) file 2017.11.16 4090
73 다른 테이블 데이터를 원하는 테이블에 업데이트 시키기 2017.11.16 5076
72 특정 COLUMN을 제외하고 SELECT/INSERT하는 방법 2017.11.16 8864
71 Union 사용법. 여러 테이블의 같은 값을 한번 쿼리로 추출하기 2017.11.21 3918
70 두 테이블을 비교하여 한쪽테이블에는 있지만 다른 테이블에는 없는 값을 뽑아내보자! 2017.11.21 5387
69 Mysql Join 해부(Left, Right, Outer, Inner Join) file 2017.11.28 5340
68 MySQL Shard 데이터 재분배 file 2017.11.28 4950
67 MySQL 파티션 개요 file 2017.12.22 4150
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved