> 데이터 베이스 > MySQL 튜토리얼 > MYSQL 内外连接

MYSQL 内外连接

WBOY
풀어 주다: 2016-06-07 15:46:57
원래의
1124명이 탐색했습니다.

假设student表有如下记录: +--------+----------+---------+-----------+| stu_id | stu_name | stu_tel | stu_score |+--------+----------+---------+-----------+| 1 | a | 151 | 60 || 2 | b | 152 | 61 || 3 | c | 153 | 62 |+--------+----------+---

假设student表有如下记录:

+--------+----------+---------+-----------+
| stu_id | stu_name | stu_tel | stu_score |
+--------+----------+---------+-----------+
|      1 | a        |     151 |        60 |
|      2 | b        |     152 |        61 |
|      3 | c        |     153 |        62 |
+--------+----------+---------+-----------+
로그인 후 복사

teacher表有如下记录:
+--------+----------+---------+---------+--------+
| tea_id | tea_name | tea_tel | tea_pay | stu_id |
+--------+----------+---------+---------+--------+
|      1 | A        |     130 |    3000 |      1 |
|      2 | B        |     131 |    4000 |      2 |
|      3 | C        |     132 |    4000 |      0 |
+--------+----------+---------+---------+--------+
로그인 후 복사

连接可分为以下几类:                 
内连接。       

内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行,也可以使用显示内连接:inner join ,没有包含一个连接条件时,;结果就是一个笛卡尔积。

mysql> select * from student inner join teacher;(类似于select * from student,teacher;)
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
| stu_id | stu_name | stu_tel | stu_score | tea_id | tea_name | tea_tel | tea_pay | stu_id |
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
|      1 | a        |     151 |        60 |      1 | A        |     130 |    3000 |      1 |
|      2 | b        |     152 |        61 |      1 | A        |     130 |    3000 |      1 |
|      3 | c        |     153 |        62 |      1 | A        |     130 |    3000 |      1 |
|      1 | a        |     151 |        60 |      2 | B        |     131 |    4000 |      2 |
|      2 | b        |     152 |        61 |      2 | B        |     131 |    4000 |      2 |
|      3 | c        |     153 |        62 |      2 | B        |     131 |    4000 |      2 |
|      1 | a        |     151 |        60 |      3 | C        |     132 |    4000 |      0 |
|      2 | b        |     152 |        61 |      3 | C        |     132 |    4000 |      0 |
|      3 | c        |     153 |        62 |      3 | C        |     132 |    4000 |      0 |
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
로그인 후 복사

外连接。外连接可以是左向外连接、右向外连接。

在FROM子句中指定外连接时,可以由下列几组关键字中的一组指定:   
左向外连接:left join 或者left outer join    
左向外连接的结果集包括left join子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 

mysql> select * from student left join teacher on student.stu_id=teacher.stu_id;
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
| stu_id | stu_name | stu_tel | stu_score | tea_id | tea_name | tea_tel | tea_pay | stu_id |
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
|      1 | a        |     151 |        60 |      1 | A        |     130 |    3000 |      1 |
|      2 | b        |     152 |        61 |      2 | B        |     131 |    4000 |      2 |
|      3 | c        |     153 |        62 |   NULL | NULL     |    NULL |    NULL |   NULL |
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
로그인 후 복사

右向外连接:right join  或  right outer join 。     
右向外连接是左向外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
mysql> select * from student right join teacher on student.stu_id=teacher.stu_id;
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
| stu_id | stu_name | stu_tel | stu_score | tea_id | tea_name | tea_tel | tea_pay | stu_id |
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
|      1 | a        |     151 |        60 |      1 | A        |     130 |    3000 |      1 |
|      2 | b        |     152 |        61 |      2 | B        |     131 |    4000 |      2 |
|   NULL | NULL     |    NULL |      NULL |      3 | C        |     132 |    4000 |      0 |
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
로그인 후 복사

自然连接
在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
mysql> select * from student natural join teacher;
+--------+----------+---------+-----------+--------+----------+---------+---------+
| stu_id | stu_name | stu_tel | stu_score | tea_id | tea_name | tea_tel | tea_pay |
+--------+----------+---------+-----------+--------+----------+---------+---------+
|      1 | a        |     151 |        60 |      1 | A        |     130 |    3000 |
|      2 | b        |     152 |        61 |      2 | B        |     131 |    4000 |
+--------+----------+---------+-----------+--------+----------+---------+---------+
로그인 후 복사

交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。如果没有包含一个连接条件,交叉连接的结果就是一个笛卡尔积。  
mysql> select * from student cross join teacher;
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
| stu_id | stu_name | stu_tel | stu_score | tea_id | tea_name | tea_tel | tea_pay | stu_id |
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
|      1 | a        |     151 |        60 |      1 | A        |     130 |    3000 |      1 |
|      2 | b        |     152 |        61 |      1 | A        |     130 |    3000 |      1 |
|      3 | c        |     153 |        62 |      1 | A        |     130 |    3000 |      1 |
|      1 | a        |     151 |        60 |      2 | B        |     131 |    4000 |      2 |
|      2 | b        |     152 |        61 |      2 | B        |     131 |    4000 |      2 |
|      3 | c        |     153 |        62 |      2 | B        |     131 |    4000 |      2 |
|      1 | a        |     151 |        60 |      3 | C        |     132 |    4000 |      0 |
|      2 | b        |     152 |        61 |      3 | C        |     132 |    4000 |      0 |
|      3 | c        |     153 |        62 |      3 | C        |     132 |    4000 |      0 |
+--------+----------+---------+-----------+--------+----------+---------+---------+--------+
로그인 후 복사

如果要连接的列的名字相同,并且连接条件就是两者相等,那么也可以使用using,只需把on语句用using替换即可;
mysql> select * from student inner join teacher using(stu_id);
+--------+----------+---------+-----------+--------+----------+---------+---------+
| stu_id | stu_name | stu_tel | stu_score | tea_id | tea_name | tea_tel | tea_pay |
+--------+----------+---------+-----------+--------+----------+---------+---------+
|      1 | a        |     151 |        60 |      1 | A        |     130 |    3000 |
|      2 | b        |     152 |        61 |      2 | B        |     131 |    4000 |
+--------+----------+---------+-----------+--------+----------+---------+---------+
로그인 후 복사


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