当前位置:Gxlcms > mysql > MYSQL内外连接

MYSQL内外连接

时间:2021-07-01 10:21:17 帮助过:24人阅读

假设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 |
+--------+----------+---------+-----------+--------+----------+---------+---------+

人气教程排行