본문 바로가기
연구_고민/PHP & MySql

sql공부중...Join

by DevG 2007. 8. 11.

std_data

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | 0       |                |
| class | varchar(10) | NO   |     | 0       |                |
| add   | varchar(10) | NO   |     | 0       |                |
+-------+-------------+------+-----+---------+----------------+

std_point

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI |         |       |
| level | tinyint(10)  | NO   |     |         |       |
| ls_1  | tinyint(100) | NO   |     |         |       |
| ls_2  | tinyint(100) | NO   |     |         |       |
| ls_3  | tinyint(100) | NO   |     |         |       |
+-------+--------------+------+-----+---------+-------+

ysql> select * from std_point;
----+-------+------+------+------+
 id | level | ls_1 | ls_2 | ls_3 |
----+-------+------+------+------+
  1 |     1 |   98 |   23 |   88 |
  2 |     3 |   10 |   63 |   88 |
  3 |     2 |   54 |   27 |   56 |
  4 |     3 |   38 |    3 |   76 |
  5 |     3 |   22 |   95 |   80 |
  6 |     2 |   14 |   59 |   88 |
  7 |     1 |   74 |   35 |  100 |
  8 |     1 |   46 |   43 |  100 |
  9 |     2 |   22 |   55 |   56 |
 10 |     1 |   10 |   27 |   88 |
----+-------+------+------+------+


mysql> select * from std_data;
+----+------+-------+---------+
| id | name | class | add     |
+----+------+-------+---------+
|  1 | 2    | 1-2   | 102-167 |
|  2 | 2    | 1-1   | 146-107 |
|  3 | 3    | 1-1   | 178-155 |
|  4 | 1    | 1-2   | 186-127 |
|  5 | 2    | 1-1   | 110-123 |
|  6 | 2    | 1-1   | 170-195 |
|  7 | 3    | 1-3   | 106-179 |
|  8 | 1    | 1-3   | 138-123 |
|  9 | 3    | 1-2   | 174-131 |
| 10 | 1    | 1-1   | 166-151 |
+----+------+-------+---------+

 

테이블 별명 단축..
select * from std_data
이러한 쿼리를
select * from std_data sd

라고 선언할수 있다.

그러므로써 뒤의 where문 뒤의 조건식에서
select * from std_data sd where sd.id<5
와 같은식으로 표기할수 있어진다.

그리고 앞쪽의 필드 구분에서도 이용가능하다.

 

◆◆ The Cross Join

mysql> select * from std_data,std_point;
+----+------+-------+---------+----+-------+------+------+------+
| id | name | class | add     | id | level | ls_1 | ls_2 | ls_3 |
+----+------+-------+---------+----+-------+------+------+------+
|  1 | 2    | 1-2   | 102-167 |  1 |     1 |   98 |   23 |   88 |
|  2 | 2    | 1-1   | 146-107 |  1 |     1 |   98 |   23 |   88 |
|  3 | 3    | 1-1   | 178-155 |  1 |     1 |   98 |   23 |   88 |
|  4 | 1    | 1-2   | 186-127 |  1 |     1 |   98 |   23 |   88 |
.
.
.
.

100 rows in set (0.00 sec)


한 데이터당 한데이터씩 매치시켜가며 표기한다.
10x10 즉 100개의 결과를 내놓는다.

 

 


mysql> select sd.add,sp.id from std_data sd,std_point sp where sp.id='5';
+---------+----+
| add     | id |
+---------+----+
| 102-167 |  5 |
| 146-107 |  5 |
| 178-155 |  5 |
| 186-127 |  5 |
| 110-123 |  5 |
| 170-195 |  5 |
| 106-179 |  5 |
| 138-123 |  5 |
| 174-131 |  5 |
| 166-151 |  5 |
+---------+----+
10 rows in set (0.02 sec)

id를 add에 한번씩 매치시켜 표시한다.
1x10 즉 10개의 결과를 내놓는다.

 


◆◆ The Equi-join
직접 테이블의 필드와 필드를 비교해서 값을 가져온다.

mysql> select sd.add,sp.id from std_data sd,std_point sp where sp.id=sd.id and sd.id=3;
+---------+----+
| add     | id |
+---------+----+
| 178-155 |  3 |
+---------+----+
1 row in set (0.30 sec)

