mysql表连接

2016-05-20  本文已影响329人  Fa1se003

当同时要现实多张表中的数据库时,可以会用表连接来完成这样的需求。从大类上分,表连接分为内连接和外连接,他们的区别主要是,内连接可以选出两张表中互相匹配的记录,外连接会选出其他不匹配的记录。我们最常用的是内连接。

学生表
mysql> select * from student;
+----+--------+-------+---------+
| id | name   | score | classid |
+----+--------+-------+---------+
|  1 | 张三   |    99 |       3 |
|  2 | 李四   |    60 |       2 |
|  3 | 王五   |    88 |       2 |
|  4 | 赵6    |    22 |       1 |
+----+--------+-------+---------+
4 rows in set (0.00 sec)

班级表
mysql> select * from class;
+---------+-----------+
| classid | classname |
+---------+-----------+
|       1 | 快班      |
|       2 | 慢班      |
|       3 | 中等班    |
+---------+-----------+
3 rows in set (0.00 sec)
查询出所有学生的名字,和他们所在的班级。
mysql> select name,classname from student ,class where student.classid=class.classid;
+--------+-----------+
| name   | classname |
+--------+-----------+
| 张三   | 中等班    |
| 李四   | 慢班      |
| 王五   | 慢班      |
| 赵6    | 快班      |
+--------+-----------+
4 rows in set (0.00 sec)

外连接又分为左连接右连接

左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。

学生表
mysql> select * from student;
+----+--------+-------+---------+
| id | name   | score | classid |
+----+--------+-------+---------+
|  1 | 张三   |    99 |       3 |
|  2 | 李四   |    60 |       2 |
|  3 | 王五   |    88 |       2 |
|  4 | 赵6    |    22 |       1 |
|  5 | 神童   |   100 |    NULL |
+----+--------+-------+---------+
5 rows in set (0.00 sec)

班级表
mysql> select * from class;
+---------+-----------+
| classid | classname |
+---------+-----------+
|       1 | 快班      |
|       2 | 慢班      |
|       3 | 中等班    |
+---------+-----------+
3 rows in set (0.00 sec)

查出学生表中所有学生名字和他们所在的班级
mysql> select s.name,c.classname from student as s left join class as c on s.classid=c.classid;
+--------+-----------+
| name   | classname |
+--------+-----------+
| 赵6    | 快班      |
| 李四   | 慢班      |
| 王五   | 慢班      |
| 张三   | 中等班    |
| 神童   | NULL      |
+--------+-----------+
5 rows in set (0.00 sec)

右连接和左连接类似,两者可以互相转化,用student表作为右表查询如下。
mysql> select s.name,c.classname from class as c right join student as s on s.classid=c.classid;
+--------+-----------+
| name   | classname |
+--------+-----------+
| 赵6    | 快班      |
| 李四   | 慢班      |
| 王五   | 慢班      |
| 张三   | 中等班    |
| 神童   | NULL      |
+--------+-----------+
5 rows in set (0.01 sec)

右连接,用班级表作为右表,查询结果则没有神童这条记录。
mysql> select s.name,c.classname from student as s right join class as c on s.classid=c.classid;
+--------+-----------+
| name   | classname |
+--------+-----------+
| 张三   | 中等班    |
| 李四   | 慢班      |
| 王五   | 慢班      |
| 赵6    | 快班      |
+--------+-----------+
4 rows in set (0.00 sec)
上一篇 下一篇

猜你喜欢

热点阅读