일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- WebMysql
- BIOS
- Palm Tracking
- DB
- 폼 파일 리셋
- form reset
- 호스팅
- cafe24
- window8 설치
- 파일
- NT900X4C-A99 터치패드
- 카페24
- 파티션
- form input file reset
- putty
- NT900X4C-A99 손바닥인식
- usb부팅
- 폼
- NT900X4C-A99 PalmTracking
- 폼 리셋
- 리셋
- 윈8 설치
- PalmTracking
- ssd 파티션
- Today
- Total
Mission Completed
JOIN 종류와 사용(1)-INNER JOIN, CROSS JOIN, JOIN, 콤마 연산자 본문
SELECT 문의 기본적인 문법
SELECT는 아마 SQL 언어에서 다른 어느 것보다도 가장 자주 사용되는 문장이겠지만, 또한 가장 까다로운 것이기도 하다.
행을 선택할 때 사용하는 구속 조건은 마구 복잡해질 수도 있고 많은 테이블 안에 있는 칼럼 간의 비교를 포함할 수도 있다.
_SELECT 문
SELECT select_list # 선택할 칼럼 FROM table_list # 선택할 행이 있는 곳 WHERE row_constraint # 행이 만족되어야 하는 조건 GROUP BY grouping_cols # 결과를 그룹으로 만드는 방법 ORDER BY sorting_cols # 결과를 정렬시키는 방법 HAVING group_constraint # 그룹이 만족되어야 하는 조건 LIMIT count; # 결과의 제한
어떤 DB 제품들은 FROM 절까지는 필수로 하기도 한다.
하지만 MySQL은 그렇지 않고 어떠한 테이블에 대한 참조 없이 표현식을 평가할 수 있도록 허용한다.
복수 테이블 SELECT 문의 다른 타입은 서브쿼리(하나의 SELECT,가 다른 것에 중첩되어 있다)와 UNION 문이다.
이것에 대해서는 나중에 다시 논하도록 하겠다.
앞으로 자주 사용할 두 테이블, t1과 t2
CREATE TABLE t1 ( i1 int(1) primary key, c1 char(1) ); CREATE TABLE t2 ( i2 int(1) primary key, c2 char(1) ); INSERT INTO t1 (i1, c1) values (1, 'a'), (2, 'b'), (3, 'c'); INSERT INTO t2 (i2, c2) values (2, 'c'), (3, 'b'), (4, 'a');
내부 조인 (INNER JOIN)
SELECT 문에서 FROM 절 내에 복수 테이블을 INNER JOIN에 의해 구분해서 명명하면, MySQL은 내부 조인을 수행하여 어떤 테이블의 행을 다른 테이블의 행과 매칭한다.
예를 들면, t1과 t2를 다음과 같이 조인 시키면, t1에 있는 각 행은 t2에 있는 각 행에 연결된다.
SELECT * FROM t1 INNER JOIN t2; #이걸 사용하거나 SELECT t1.*, t2.* FROM t1 INNER JOIN t2; #이걸 사용하거나 결과는 같다.
i1 | c1 | i2 | c2 |
---|---|---|---|
1 | a | 2 | c |
2 | b | 2 | c |
3 | c | 2 | c |
1 | a | 3 | b |
1 | a | 2 | c |
1 | a | 2 | c |
1 | a | 4 | a |
1 | a | 2 | c |
1 | a | 2 | c |
만약 모든 칼럼을 선택하고 싶지 않으며, 좀 다르게 왼쪽에서 오른쪽 순서로 나타내고 싶다면,
각 칼럼을 콤마로 구분하여 사용해도 된다.
각 테이블의 각 행이 다른 모든 테이블 내의 각 행에 교차시켜서 만들어낸 가능한 모든 조합을 "카르테시안 곱(Cartesian product)"라고도 한다.
하지만 이렇게 되면 많은 수의 행이 있을 수 있기 때문에 통상적으로 WHERE절을 사용해서 결과 세트의 수를 줄여 보다 관리하기 편한 크기로 만들게 된다.
JOIN & CROSS JOIN & ','(콤마) JOIN
JOIN, CROSS JOIN, COMMA JOIN 타입은 INNER JOIN과 같다.
하지만 콤마연산자는 다른 조인 타입과 다른 우선순위를 가지고 있으며, 다른 타입의 불가능한 문법 에러를 발생할 수 있다.
따라서 책의 저자는 콤마 연산자를 사용하지 않을 것을 추천한다.
SELECT t1.*, t2.* FROM t1 INNER JOIN t2 WHERE t1.i1 = t2.i2; SELECT t1.*, t2.* FROM t1 CROSS JOIN t2 WHERE t1.i1 = t2.i2; SELECT t1.*, t2.* FROM t1 JOIN t2 WHERE t1.i1 = t2.i2; SELECT t1.*, t2.* FROM t1, t2 WHERE t1.i1 = t2.i2;
위 네 문장 모두 같은 결과를 출력한다.
i1 | c1 | i2 | c2 |
---|---|---|---|
2 | b | 2 | c |
3 | c | 3 | b |
INNER JOIN, CROSS JOIN, JOIN은 테이블 칼럼을 어떻게 매칭해야 하는지를 지정하기 위한 다른 문법을 허용한다.
_WHERE 절보다 ON절을 사용하는 문법_
ON은 조인하고자 하는 칼럼들이 동일한 이름을 가지더라도 이에 상관없이 사용될 수 있다.
다음의 예는 INNER JOIN을 어떻게 사용하는지 나타낸다.
SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ON t1.i1 = t2.i2;
_USING() 절을 포함하는 다른 문법_
이는 ON과 개념이 동일하지만, 조인된 칼럼 또는 칼럼의 이름은 각 테이블에서 동일해야 한다.
예를 들면, 다음의 쿼리는 mytbl1.b를 mytbl2.b에 조인한다.
SELECT mytbl1.*, mytbl2.* FROM mytbl1 INNER JOIN mytbl2 USING(b);
출처: Paul DuBois, 김형훈 역, 2009. 한국어판 MySQL 4th ed., chapter2 section8.
'selfstudy > MySQL' 카테고리의 다른 글
UNION으로 복수의 테이블에서 검색 (0) | 2013.09.09 |
---|---|
JOIN 종류와 사용(4)-서브쿼리를 사용한 복수 테이블 검색 (0) | 2013.09.09 |
JOIN 종류와 사용(3)-서브쿼리를 사용한 복수 테이블 검색 (0) | 2013.09.06 |
JOIN 종류와 사용(2)-LEFT&RIGHT JOIN (0) | 2013.09.06 |
메타데이터 얻기 (0) | 2013.09.06 |