필드의 값을 직접비교해서 결과를 가져온다.

 


◆◆ The Left Join

mysql> select * from std_data left join std_point on std_data.id=std_point.id;
+----+------+-------+---------+------+-------+------+------+------+
| id | name | class | add     | id   | level | ls_1 | ls_2 | ls_3 |
+----+------+-------+---------+------+-------+------+------+------+
|  1 | 2    | 1-2   | 102-167 |    1 |     1 |   98 |   23 |   88 |
|  2 | 2    | 1-1   | 146-107 |    2 |     3 |   10 |   63 |   88 |
|  3 | 3    | 1-1   | 178-155 |    3 |     2 |   54 |   27 |   56 |
|  4 | 1    | 1-2   | 186-127 |    4 |     3 |   38 |    3 |   76 |
|  5 | 2    | 1-1   | 110-123 |    5 |     3 |   22 |   95 |   80 |
|  6 | 2    | 1-1   | 170-195 |    6 |     2 |   14 |   59 |   88 |
|  7 | 3    | 1-3   | 106-179 |    7 |     1 |   74 |   35 |  100 |
|  8 | 1    | 1-3   | 138-123 |    8 |     1 |   46 |   43 |  100 |
|  9 | 3    | 1-2   | 174-131 |    9 |     2 |   22 |   55 |   56 |
| 10 | 1    | 1-1   | 166-151 |   10 |     1 |   10 |   27 |   88 |
+----+------+-------+---------+------+-------+------+------+------+
10 rows in set (0.00 sec)

두 테이블을 합쳐서 한화면에 보여준다.
요구한 필드의 값이 같은것들을 찾아서 보여준다.

Left Join이 아니더라도
mysql> select * from std_data , std_point where std_data.id=std_point.id;
이런 쿼리를 보내면 같은 결과를 얻을수 있다.


◆ The Using Clause
조금더 편리한 방법으로 using 을 사용해서 아래와 같은 결과를 얻을수 잇다.
겹쳐지는 id 부분은 한번만 출력한다.
mysql> select * from std_data left join std_point using(id);
+----+------+-------+---------+-------+------+------+------+
| id | name | class | add     | level | ls_1 | ls_2 | ls_3 |
+----+------+-------+---------+-------+------+------+------+
|  1 | 2    | 1-2   | 102-167 |     1 |   98 |   23 |   88 |
|  2 | 2    | 1-1   | 146-107 |     3 |   10 |   63 |   88 |
|  3 | 3    | 1-1   | 178-155 |     2 |   54 |   27 |   56 |
|  4 | 1    | 1-2   | 186-127 |     3 |   38 |    3 |   76 |
|  5 | 2    | 1-1   | 110-123 |     3 |   22 |   95 |   80 |
|  6 | 2    | 1-1   | 170-195 |     2 |   14 |   59 |   88 |
|  7 | 3    | 1-3   | 106-179 |     1 |   74 |   35 |  100 |
|  8 | 1    | 1-3   | 138-123 |     1 |   46 |   43 |  100 |
|  9 | 3    | 1-2   | 174-131 |     2 |   22 |   55 |   56 |
| 10 | 1    | 1-1   | 166-151 |     1 |   10 |   27 |   88 |
+----+------+-------+---------+-------+------+------+------+
10 rows in set (0.00 sec)

 

 

 


◆◆ Self-joins

mysql> select * from std_data as sd1, std_data as sd2;
+----+------+-------+---------+----+------+-------+---------+
| id | name | class | add     | id | name | class | add     |
+----+------+-------+---------+----+------+-------+---------+
|  1 | 2    | 1-2   | 102-167 |  1 | 2    | 1-2   | 102-167 |
|  2 | 2    | 1-1   | 146-107 |  1 | 2    | 1-2   | 102-167 |
|  3 | 3    | 1-1   | 178-155 |  1 | 2    | 1-2   | 102-167 |
|  4 | 1    | 1-2   | 186-127 |  1 | 2    | 1-2   | 102-167 |

처음에 했던 크로스 조인과 비슷한 출력물을 내놓는다.